changeset 5164:57077d0ddc8e

[project @ 2005-02-25 19:55:24 by jwe]
author jwe
date Fri, 25 Feb 2005 19:55:28 +0000
parents 9f3299378193
children b822b4895af2
files Makeconf.in PROJECTS doc/ChangeLog doc/interpreter/Makefile.in doc/interpreter/octave.texi doc/interpreter/sparse.txi libcruft/ChangeLog libcruft/blas/zher.f libcruft/blas/ztbsv.f libcruft/lapack/dgbcon.f libcruft/lapack/dgtsv.f libcruft/lapack/dgttrf.f libcruft/lapack/dgttrs.f libcruft/lapack/dlatbs.f libcruft/lapack/dpbcon.f libcruft/lapack/dpbtf2.f libcruft/lapack/dpbtrf.f libcruft/lapack/dpbtrs.f libcruft/lapack/dptsv.f libcruft/lapack/dpttrf.f libcruft/lapack/dpttrs.f libcruft/lapack/dptts2.f libcruft/lapack/zgbcon.f libcruft/lapack/zgbtf2.f libcruft/lapack/zgbtrf.f libcruft/lapack/zgbtrs.f libcruft/lapack/zgtsv.f libcruft/lapack/zgttrf.f libcruft/lapack/zgttrs.f libcruft/lapack/zlatbs.f libcruft/lapack/zpbcon.f libcruft/lapack/zpbtf2.f libcruft/lapack/zpbtrf.f libcruft/lapack/zpbtrs.f libcruft/lapack/zptsv.f libcruft/lapack/zpttrf.f libcruft/lapack/zpttrs.f libcruft/lapack/zptts2.f liboctave/CNDArray.cc liboctave/COLAMD.README liboctave/COLAMD.files liboctave/COLAMD/ChangeLog liboctave/COLAMD/Makefile liboctave/COLAMD/README liboctave/COLAMD/colamd.c liboctave/COLAMD/colamd.h liboctave/COLAMD/colamd.m liboctave/COLAMD/colamd_demo.m liboctave/COLAMD/colamd_example.c liboctave/COLAMD/colamd_example.out liboctave/COLAMD/colamd_test.m liboctave/COLAMD/colamdmex.c liboctave/COLAMD/colamdtestmex.c liboctave/COLAMD/luflops.m liboctave/COLAMD/symamd.m liboctave/COLAMD/symamdmex.c liboctave/COLAMD/symamdtestmex.c liboctave/CSparse.cc liboctave/CSparse.h liboctave/ChangeLog liboctave/CmplxDET.h liboctave/MSparse-C.cc liboctave/MSparse-d.cc liboctave/MSparse-defs.h liboctave/MSparse.cc liboctave/MSparse.h liboctave/Makefile.in liboctave/Sparse-C.cc liboctave/Sparse-b.cc liboctave/Sparse-d.cc liboctave/Sparse-op-defs.h liboctave/Sparse.cc liboctave/Sparse.h liboctave/SparseCmplxLU.cc liboctave/SparseCmplxLU.h liboctave/SparseType.cc liboctave/SparseType.h liboctave/SparsedbleLU.cc liboctave/SparsedbleLU.h liboctave/UMFPACK.README liboctave/UMFPACK.files liboctave/UMFPACK.patch liboctave/UMFPACK.rules liboctave/UMFPACK/AMD/Demo/Makefile liboctave/UMFPACK/AMD/Demo/amd_demo.c liboctave/UMFPACK/AMD/Demo/amd_demo.out liboctave/UMFPACK/AMD/Demo/amd_demo2.c liboctave/UMFPACK/AMD/Demo/amd_demo2.out liboctave/UMFPACK/AMD/Demo/amd_f77cross.f liboctave/UMFPACK/AMD/Demo/amd_f77cross.out liboctave/UMFPACK/AMD/Demo/amd_f77demo.f liboctave/UMFPACK/AMD/Demo/amd_f77demo.out liboctave/UMFPACK/AMD/Demo/amd_f77simple.f liboctave/UMFPACK/AMD/Demo/amd_f77simple.out liboctave/UMFPACK/AMD/Demo/amd_f77wrapper.c liboctave/UMFPACK/AMD/Demo/amd_simple.c liboctave/UMFPACK/AMD/Demo/amd_simple.out liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.bib liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.pdf liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.tex liboctave/UMFPACK/AMD/Doc/ChangeLog liboctave/UMFPACK/AMD/Doc/License liboctave/UMFPACK/AMD/Doc/Makefile liboctave/UMFPACK/AMD/Include/amd.h liboctave/UMFPACK/AMD/Lib/libamd.def liboctave/UMFPACK/AMD/MATLAB/Contents.m liboctave/UMFPACK/AMD/MATLAB/GNUmakefile liboctave/UMFPACK/AMD/MATLAB/Makefile liboctave/UMFPACK/AMD/MATLAB/amd.m liboctave/UMFPACK/AMD/MATLAB/amd_demo.m liboctave/UMFPACK/AMD/MATLAB/amd_demo.m.out liboctave/UMFPACK/AMD/MATLAB/amd_make.m liboctave/UMFPACK/AMD/MATLAB/amd_mex.c liboctave/UMFPACK/AMD/MATLAB/can_24.mat liboctave/UMFPACK/AMD/Make/Make.alpha liboctave/UMFPACK/AMD/Make/Make.include liboctave/UMFPACK/AMD/Make/Make.linux liboctave/UMFPACK/AMD/Make/Make.rs6000 liboctave/UMFPACK/AMD/Make/Make.sgi liboctave/UMFPACK/AMD/Make/Make.solaris liboctave/UMFPACK/AMD/Makefile liboctave/UMFPACK/AMD/OCTAVE/GNUmakefile liboctave/UMFPACK/AMD/OCTAVE/Makefile liboctave/UMFPACK/AMD/OCTAVE/amd.cc liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m.out liboctave/UMFPACK/AMD/OCTAVE/can_24.mat liboctave/UMFPACK/AMD/README.txt liboctave/UMFPACK/AMD/Source/GNUmakefile liboctave/UMFPACK/AMD/Source/Makefile liboctave/UMFPACK/AMD/Source/amd.f liboctave/UMFPACK/AMD/Source/amd_1.c liboctave/UMFPACK/AMD/Source/amd_2.c liboctave/UMFPACK/AMD/Source/amd_aat.c liboctave/UMFPACK/AMD/Source/amd_control.c liboctave/UMFPACK/AMD/Source/amd_defaults.c liboctave/UMFPACK/AMD/Source/amd_dump.c liboctave/UMFPACK/AMD/Source/amd_info.c liboctave/UMFPACK/AMD/Source/amd_internal.h liboctave/UMFPACK/AMD/Source/amd_order.c liboctave/UMFPACK/AMD/Source/amd_post_tree.c liboctave/UMFPACK/AMD/Source/amd_postorder.c liboctave/UMFPACK/AMD/Source/amd_preprocess.c liboctave/UMFPACK/AMD/Source/amd_valid.c liboctave/UMFPACK/AMD/Source/amdbar.f liboctave/UMFPACK/README.txt liboctave/UMFPACK/UMFPACK/Demo/HB/arc130.rua liboctave/UMFPACK/UMFPACK/Demo/HB/can_24.psa liboctave/UMFPACK/UMFPACK/Demo/HB/fs_183_6.rua liboctave/UMFPACK/UMFPACK/Demo/HB/qc324.cua liboctave/UMFPACK/UMFPACK/Demo/HB/west0067.rua liboctave/UMFPACK/UMFPACK/Demo/Makefile liboctave/UMFPACK/UMFPACK/Demo/readhb.f liboctave/UMFPACK/UMFPACK/Demo/readhb_nozeros.f liboctave/UMFPACK/UMFPACK/Demo/readhb_size.f liboctave/UMFPACK/UMFPACK/Demo/simple_compile liboctave/UMFPACK/UMFPACK/Demo/umf4.c liboctave/UMFPACK/UMFPACK/Demo/umf4.out liboctave/UMFPACK/UMFPACK/Demo/umf4_f77wrapper.c liboctave/UMFPACK/UMFPACK/Demo/umf4_f77zwrapper.c liboctave/UMFPACK/UMFPACK/Demo/umf4hb.f liboctave/UMFPACK/UMFPACK/Demo/umf4hb.out liboctave/UMFPACK/UMFPACK/Demo/umf4hb64.f liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.f liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.out liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.out liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.sed liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.out liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.sed liboctave/UMFPACK/UMFPACK/Demo/umfpack_simple.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_xx_demo.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.out liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.sed liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.c liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.out liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.sed liboctave/UMFPACK/UMFPACK/Doc/ChangeLog liboctave/UMFPACK/UMFPACK/Doc/License liboctave/UMFPACK/UMFPACK/Doc/Makefile liboctave/UMFPACK/UMFPACK/Doc/QuickStart.pdf liboctave/UMFPACK/UMFPACK/Doc/QuickStart.tex liboctave/UMFPACK/UMFPACK/Doc/UserGuide.bib liboctave/UMFPACK/UMFPACK/Doc/UserGuide.pdf liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed1 liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed2 liboctave/UMFPACK/UMFPACK/Doc/UserGuide.stex liboctave/UMFPACK/UMFPACK/Include/umfpack.h liboctave/UMFPACK/UMFPACK/Include/umfpack_col_to_triplet.h liboctave/UMFPACK/UMFPACK/Include/umfpack_defaults.h liboctave/UMFPACK/UMFPACK/Include/umfpack_free_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_free_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_get_determinant.h liboctave/UMFPACK/UMFPACK/Include/umfpack_get_lunz.h liboctave/UMFPACK/UMFPACK/Include/umfpack_get_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_get_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_load_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_load_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_qsymbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_control.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_info.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_matrix.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_perm.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_status.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_triplet.h liboctave/UMFPACK/UMFPACK/Include/umfpack_report_vector.h liboctave/UMFPACK/UMFPACK/Include/umfpack_save_numeric.h liboctave/UMFPACK/UMFPACK/Include/umfpack_save_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_scale.h liboctave/UMFPACK/UMFPACK/Include/umfpack_solve.h liboctave/UMFPACK/UMFPACK/Include/umfpack_symbolic.h liboctave/UMFPACK/UMFPACK/Include/umfpack_tictoc.h liboctave/UMFPACK/UMFPACK/Include/umfpack_timer.h liboctave/UMFPACK/UMFPACK/Include/umfpack_transpose.h liboctave/UMFPACK/UMFPACK/Include/umfpack_triplet_to_col.h liboctave/UMFPACK/UMFPACK/Include/umfpack_wsolve.h liboctave/UMFPACK/UMFPACK/Lib/libumfpack.def liboctave/UMFPACK/UMFPACK/MATLAB/Contents.m liboctave/UMFPACK/UMFPACK/MATLAB/GNUmakefile liboctave/UMFPACK/UMFPACK/MATLAB/Makefile liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/lapacksyms.def liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/libmwlapack.lib liboctave/UMFPACK/UMFPACK/MATLAB/lu_normest.m liboctave/UMFPACK/UMFPACK/MATLAB/luflop.m liboctave/UMFPACK/UMFPACK/MATLAB/luflopmex.c liboctave/UMFPACK/UMFPACK/MATLAB/umfpack.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_btf.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m.out liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_details.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_make.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_report.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m.out liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_solve.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_test.m liboctave/UMFPACK/UMFPACK/MATLAB/umfpackmex.c liboctave/UMFPACK/UMFPACK/MATLAB/west0067.mat liboctave/UMFPACK/UMFPACK/Makefile liboctave/UMFPACK/UMFPACK/OCTAVE/Contents.m liboctave/UMFPACK/UMFPACK/OCTAVE/GNUmakefile liboctave/UMFPACK/UMFPACK/OCTAVE/Makefile liboctave/UMFPACK/UMFPACK/OCTAVE/lu_normest.m liboctave/UMFPACK/UMFPACK/OCTAVE/luflop.cc liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack.cc liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_make.m liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_report.m liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m liboctave/UMFPACK/UMFPACK/OCTAVE/west0067.mat liboctave/UMFPACK/UMFPACK/README.txt liboctave/UMFPACK/UMFPACK/Source/GNUmakefile liboctave/UMFPACK/UMFPACK/Source/Makefile liboctave/UMFPACK/UMFPACK/Source/umf_2by2.c liboctave/UMFPACK/UMFPACK/Source/umf_2by2.h liboctave/UMFPACK/UMFPACK/Source/umf_analyze.c liboctave/UMFPACK/UMFPACK/Source/umf_analyze.h liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.c liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.h liboctave/UMFPACK/UMFPACK/Source/umf_assemble.c liboctave/UMFPACK/UMFPACK/Source/umf_assemble.h liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.c liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.h liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.c liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.h liboctave/UMFPACK/UMFPACK/Source/umf_colamd.c liboctave/UMFPACK/UMFPACK/Source/umf_colamd.h liboctave/UMFPACK/UMFPACK/Source/umf_config.h liboctave/UMFPACK/UMFPACK/Source/umf_create_element.c liboctave/UMFPACK/UMFPACK/Source/umf_create_element.h liboctave/UMFPACK/UMFPACK/Source/umf_dump.c liboctave/UMFPACK/UMFPACK/Source/umf_dump.h liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.c liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.h liboctave/UMFPACK/UMFPACK/Source/umf_free.c liboctave/UMFPACK/UMFPACK/Source/umf_free.h liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c liboctave/UMFPACK/UMFPACK/Source/umf_fsize.h liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.c liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.h liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.c liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.h liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.c liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.h liboctave/UMFPACK/UMFPACK/Source/umf_init_front.c liboctave/UMFPACK/UMFPACK/Source/umf_init_front.h liboctave/UMFPACK/UMFPACK/Source/umf_internal.h liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.c liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.h liboctave/UMFPACK/UMFPACK/Source/umf_kernel.c liboctave/UMFPACK/UMFPACK/Source/umf_kernel.h liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.c liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.h liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.c liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.h liboctave/UMFPACK/UMFPACK/Source/umf_local_search.c liboctave/UMFPACK/UMFPACK/Source/umf_local_search.h liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.c liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.h liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.c liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.h liboctave/UMFPACK/UMFPACK/Source/umf_malloc.c liboctave/UMFPACK/UMFPACK/Source/umf_malloc.h liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.c liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.h liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.c liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.h liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.c liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.h liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.c liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.h liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.c liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.h liboctave/UMFPACK/UMFPACK/Source/umf_multicompile.c liboctave/UMFPACK/UMFPACK/Source/umf_realloc.c liboctave/UMFPACK/UMFPACK/Source/umf_realloc.h liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.c liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.h liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.c liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.h liboctave/UMFPACK/UMFPACK/Source/umf_row_search.c liboctave/UMFPACK/UMFPACK/Source/umf_row_search.h liboctave/UMFPACK/UMFPACK/Source/umf_scale.c liboctave/UMFPACK/UMFPACK/Source/umf_scale.h liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.c liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.h liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.c liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.h liboctave/UMFPACK/UMFPACK/Source/umf_singletons.c liboctave/UMFPACK/UMFPACK/Source/umf_singletons.h liboctave/UMFPACK/UMFPACK/Source/umf_solve.c liboctave/UMFPACK/UMFPACK/Source/umf_solve.h liboctave/UMFPACK/UMFPACK/Source/umf_start_front.c liboctave/UMFPACK/UMFPACK/Source/umf_start_front.h liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.c liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.h liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.c liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.h liboctave/UMFPACK/UMFPACK/Source/umf_transpose.c liboctave/UMFPACK/UMFPACK/Source/umf_transpose.h liboctave/UMFPACK/UMFPACK/Source/umf_triplet.c liboctave/UMFPACK/UMFPACK/Source/umf_triplet.h liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.c liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.h liboctave/UMFPACK/UMFPACK/Source/umf_usolve.c liboctave/UMFPACK/UMFPACK/Source/umf_usolve.h liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.c liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.h liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.c liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.h liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.h liboctave/UMFPACK/UMFPACK/Source/umf_version.h liboctave/UMFPACK/UMFPACK/Source/umfpack_col_to_triplet.c liboctave/UMFPACK/UMFPACK/Source/umfpack_defaults.c liboctave/UMFPACK/UMFPACK/Source/umfpack_free_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_free_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_get_determinant.c liboctave/UMFPACK/UMFPACK/Source/umfpack_get_lunz.c liboctave/UMFPACK/UMFPACK/Source/umfpack_get_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_get_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_load_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_load_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_qsymbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_control.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_info.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_matrix.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_perm.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_status.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_triplet.c liboctave/UMFPACK/UMFPACK/Source/umfpack_report_vector.c liboctave/UMFPACK/UMFPACK/Source/umfpack_save_numeric.c liboctave/UMFPACK/UMFPACK/Source/umfpack_save_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_scale.c liboctave/UMFPACK/UMFPACK/Source/umfpack_solve.c liboctave/UMFPACK/UMFPACK/Source/umfpack_symbolic.c liboctave/UMFPACK/UMFPACK/Source/umfpack_tictoc.c liboctave/UMFPACK/UMFPACK/Source/umfpack_timer.c liboctave/UMFPACK/UMFPACK/Source/umfpack_transpose.c liboctave/UMFPACK/UMFPACK/Source/umfpack_triplet_to_col.c liboctave/boolSparse.cc liboctave/boolSparse.h liboctave/dNDArray.cc liboctave/dSparse.cc liboctave/dSparse.h liboctave/dbleDET.h liboctave/mx-base.h liboctave/oct-spparms.cc liboctave/oct-spparms.h liboctave/sparse-base-lu.cc liboctave/sparse-base-lu.h liboctave/sparse-mk-ops.awk liboctave/sparse-mx-ops liboctave/sparse-sort.cc liboctave/sparse-sort.h scripts/ChangeLog scripts/Makefile.in scripts/configure.in scripts/sparse/Makefile.in scripts/sparse/colperm.m scripts/sparse/nonzeros.m scripts/sparse/spalloc.m scripts/sparse/spconvert.m scripts/sparse/spdiags.m scripts/sparse/speye.m scripts/sparse/spfun.m scripts/sparse/sphcat.m scripts/sparse/spones.m scripts/sparse/sprand.m scripts/sparse/sprandn.m scripts/sparse/spstats.m scripts/sparse/spvcat.m scripts/sparse/spy.m src/ChangeLog src/DLD-FUNCTIONS/colamd.cc src/DLD-FUNCTIONS/det.cc src/DLD-FUNCTIONS/dispatch.cc src/DLD-FUNCTIONS/gcd.cc src/DLD-FUNCTIONS/rand.cc src/DLD-FUNCTIONS/sort.cc src/DLD-FUNCTIONS/sparse.cc src/DLD-FUNCTIONS/spdet.cc src/DLD-FUNCTIONS/splu.cc src/DLD-FUNCTIONS/spparms.cc src/Makefile.in src/OPERATORS/op-b-b.cc src/OPERATORS/op-b-bm.cc src/OPERATORS/op-b-sbm.cc src/OPERATORS/op-bm-b.cc src/OPERATORS/op-bm-bm.cc src/OPERATORS/op-bm-sbm.cc src/OPERATORS/op-cell.cc src/OPERATORS/op-chm.cc src/OPERATORS/op-cm-cm.cc src/OPERATORS/op-cm-cs.cc src/OPERATORS/op-cm-m.cc src/OPERATORS/op-cm-s.cc src/OPERATORS/op-cm-scm.cc src/OPERATORS/op-cm-sm.cc src/OPERATORS/op-cs-cm.cc src/OPERATORS/op-cs-cs.cc src/OPERATORS/op-cs-m.cc src/OPERATORS/op-cs-s.cc src/OPERATORS/op-cs-scm.cc src/OPERATORS/op-cs-sm.cc src/OPERATORS/op-double-conv.cc src/OPERATORS/op-fil-b.cc src/OPERATORS/op-fil-bm.cc src/OPERATORS/op-fil-cm.cc src/OPERATORS/op-fil-cs.cc src/OPERATORS/op-fil-lis.cc src/OPERATORS/op-fil-m.cc src/OPERATORS/op-fil-rec.cc src/OPERATORS/op-fil-s.cc src/OPERATORS/op-fil-sbm.cc src/OPERATORS/op-fil-scm.cc src/OPERATORS/op-fil-sm.cc src/OPERATORS/op-fil-str.cc src/OPERATORS/op-i16-i16.cc src/OPERATORS/op-i32-i32.cc src/OPERATORS/op-i64-i64.cc src/OPERATORS/op-i8-i8.cc src/OPERATORS/op-int-conv.cc src/OPERATORS/op-list.cc src/OPERATORS/op-m-cm.cc src/OPERATORS/op-m-cs.cc src/OPERATORS/op-m-m.cc src/OPERATORS/op-m-s.cc src/OPERATORS/op-m-scm.cc src/OPERATORS/op-m-sm.cc src/OPERATORS/op-range.cc src/OPERATORS/op-s-cm.cc src/OPERATORS/op-s-cs.cc src/OPERATORS/op-s-m.cc src/OPERATORS/op-s-s.cc src/OPERATORS/op-s-scm.cc src/OPERATORS/op-s-sm.cc src/OPERATORS/op-sbm-b.cc src/OPERATORS/op-sbm-bm.cc src/OPERATORS/op-sbm-sbm.cc src/OPERATORS/op-scm-cm.cc src/OPERATORS/op-scm-cs.cc src/OPERATORS/op-scm-m.cc src/OPERATORS/op-scm-s.cc src/OPERATORS/op-scm-scm.cc src/OPERATORS/op-scm-sm.cc src/OPERATORS/op-sm-cm.cc src/OPERATORS/op-sm-cs.cc src/OPERATORS/op-sm-m.cc src/OPERATORS/op-sm-s.cc src/OPERATORS/op-sm-scm.cc src/OPERATORS/op-sm-sm.cc src/OPERATORS/op-str-m.cc src/OPERATORS/op-str-s.cc src/OPERATORS/op-str-str.cc src/OPERATORS/op-struct.cc src/OPERATORS/op-ui16-ui16.cc src/OPERATORS/op-ui32-ui32.cc src/OPERATORS/op-ui64-ui64.cc src/OPERATORS/op-ui8-ui8.cc src/data.cc src/ls-mat5.cc src/oct.h src/ov-base-sparse.cc src/ov-base-sparse.h src/ov-base.cc src/ov-base.h src/ov-bool-mat.h src/ov-bool-sparse.cc src/ov-bool-sparse.h src/ov-cell.cc src/ov-cx-mat.cc src/ov-cx-mat.h src/ov-cx-sparse.cc src/ov-cx-sparse.h src/ov-fcn-handle.cc src/ov-fcn-inline.cc src/ov-fcn-inline.h src/ov-int16.cc src/ov-int32.cc src/ov-int64.cc src/ov-int8.cc src/ov-re-mat.cc src/ov-re-mat.h src/ov-re-sparse.cc src/ov-re-sparse.h src/ov-uint16.cc src/ov-uint32.cc src/ov-uint64.cc src/ov-uint8.cc src/ov.cc src/ov.h src/pt-arg-list.cc src/pt-mat.cc src/sparse-xdiv.cc src/sparse-xdiv.h src/sparse-xpow.cc src/sparse-xpow.h src/symtab.cc src/symtab.h src/token.h
diffstat 553 files changed, 160022 insertions(+), 347 deletions(-) [+]
line wrap: on
line diff
--- a/Makeconf.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/Makeconf.in	Fri Feb 25 19:55:28 2005 +0000
@@ -101,13 +101,21 @@
   TMP_IF_1 = -I. -I$(srcdir)
 endif
 ifeq ($(TOPDIR),$(top_srcdir))
-  TMP_IF_2 = -I$(TOPDIR) -I$(TOPDIR)/liboctave -I$(TOPDIR)/src \
-	-I$(TOPDIR)/libcruft/misc
+  TMP_IF_2 = \
+    -I$(TOPDIR) \
+    -I$(TOPDIR)/liboctave \
+    -I$(TOPDIR)/src \
+    -I$(TOPDIR)/libcruft/misc
 else
-  TMP_IF_2 = -I$(TOPDIR) -I$(TOPDIR)/liboctave -I$(TOPDIR)/src \
-	-I$(TOPDIR)/libcruft/misc -I$(top_srcdir) \
-	-I$(top_srcdir)/liboctave -I$(top_srcdir)/src \
-	-I$(top_srcdir)/libcruft/misc
+  TMP_IF_2 = \
+    -I$(TOPDIR) \
+    -I$(TOPDIR)/liboctave \
+    -I$(TOPDIR)/src \
+    -I$(TOPDIR)/libcruft/misc \
+    -I$(top_srcdir) \
+    -I$(top_srcdir)/liboctave \
+    -I$(top_srcdir)/src \
+    -I$(top_srcdir)/libcruft/misc
 endif
 INCFLAGS = $(TMP_IF_1) $(TMP_IF_2) $(DLFCN_INCFLAGS) $(GLOB_INCFLAGS)
 
--- a/PROJECTS	Fri Feb 25 17:42:55 2005 +0000
+++ b/PROJECTS	Fri Feb 25 19:55:28 2005 +0000
@@ -35,8 +35,6 @@
 
   * Free NLP solver.
 
-  * Support for sparse matrices.
-
   * Fix CollocWt to handle Laguerre polynomials.  Make it easy to
     extend it to other polynomial types.
 
@@ -105,6 +103,104 @@
     non-square systems compatible with Matlab.  Currently, they return
     the minimum norm solution from DGELSS, which behaves differently.
 
+---------------
+Sparse Matrices:
+---------------
+
+  * Sparse Cholesky factorization for Fchol function and also for the 
+    in built polymorphic solvers.
+
+  * QR factorization functions, also for use in lssolve functions. Write
+    svds function based on this. Write sprank function based on svds.
+
+  * Once dmperm is implemented, use the technique to detect permuted
+    triangular matrices. Test the permuted triangular matrix solver code
+
+  * Accelerate the copying of the data from a sparse matrix to a banded matrix
+    in the solvers, that takes a significant portion of the computation time 
+    for narrow matrices. This is not obvious, due to the treatment of zero
+    elements in the matrix. Maybe current solution is optimal.
+
+  * Perhaps split the overly long ::solve functions up, either by the type 
+    of solver, or seperate factorization functions, so that they can be 
+    reused in each of 4 different ::solve functions.
+
+  * Sparse inverse function, based on Andy's code from octave-forge.
+
+  * Implement fourth argument to the sprand and sprandn that the leading
+    brand implements.
+
+  * Mapper functions such as real, imag, abs, etc need to be treated, either
+    with a dispatch or by changing the mapper function code.
+
+  * Write the rest of the sparse docs
+
+  * The algo in TOMS 582 is perfect for symrcm function. However, this is
+    under  the ACM license and can't be used in a GPL program.
+
+    An alternative is that PETSC is GPL compatiable and has a symrcm 
+    implemented from the original SPARSPAK. Its not clear that this is
+    legal to me as I have found no clarification of the original license
+    of SPARSPAK. As PETSC has had this code for over 10 years without
+    problem, we can perhaps assume that there is no issues. Maybe need
+    to contact PETSC people or the SPARSPAK people at uni of waterloo
+    to check issues.
+
+  * Make spalloc(r,c,n) actually create an empty sparse with n non-zero 
+    elements? This allows something like
+
+    sm = spalloc (r,c,n)
+    for j=1:c
+      for i=1:r
+        tmp = foo (i,j);
+        if (tmp != 0.)
+          sm (i,j) = tmp;
+        endif
+      endfor
+    endfor
+
+    actually make sense. Otherwise the above will cause massive amounts
+    of memory reallocation.
+
+    The fact is that this doesn't make sense in any case as the assign
+    function makes another copy of the sparse matrix. So although spalloc
+    might easily be made to have the correct behaviour, the first assign
+    will cause the matrix to be resized !!! There seems to be no simple
+    way to treat this but a complete rewrite of the sparse assignment
+    functions...
+
+  * Port the sparse testing code into the DejaGNU testing code.
+
+  * Treat the dispatching of the splu, spdet, functions, etc within octave
+    itself. This either means that classes need implementing or at the
+    minimum the octave-forge dispatch function is implemented within octave
+
+  * Other missing Functions
+      - eigs
+      - dmperm      Tim Davis is apparently working on something
+      - symmmd      Superseded by symamd
+      - colmmd      Superseded by colamd
+      - sprandsym
+      - symbfact
+      - etreeplot
+      - treeplot
+      - gplot
+      - treelayout
+      - cholinc
+      - condest
+      - normest
+      - bicg
+      - bicgstab
+      - cgs
+      - gmres
+      - lsqr
+      - minres
+      - pcg         Can this be taken from o-forge? Is it compatiable
+      - pcr         Can and should this be taken from o-forge?
+      - qmr
+      - symmlq 
+      - spaugment
+
 --------
 Graphics:
 --------
--- a/doc/ChangeLog	Fri Feb 25 17:42:55 2005 +0000
+++ b/doc/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -1,3 +1,14 @@
+2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	Sparse merge.
+
+	2005-01-07  David Bateman  <dbateman@free.fr>
+
+	* interpreter/sparse.txi: New file.
+	* interpreter/Makefile.in: Add it to the build.
+	* interpreter/octave.texi: Include it in the contents tables and the
+	top level document.
+
 2005-02-25  John W. Eaton  <jwe@octave.org>
 
 	* liboctave/Makefile.in (all): Also depend on Octave-FAQ.pdf.
--- a/doc/interpreter/Makefile.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/doc/interpreter/Makefile.in	Fri Feb 25 19:55:28 2005 +0000
@@ -25,7 +25,7 @@
 	grammar.txi image.txi install.txi intro.txi io.txi \
 	linalg.txi matrix.txi nonlin.txi numbers.txi \
 	op-idx.txi optim.txi plot.txi poly.txi preface.txi \
-	quad.txi quaternion.txi set.txi signal.txi stats.txi \
+	quad.txi quaternion.txi set.txi signal.txi sparse.txi stats.txi \
 	stmt.txi stream.txi strings.txi struct.txi system.txi \
 	tips.txi var.txi vr-idx.txi
 
--- a/doc/interpreter/octave.texi	Fri Feb 25 17:42:55 2005 +0000
+++ b/doc/interpreter/octave.texi	Fri Feb 25 19:55:28 2005 +0000
@@ -138,6 +138,7 @@
 * Arithmetic::                  
 * Linear Algebra::              
 * Nonlinear Equations::         
+* Sparse Matrices::
 * Quadrature::                  
 * Differential Equations::      
 * Optimization::                
@@ -378,6 +379,16 @@
 * Matrix Factorizations::       
 * Functions of a Matrix::       
 
+Sparse Matrices
+
+* Basics::
+* Graph Theory::
+* Sparse Linear Algebra::
+* Iterative Techniques::
+* Oct-Files::
+* License::
+* Function Reference::
+
 Quadrature
 
 * Functions of One Variable::   
@@ -507,6 +518,7 @@
 @include arith.texi
 @include linalg.texi
 @include nonlin.texi
+@include sparse.texi
 @include quad.texi
 @include diffeq.texi
 @include optim.texi
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/interpreter/sparse.txi	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1308 @@
+@c Copyright (C) 2004, 2005 David Bateman
+@c This is part of the Octave manual.
+@c For copying conditions, see the file gpl.texi.
+
+@node Sparse Matrices 
+@chapter Sparse Matrices
+
+@menu
+* Basics:: The Creation and Manipulation of Sparse Matrices
+* Graph Theory:: Graphs are their use with Sparse Matrices
+* Sparse Linear Algebra:: Linear Algebra on Sparse Matrices
+* Iterative Techniques:: Iterative Techniques applied to Sparse Matrices
+* Oct-Files:: Using Sparse Matrices in Oct-files
+* License:: Licensing of Third Party Software
+* Function Reference:: Documentation from the Specific Sparse Functions
+@end menu
+
+@node Basics, Graph Theory, Sparse Matrices, Sparse Matrices
+@section The Creation and Manipulation of Sparse Matrices
+
+The size of mathematical problems that can be treated at any particular
+time is generally limited by the available computing resources. Both,
+the speed of the computer and its available memory place limitation on
+the problem size. 
+
+There are many classes mathematical problems which give rise to
+matrices, where a large number of the elements are zero. In this case
+it makes sense to have a special matrix type to handle this class of
+problems where only the non-zero elements of the matrix are
+stored. Not only done this reduce the amount of memory to store the
+matrix, but it also means that operations on this type of matrix can
+take advantage of the a-priori knowledge of the positions of the
+non-zero elements to accelerate their calculations.
+
+A matrix type that stores only the non-zero elements is generally called
+sparse. It is the purpose of this document to discuss the basics of the
+storage and creation of sparse matrices and the fundamental operations
+on them.
+
+THIS DOCUMENT STILL HAS LARGE BLANKS. PLEASE FILL THEM IN. LOOK FOR
+THE TAG "WRITE ME"
+
+@menu
+* Storage:: Storage of Sparse Matrices
+* Creation:: Creating Sparse Matrices
+* Operators and Functions:: Basic Operators and Functions on Sparse Matrices
+* Information:: Finding out Information about Sparse Matrices
+@end menu
+
+@node Storage, Creation, Basics, Basics
+@subsection Storage of Sparse Matrices
+
+It is not strictly speaking necessary for the user to understand how
+sparse matrices are stored. However, such an understanding will help
+to get an understanding of the size of sparse matrices. Understanding
+the storage technique is also necessary for those users wishing to 
+create their own oct-files. 
+
+There are many different means of storing sparse matrix data. What all
+of the methods have in common is that they attempt to reduce the compelxity
+and storage given a-priori knowledge of the particular class of problems
+that will be solved. A good summary of the available techniques for storing
+sparse matrix is given by Saad @footnote{Youcef Saad "SPARSKIT: A basic toolkit
+for sparse matrix computation", 1994,
+@url{ftp://ftp.cs.umn.edu/dept/sparse/SPARSKIT2/DOC/paper.ps}}.
+With full matrices, knowledge of the point of an element of the matrix
+within the matrix is implied by its position in the computers memory. 
+However, this is not the case for sparse matrices, and so the positions
+of the non-zero elements of the matrix must equally be stored. 
+
+An obvious way to do this is by storing the elements of the matrix as
+triplets, with two elements being the of the position in the array 
+(rows and column) and the third being the data itself. This is conceptually
+easy to grasp, but requires more storage than is strictly needed.
+
+The storage technique used within @sc{Octave} is compressed column
+format.  In this format the position of each element in a row and the
+data are stored as previously. However, if we assume that all elements
+in the same column are stored adjacent in the computers memory, then
+we only need to store information on the number of non-zero elements
+in each column, rather than their positions. Thus assuming that the
+matrix has more non-zero elements than there are columns in the
+matrix, we win in terms of the amount of memory used.
+
+In fact, the column index contains one more element than the number of
+columns, with the first element always being zero. The advantage of
+this is a simplication in the code, in that their is no special case
+for the first or last columns. A short example, demonstrating this in
+C is.
+
+@example
+  for (j = 0; j < nc; j++)
+    for (i = cidx (j); i < cidx(j+1); i++)
+       printf ("non-zero element (%i,%i) is %d\n", ridx(i), j, data(i));
+@end example
+
+A clear understanding might be had by considering an example of how the
+above applies to an example matrix. Consider the matrix
+
+@example
+@group
+    1   2   0  0
+    0   0   0  3
+    0   0   0  4
+@end group
+@end example
+
+The non-zero elements of this matrix are
+
+@example
+@group
+   (1, 1)  @result{} 1
+   (1, 2)  @result{} 2
+   (2, 4)  @result{} 3
+   (3, 4)  @result{} 4
+@end group
+@end example
+
+This will be stored as three vectors @var{cidx}, @var{ridx} and @var{data},
+representing the column indexing, row indexing and data respectively. The
+contents of these three vectors for the above matrix will be
+
+@example
+@group
+  @var{cidx} = [0, 2, 2, 4]
+  @var{ridx} = [0, 0, 1, 2]
+  @var{data} = [1, 2, 3, 4]
+@end group
+@end example
+
+Note that this is the representation of these elements with the first row
+and column assumed to start as zero. Thus the number of elements in the 
+@var{i}-th column is given by @code{@var{cidx} (@var{i} + 1) - 
+@var{cidx} (@var{i})}.
+
+It should be noted that compressed row formats are equally possible. However,
+in the context of mixed operations between mixed sparse and dense matrices,
+it makes sense that the elements of the sparse matrices are in the same
+order as the dense matrices. @sc{Octave} stores dense matrices in column
+major ordering, and so sparse matrices are equally stored in this manner.
+
+A further constraint on the sparse matrix storage used by @sc{Octave} is that 
+all elements in the rows are stored in increasing order of their row
+index. This makes certain operations, later be faster. However, it imposes
+the need to sort the elements on the creation of sparse matrices. Having
+dis-ordered elements is potentially an advantage in that it makes operations
+such as concatenating two sparse matrices together easier and faster, however
+it adds complexity and speed problems elsewhere.
+
+@node Creation, Operators and Functions, Storage, Basics
+@subsection Creating Sparse Matrices
+
+There are several means to create sparse matrix.
+
+@table @asis
+@item Returned from a function
+There are many functions that directly return sparse matrices. These include
+@dfn{speye}, @dfn{sprand}, @dfn{spdiag}, etc.
+@item Constructed from matrices or vectors
+The function @dfn{sparse} allows a sparse matrix to be constructed from 
+three vectors representing the row, column and data. ALternatively, the
+function @dfn{spconvert} uses a three column matrix format to allow easy
+importation of data from elsewhere.
+@item Created and then filled
+The function @dfn{sparse} or @dfn{spalloc} can be used to create an empty
+matrix that is then filled by the user
+@item From a user binary program
+The user can directly create the sparse matrix within an oct-file.
+@end table
+
+There are several basic functions to return specific sparse
+matrices. For example the sparse identity matrix, is a matrix that is
+often needed. It therefore has its own function to create it as
+@code{speye (@var{n})} or @code{speye (@var{r}, @var{c})}, which
+creates an @var{n}-by-@var{n} or @var{r}-by-@var{c} sparse identity
+matrix.
+
+Another typical sparse matrix that is often needed is a random distribution
+of random elements. The functions @dfn{sprand} and @dfn{sprandn} perform
+this for uniform and random distributions of elements. They have exactly
+the same calling convention as @code{sprand (@var{r}, @var{c}, @var{d})},
+which creates an @var{r}-by-@var{c} sparse matrix a density of filled
+elements of @var{d}.
+
+Other functions of interest that directly creates a sparse matrix, are
+@dfn{spdiag} or its generalization @dfn{spdiags}, that can take the
+definition of the diagonals of the matrix and create the sparse matrix 
+that corresponds to this. For example
+
+@c FIXME, when spdiag is overloaded to diag the below won't work. 
+
+@example
+s = spdiag (randn(1,n), -1);
+@end example
+
+creates a sparse (@var{n}+1)-by-(@var{n}+1) sparse matrix with a single
+diagonal defined.
+
+The recommended way for the user to create a sparse matrix, is to create 
+two vectors contain the row and column index of the data and a third
+vector of the same size containing the data to be stored. For example
+
+@example
+ function x = foo (r, j)
+  idx = randperm (r);
+  x = ([zeros(r-2,1); rand(2,1)])(idx);
+ endfunction
+
+ ri = [];
+ ci = [];
+ d = [];
+
+ for j=1:c
+    dtmp = foo (r, j);  # Returns vector of length r with (:,j) values
+    idx = find (dtmp != 0.);
+    ri = [ri; idx];
+    ci = [ci; j*ones(length(idx),1)]; 
+    d = [d; dtmp(idx)];
+ endfor
+ s = sparse (ri, ci, d, r, c);
+@end example
+
+creates an @var{r}-by-@var{c} sparse matrix with a random distribution of
+2 elements per row. The elements of the vectors do not need to be sorted in
+any particular order as @sc{Octave} will store them prior to storing the
+data. However, per sorting the data will make teh creation of the sparse
+matrix faster.
+
+The function @dfn{spconvert} takes a three or four column real matrix.
+The first two columns represent the row and column index respectively and
+the third and four columns, the real and imaginary parts of the sparse
+matrix. The matrix can contain zero elements and the elements can be 
+sorted in any order. Adding zero elements is a convenient way to define
+the size of the sparse matrix. For example
+
+@example
+s = spconvert ([1 2 3 4; 1 3 4 4; 1 2 3 0]')
+@result{} Compressed Column Sparse (rows=4, cols=4, nnz=3)
+      (1 , 1) -> 1
+      (2 , 3) -> 2
+      (3 , 4) -> 3
+@end example
+
+An example of creating and filling a matrix might be
+
+@example
+k = 5;
+nz = r * k;
+s = spalloc (r, c, nz)
+for j = 1:c
+  idx = randperm (r);
+  s (:, j) = [zeros(r - k, 1); rand(k, 1)] (idx);
+endfor
+@end example
+
+It should be noted, that due to the way that the @sc{Octave}
+assignment functions are written that the assignment will reallocate
+the memory used by the sparse matrix at each iteration. Therefore the
+@dfn{spalloc} function ignores the @var{nz} argument and does not
+preassign the memory for the matrix. Therefore, it is vitally
+important that code using to above structure should be as vectorized
+as possible to minimize the number of assignments and reduce the
+number of memory allocations.
+
+The above problem can be avoided in oct-files. However, the
+construction of a sparse matrix from an oct-file is more complex than
+can be discussed in this brief introduction, and you are referred to
+section @ref{Oct-Files}, to have a full description of the techniques
+involved.
+
+@node Operators and Functions, Information, Creation, Basics
+@subsection Basic Operators and Functions on Sparse Matrices
+
+@menu
+* Functions:: Operators and Functions
+* ReturnType:: The Return Types of Operators and Functions
+* MathConsiderations:: Mathematical Considerations
+@end menu
+
+@node Functions, ReturnType, Operators and Functions, Operators and Functions
+@subsubsection Operators and Functions
+
+WRITE ME
+
+@node ReturnType, MathConsiderations, Functions, Operators and Functions
+@subsubsection The Return Types of Operators and Functions
+
+The two basic reason to use sparse matrices are to reduce the memory 
+usage and to not have to do calculations on zero elements. The two are
+closely related in that the computation time on a sparse matrix operator
+or function is roughly linear with the numberof non-zero elements.
+
+Therefore, there is a certain density of non-zero elements of a matrix 
+where it no longer makes sense to store it as a sparse matrix, but rather
+as a full matrix. For this reason operators and functions that have a 
+high probability of returning a full matrix will always return one. For
+example adding a scalar constant to a sparse matrix will almost always
+make it a full matrix, and so the example
+
+@example
+speye(3) + 0
+@result{}   1  0  0
+  0  1  0
+  0  0  1
+@end example
+
+returns a full matrix as can be seen. Additionally all sparse functions
+test the amount of memory occupied by the sparse matrix to see if the 
+amount of storage used is larger than the amount used by the full 
+equivalent. Therefore @code{speye (2) * 1} will return a full matrix as
+the memory used is smaller for the full version than the sparse version.
+
+As all of the mixed operators and functions between full and sparse 
+matrices exist, in general this does not cause any problems. However,
+one area where it does cause a problem is where a sparse matrix is
+promoted to a full matrix, where subsequent operations would resparsify
+the matrix. Such cases as rare, but can be artificially created, for
+example @code{(fliplr(speye(3)) + speye(3)) - speye(3)} gives a full
+matrix when it should give a sparse one. In general, where such cases 
+occur, they impose only a small memory penalty.
+
+There is however one known case where this behaviour of @sc{Octave}'s
+sparse matrices will cause a problem. That is in the handling of the
+@dfn{diag} function. Whether @dfn{diag} returns a sparse or full matrix
+depending on the type of its input arguments. So 
+
+@example
+ a = diag (sparse([1,2,3]), -1);
+@end example
+
+should return a sparse matrix. To ensure this actually happens, the
+@dfn{sparse} function, and other functions based on it like @dfn{speye}, 
+always returns a sparse matrix, even if the memory used will be larger 
+than its full representation.
+
+@node MathConsiderations, , ReturnType, Operators and Functions
+@subsubsection Mathematical Considerations
+
+The attempt has been made to make sparse matrices behave in exactly the
+same manner as there full counterparts. However, there are certain differences
+and especially differences with other products sparse implementations.
+
+Firstly, the "./" and ".^" operators must be used with care. Consider what
+the examples
+
+@example
+  s = speye (4);
+  a1 = s .^ 2;
+  a2 = s .^ s;
+  a3 = s .^ -2;
+  a4 = s ./ 2;
+  a5 = 2 ./ s;
+  a6 = s ./ s;
+@end example
+
+will give. The first example of @var{s} raised to the power of 2 causes
+no problems. However @var{s} raised element-wise to itself involves a
+a large number of terms @code{0 .^ 0} which is 1. There @code{@var{s} .^
+@var{s}} is a full matrix. 
+
+Likewise @code{@var{s} .^ -2} involves terms terms like @code{0 .^ -2} which
+is infinity, and so @code{@var{s} .^ -2} is equally a full matrix.
+
+For the "./" operator @code{@var{s} ./ 2} has no problems, but 
+@code{2 ./ @var{s}} involves a large number of infinity terms as well
+and is equally a full matrix. The case of @code{@var{s} ./ @var{s}}
+involves terms like @code{0 ./ 0} which is a @code{NaN} and so this
+is equally a full matrix with the zero elements of @var{s} filled with
+@code{NaN} values.
+
+The above behaviour is consistent with full matrices, but is not 
+consistent with sparse implementations in other products.
+
+A particular problem of sparse matrices comes about due to the fact that
+as the zeros are not stored, the sign-bit of these zeros is equally not
+stored... In certain cases the sign-bit of zero is important. For example
+
+@example
+ a = 0 ./ [-1, 1; 1, -1];
+ b = 1 ./ a
+ @result{} -Inf            Inf
+     Inf           -Inf
+ c = 1 ./ sparse (a)
+ @result{}  Inf            Inf
+     Inf            Inf
+@end example
+ 
+To correct this behaviour would mean that zero elements with a negative
+sign-bit would need to be stored in the matrix to ensure that their 
+sign-bit was respected. This is not done at this time, for reasons of
+efficient, and so the user is warned that calculations where the sign-bit
+of zero is important must not be done using sparse matrices.
+
+Also discuss issues of fill-in. Discuss symamd etc, and mention randperm
+that is included  elsewhere in the docs...
+
+WRITE ME
+
+@node Information, , Operators and Functions, Basics
+@subsection Finding out Information about Sparse Matrices
+
+Talk about the spy, spstats, nnz, spparms, etc function
+
+WRITE ME
+
+@node Graph Theory, Sparse Linear Algebra, Basics, Sparse Matrices
+@section Graphs are their use with Sparse Matrices
+
+Someone who knows more about this than me should write this...
+
+WRITE ME
+
+@node Sparse Linear Algebra, Iterative Techniques, Graph Theory, Sparse Matrices
+@section Linear Algebra on Sparse Matrices
+
+@sc{Octave} includes a poly-morphic solver for sparse matrices, where 
+the exact solver used to factorize the matrix, depends on the properties
+of the sparse matrix, itself. As the cost of determining the matrix type
+is small relative to the cost of factorizing the matrix itself, the matrix
+type is re-determined each time it is used in a linear equation.
+
+The selection tree for how the linear equation is solve is
+
+@enumerate 1
+@item If the matrix is not square go to 9.
+
+@item If the matrix is diagonal, solve directly and goto 9
+
+@item If the matrix is a permuted diagonal, solve directly taking into
+account the permutations. Goto 9
+
+@item If the matrix is banded and if the band density is less than that
+given by @code{spparms ("bandden")} continue, else goto 5.
+
+@enumerate a
+@item If the matrix is tridiagonal and the right-hand side is not sparse 
+continue, else goto 4b.
+
+@enumerate
+@item If the matrix is hermitian, with a positive real diagonal, attempt
+      Cholesky factorization using @sc{Lapack} xPTSV.
+
+@item If the above failed or the matrix is not hermitian with a positive
+      real diagonal use Gaussian elimination with pivoting using 
+      @sc{Lapack} xGTSV, and goto 9.
+@end enumerate
+
+@item If the matrix is hermitian with a positive real diagonal, attempt
+      Cholesky factorization using @sc{Lapack} xPBTRF.
+
+@item if the above failed or the matrix is not hermitian with a positive
+      real diagonal use Gaussian elimination with pivoting using 
+      @sc{Lapack} xGBTRF, and goto 9.
+@end enumerate
+
+@item If the matrix is upper or lower triangular perform a sparse forward
+or backward subsitution, and goto 9
+
+@item If the matrix is a permuted upper or lower triangular matrix, perform
+a sparse forward or backward subsitution, and goto 9
+
+FIXME: Detection of permuted triangular matrices not written yet, and so
+       the code itself is not tested either
+
+@item If the matrix is hermitian with a real positive diagonal, attempt
+sparse Cholesky factorization.
+
+FIXME: Detection of positive definite matrices written and tested, but 
+   Cholesky factorization isn't yet written
+
+@item If the sparse Cholesky factorization failed or the matrix is not
+hermitian with a real positive diagonal, factorize using UMFPACK.
+
+@item If the matrix is not square, or any of the previous solvers flags
+a singular or near singular matrix, find a minimum norm solution
+
+FIXME: QR solvers not yet written.
+
+@end enumerate
+
+The band density is defined as the number of non-zero values in the matrix
+divided by the number of non-zero values in the matrix. The banded matrix
+solvers can be entirely disabled by using @dfn{spparms} to set @code{bandden}
+to 1 (i.e. @code{spparms ("bandden", 1)}).
+
+All of the solvers above, expect the banded solvers, calculate an
+estimate of the condition number. This can be used to detect numerical
+stability problems in the solution and force a minimum norm solution
+to be used. However, for narrow banded matrices, the cost of
+calculating the condition number is significant, and can in fact exceed
+the cost of factoring the matrix. Therefore the condition number is
+not calculated for banded matrices, and therefore unless the factorization
+is exactly singular, these numerical instabilities won't be detected.
+In cases where, this might be a problem the user is recommended to disable
+the banded solvers as above, at a significant cost in terms of speed.
+
+@node Iterative Techniques, Oct-Files, Sparse Linear Algebra, Sparse Matrices
+@section Iterative Techniques applied to sparse matrices
+
+WRITE ME
+
+@node Oct-Files, License, Iterative Techniques, Sparse Matrices
+@section Using Sparse Matrices in Oct-files
+
+An oct-file is a means of writing an @sc{Octave} function in a compilable
+language like C++, rather than as a script file. This results in a
+significant acceleration in the code.  It is not the purpose of this
+section to discuss how to write an oct-file, or discuss what they
+are. There are already two @footnote{Paul Thomas "Dal Segno al Coda 
+- The octave dynamically linked function cookbook", 
+@url{http://perso.wanadoo.fr/prthomas/intro.html}, and Cristophe Spiel 
+"Del Coda Al Fine - Pushing Octave's Limits", 
+@url{http://octave.sourceforge.net/coda/coda.pdf}} very good
+references on oct-files themselves. Users who are not familiar with
+oct-files are urged to read these references to fully understand this
+chapter. The examples discussed here assume that the oct-file is written 
+entirely in C++.
+
+There are three classes of sparse objects that are of interest to the
+user.
+
+@table @asis
+@item SparseMatrix
+A double precision sparse matrix class
+@item SparseComplexMatrix
+A Complex sparse matrix class
+@item SparseBoolMatrix
+A boolen sparse matrix class
+@end table
+
+All of these classes inherit from the @code{Sparse<T>} template class,
+and so all have similar capabilities and usage. The @code{Sparse<T>}
+class was based on @sc{Octave} @code{Array<T>} class, and so users familar
+with @sc{Octave}'s Array classes will be comfortable with the use of
+the sparse classes.
+
+The sparse classes will not be entirely described in this section, due
+to their similar with the existing Array classes. However, there are a
+few differences due the different nature of sparse objects, and these
+will be described. Firstly, although it is fundamentally possible to
+have N-dimensional sparse objects, the @sc{Octave} sparse classes do
+not allow them at this time. So all operations of the sparse classes
+must be 2-dimensional.  This means that in fact @code{SparseMatrix} is
+similar to @sc{Octave}'s @code{Matrix} class rather than its
+@code{NDArray} class.
+
+@menu
+* OctDifferences:: The Differences between the Array and Sparse Classes
+* OctCreation:: Creating Spare Matrices in Oct-Files
+* OctUse:: Using Sparse Matrices in Oct-Files
+@end menu
+
+@node OctDifferences, OctCreation, Oct-Files, Oct-Files
+@subsection The Differences between the Array and Sparse Classes
+
+The number of elements in a sparse matrix is considered to be the number
+of non-zero elements rather than the product of the dimensions. Therefore
+
+@example
+  SparseMatrix sm;
+  @dots{}
+  int nel = sm.nelem ();
+@end example
+
+returns the number of non-zero elements. If the user really requires the 
+number of elements in the matrix, including the non-zero elements, they
+should use @code{numel} rather than @code{nelem}. Note that for very 
+large matrices, where the product of the two dimensions is large that
+the representation of the an unsigned int, then @code{numel} can overflow.
+An example is @code{speye(1e6)} which will create a matrix with a million
+rows and columns, but only a million non-zero elements. Therefore the
+number of rows by the number of columns in this case is more than two
+hundred times the maximum value that can be represented by an unsigned int.
+The use of @code{numel} should therefore be avoided useless it is known
+it won't overflow.
+
+Extreme care must be take with the elem method and the "()" operator,
+which perform basically the same function. The reason is that if a
+sparse object is non-const, then @sc{Octave} will assume that a
+request for a zero element in a sparse matrix is in fact a request 
+to create this element so it can be filled. Therefore a piece of
+code like
+
+@example
+  SparseMatrix sm;
+  @dots{}
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      std::cerr << " (" << i << "," << j << "): " << sm(i,j) 
+                << std::endl;
+@end example
+
+is a great way of turning the sparse matrix into a dense one, and a
+very slow way at that since it reallocates the sparse object at each
+zero element in the matrix.
+
+An easy way of preventing the above from hapening is to create a temporary
+constant version of the sparse matrix. Note that only the container for
+the sparse matrix will be copied, while the actual representation of the
+data will be shared between the two versions of the sparse matrix. So this
+is not a costly operation. For example, the above would become
+
+@example
+  SparseMatrix sm;
+  @dots{}
+  const SparseMatrix tmp (sm);
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      std::cerr << " (" << i << "," << j << "): " << tmp(i,j) 
+                << std::endl;
+@end example
+
+Finally, as the sparse types aren't just represented as a contiguous
+block of memory, the @code{fortran_vec} method of the @code{Array<T>}
+is not available. It is however replaced by three seperate methods
+@code{ridx}, @code{cidx} and @code{data}, that access the raw compressed
+column format that the @sc{Octave} sparse matrices are stored in.
+Additionally, these methods can be used in a manner similar to @code{elem},
+to allow the matrix to be accessed or filled. However, in that case it is
+up to the user to repect the sparse matrix compressed column format
+discussed previous.
+
+@node OctCreation, OctUse, OctDifferences, Oct-Files
+@subsection Creating Spare Matrices in Oct-Files
+
+The user has several alternatives in how to create a sparse matrix.
+They can first create the data as three vectors representing the
+row and column indexes and the data, and from those create the matrix.
+Or alternatively, they can create a sparse matrix with the appropriate
+amount of space and then fill in the values. Both techniques have their
+advantages and disadvantages.
+
+An example of how to create a small sparse matrix with the first technique
+might be seen the example
+
+@example
+  int nz = 4, nr = 3, nc = 4;
+  ColumnVector ridx (nz);
+  ColumnVector cidx (nz);
+  ColumnVector data (nz);
+
+  ridx(0) = 0; ridx(1) = 0; ridx(2) = 1; ridx(3) = 2;
+  cidx(0) = 0; cidx(1) = 1; cidx(2) = 3; cidx(3) = 3;
+  data(0) = 1; data(1) = 2; data(2) = 3; data(3) = 4;
+
+  SparseMatrix sm (data, ridx, cidx, nr, nc);
+@end example
+
+which creates the matrix given in section @ref{Storage}. Note that 
+the compressed matrix format is not used at the time of the creation
+of the matrix itself, however it is used internally. 
+
+As previously mentioned, the values of the sparse matrix are stored
+in increasing column-major ordering. Although the data passed by the
+user does not need to respect this requirement, the pre-sorting the
+data significantly speeds up the creation of the sparse matrix.
+
+The disadvantage of this technique of creating a sparse matrix is
+that there is a brief time where two copies of the data exists. Therefore
+for extremely memory constrained problems this might not be the right
+technique to create the sparse matrix.
+
+The alternative is to first create the sparse matrix with the desired
+number of non-zero elements and then later fill those elements in. The
+easiest way to do this is 
+
+@example 
+  int nz = 4, nr = 3, nc = 4;
+  SparseMatrix sm (nr, nc, nz);
+  sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4;
+@end example
+
+That creates the same matrix as previously. Again, although it is not
+strictly necessary, it is significantly faster if the sparse matrix is
+created in this manner that the elements are added in column-major
+ordering. The reason for this is that if the elements are inserted
+at the end of the current list of known elements then no element
+in the matrix needs to be moved to allow the new element to be
+inserted. Only the column indexes need to be updated.
+
+There are a few further points to note about this technique of creating
+a sparse matrix. Firstly, it is not illegal to create a sparse matrix 
+with fewer elements than are actually inserted in the matrix. Therefore
+
+@example 
+  int nz = 4, nr = 3, nc = 4;
+  SparseMatrix sm (nr, nc, 0);
+  sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4;
+@end example
+
+is perfectly legal. However it is a very bad idea. The reason is that 
+as each new element is added to the sparse matrix the space allocated
+to it is increased by reallocating the memory. This is an expensive
+operation, that will significantly slow this means of creating a sparse
+matrix. Furthermore, it is not illegal to create a sparse matrix with 
+too much storage, so having @var{nz} above equaling 6 is also legal.
+The disadvantage is that the matrix occupies more memory than strictly
+needed.
+
+It is not always easy to known the number of non-zero elements prior
+to filling a matrix. For this reason the additional storage for the
+sparse matrix can be removed after its creation with the
+@dfn{maybe_compress} function. Furthermore, the maybe_compress can
+deallocate the unused storage, but it can equally remove zero elements
+from the matrix.  The removal of zero elements from the matrix is
+controlled by setting the argument of the @dfn{maybe_compress} function
+to be 'true'. However, the cost of removing the zeros is high because it
+implies resorting the elements. Therefore, if possible it is better
+is the user doesn't add the zeros in the first place. An example of
+the use of @dfn{maybe_compress} is
+
+@example
+  int nz = 6, nr = 3, nc = 4;
+  SparseMatrix sm1 (nr, nc, nz);
+  sm1(0,0) = 1; sm1(0,1) = 2; sm1(1,3) = 3; sm1(2,3) = 4;
+  sm1.maybe_compress ();  // No zero elements were added
+
+  SparseMatrix sm2 (nr, nc, nz);
+  sm2(0,0) = 1; sm2(0,1) = 2; sm(0,2) = 0; sm(1,2) = 0; 
+  sm1(1,3) = 3; sm1(2,3) = 4;
+  sm2.maybe_compress (true);  // Zero elements were added
+@end example
+
+The use of the @dfn{maybe_compress} function should be avoided if
+possible, as it will slow the creation of the matrices.
+
+A third means of creating a sparse matrix is to work directly with
+the data in compressed row format. An example of this technique might
+be
+
+@c Note the @verbatim environment is a relatively new addition to texinfo.
+@c Therefore use the @example environment and replace @, with @@, 
+@c { with @{, etc
+
+@example
+  octave_value arg;
+  
+  @dots{}
+
+  int nz = 6, nr = 3, nc = 4;   // Assume we know the max no nz 
+  SparseMatrix sm (nr, nc, nz);
+  Matrix m = arg.matrix_value ();
+
+  int ii = 0;
+  sm.cidx (0) = 0;
+  for (int j = 1; j < nc; j++)
+    @{
+      for (int i = 0; i < nr; i++)
+        @{
+          double tmp = foo (m(i,j));
+          if (tmp != 0.)
+            @{
+              sm.data(ii) = tmp;
+              sm.ridx(ii) = i;
+              ii++;
+            @}
+        @}
+      sm.cidx(j+1) = ii;
+   @}
+  sm.maybe_mutate ();  // If don't know a-priori the final no of nz.
+@end example
+
+which is probably the most efficient means of creating the sparse matrix.
+
+Finally, it might sometimes arise that the amount of storage initially
+created is insufficient to completely store the sparse matrix. Therefore,
+the method @code{change_capacity} exists to reallocate the sparse memory.
+The above example would then be modified as 
+
+@example
+  octave_value arg;
+  
+  @dots{}
+
+  int nz = 6, nr = 3, nc = 4;   // Assume we know the max no nz 
+  SparseMatrix sm (nr, nc, nz);
+  Matrix m = arg.matrix_value ();
+
+  int ii = 0;
+  sm.cidx (0) = 0;
+  for (int j = 1; j < nc; j++)
+    @{
+      for (int i = 0; i < nr; i++)
+        @{
+          double tmp = foo (m(i,j));
+          if (tmp != 0.)
+            @{
+              if (ii == nz)
+                @{
+                  nz += 2;   // Add 2 more elements
+                  sm.change_capacity (nz);
+                @}
+              sm.data(ii) = tmp;
+              sm.ridx(ii) = i;
+              ii++;
+            @}
+        @}
+      sm.cidx(j+1) = ii;
+   @}
+  sm.maybe_mutate ();  // If don't know a-priori the final no of nz.
+@end example
+
+Note that both increasing and decreasing the number of non-zero elements in
+a sparse matrix is expensive, as it involves memory reallocation. Also as
+parts of the matrix, though not its entirety, exist as the old and new copy
+at the same time, additional memory is needed. Therefore if possible this
+should be avoided.
+
+@node OctUse, , OctCreation, Oct-Files
+@subsection Using Sparse Matrices in Oct-Files
+
+Most of the same operators and functions on sparse matrices that are
+available from the @sc{Octave} are equally available with oct-files.
+The basic means of extracting a sparse matrix from an @code{octave_value}
+and returning them as an @code{octave_value}, can be seen in the
+following example
+
+@example
+   octave_value_list retval;
+
+   SparseMatrix sm = args(0).sparse_matrix_value ();
+   SparseComplexMatrix scm = args(1).sparse_complex_matrix_value ();
+   SparseBoolMatrix sbm = args(2).sparse_bool_matrix_value ();
+
+   @dots{}
+
+   retval(2) = sbm;
+   retval(1) = scm;
+   retval(0) = sm;
+@end example
+
+The conversion to an octave-value is handled by the sparse
+@code{octave_value} constructors, and so no special care is needed.
+
+@node License, Function Reference, Oct-Files, Sparse Matrices
+@section Licensing of Third Party Software
+
+There are several third party software packages used by the @sc{Octave}
+sparse matrix.
+
+@table @asis
+@item COLAMD
+is used for the @dfn{colamd} and @dfn{symamd} functions.
+
+@table @asis
+@item Authors
+The authors of the code itself are Stefan I. Larimore and Timothy A.
+Davis (davis@@cise.ufl.edu), University of Florida.  The algorithm was
+developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+Ng, Oak Ridge National Laboratory.
+
+@item License
+Copyright @copyright{} 1998-2003 by the University of Florida.
+All Rights Reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use, copy, modify, and/or distribute
+this program, provided that the Copyright, this License, and the
+Availability of the original version is retained on all copies and made
+accessible to the end-user of any code or package that includes COLAMD
+or any modified version of COLAMD. 
+
+@item Availability
+@url{http://www.cise.ufl.edu/research/sparse/colamd/}
+@end table
+
+@item UMFPACK
+is used in various places with the sparse types, including the
+LU decomposition and solvers.
+
+@table @asis
+@item License
+UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by
+Timothy A. Davis.  All Rights Reserved.
+
+Your use or distribution of UMFPACK or any modified version of
+UMFPACK implies that you agree to this License.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program, provided
+that the Copyright, this License, and the Availability of the original
+version is retained on all copies.  User documentation of any code that
+uses UMFPACK or any modified version of UMFPACK code must cite the
+Copyright, this License, the Availability note, and 'Used by permission.'
+Permission to modify the code and to distribute modified code is granted,
+provided the Copyright, this License, and the Availability note are
+retained, and a notice that the code was modified is included.  This
+software was developed with support from the National Science Foundation,
+and is provided to you free of charge.
+
+@item Availability
+@url{http://www.cise.ufl.edu/research/sparse/umfpack/}
+@end table
+@end table
+
+@node Function Reference, , License, Sparse Matrices
+@section Function Reference
+
+@iftex
+@subsection Functions by Category
+@subsubsection Generate sparse matrix
+@table @asis
+@item spdiags
+A generalization of the function `spdiag'.
+@item speye
+Returns a sparse identity matrix.
+@item sprand
+Generate a random sparse matrix.
+@item sprandn
+Generate a random sparse matrix.
+@item sprandsym
+@emph{Not implemented}
+@end table
+@subsubsection Sparse matrix conversion
+@table @asis
+@item full
+returns a full storage matrix from a sparse one See also: sparse
+@item sparse
+SPARSE: create a sparse matrix
+@item spconvert
+This function converts for a simple sparse matrix format easily produced by other programs into Octave's internal sparse format.
+@item spfind
+SPFIND: a sparse version of the find operator 1.
+@end table
+@subsubsection Manipulate sparse matrices
+@table @asis
+@item issparse
+Return 1 if the value of the expression EXPR is a sparse matrix.
+@item nnz
+returns number of non zero elements in SM See also: sparse
+@item nonzeros
+Returns a vector of the non-zero values of the sparse matrix S
+@item nzmax
+Returns the amount of storage allocated to the sparse matrix SM.
+@item spalloc
+Returns an empty sparse matrix of size R-by-C.
+@item spfun
+Compute `f(X)' for the non-zero values of X This results in a sparse matrix with the same structure as X.
+@item spones
+Replace the non-zero entries of X with ones.
+@item spy
+Plot the sparsity pattern of the sparse matrix X
+@end table
+@subsubsection Graph Theory
+@table @asis
+@item etree
+Returns the elimination tree for the matrix S.
+@item etreeplot
+@emph{Not implemented}
+@item gplot
+@emph{Not implemented}
+@item treelayout
+@emph{Not implemented}
+@item treeplot
+@emph{Not implemented}
+@end table
+@subsubsection Sparse matrix reordering
+@table @asis
+@item colamd
+Column approximate minimum degree permutation.
+@item colperm
+Returns the column permutations such that the columns of `S (:, P)' are ordered in terms of increase number of non-zero elements.
+@item dmperm
+Perfrom a Deulmage-Mendelsohn permutation on the sparse matrix S.
+@item symamd
+For a symmetric positive definite matrix S, returns the permutation vector p such that `S (P, P)' tends to have a sparser Cholesky factor than S.
+@item symrcm
+Returns the Reverse Cuthill McKee reordering of the sparse matrix S.
+@end table
+@subsubsection Linear algebra
+@table @asis
+@item cholinc
+@emph{Not implemented}
+@item condest
+@emph{Not implemented}
+@item eigs
+@emph{Not implemented}
+@item normest
+@emph{Not implemented}
+@item spdet
+Compute the determinant of sparse matrix A using UMFPACK.
+@item spinv
+Compute the inverse of the square matrix A.
+@item splu
+Compute the LU decomposition of the sparse matrix A, using subroutines from UMFPACK.
+@item sprank
+@emph{Not implemented}
+@item svds
+@emph{Not implemented}
+@end table
+@subsubsection Iterative techniques
+@table @asis
+@item bicg
+@emph{Not implemented}
+@item bicgstab
+@emph{Not implemented}
+@item cgs
+@emph{Not implemented}
+@item gmres
+@emph{Not implemented}
+@item lsqr
+@emph{Not implemented}
+@item minres
+@emph{Not implemented}
+@item pcg
+@emph{Not implemented}
+@item pcr
+@emph{Not implemented}
+@item qmr
+@emph{Not implemented}
+@item symmlq
+@emph{Not implemented}
+@end table
+@subsubsection Miscellaneous
+@table @asis
+@item spaugment
+@emph{Not implemented}
+@item spparms
+Sets or displays the parameters used by the sparse solvers and factorization functions.
+@item symbfact
+Performs a symbolic factorization analysis on the sparse matrix S.
+@item spstats
+Return the stats for the non-zero elements of the sparse matrix S COUNT is the number of non-zeros in each column, MEAN is the mean of the non-zeros in each column, and VAR is the variance of the non-zeros in each column
+@item spprod
+Product of elements along dimension DIM.
+@item spcumprod
+Cumulative product of elements along dimension DIM.
+@item spcumsum
+Cumulative sum of elements along dimension DIM.
+@item spsum
+Sum of elements along dimension DIM.
+@item spsumsq
+Sum of squares of elements along dimension DIM.
+@item spmin
+For a vector argument, return the minimum value.
+@item spmax
+For a vector argument, return the maximum value.
+@item spatan2
+Compute atan (Y / X) for corresponding sparse matrix elements of Y and X.
+@item spdiag
+Return a diagonal matrix with the sparse vector V on diagonal K.
+@item spreshape
+Return a sparse matrix with M rows and N columns whose elements are taken from the sparse matrix A.
+@end table
+
+@subsection Functions Alphabetically
+@end iftex
+
+@menu
+* colamd::	Column approximate minimum degree permutation.
+* colperm::	Returns the column permutations such that the columns of `S
+		(:, P)' are ordered in terms of increase number of non-zero
+		elements.
+* dmperm::	Perfrom a Deulmage-Mendelsohn permutation on the sparse
+		matrix S.
+* etree::	Returns the elimination tree for the matrix S.
+* full::	returns a full storage matrix from a sparse one See also:
+		sparse
+* issparse::	Return 1 if the value of the expression EXPR is a sparse
+		matrix.
+* nnz:: 	returns number of non zero elements in SM See also: sparse
+* nonzeros::	Returns a vector of the non-zero values of the sparse
+		matrix S
+* nzmax::	Returns the amount of storage allocated to the sparse
+		matrix SM.
+* spalloc::	Returns an empty sparse matrix of size R-by-C.
+* sparse::	SPARSE: create a sparse matrix
+* spatan2::	Compute atan (Y / X) for corresponding sparse matrix
+		elements of Y and X.
+* spconvert::	This function converts for a simple sparse matrix format
+		easily produced by other programs into Octave's internal
+		sparse format.
+* spcumprod::	Cumulative product of elements along dimension DIM.
+* spcumsum::	Cumulative sum of elements along dimension DIM.
+* spdet::	Compute the determinant of sparse matrix A using UMFPACK.
+* spdiag::	Return a diagonal matrix with the sparse vector V on
+		diagonal K.
+* spdiags::	A generalization of the function `spdiag'.
+* speye::	Returns a sparse identity matrix.
+* spfind::	SPFIND: a sparse version of the find operator 1.
+* spfun::	Compute `f(X)' for the non-zero values of X This results in
+		a sparse matrix with the same structure as X.
+* spinv::	Compute the inverse of the square matrix A.
+* splu::	Compute the LU decomposition of the sparse matrix A, using
+		subroutines from UMFPACK.
+* spmax::	For a vector argument, return the maximum value.
+* spmin::	For a vector argument, return the minimum value.
+* spones::	Replace the non-zero entries of X with ones.
+* spparms::	Sets or displays the parameters used by the sparse solvers
+		and factorization functions.
+* spprod::	Product of elements along dimension DIM.
+* sprand::	Generate a random sparse matrix.
+* sprandn::	Generate a random sparse matrix.
+* spreshape::	Return a sparse matrix with M rows and N columns whose
+		elements are taken from the sparse matrix A.
+* spstats::	Return the stats for the non-zero elements of the sparse
+		matrix S COUNT is the number of non-zeros in each column,
+		MEAN is the mean of the non-zeros in each column, and VAR
+		is the variance of the non-zeros in each column
+* spsum::	Sum of elements along dimension DIM.
+* spsumsq::	Sum of squares of elements along dimension DIM.
+* spy:: 	Plot the sparsity pattern of the sparse matrix X
+* symamd::	For a symmetric positive definite matrix S, returns the
+		permutation vector p such that `S (P, P)' tends to have a
+		sparser Cholesky factor than S.
+* symbfact::	Performs a symbolic factorization analysis on the sparse
+		matrix S.
+* symrcm::	Returns the Reverse Cuthill McKee reordering of the sparse
+		matrix S.
+@end menu
+
+@node colamd, colperm, , Function Reference
+@subsubsection colamd
+
+@DOCSTRING(colamd)
+
+@node colperm, dmperm, colamd, Function Reference
+@subsubsection colperm
+
+@DOCSTRING(colperm)
+
+@node dmperm, etree, colperm, Function Reference
+@subsubsection dmperm
+
+@DOCSTRING(dmperm)
+
+@node etree, full, dmperm, Function Reference
+@subsubsection etree
+
+@DOCSTRING(etree)
+
+@node full, issparse, etree, Function Reference
+@subsubsection full
+
+@DOCSTRING(full)
+
+@node issparse, nnz, full, Function Reference
+@subsubsection issparse
+
+@DOCSTRING(issparse)
+
+@node nnz, nonzeros, issparse, Function Reference
+@subsubsection nnz
+
+@DOCSTRING(nnz)
+
+@node nonzeros, nzmax, nnz, Function Reference
+@subsubsection nonzeros
+
+@DOCSTRING(nonzeros)
+
+@node nzmax, spalloc, nonzeros, Function Reference
+@subsubsection nzmax
+
+@DOCSTRING(nzmax)
+
+@node spalloc, sparse, nzmax, Function Reference
+@subsubsection spalloc
+
+@DOCSTRING(spalloc)
+
+@node sparse, spatan2, spalloc, Function Reference
+@subsubsection sparse
+
+@DOCSTRING(sparse)
+
+@node spatan2, spconvert, sparse, Function Reference
+@subsubsection spatan2
+
+@DOCSTRING(spatan2)
+
+@node spconvert, spcumprod, spatan2, Function Reference
+@subsubsection spconvert
+
+@DOCSTRING(spconvert)
+
+@node spcumprod, spcumsum, spconvert, Function Reference
+@subsubsection spcumprod
+
+@DOCSTRING(spcumprod)
+
+@node spcumsum, spdet, spcumprod, Function Reference
+@subsubsection spcumsum
+
+@DOCSTRING(spcumsum)
+
+@node spdet, spdiag, spcumsum, Function Reference
+@subsubsection spdet
+
+@DOCSTRING(spdet)
+
+@node spdiag, spdiags, spdet, Function Reference
+@subsubsection spdiag
+
+@DOCSTRING(spdiag)
+
+@node spdiags, speye, spdiag, Function Reference
+@subsubsection spdiags
+
+@DOCSTRING(spdiags)
+
+@node speye, spfind, spdiags, Function Reference
+@subsubsection speye
+
+@DOCSTRING(speye)
+
+@node spfind, spfun, speye, Function Reference
+@subsubsection spfind
+
+@DOCSTRING(spfind)
+
+@node spfun, spinv, spfind, Function Reference
+@subsubsection spfun
+
+@DOCSTRING(spfun)
+
+@node spinv, splu, spfun, Function Reference
+@subsubsection spinv
+
+@DOCSTRING(spinv)
+
+@node splu, spmax, spinv, Function Reference
+@subsubsection splu
+
+@DOCSTRING(splu)
+
+@node spmax, spmin, splu, Function Reference
+@subsubsection spmax
+
+@DOCSTRING(spmax)
+
+@node spmin, spones, spmax, Function Reference
+@subsubsection spmin
+
+@DOCSTRING(spmin)
+
+@node spones, spparms, spmin, Function Reference
+@subsubsection spones
+
+@DOCSTRING(spones)
+
+@node spparms, spprod, spones, Function Reference
+@subsubsection spparms
+
+@DOCSTRING(spparms)
+
+@node spprod, sprand, spparms, Function Reference
+@subsubsection spprod
+
+@DOCSTRING(spprod)
+
+@node sprand, sprandn, spprod, Function Reference
+@subsubsection sprand
+
+@DOCSTRING(sprand)
+
+@node sprandn, spreshape, sprand, Function Reference
+@subsubsection sprandn
+
+@DOCSTRING(sprandn)
+
+@node spreshape, spstats, sprandn, Function Reference
+@subsubsection spreshape
+
+@DOCSTRING(spreshape)
+
+@node spstats, spsum, spreshape, Function Reference
+@subsubsection spstats
+
+@DOCSTRING(spstats)
+
+@node spsum, spsumsq, spstats, Function Reference
+@subsubsection spsum
+
+@DOCSTRING(spsum)
+
+@node spsumsq, spy, spsum, Function Reference
+@subsubsection spsumsq
+
+@DOCSTRING(spsumsq)
+
+@node spy, symamd, spsumsq, Function Reference
+@subsubsection spy
+
+@DOCSTRING(spy)
+
+@node symamd, symbfact, spy, Function Reference
+@subsubsection symamd
+
+@DOCSTRING(symamd)
+
+@node symbfact, symrcm, symamd, Function Reference
+@subsubsection symbfact
+
+@DOCSTRING(symbfact)
+
+@node symrcm, , symbfact, Function Reference
+@subsubsection symrcm
+
+@DOCSTRING(symrcm)
+
+@c Local Variables: ***
+@c Mode: texinfo ***
+@c End: ***
--- a/libcruft/ChangeLog	Fri Feb 25 17:42:55 2005 +0000
+++ b/libcruft/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -1,3 +1,29 @@
+2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	* blas/zher.f: New file.
+
+	Sparse merge.
+
+	2005-01-13 David Bateman  <dbateman@free.fr>
+
+	* lapack/dgttrf.f lapack/dgttrs.f lapacl/zgttrf.f lapack/zgttrs.f:
+	new files
+
+	2005-01-23  David Bateman  <dbateman@free.fr>
+
+	* lapack/dgtsv.f lapack/dpbcon.f lapack/dpbtf2.f lapack/dpbtrf.f 
+	lapack/dpbtrs.f lapack/dptsv.f lapack/dpttrf.f lapack/dpttrs.f 
+	lapack/dptts2.f lapack/zgtsv.f lapack/zpbcon.f lapack/zpbtf2.f 
+	lapack/zpbtrf.f lapack/zpbtrs.f lapack/zptsv.f lapack/zpttrf.f 
+	lapack/zpttrs.f lapck/zptts2.f: New files.
+
+	2004-12-29  John W. Eaton  <jwe@octave.org>
+
+	* blas/zbtsv.f: New file.
+	* lapack/dgbcon.f, lapack/dgbtrf.f, lapack/dgbtrs.f,
+	lapack/dlatbs.f, lapack/zgbcon.f, lapack/zgbtf2.f,
+	lapack/zgbtrf.f, lapack/zgbtrs.f, lapack/zlatbs.f: New files.
+
 2005-02-10  John W. Eaton  <jwe@octave.org>
 
 	* misc/cquit.c (octave_signal_caught): New global variable.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/blas/zher.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,212 @@
+      SUBROUTINE ZHER  ( UPLO, N, ALPHA, X, INCX, A, LDA )
+*     .. Scalar Arguments ..
+      DOUBLE PRECISION   ALPHA
+      INTEGER            INCX, LDA, N
+      CHARACTER*1        UPLO
+*     .. Array Arguments ..
+      COMPLEX*16         A( LDA, * ), X( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZHER   performs the hermitian rank 1 operation
+*
+*     A := alpha*x*conjg( x' ) + A,
+*
+*  where alpha is a real scalar, x is an n element vector and A is an
+*  n by n hermitian 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      - COMPLEX*16       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.
+*
+*  A      - COMPLEX*16       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 hermitian 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 hermitian 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.
+*           Note that the imaginary parts of the diagonal elements need
+*           not be set, they are assumed to be zero, and on exit they
+*           are set to zero.
+*
+*  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.
+*
+*
+*     .. Parameters ..
+      COMPLEX*16         ZERO
+      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
+*     .. Local Scalars ..
+      COMPLEX*16         TEMP
+      INTEGER            I, INFO, IX, J, JX, KX
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     .. Intrinsic Functions ..
+      INTRINSIC          DCONJG, MAX, DBLE
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF     ( .NOT.LSAME( UPLO, 'U' ).AND.
+     $         .NOT.LSAME( UPLO, 'L' )      )THEN
+         INFO = 1
+      ELSE IF( N.LT.0 )THEN
+         INFO = 2
+      ELSE IF( INCX.EQ.0 )THEN
+         INFO = 5
+      ELSE IF( LDA.LT.MAX( 1, N ) )THEN
+         INFO = 7
+      END IF
+      IF( INFO.NE.0 )THEN
+         CALL XERBLA( 'ZHER  ', INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible.
+*
+      IF( ( N.EQ.0 ).OR.( ALPHA.EQ.DBLE( ZERO ) ) )
+     $   RETURN
+*
+*     Set the start point in X if the increment is not unity.
+*
+      IF( INCX.LE.0 )THEN
+         KX = 1 - ( N - 1 )*INCX
+      ELSE IF( INCX.NE.1 )THEN
+         KX = 1
+      END IF
+*
+*     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' ) )THEN
+*
+*        Form  A  when A is stored in upper triangle.
+*
+         IF( INCX.EQ.1 )THEN
+            DO 20, J = 1, N
+               IF( X( J ).NE.ZERO )THEN
+                  TEMP = ALPHA*DCONJG( X( J ) )
+                  DO 10, I = 1, J - 1
+                     A( I, J ) = A( I, J ) + X( I )*TEMP
+   10             CONTINUE
+                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( J )*TEMP )
+               ELSE
+                  A( J, J ) = DBLE( A( J, J ) )
+               END IF
+   20       CONTINUE
+         ELSE
+            JX = KX
+            DO 40, J = 1, N
+               IF( X( JX ).NE.ZERO )THEN
+                  TEMP = ALPHA*DCONJG( X( JX ) )
+                  IX   = KX
+                  DO 30, I = 1, J - 1
+                     A( I, J ) = A( I, J ) + X( IX )*TEMP
+                     IX        = IX        + INCX
+   30             CONTINUE
+                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( X( JX )*TEMP )
+               ELSE
+                  A( J, J ) = DBLE( A( J, J ) )
+               END IF
+               JX = JX + INCX
+   40       CONTINUE
+         END IF
+      ELSE
+*
+*        Form  A  when A is stored in lower triangle.
+*
+         IF( INCX.EQ.1 )THEN
+            DO 60, J = 1, N
+               IF( X( J ).NE.ZERO )THEN
+                  TEMP      = ALPHA*DCONJG( X( J ) )
+                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( J ) )
+                  DO 50, I = J + 1, N
+                     A( I, J ) = A( I, J ) + X( I )*TEMP
+   50             CONTINUE
+               ELSE
+                  A( J, J ) = DBLE( A( J, J ) )
+               END IF
+   60       CONTINUE
+         ELSE
+            JX = KX
+            DO 80, J = 1, N
+               IF( X( JX ).NE.ZERO )THEN
+                  TEMP      = ALPHA*DCONJG( X( JX ) )
+                  A( J, J ) = DBLE( A( J, J ) ) + DBLE( TEMP*X( JX ) )
+                  IX        = JX
+                  DO 70, I = J + 1, N
+                     IX        = IX        + INCX
+                     A( I, J ) = A( I, J ) + X( IX )*TEMP
+   70             CONTINUE
+               ELSE
+                  A( J, J ) = DBLE( A( J, J ) )
+               END IF
+               JX = JX + INCX
+   80       CONTINUE
+         END IF
+      END IF
+*
+      RETURN
+*
+*     End of ZHER  .
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/blas/ztbsv.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,381 @@
+      SUBROUTINE ZTBSV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX )
+*     .. Scalar Arguments ..
+      INTEGER            INCX, K, LDA, N
+      CHARACTER*1        DIAG, TRANS, UPLO
+*     .. Array Arguments ..
+      COMPLEX*16         A( LDA, * ), X( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZTBSV  solves one of the systems of equations
+*
+*     A*x = b,   or   A'*x = b,   or   conjg( 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 band matrix, with ( k + 1 )
+*  diagonals.
+*
+*  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'   conjg( 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.
+*
+*  K      - INTEGER.
+*           On entry with UPLO = 'U' or 'u', K specifies the number of
+*           super-diagonals of the matrix A.
+*           On entry with UPLO = 'L' or 'l', K specifies the number of
+*           sub-diagonals of the matrix A.
+*           K must satisfy  0 .le. K.
+*           Unchanged on exit.
+*
+*  A      - COMPLEX*16       array of DIMENSION ( LDA, n ).
+*           Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
+*           by n part of the array A must contain the upper triangular
+*           band part of the matrix of coefficients, supplied column by
+*           column, with the leading diagonal of the matrix in row
+*           ( k + 1 ) of the array, the first super-diagonal starting at
+*           position 2 in row k, and so on. The top left k by k triangle
+*           of the array A is not referenced.
+*           The following program segment will transfer an upper
+*           triangular band matrix from conventional full matrix storage
+*           to band storage:
+*
+*                 DO 20, J = 1, N
+*                    M = K + 1 - J
+*                    DO 10, I = MAX( 1, J - K ), J
+*                       A( M + I, J ) = matrix( I, J )
+*              10    CONTINUE
+*              20 CONTINUE
+*
+*           Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
+*           by n part of the array A must contain the lower triangular
+*           band part of the matrix of coefficients, supplied column by
+*           column, with the leading diagonal of the matrix in row 1 of
+*           the array, the first sub-diagonal starting at position 1 in
+*           row 2, and so on. The bottom right k by k triangle of the
+*           array A is not referenced.
+*           The following program segment will transfer a lower
+*           triangular band matrix from conventional full matrix storage
+*           to band storage:
+*
+*                 DO 20, J = 1, N
+*                    M = 1 - J
+*                    DO 10, I = J, MIN( N, J + K )
+*                       A( M + I, J ) = matrix( I, J )
+*              10    CONTINUE
+*              20 CONTINUE
+*
+*           Note that when DIAG = 'U' or 'u' the elements of the array A
+*           corresponding to the diagonal elements of the matrix are not
+*           referenced, 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
+*           ( k + 1 ).
+*           Unchanged on exit.
+*
+*  X      - COMPLEX*16       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.
+*
+*
+*     .. Parameters ..
+      COMPLEX*16         ZERO
+      PARAMETER        ( ZERO = ( 0.0D+0, 0.0D+0 ) )
+*     .. Local Scalars ..
+      COMPLEX*16         TEMP
+      INTEGER            I, INFO, IX, J, JX, KPLUS1, KX, L
+      LOGICAL            NOCONJ, NOUNIT
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     .. Intrinsic Functions ..
+      INTRINSIC          DCONJG, MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.
+     $         .NOT.LSAME( UPLO , 'L' )      )THEN
+         INFO = 1
+      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
+     $         .NOT.LSAME( TRANS, 'T' ).AND.
+     $         .NOT.LSAME( TRANS, 'C' )      )THEN
+         INFO = 2
+      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
+     $         .NOT.LSAME( DIAG , 'N' )      )THEN
+         INFO = 3
+      ELSE IF( N.LT.0 )THEN
+         INFO = 4
+      ELSE IF( K.LT.0 )THEN
+         INFO = 5
+      ELSE IF( LDA.LT.( K + 1 ) )THEN
+         INFO = 7
+      ELSE IF( INCX.EQ.0 )THEN
+         INFO = 9
+      END IF
+      IF( INFO.NE.0 )THEN
+         CALL XERBLA( 'ZTBSV ', INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible.
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+      NOCONJ = LSAME( TRANS, 'T' )
+      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.LE.0 )THEN
+         KX = 1 - ( N - 1 )*INCX
+      ELSE IF( INCX.NE.1 )THEN
+         KX = 1
+      END IF
+*
+*     Start the operations. In this version the elements of A are
+*     accessed by sequentially with one pass through A.
+*
+      IF( LSAME( TRANS, 'N' ) )THEN
+*
+*        Form  x := inv( A )*x.
+*
+         IF( LSAME( UPLO, 'U' ) )THEN
+            KPLUS1 = K + 1
+            IF( INCX.EQ.1 )THEN
+               DO 20, J = N, 1, -1
+                  IF( X( J ).NE.ZERO )THEN
+                     L = KPLUS1 - J
+                     IF( NOUNIT )
+     $                  X( J ) = X( J )/A( KPLUS1, J )
+                     TEMP = X( J )
+                     DO 10, I = J - 1, MAX( 1, J - K ), -1
+                        X( I ) = X( I ) - TEMP*A( L + I, J )
+   10                CONTINUE
+                  END IF
+   20          CONTINUE
+            ELSE
+               KX = KX + ( N - 1 )*INCX
+               JX = KX
+               DO 40, J = N, 1, -1
+                  KX = KX - INCX
+                  IF( X( JX ).NE.ZERO )THEN
+                     IX = KX
+                     L  = KPLUS1 - J
+                     IF( NOUNIT )
+     $                  X( JX ) = X( JX )/A( KPLUS1, J )
+                     TEMP = X( JX )
+                     DO 30, I = J - 1, MAX( 1, J - K ), -1
+                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
+                        IX      = IX      - INCX
+   30                CONTINUE
+                  END IF
+                  JX = JX - INCX
+   40          CONTINUE
+            END IF
+         ELSE
+            IF( INCX.EQ.1 )THEN
+               DO 60, J = 1, N
+                  IF( X( J ).NE.ZERO )THEN
+                     L = 1 - J
+                     IF( NOUNIT )
+     $                  X( J ) = X( J )/A( 1, J )
+                     TEMP = X( J )
+                     DO 50, I = J + 1, MIN( N, J + K )
+                        X( I ) = X( I ) - TEMP*A( L + I, J )
+   50                CONTINUE
+                  END IF
+   60          CONTINUE
+            ELSE
+               JX = KX
+               DO 80, J = 1, N
+                  KX = KX + INCX
+                  IF( X( JX ).NE.ZERO )THEN
+                     IX = KX
+                     L  = 1  - J
+                     IF( NOUNIT )
+     $                  X( JX ) = X( JX )/A( 1, J )
+                     TEMP = X( JX )
+                     DO 70, I = J + 1, MIN( N, J + K )
+                        X( IX ) = X( IX ) - TEMP*A( L + I, J )
+                        IX      = IX      + INCX
+   70                CONTINUE
+                  END IF
+                  JX = JX + INCX
+   80          CONTINUE
+            END IF
+         END IF
+      ELSE
+*
+*        Form  x := inv( A' )*x  or  x := inv( conjg( A') )*x.
+*
+         IF( LSAME( UPLO, 'U' ) )THEN
+            KPLUS1 = K + 1
+            IF( INCX.EQ.1 )THEN
+               DO 110, J = 1, N
+                  TEMP = X( J )
+                  L    = KPLUS1 - J
+                  IF( NOCONJ )THEN
+                     DO 90, I = MAX( 1, J - K ), J - 1
+                        TEMP = TEMP - A( L + I, J )*X( I )
+   90                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/A( KPLUS1, J )
+                  ELSE
+                     DO 100, I = MAX( 1, J - K ), J - 1
+                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I )
+  100                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/DCONJG( A( KPLUS1, J ) )
+                  END IF
+                  X( J ) = TEMP
+  110          CONTINUE
+            ELSE
+               JX = KX
+               DO 140, J = 1, N
+                  TEMP = X( JX )
+                  IX   = KX
+                  L    = KPLUS1  - J
+                  IF( NOCONJ )THEN
+                     DO 120, I = MAX( 1, J - K ), J - 1
+                        TEMP = TEMP - A( L + I, J )*X( IX )
+                        IX   = IX   + INCX
+  120                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/A( KPLUS1, J )
+                  ELSE
+                     DO 130, I = MAX( 1, J - K ), J - 1
+                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX )
+                        IX   = IX   + INCX
+  130                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/DCONJG( A( KPLUS1, J ) )
+                  END IF
+                  X( JX ) = TEMP
+                  JX      = JX   + INCX
+                  IF( J.GT.K )
+     $               KX = KX + INCX
+  140          CONTINUE
+            END IF
+         ELSE
+            IF( INCX.EQ.1 )THEN
+               DO 170, J = N, 1, -1
+                  TEMP = X( J )
+                  L    = 1      - J
+                  IF( NOCONJ )THEN
+                     DO 150, I = MIN( N, J + K ), J + 1, -1
+                        TEMP = TEMP - A( L + I, J )*X( I )
+  150                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/A( 1, J )
+                  ELSE
+                     DO 160, I = MIN( N, J + K ), J + 1, -1
+                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( I )
+  160                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/DCONJG( A( 1, J ) )
+                  END IF
+                  X( J ) = TEMP
+  170          CONTINUE
+            ELSE
+               KX = KX + ( N - 1 )*INCX
+               JX = KX
+               DO 200, J = N, 1, -1
+                  TEMP = X( JX )
+                  IX   = KX
+                  L    = 1       - J
+                  IF( NOCONJ )THEN
+                     DO 180, I = MIN( N, J + K ), J + 1, -1
+                        TEMP = TEMP - A( L + I, J )*X( IX )
+                        IX   = IX   - INCX
+  180                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/A( 1, J )
+                  ELSE
+                     DO 190, I = MIN( N, J + K ), J + 1, -1
+                        TEMP = TEMP - DCONJG( A( L + I, J ) )*X( IX )
+                        IX   = IX   - INCX
+  190                CONTINUE
+                     IF( NOUNIT )
+     $                  TEMP = TEMP/DCONJG( A( 1, J ) )
+                  END IF
+                  X( JX ) = TEMP
+                  JX      = JX   - INCX
+                  IF( ( N - J ).GE.K )
+     $               KX = KX - INCX
+  200          CONTINUE
+            END IF
+         END IF
+      END IF
+*
+      RETURN
+*
+*     End of ZTBSV .
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dgbcon.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,222 @@
+      SUBROUTINE DGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
+     $                   WORK, IWORK, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          NORM
+      INTEGER            INFO, KL, KU, LDAB, N
+      DOUBLE PRECISION   ANORM, RCOND
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * ), IWORK( * )
+      DOUBLE PRECISION   AB( LDAB, * ), WORK( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DGBCON estimates the reciprocal of the condition number of a real
+*  general band matrix A, in either the 1-norm or the infinity-norm,
+*  using the LU factorization computed by DGBTRF.
+*
+*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
+*  condition number is computed as
+*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
+*
+*  Arguments
+*  =========
+*
+*  NORM    (input) CHARACTER*1
+*          Specifies whether the 1-norm condition number or the
+*          infinity-norm condition number is required:
+*          = '1' or 'O':  1-norm;
+*          = 'I':         Infinity-norm.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KL      (input) INTEGER
+*          The number of subdiagonals within the band of A.  KL >= 0.
+*
+*  KU      (input) INTEGER
+*          The number of superdiagonals within the band of A.  KU >= 0.
+*
+*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*          Details of the LU factorization of the band matrix A, as
+*          computed by DGBTRF.  U is stored as an upper triangular band
+*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
+*          the multipliers used during the factorization are stored in
+*          rows KL+KU+2 to 2*KL+KU+1.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
+*
+*  IPIV    (input) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= N, row i of the matrix was
+*          interchanged with row IPIV(i).
+*
+*  ANORM   (input) DOUBLE PRECISION
+*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
+*          If NORM = 'I', the infinity-norm of the original matrix A.
+*
+*  RCOND   (output) DOUBLE PRECISION
+*          The reciprocal of the condition number of the matrix A,
+*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
+*
+*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
+*
+*  IWORK   (workspace) INTEGER array, dimension (N)
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0: if INFO = -i, the i-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            LNOTI, ONENRM
+      CHARACTER          NORMIN
+      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
+      DOUBLE PRECISION   AINVNM, SCALE, SMLNUM, T
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IDAMAX
+      DOUBLE PRECISION   DDOT, DLAMCH
+      EXTERNAL           LSAME, IDAMAX, DDOT, DLAMCH
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DAXPY, DLACON, DLATBS, DRSCL, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
+      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KL.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( KU.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
+         INFO = -6
+      ELSE IF( ANORM.LT.ZERO ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DGBCON', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      RCOND = ZERO
+      IF( N.EQ.0 ) THEN
+         RCOND = ONE
+         RETURN
+      ELSE IF( ANORM.EQ.ZERO ) THEN
+         RETURN
+      END IF
+*
+      SMLNUM = DLAMCH( 'Safe minimum' )
+*
+*     Estimate the norm of inv(A).
+*
+      AINVNM = ZERO
+      NORMIN = 'N'
+      IF( ONENRM ) THEN
+         KASE1 = 1
+      ELSE
+         KASE1 = 2
+      END IF
+      KD = KL + KU + 1
+      LNOTI = KL.GT.0
+      KASE = 0
+   10 CONTINUE
+      CALL DLACON( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE )
+      IF( KASE.NE.0 ) THEN
+         IF( KASE.EQ.KASE1 ) THEN
+*
+*           Multiply by inv(L).
+*
+            IF( LNOTI ) THEN
+               DO 20 J = 1, N - 1
+                  LM = MIN( KL, N-J )
+                  JP = IPIV( J )
+                  T = WORK( JP )
+                  IF( JP.NE.J ) THEN
+                     WORK( JP ) = WORK( J )
+                     WORK( J ) = T
+                  END IF
+                  CALL DAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
+   20          CONTINUE
+            END IF
+*
+*           Multiply by inv(U).
+*
+            CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
+     $                   INFO )
+         ELSE
+*
+*           Multiply by inv(U').
+*
+            CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
+     $                   KL+KU, AB, LDAB, WORK, SCALE, WORK( 2*N+1 ),
+     $                   INFO )
+*
+*           Multiply by inv(L').
+*
+            IF( LNOTI ) THEN
+               DO 30 J = N - 1, 1, -1
+                  LM = MIN( KL, N-J )
+                  WORK( J ) = WORK( J ) - DDOT( LM, AB( KD+1, J ), 1,
+     $                        WORK( J+1 ), 1 )
+                  JP = IPIV( J )
+                  IF( JP.NE.J ) THEN
+                     T = WORK( JP )
+                     WORK( JP ) = WORK( J )
+                     WORK( J ) = T
+                  END IF
+   30          CONTINUE
+            END IF
+         END IF
+*
+*        Divide X by 1/SCALE if doing so will not cause overflow.
+*
+         NORMIN = 'Y'
+         IF( SCALE.NE.ONE ) THEN
+            IX = IDAMAX( N, WORK, 1 )
+            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
+     $         GO TO 40
+            CALL DRSCL( N, SCALE, WORK, 1 )
+         END IF
+         GO TO 10
+      END IF
+*
+*     Compute the estimate of the reciprocal condition number.
+*
+      IF( AINVNM.NE.ZERO )
+     $   RCOND = ( ONE / AINVNM ) / ANORM
+*
+   40 CONTINUE
+      RETURN
+*
+*     End of DGBCON
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dgtsv.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,263 @@
+      SUBROUTINE DGTSV( N, NRHS, DL, D, DU, B, LDB, 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, 1999
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DGTSV  solves the equation
+*
+*     A*X = B,
+*
+*  where A is an n by n tridiagonal matrix, by Gaussian elimination with
+*  partial pivoting.
+*
+*  Note that the equation  A'*X = B  may be solved by interchanging the
+*  order of the arguments DU and DL.
+*
+*  Arguments
+*  =========
+*
+*  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.
+*
+*  DL      (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, DL must contain the (n-1) sub-diagonal elements of
+*          A.
+*
+*          On exit, DL is overwritten by the (n-2) elements of the
+*          second super-diagonal of the upper triangular matrix U from
+*          the LU factorization of A, in DL(1), ..., DL(n-2).
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, D must contain the diagonal elements of A.
+*
+*          On exit, D is overwritten by the n diagonal elements of U.
+*
+*  DU      (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, DU must contain the (n-1) super-diagonal elements
+*          of A.
+*
+*          On exit, DU is overwritten by the (n-1) elements of the first
+*          super-diagonal of U.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the N by NRHS matrix of right hand side matrix B.
+*          On exit, if INFO = 0, the N by NRHS 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
+*          > 0: if INFO = i, U(i,i) is exactly zero, and the solution
+*               has not been computed.  The factorization has not been
+*               completed unless i = N.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO
+      PARAMETER          ( ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, J
+      DOUBLE PRECISION   FACT, TEMP
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, MAX
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -7
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DGTSV ', -INFO )
+         RETURN
+      END IF
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+      IF( NRHS.EQ.1 ) THEN
+         DO 10 I = 1, N - 2
+            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
+*
+*              No row interchange required
+*
+               IF( D( I ).NE.ZERO ) THEN
+                  FACT = DL( I ) / D( I )
+                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
+                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
+               ELSE
+                  INFO = I
+                  RETURN
+               END IF
+               DL( I ) = ZERO
+            ELSE
+*
+*              Interchange rows I and I+1
+*
+               FACT = D( I ) / DL( I )
+               D( I ) = DL( I )
+               TEMP = D( I+1 )
+               D( I+1 ) = DU( I ) - FACT*TEMP
+               DL( I ) = DU( I+1 )
+               DU( I+1 ) = -FACT*DL( I )
+               DU( I ) = TEMP
+               TEMP = B( I, 1 )
+               B( I, 1 ) = B( I+1, 1 )
+               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
+            END IF
+   10    CONTINUE
+         IF( N.GT.1 ) THEN
+            I = N - 1
+            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
+               IF( D( I ).NE.ZERO ) THEN
+                  FACT = DL( I ) / D( I )
+                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
+                  B( I+1, 1 ) = B( I+1, 1 ) - FACT*B( I, 1 )
+               ELSE
+                  INFO = I
+                  RETURN
+               END IF
+            ELSE
+               FACT = D( I ) / DL( I )
+               D( I ) = DL( I )
+               TEMP = D( I+1 )
+               D( I+1 ) = DU( I ) - FACT*TEMP
+               DU( I ) = TEMP
+               TEMP = B( I, 1 )
+               B( I, 1 ) = B( I+1, 1 )
+               B( I+1, 1 ) = TEMP - FACT*B( I+1, 1 )
+            END IF
+         END IF
+         IF( D( N ).EQ.ZERO ) THEN
+            INFO = N
+            RETURN
+         END IF
+      ELSE
+         DO 40 I = 1, N - 2
+            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
+*
+*              No row interchange required
+*
+               IF( D( I ).NE.ZERO ) THEN
+                  FACT = DL( I ) / D( I )
+                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
+                  DO 20 J = 1, NRHS
+                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
+   20             CONTINUE
+               ELSE
+                  INFO = I
+                  RETURN
+               END IF
+               DL( I ) = ZERO
+            ELSE
+*
+*              Interchange rows I and I+1
+*
+               FACT = D( I ) / DL( I )
+               D( I ) = DL( I )
+               TEMP = D( I+1 )
+               D( I+1 ) = DU( I ) - FACT*TEMP
+               DL( I ) = DU( I+1 )
+               DU( I+1 ) = -FACT*DL( I )
+               DU( I ) = TEMP
+               DO 30 J = 1, NRHS
+                  TEMP = B( I, J )
+                  B( I, J ) = B( I+1, J )
+                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
+   30          CONTINUE
+            END IF
+   40    CONTINUE
+         IF( N.GT.1 ) THEN
+            I = N - 1
+            IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
+               IF( D( I ).NE.ZERO ) THEN
+                  FACT = DL( I ) / D( I )
+                  D( I+1 ) = D( I+1 ) - FACT*DU( I )
+                  DO 50 J = 1, NRHS
+                     B( I+1, J ) = B( I+1, J ) - FACT*B( I, J )
+   50             CONTINUE
+               ELSE
+                  INFO = I
+                  RETURN
+               END IF
+            ELSE
+               FACT = D( I ) / DL( I )
+               D( I ) = DL( I )
+               TEMP = D( I+1 )
+               D( I+1 ) = DU( I ) - FACT*TEMP
+               DU( I ) = TEMP
+               DO 60 J = 1, NRHS
+                  TEMP = B( I, J )
+                  B( I, J ) = B( I+1, J )
+                  B( I+1, J ) = TEMP - FACT*B( I+1, J )
+   60          CONTINUE
+            END IF
+         END IF
+         IF( D( N ).EQ.ZERO ) THEN
+            INFO = N
+            RETURN
+         END IF
+      END IF
+*
+*     Back solve with the matrix U from the factorization.
+*
+      IF( NRHS.LE.2 ) THEN
+         J = 1
+   70    CONTINUE
+         B( N, J ) = B( N, J ) / D( N )
+         IF( N.GT.1 )
+     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
+         DO 80 I = N - 2, 1, -1
+            B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
+     $                  B( I+2, J ) ) / D( I )
+   80    CONTINUE
+         IF( J.LT.NRHS ) THEN
+            J = J + 1
+            GO TO 70
+         END IF
+      ELSE
+         DO 100 J = 1, NRHS
+            B( N, J ) = B( N, J ) / D( N )
+            IF( N.GT.1 )
+     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
+     $                       D( N-1 )
+            DO 90 I = N - 2, 1, -1
+               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DL( I )*
+     $                     B( I+2, J ) ) / D( I )
+   90       CONTINUE
+  100    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of DGTSV
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dgttrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,149 @@
+      SUBROUTINE DGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
+*
+*  -- LAPACK routine (version 2.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     September 30, 1994
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, N
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      DOUBLE PRECISION   D( * ), DL( * ), DU( * ), DU2( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DGTTRF computes an LU factorization of a real tridiagonal matrix A
+*  using elimination with partial pivoting and row interchanges.
+*
+*  The factorization has the form
+*     A = L * U
+*  where L is a product of permutation and unit lower bidiagonal
+*  matrices and U is upper triangular with nonzeros in only the main
+*  diagonal and first two superdiagonals.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  DL      (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, DL must contain the (n-1) subdiagonal elements of
+*          A.
+*          On exit, DL is overwritten by the (n-1) multipliers that
+*          define the matrix L from the LU factorization of A.
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, D must contain the diagonal elements of A.
+*          On exit, D is overwritten by the n diagonal elements of the
+*          upper triangular matrix U from the LU factorization of A.
+*
+*  DU      (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, DU must contain the (n-1) superdiagonal elements
+*          of A.
+*          On exit, DU is overwritten by the (n-1) elements of the first
+*          superdiagonal of U.
+*
+*  DU2     (output) DOUBLE PRECISION array, dimension (N-2)
+*          On exit, DU2 is overwritten by the (n-2) elements of the
+*          second superdiagonal of U.
+*
+*  IPIV    (output) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= n, row i of the matrix was
+*          interchanged with row IPIV(i).  IPIV(i) will always be either
+*          i or i+1; IPIV(i) = i indicates a row interchange was not
+*          required.
+*
+*  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.
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      INTEGER            I
+      DOUBLE PRECISION   FACT, TEMP
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO
+      PARAMETER          ( ZERO = 0.0D+0 )
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+         CALL XERBLA( 'DGTTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Initialize IPIV(i) = i
+*
+      DO 10 I = 1, N
+         IPIV( I ) = I
+   10 CONTINUE
+*
+      DO 20 I = 1, N - 1
+         IF( DL( I ).EQ.ZERO ) THEN
+*
+*           Subdiagonal is zero, no elimination is required.
+*
+            IF( D( I ).EQ.ZERO .AND. INFO.EQ.0 )
+     $         INFO = I
+            IF( I.LT.N-1 )
+     $         DU2( I ) = ZERO
+         ELSE IF( ABS( D( I ) ).GE.ABS( DL( I ) ) ) THEN
+*
+*           No row interchange required, eliminate DL(I)
+*
+            FACT = DL( I ) / D( I )
+            DL( I ) = FACT
+            D( I+1 ) = D( I+1 ) - FACT*DU( I )
+            IF( I.LT.N-1 )
+     $         DU2( I ) = ZERO
+         ELSE
+*
+*           Interchange rows I and I+1, eliminate DL(I)
+*
+            FACT = D( I ) / DL( I )
+            D( I ) = DL( I )
+            DL( I ) = FACT
+            TEMP = DU( I )
+            DU( I ) = D( I+1 )
+            D( I+1 ) = TEMP - FACT*D( I+1 )
+            IF( I.LT.N-1 ) THEN
+               DU2( I ) = DU( I+1 )
+               DU( I+1 ) = -FACT*DU( I+1 )
+            END IF
+            IPIV( I ) = IPIV( I ) + 1
+         END IF
+   20 CONTINUE
+      IF( D( N ).EQ.ZERO .AND. INFO.EQ.0 ) THEN
+         INFO = N
+         RETURN
+      END IF
+*
+      RETURN
+*
+*     End of DGTTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dgttrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,176 @@
+      SUBROUTINE DGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
+     $                   INFO )
+*
+*  -- LAPACK routine (version 2.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     September 30, 1994
+*
+*     .. Scalar Arguments ..
+      CHARACTER          TRANS
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      DOUBLE PRECISION   B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DGTTRS solves one of the systems of equations
+*     A*X = B  or  A'*X = B,
+*  with a tridiagonal matrix A using the LU factorization computed
+*  by DGTTRF.
+*
+*  Arguments
+*  =========
+*
+*  TRANS   (input) CHARACTER
+*          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.
+*
+*  DL      (input) DOUBLE PRECISION array, dimension (N-1)
+*          The (n-1) multipliers that define the matrix L from the
+*          LU factorization of A.
+*
+*  D       (input) DOUBLE PRECISION array, dimension (N)
+*          The n diagonal elements of the upper triangular matrix U from
+*          the LU factorization of A.
+*
+*  DU      (input) DOUBLE PRECISION array, dimension (N-1)
+*          The (n-1) elements of the first superdiagonal of U.
+*
+*  DU2     (input) DOUBLE PRECISION array, dimension (N-2)
+*          The (n-2) elements of the second superdiagonal of U.
+*
+*  IPIV    (input) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= n, row i of the matrix was
+*          interchanged with row IPIV(i).  IPIV(i) will always be either
+*          i or i+1; IPIV(i) = i indicates a row interchange was not
+*          required.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the right hand side matrix B.
+*          On exit, B is overwritten by 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
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      LOGICAL            NOTRAN
+      INTEGER            I, J
+      DOUBLE PRECISION   TEMP
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      NOTRAN = LSAME( TRANS, 'N' )
+      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
+     $    LSAME( TRANS, 'C' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
+         INFO = -10
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DGTTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+      IF( NOTRAN ) THEN
+*
+*        Solve A*X = B using the LU factorization of A,
+*        overwriting each right hand side vector with its solution.
+*
+         DO 30 J = 1, NRHS
+*
+*           Solve L*x = b.
+*
+            DO 10 I = 1, N - 1
+               IF( IPIV( I ).EQ.I ) THEN
+                  B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
+               ELSE
+                  TEMP = B( I, J )
+                  B( I, J ) = B( I+1, J )
+                  B( I+1, J ) = TEMP - DL( I )*B( I, J )
+               END IF
+   10       CONTINUE
+*
+*           Solve U*x = b.
+*
+            B( N, J ) = B( N, J ) / D( N )
+            IF( N.GT.1 )
+     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
+     $                       D( N-1 )
+            DO 20 I = N - 2, 1, -1
+               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
+     $                     B( I+2, J ) ) / D( I )
+   20       CONTINUE
+   30    CONTINUE
+      ELSE
+*
+*        Solve A' * X = B.
+*
+         DO 60 J = 1, NRHS
+*
+*           Solve U'*x = b.
+*
+            B( 1, J ) = B( 1, J ) / D( 1 )
+            IF( N.GT.1 )
+     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
+            DO 40 I = 3, N
+               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
+     $                     B( I-2, J ) ) / D( I )
+   40       CONTINUE
+*
+*           Solve L'*x = b.
+*
+            DO 50 I = N - 1, 1, -1
+               IF( IPIV( I ).EQ.I ) THEN
+                  B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
+               ELSE
+                  TEMP = B( I+1, J )
+                  B( I+1, J ) = B( I, J ) - DL( I )*TEMP
+                  B( I, J ) = TEMP
+               END IF
+   50       CONTINUE
+   60    CONTINUE
+      END IF
+*
+*     End of DGTTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dlatbs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,724 @@
+      SUBROUTINE DLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
+     $                   SCALE, CNORM, INFO )
+*
+*  -- 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, 1992
+*
+*     .. Scalar Arguments ..
+      CHARACTER          DIAG, NORMIN, TRANS, UPLO
+      INTEGER            INFO, KD, LDAB, N
+      DOUBLE PRECISION   SCALE
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   AB( LDAB, * ), CNORM( * ), X( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DLATBS solves one of the triangular systems
+*
+*     A *x = s*b  or  A'*x = s*b
+*
+*  with scaling to prevent overflow, where A is an upper or lower
+*  triangular band matrix.  Here A' denotes the transpose of A, x and b
+*  are n-element vectors, and s is a scaling factor, usually less than
+*  or equal to 1, chosen so that the components of x will be less than
+*  the overflow threshold.  If the unscaled problem will not cause
+*  overflow, the Level 2 BLAS routine DTBSV is called.  If the matrix A
+*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
+*  non-trivial solution to A*x = 0 is returned.
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          Specifies whether the matrix A is upper or lower triangular.
+*          = 'U':  Upper triangular
+*          = 'L':  Lower triangular
+*
+*  TRANS   (input) CHARACTER*1
+*          Specifies the operation applied to A.
+*          = 'N':  Solve A * x = s*b  (No transpose)
+*          = 'T':  Solve A'* x = s*b  (Transpose)
+*          = 'C':  Solve A'* x = s*b  (Conjugate transpose = Transpose)
+*
+*  DIAG    (input) CHARACTER*1
+*          Specifies whether or not the matrix A is unit triangular.
+*          = 'N':  Non-unit triangular
+*          = 'U':  Unit triangular
+*
+*  NORMIN  (input) CHARACTER*1
+*          Specifies whether CNORM has been set or not.
+*          = 'Y':  CNORM contains the column norms on entry
+*          = 'N':  CNORM is not set on entry.  On exit, the norms will
+*                  be computed and stored in CNORM.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of subdiagonals or superdiagonals in the
+*          triangular matrix A.  KD >= 0.
+*
+*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*          The upper or lower triangular band matrix A, stored in the
+*          first KD+1 rows of the array. The j-th column of A is stored
+*          in the j-th column of the array AB as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  X       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, the right hand side b of the triangular system.
+*          On exit, X is overwritten by the solution vector x.
+*
+*  SCALE   (output) DOUBLE PRECISION
+*          The scaling factor s for the triangular system
+*             A * x = s*b  or  A'* x = s*b.
+*          If SCALE = 0, the matrix A is singular or badly scaled, and
+*          the vector x is an exact or approximate solution to A*x = 0.
+*
+*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
+*
+*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
+*          contains the norm of the off-diagonal part of the j-th column
+*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
+*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
+*          must be greater than or equal to the 1-norm.
+*
+*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
+*          returns the 1-norm of the offdiagonal part of the j-th column
+*          of A.
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0:  if INFO = -k, the k-th argument had an illegal value
+*
+*  Further Details
+*  ======= =======
+*
+*  A rough bound on x is computed; if that is less than overflow, DTBSV
+*  is called, otherwise, specific code is used which checks for possible
+*  overflow or divide-by-zero at every operation.
+*
+*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
+*  if A is lower triangular is
+*
+*       x[1:n] := b[1:n]
+*       for j = 1, ..., n
+*            x(j) := x(j) / A(j,j)
+*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
+*       end
+*
+*  Define bounds on the components of x after j iterations of the loop:
+*     M(j) = bound on x[1:j]
+*     G(j) = bound on x[j+1:n]
+*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
+*
+*  Then for iteration j+1 we have
+*     M(j+1) <= G(j) / | A(j+1,j+1) |
+*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
+*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
+*
+*  where CNORM(j+1) is greater than or equal to the infinity-norm of
+*  column j+1 of A, not counting the diagonal.  Hence
+*
+*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
+*                  1<=i<=j
+*  and
+*
+*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
+*                                   1<=i< j
+*
+*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTBSV if the
+*  reciprocal of the largest M(j), j=1,..,n, is larger than
+*  max(underflow, 1/overflow).
+*
+*  The bound on x(j) is also used to determine when a step in the
+*  columnwise method can be performed without fear of overflow.  If
+*  the computed bound is greater than a large constant, x is scaled to
+*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
+*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
+*
+*  Similarly, a row-wise scheme is used to solve A'*x = b.  The basic
+*  algorithm for A upper triangular is
+*
+*       for j = 1, ..., n
+*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
+*       end
+*
+*  We simultaneously compute two bounds
+*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
+*       M(j) = bound on x(i), 1<=i<=j
+*
+*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
+*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
+*  Then the bound on x(j) is
+*
+*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
+*
+*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
+*                      1<=i<=j
+*
+*  and we can safely call DTBSV if 1/M(n) and 1/G(n) are both greater
+*  than max(underflow, 1/overflow).
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO, HALF, ONE
+      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            NOTRAN, NOUNIT, UPPER
+      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
+      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
+     $                   TMAX, TSCAL, USCAL, XBND, XJ, XMAX
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IDAMAX
+      DOUBLE PRECISION   DASUM, DDOT, DLAMCH
+      EXTERNAL           LSAME, IDAMAX, DASUM, DDOT, DLAMCH
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DAXPY, DSCAL, DTBSV, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      NOTRAN = LSAME( TRANS, 'N' )
+      NOUNIT = LSAME( DIAG, 'N' )
+*
+*     Test the input parameters.
+*
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
+     $         LSAME( TRANS, 'C' ) ) THEN
+         INFO = -2
+      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
+         INFO = -3
+      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
+     $         LSAME( NORMIN, 'N' ) ) THEN
+         INFO = -4
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -5
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -6
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DLATBS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Determine machine dependent parameters to control overflow.
+*
+      SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
+      BIGNUM = ONE / SMLNUM
+      SCALE = ONE
+*
+      IF( LSAME( NORMIN, 'N' ) ) THEN
+*
+*        Compute the 1-norm of each column, not including the diagonal.
+*
+         IF( UPPER ) THEN
+*
+*           A is upper triangular.
+*
+            DO 10 J = 1, N
+               JLEN = MIN( KD, J-1 )
+               CNORM( J ) = DASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
+   10       CONTINUE
+         ELSE
+*
+*           A is lower triangular.
+*
+            DO 20 J = 1, N
+               JLEN = MIN( KD, N-J )
+               IF( JLEN.GT.0 ) THEN
+                  CNORM( J ) = DASUM( JLEN, AB( 2, J ), 1 )
+               ELSE
+                  CNORM( J ) = ZERO
+               END IF
+   20       CONTINUE
+         END IF
+      END IF
+*
+*     Scale the column norms by TSCAL if the maximum element in CNORM is
+*     greater than BIGNUM.
+*
+      IMAX = IDAMAX( N, CNORM, 1 )
+      TMAX = CNORM( IMAX )
+      IF( TMAX.LE.BIGNUM ) THEN
+         TSCAL = ONE
+      ELSE
+         TSCAL = ONE / ( SMLNUM*TMAX )
+         CALL DSCAL( N, TSCAL, CNORM, 1 )
+      END IF
+*
+*     Compute a bound on the computed solution vector to see if the
+*     Level 2 BLAS routine DTBSV can be used.
+*
+      J = IDAMAX( N, X, 1 )
+      XMAX = ABS( X( J ) )
+      XBND = XMAX
+      IF( NOTRAN ) THEN
+*
+*        Compute the growth in A * x = b.
+*
+         IF( UPPER ) THEN
+            JFIRST = N
+            JLAST = 1
+            JINC = -1
+            MAIND = KD + 1
+         ELSE
+            JFIRST = 1
+            JLAST = N
+            JINC = 1
+            MAIND = 1
+         END IF
+*
+         IF( TSCAL.NE.ONE ) THEN
+            GROW = ZERO
+            GO TO 50
+         END IF
+*
+         IF( NOUNIT ) THEN
+*
+*           A is non-unit triangular.
+*
+*           Compute GROW = 1/G(j) and XBND = 1/M(j).
+*           Initially, G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = ONE / MAX( XBND, SMLNUM )
+            XBND = GROW
+            DO 30 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 50
+*
+*              M(j) = G(j-1) / abs(A(j,j))
+*
+               TJJ = ABS( AB( MAIND, J ) )
+               XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
+               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
+*
+*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
+*
+                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
+               ELSE
+*
+*                 G(j) could overflow, set GROW to 0.
+*
+                  GROW = ZERO
+               END IF
+   30       CONTINUE
+            GROW = XBND
+         ELSE
+*
+*           A is unit triangular.
+*
+*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
+            DO 40 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 50
+*
+*              G(j) = G(j-1)*( 1 + CNORM(j) )
+*
+               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
+   40       CONTINUE
+         END IF
+   50    CONTINUE
+*
+      ELSE
+*
+*        Compute the growth in A' * x = b.
+*
+         IF( UPPER ) THEN
+            JFIRST = 1
+            JLAST = N
+            JINC = 1
+            MAIND = KD + 1
+         ELSE
+            JFIRST = N
+            JLAST = 1
+            JINC = -1
+            MAIND = 1
+         END IF
+*
+         IF( TSCAL.NE.ONE ) THEN
+            GROW = ZERO
+            GO TO 80
+         END IF
+*
+         IF( NOUNIT ) THEN
+*
+*           A is non-unit triangular.
+*
+*           Compute GROW = 1/G(j) and XBND = 1/M(j).
+*           Initially, M(0) = max{x(i), i=1,...,n}.
+*
+            GROW = ONE / MAX( XBND, SMLNUM )
+            XBND = GROW
+            DO 60 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 80
+*
+*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
+*
+               XJ = ONE + CNORM( J )
+               GROW = MIN( GROW, XBND / XJ )
+*
+*              M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
+*
+               TJJ = ABS( AB( MAIND, J ) )
+               IF( XJ.GT.TJJ )
+     $            XBND = XBND*( TJJ / XJ )
+   60       CONTINUE
+            GROW = MIN( GROW, XBND )
+         ELSE
+*
+*           A is unit triangular.
+*
+*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
+            DO 70 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 80
+*
+*              G(j) = ( 1 + CNORM(j) )*G(j-1)
+*
+               XJ = ONE + CNORM( J )
+               GROW = GROW / XJ
+   70       CONTINUE
+         END IF
+   80    CONTINUE
+      END IF
+*
+      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
+*
+*        Use the Level 2 BLAS solve if the reciprocal of the bound on
+*        elements of X is not too small.
+*
+         CALL DTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
+      ELSE
+*
+*        Use a Level 1 BLAS solve, scaling intermediate results.
+*
+         IF( XMAX.GT.BIGNUM ) THEN
+*
+*           Scale X so that its components are less than or equal to
+*           BIGNUM in absolute value.
+*
+            SCALE = BIGNUM / XMAX
+            CALL DSCAL( N, SCALE, X, 1 )
+            XMAX = BIGNUM
+         END IF
+*
+         IF( NOTRAN ) THEN
+*
+*           Solve A * x = b
+*
+            DO 110 J = JFIRST, JLAST, JINC
+*
+*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
+*
+               XJ = ABS( X( J ) )
+               IF( NOUNIT ) THEN
+                  TJJS = AB( MAIND, J )*TSCAL
+               ELSE
+                  TJJS = TSCAL
+                  IF( TSCAL.EQ.ONE )
+     $               GO TO 100
+               END IF
+               TJJ = ABS( TJJS )
+               IF( TJJ.GT.SMLNUM ) THEN
+*
+*                    abs(A(j,j)) > SMLNUM:
+*
+                  IF( TJJ.LT.ONE ) THEN
+                     IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                          Scale x by 1/b(j).
+*
+                        REC = ONE / XJ
+                        CALL DSCAL( N, REC, X, 1 )
+                        SCALE = SCALE*REC
+                        XMAX = XMAX*REC
+                     END IF
+                  END IF
+                  X( J ) = X( J ) / TJJS
+                  XJ = ABS( X( J ) )
+               ELSE IF( TJJ.GT.ZERO ) THEN
+*
+*                    0 < abs(A(j,j)) <= SMLNUM:
+*
+                  IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
+*                       to avoid overflow when dividing by A(j,j).
+*
+                     REC = ( TJJ*BIGNUM ) / XJ
+                     IF( CNORM( J ).GT.ONE ) THEN
+*
+*                          Scale by 1/CNORM(j) to avoid overflow when
+*                          multiplying x(j) times column j.
+*
+                        REC = REC / CNORM( J )
+                     END IF
+                     CALL DSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                     XMAX = XMAX*REC
+                  END IF
+                  X( J ) = X( J ) / TJJS
+                  XJ = ABS( X( J ) )
+               ELSE
+*
+*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
+*                    scale = 0, and compute a solution to A*x = 0.
+*
+                  DO 90 I = 1, N
+                     X( I ) = ZERO
+   90             CONTINUE
+                  X( J ) = ONE
+                  XJ = ONE
+                  SCALE = ZERO
+                  XMAX = ZERO
+               END IF
+  100          CONTINUE
+*
+*              Scale x if necessary to avoid overflow when adding a
+*              multiple of column j of A.
+*
+               IF( XJ.GT.ONE ) THEN
+                  REC = ONE / XJ
+                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
+*
+*                    Scale x by 1/(2*abs(x(j))).
+*
+                     REC = REC*HALF
+                     CALL DSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                  END IF
+               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
+*
+*                 Scale x by 1/2.
+*
+                  CALL DSCAL( N, HALF, X, 1 )
+                  SCALE = SCALE*HALF
+               END IF
+*
+               IF( UPPER ) THEN
+                  IF( J.GT.1 ) THEN
+*
+*                    Compute the update
+*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
+*                                             x(j)* A(max(1,j-kd):j-1,j)
+*
+                     JLEN = MIN( KD, J-1 )
+                     CALL DAXPY( JLEN, -X( J )*TSCAL,
+     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
+                     I = IDAMAX( J-1, X, 1 )
+                     XMAX = ABS( X( I ) )
+                  END IF
+               ELSE IF( J.LT.N ) THEN
+*
+*                 Compute the update
+*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
+*                                          x(j) * A(j+1:min(j+kd,n),j)
+*
+                  JLEN = MIN( KD, N-J )
+                  IF( JLEN.GT.0 )
+     $               CALL DAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
+     $                           X( J+1 ), 1 )
+                  I = J + IDAMAX( N-J, X( J+1 ), 1 )
+                  XMAX = ABS( X( I ) )
+               END IF
+  110       CONTINUE
+*
+         ELSE
+*
+*           Solve A' * x = b
+*
+            DO 160 J = JFIRST, JLAST, JINC
+*
+*              Compute x(j) = b(j) - sum A(k,j)*x(k).
+*                                    k<>j
+*
+               XJ = ABS( X( J ) )
+               USCAL = TSCAL
+               REC = ONE / MAX( XMAX, ONE )
+               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
+*
+*                 If x(j) could overflow, scale x by 1/(2*XMAX).
+*
+                  REC = REC*HALF
+                  IF( NOUNIT ) THEN
+                     TJJS = AB( MAIND, J )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                  END IF
+                  TJJ = ABS( TJJS )
+                  IF( TJJ.GT.ONE ) THEN
+*
+*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
+*
+                     REC = MIN( ONE, REC*TJJ )
+                     USCAL = USCAL / TJJS
+                  END IF
+                  IF( REC.LT.ONE ) THEN
+                     CALL DSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                     XMAX = XMAX*REC
+                  END IF
+               END IF
+*
+               SUMJ = ZERO
+               IF( USCAL.EQ.ONE ) THEN
+*
+*                 If the scaling needed for A in the dot product is 1,
+*                 call DDOT to perform the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     SUMJ = DDOT( JLEN, AB( KD+1-JLEN, J ), 1,
+     $                      X( J-JLEN ), 1 )
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     IF( JLEN.GT.0 )
+     $                  SUMJ = DDOT( JLEN, AB( 2, J ), 1, X( J+1 ), 1 )
+                  END IF
+               ELSE
+*
+*                 Otherwise, use in-line code for the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     DO 120 I = 1, JLEN
+                        SUMJ = SUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
+     $                         X( J-JLEN-1+I )
+  120                CONTINUE
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     DO 130 I = 1, JLEN
+                        SUMJ = SUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
+  130                CONTINUE
+                  END IF
+               END IF
+*
+               IF( USCAL.EQ.TSCAL ) THEN
+*
+*                 Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j)
+*                 was not used to scale the dotproduct.
+*
+                  X( J ) = X( J ) - SUMJ
+                  XJ = ABS( X( J ) )
+                  IF( NOUNIT ) THEN
+*
+*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
+*
+                     TJJS = AB( MAIND, J )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                     IF( TSCAL.EQ.ONE )
+     $                  GO TO 150
+                  END IF
+                  TJJ = ABS( TJJS )
+                  IF( TJJ.GT.SMLNUM ) THEN
+*
+*                       abs(A(j,j)) > SMLNUM:
+*
+                     IF( TJJ.LT.ONE ) THEN
+                        IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                             Scale X by 1/abs(x(j)).
+*
+                           REC = ONE / XJ
+                           CALL DSCAL( N, REC, X, 1 )
+                           SCALE = SCALE*REC
+                           XMAX = XMAX*REC
+                        END IF
+                     END IF
+                     X( J ) = X( J ) / TJJS
+                  ELSE IF( TJJ.GT.ZERO ) THEN
+*
+*                       0 < abs(A(j,j)) <= SMLNUM:
+*
+                     IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
+*
+                        REC = ( TJJ*BIGNUM ) / XJ
+                        CALL DSCAL( N, REC, X, 1 )
+                        SCALE = SCALE*REC
+                        XMAX = XMAX*REC
+                     END IF
+                     X( J ) = X( J ) / TJJS
+                  ELSE
+*
+*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
+*                       scale = 0, and compute a solution to A'*x = 0.
+*
+                     DO 140 I = 1, N
+                        X( I ) = ZERO
+  140                CONTINUE
+                     X( J ) = ONE
+                     SCALE = ZERO
+                     XMAX = ZERO
+                  END IF
+  150             CONTINUE
+               ELSE
+*
+*                 Compute x(j) := x(j) / A(j,j) - sumj if the dot
+*                 product has already been divided by 1/A(j,j).
+*
+                  X( J ) = X( J ) / TJJS - SUMJ
+               END IF
+               XMAX = MAX( XMAX, ABS( X( J ) ) )
+  160       CONTINUE
+         END IF
+         SCALE = SCALE / TSCAL
+      END IF
+*
+*     Scale the column norms by 1/TSCAL for return.
+*
+      IF( TSCAL.NE.ONE ) THEN
+         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
+      END IF
+*
+      RETURN
+*
+*     End of DLATBS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpbcon.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,188 @@
+      SUBROUTINE DPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
+     $                   IWORK, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+      DOUBLE PRECISION   ANORM, RCOND
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IWORK( * )
+      DOUBLE PRECISION   AB( LDAB, * ), WORK( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPBCON estimates the reciprocal of the condition number (in the
+*  1-norm) of a real symmetric positive definite band matrix using the
+*  Cholesky factorization A = U**T*U or A = L*L**T computed by DPBTRF.
+*
+*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
+*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          = 'U':  Upper triangular factor stored in AB;
+*          = 'L':  Lower triangular factor stored in AB.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*          The triangular factor U or L from the Cholesky factorization
+*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
+*          first KD+1 rows of the array.  The j-th column of U or L is
+*          stored in the j-th column of the array AB as follows:
+*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  ANORM   (input) DOUBLE PRECISION
+*          The 1-norm (or infinity-norm) of the symmetric band matrix A.
+*
+*  RCOND   (output) DOUBLE PRECISION
+*          The reciprocal of the condition number of the matrix A,
+*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
+*          estimate of the 1-norm of inv(A) computed in this routine.
+*
+*  WORK    (workspace) DOUBLE PRECISION array, dimension (3*N)
+*
+*  IWORK   (workspace) INTEGER array, dimension (N)
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0:  if INFO = -i, the i-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      CHARACTER          NORMIN
+      INTEGER            IX, KASE
+      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IDAMAX
+      DOUBLE PRECISION   DLAMCH
+      EXTERNAL           LSAME, IDAMAX, DLAMCH
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DLACON, DLATBS, DRSCL, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      ELSE IF( ANORM.LT.ZERO ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPBCON', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      RCOND = ZERO
+      IF( N.EQ.0 ) THEN
+         RCOND = ONE
+         RETURN
+      ELSE IF( ANORM.EQ.ZERO ) THEN
+         RETURN
+      END IF
+*
+      SMLNUM = DLAMCH( 'Safe minimum' )
+*
+*     Estimate the 1-norm of the inverse.
+*
+      KASE = 0
+      NORMIN = 'N'
+   10 CONTINUE
+      CALL DLACON( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE )
+      IF( KASE.NE.0 ) THEN
+         IF( UPPER ) THEN
+*
+*           Multiply by inv(U').
+*
+            CALL DLATBS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
+     $                   INFO )
+            NORMIN = 'Y'
+*
+*           Multiply by inv(U).
+*
+            CALL DLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
+     $                   INFO )
+         ELSE
+*
+*           Multiply by inv(L).
+*
+            CALL DLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEL, WORK( 2*N+1 ),
+     $                   INFO )
+            NORMIN = 'Y'
+*
+*           Multiply by inv(L').
+*
+            CALL DLATBS( 'Lower', 'Transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEU, WORK( 2*N+1 ),
+     $                   INFO )
+         END IF
+*
+*        Multiply by 1/SCALE if doing so will not cause overflow.
+*
+         SCALE = SCALEL*SCALEU
+         IF( SCALE.NE.ONE ) THEN
+            IX = IDAMAX( N, WORK, 1 )
+            IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
+     $         GO TO 20
+            CALL DRSCL( N, SCALE, WORK, 1 )
+         END IF
+         GO TO 10
+      END IF
+*
+*     Compute the estimate of the reciprocal condition number.
+*
+      IF( AINVNM.NE.ZERO )
+     $   RCOND = ( ONE / AINVNM ) / ANORM
+*
+   20 CONTINUE
+*
+      RETURN
+*
+*     End of DPBCON
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpbtf2.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,195 @@
+      SUBROUTINE DPBTF2( UPLO, N, KD, AB, LDAB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPBTF2 computes the Cholesky factorization of a real symmetric
+*  positive definite band 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, U' is the transpose of U, 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.
+*
+*  KD      (input) INTEGER
+*          The number of super-diagonals of the matrix A if UPLO = 'U',
+*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
+*          On entry, the upper or lower triangle of the symmetric band
+*          matrix A, stored in the first KD+1 rows of the array.  The
+*          j-th column of A is stored in the j-th column of the array AB
+*          as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*          On exit, if INFO = 0, the triangular factor U or L from the
+*          Cholesky factorization A = U'*U or A = L*L' of the band
+*          matrix A, in the same storage format as A.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  N = 6, KD = 2, and UPLO = 'U':
+*
+*  On entry:                       On exit:
+*
+*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*
+*  Similarly, if UPLO = 'L' the format of A is as follows:
+*
+*  On entry:                       On exit:
+*
+*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
+*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
+*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
+*
+*  Array elements marked * are not used by the routine.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      INTEGER            J, KLD, KN
+      DOUBLE PRECISION   AJJ
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DSCAL, DSYR, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN, SQRT
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPBTF2', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+      KLD = MAX( 1, LDAB-1 )
+*
+      IF( UPPER ) THEN
+*
+*        Compute the Cholesky factorization A = U'*U.
+*
+         DO 10 J = 1, N
+*
+*           Compute U(J,J) and test for non-positive-definiteness.
+*
+            AJJ = AB( KD+1, J )
+            IF( AJJ.LE.ZERO )
+     $         GO TO 30
+            AJJ = SQRT( AJJ )
+            AB( KD+1, J ) = AJJ
+*
+*           Compute elements J+1:J+KN of row J and update the
+*           trailing submatrix within the band.
+*
+            KN = MIN( KD, N-J )
+            IF( KN.GT.0 ) THEN
+               CALL DSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
+               CALL DSYR( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
+     $                    AB( KD+1, J+1 ), KLD )
+            END IF
+   10    CONTINUE
+      ELSE
+*
+*        Compute the Cholesky factorization A = L*L'.
+*
+         DO 20 J = 1, N
+*
+*           Compute L(J,J) and test for non-positive-definiteness.
+*
+            AJJ = AB( 1, J )
+            IF( AJJ.LE.ZERO )
+     $         GO TO 30
+            AJJ = SQRT( AJJ )
+            AB( 1, J ) = AJJ
+*
+*           Compute elements J+1:J+KN of column J and update the
+*           trailing submatrix within the band.
+*
+            KN = MIN( KD, N-J )
+            IF( KN.GT.0 ) THEN
+               CALL DSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
+               CALL DSYR( 'Lower', KN, -ONE, AB( 2, J ), 1,
+     $                    AB( 1, J+1 ), KLD )
+            END IF
+   20    CONTINUE
+      END IF
+      RETURN
+*
+   30 CONTINUE
+      INFO = J
+      RETURN
+*
+*     End of DPBTF2
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpbtrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,365 @@
+      SUBROUTINE DPBTRF( UPLO, N, KD, AB, LDAB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPBTRF computes the Cholesky factorization of a real symmetric
+*  positive definite band 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.
+*
+*  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.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
+*          On entry, the upper or lower triangle of the symmetric band
+*          matrix A, stored in the first KD+1 rows of the array.  The
+*          j-th column of A is stored in the j-th column of the array AB
+*          as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*          On exit, if INFO = 0, the triangular factor U or L from the
+*          Cholesky factorization A = U**T*U or A = L*L**T of the band
+*          matrix A, in the same storage format as A.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  N = 6, KD = 2, and UPLO = 'U':
+*
+*  On entry:                       On exit:
+*
+*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*
+*  Similarly, if UPLO = 'L' the format of A is as follows:
+*
+*  On entry:                       On exit:
+*
+*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
+*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
+*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
+*
+*  Array elements marked * are not used by the routine.
+*
+*  Contributed by
+*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+      INTEGER            NBMAX, LDWORK
+      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, I2, I3, IB, II, J, JJ, NB
+*     ..
+*     .. Local Arrays ..
+      DOUBLE PRECISION   WORK( LDWORK, NBMAX )
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            ILAENV
+      EXTERNAL           LSAME, ILAENV
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DGEMM, DPBTF2, DPOTF2, DSYRK, DTRSM, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
+     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPBTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Determine the block size for this environment
+*
+      NB = ILAENV( 1, 'DPBTRF', UPLO, N, KD, -1, -1 )
+*
+*     The block size must not exceed the semi-bandwidth KD, and must not
+*     exceed the limit set by the size of the local array WORK.
+*
+      NB = MIN( NB, NBMAX )
+*
+      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
+*
+*        Use unblocked code
+*
+         CALL DPBTF2( UPLO, N, KD, AB, LDAB, INFO )
+      ELSE
+*
+*        Use blocked code
+*
+         IF( LSAME( UPLO, 'U' ) ) THEN
+*
+*           Compute the Cholesky factorization of a symmetric band
+*           matrix, given the upper triangle of the matrix in band
+*           storage.
+*
+*           Zero the upper triangle of the work array.
+*
+            DO 20 J = 1, NB
+               DO 10 I = 1, J - 1
+                  WORK( I, J ) = ZERO
+   10          CONTINUE
+   20       CONTINUE
+*
+*           Process the band matrix one diagonal block at a time.
+*
+            DO 70 I = 1, N, NB
+               IB = MIN( NB, N-I+1 )
+*
+*              Factorize the diagonal block
+*
+               CALL DPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
+               IF( II.NE.0 ) THEN
+                  INFO = I + II - 1
+                  GO TO 150
+               END IF
+               IF( I+IB.LE.N ) THEN
+*
+*                 Update the relevant part of the trailing submatrix.
+*                 If A11 denotes the diagonal block which has just been
+*                 factorized, then we need to update the remaining
+*                 blocks in the diagram:
+*
+*                    A11   A12   A13
+*                          A22   A23
+*                                A33
+*
+*                 The numbers of rows and columns in the partitioning
+*                 are IB, I2, I3 respectively. The blocks A12, A22 and
+*                 A23 are empty if IB = KD. The upper triangle of A13
+*                 lies outside the band.
+*
+                  I2 = MIN( KD-IB, N-I-IB+1 )
+                  I3 = MIN( IB, N-I-KD+1 )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A12
+*
+                     CALL DTRSM( 'Left', 'Upper', 'Transpose',
+     $                           'Non-unit', IB, I2, ONE, AB( KD+1, I ),
+     $                           LDAB-1, AB( KD+1-IB, I+IB ), LDAB-1 )
+*
+*                    Update A22
+*
+                     CALL DSYRK( 'Upper', 'Transpose', I2, IB, -ONE,
+     $                           AB( KD+1-IB, I+IB ), LDAB-1, ONE,
+     $                           AB( KD+1, I+IB ), LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Copy the lower triangle of A13 into the work array.
+*
+                     DO 40 JJ = 1, I3
+                        DO 30 II = JJ, IB
+                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
+   30                   CONTINUE
+   40                CONTINUE
+*
+*                    Update A13 (in the work array).
+*
+                     CALL DTRSM( 'Left', 'Upper', 'Transpose',
+     $                           'Non-unit', IB, I3, ONE, AB( KD+1, I ),
+     $                           LDAB-1, WORK, LDWORK )
+*
+*                    Update A23
+*
+                     IF( I2.GT.0 )
+     $                  CALL DGEMM( 'Transpose', 'No Transpose', I2, I3,
+     $                              IB, -ONE, AB( KD+1-IB, I+IB ),
+     $                              LDAB-1, WORK, LDWORK, ONE,
+     $                              AB( 1+IB, I+KD ), LDAB-1 )
+*
+*                    Update A33
+*
+                     CALL DSYRK( 'Upper', 'Transpose', I3, IB, -ONE,
+     $                           WORK, LDWORK, ONE, AB( KD+1, I+KD ),
+     $                           LDAB-1 )
+*
+*                    Copy the lower triangle of A13 back into place.
+*
+                     DO 60 JJ = 1, I3
+                        DO 50 II = JJ, IB
+                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
+   50                   CONTINUE
+   60                CONTINUE
+                  END IF
+               END IF
+   70       CONTINUE
+         ELSE
+*
+*           Compute the Cholesky factorization of a symmetric band
+*           matrix, given the lower triangle of the matrix in band
+*           storage.
+*
+*           Zero the lower triangle of the work array.
+*
+            DO 90 J = 1, NB
+               DO 80 I = J + 1, NB
+                  WORK( I, J ) = ZERO
+   80          CONTINUE
+   90       CONTINUE
+*
+*           Process the band matrix one diagonal block at a time.
+*
+            DO 140 I = 1, N, NB
+               IB = MIN( NB, N-I+1 )
+*
+*              Factorize the diagonal block
+*
+               CALL DPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
+               IF( II.NE.0 ) THEN
+                  INFO = I + II - 1
+                  GO TO 150
+               END IF
+               IF( I+IB.LE.N ) THEN
+*
+*                 Update the relevant part of the trailing submatrix.
+*                 If A11 denotes the diagonal block which has just been
+*                 factorized, then we need to update the remaining
+*                 blocks in the diagram:
+*
+*                    A11
+*                    A21   A22
+*                    A31   A32   A33
+*
+*                 The numbers of rows and columns in the partitioning
+*                 are IB, I2, I3 respectively. The blocks A21, A22 and
+*                 A32 are empty if IB = KD. The lower triangle of A31
+*                 lies outside the band.
+*
+                  I2 = MIN( KD-IB, N-I-IB+1 )
+                  I3 = MIN( IB, N-I-KD+1 )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A21
+*
+                     CALL DTRSM( 'Right', 'Lower', 'Transpose',
+     $                           'Non-unit', I2, IB, ONE, AB( 1, I ),
+     $                           LDAB-1, AB( 1+IB, I ), LDAB-1 )
+*
+*                    Update A22
+*
+                     CALL DSYRK( 'Lower', 'No Transpose', I2, IB, -ONE,
+     $                           AB( 1+IB, I ), LDAB-1, ONE,
+     $                           AB( 1, I+IB ), LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Copy the upper triangle of A31 into the work array.
+*
+                     DO 110 JJ = 1, IB
+                        DO 100 II = 1, MIN( JJ, I3 )
+                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
+  100                   CONTINUE
+  110                CONTINUE
+*
+*                    Update A31 (in the work array).
+*
+                     CALL DTRSM( 'Right', 'Lower', 'Transpose',
+     $                           'Non-unit', I3, IB, ONE, AB( 1, I ),
+     $                           LDAB-1, WORK, LDWORK )
+*
+*                    Update A32
+*
+                     IF( I2.GT.0 )
+     $                  CALL DGEMM( 'No transpose', 'Transpose', I3, I2,
+     $                              IB, -ONE, WORK, LDWORK,
+     $                              AB( 1+IB, I ), LDAB-1, ONE,
+     $                              AB( 1+KD-IB, I+IB ), LDAB-1 )
+*
+*                    Update A33
+*
+                     CALL DSYRK( 'Lower', 'No Transpose', I3, IB, -ONE,
+     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
+     $                           LDAB-1 )
+*
+*                    Copy the upper triangle of A31 back into place.
+*
+                     DO 130 JJ = 1, IB
+                        DO 120 II = 1, MIN( JJ, I3 )
+                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
+  120                   CONTINUE
+  130                CONTINUE
+                  END IF
+               END IF
+  140       CONTINUE
+         END IF
+      END IF
+      RETURN
+*
+  150 CONTINUE
+      RETURN
+*
+*     End of DPBTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpbtrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,146 @@
+      SUBROUTINE DPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   AB( LDAB, * ), B( LDB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPBTRS solves a system of linear equations A*X = B with a symmetric
+*  positive definite band matrix A using the Cholesky factorization
+*  A = U**T*U or A = L*L**T computed by DPBTRF.
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          = 'U':  Upper triangular factor stored in AB;
+*          = 'L':  Lower triangular factor stored in AB.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
+*
+*  NRHS    (input) INTEGER
+*          The number of right hand sides, i.e., the number of columns
+*          of the matrix B.  NRHS >= 0.
+*
+*  AB      (input) DOUBLE PRECISION array, dimension (LDAB,N)
+*          The triangular factor U or L from the Cholesky factorization
+*          A = U**T*U or A = L*L**T of the band matrix A, stored in the
+*          first KD+1 rows of the array.  The j-th column of U or L is
+*          stored in the j-th column of the array AB as follows:
+*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  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
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      INTEGER            J
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DTBSV, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -6
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPBTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+      IF( UPPER ) THEN
+*
+*        Solve A*X = B where A = U'*U.
+*
+         DO 10 J = 1, NRHS
+*
+*           Solve U'*X = B, overwriting B with X.
+*
+            CALL DTBSV( 'Upper', 'Transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+*
+*           Solve U*X = B, overwriting B with X.
+*
+            CALL DTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+   10    CONTINUE
+      ELSE
+*
+*        Solve A*X = B where A = L*L'.
+*
+         DO 20 J = 1, NRHS
+*
+*           Solve L*X = B, overwriting B with X.
+*
+            CALL DTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+*
+*           Solve L'*X = B, overwriting B with X.
+*
+            CALL DTBSV( 'Lower', 'Transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+   20    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of DPBTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dptsv.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,100 @@
+      SUBROUTINE DPTSV( N, NRHS, D, E, B, LDB, INFO )
+*
+*  -- LAPACK routine (version 3.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     February 25, 1997
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPTSV computes the solution to a real system of linear equations
+*  A*X = B, where A is an N-by-N symmetric positive definite tridiagonal
+*  matrix, and X and B are N-by-NRHS matrices.
+*
+*  A is factored as A = L*D*L**T, and the factored form of A is then
+*  used to solve the system of equations.
+*
+*  Arguments
+*  =========
+*
+*  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.
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, the n diagonal elements of the tridiagonal matrix
+*          A.  On exit, the n diagonal elements of the diagonal matrix
+*          D from the factorization A = L*D*L**T.
+*
+*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, the (n-1) subdiagonal elements of the tridiagonal
+*          matrix A.  On exit, the (n-1) subdiagonal elements of the
+*          unit bidiagonal factor L from the L*D*L**T factorization of
+*          A.  (E can also be regarded as the superdiagonal of the unit
+*          bidiagonal factor U from the U**T*D*U factorization of A.)
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the N-by-NRHS right hand side matrix B.
+*          On exit, if INFO = 0, the N-by-NRHS 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
+*          > 0:  if INFO = i, the leading minor of order i is not
+*                positive definite, and the solution has not been
+*                computed.  The factorization has not been completed
+*                unless i = N.
+*
+*  =====================================================================
+*
+*     .. External Subroutines ..
+      EXTERNAL           DPTTRF, DPTTRS, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPTSV ', -INFO )
+         RETURN
+      END IF
+*
+*     Compute the L*D*L' (or U'*D*U) factorization of A.
+*
+      CALL DPTTRF( N, D, E, INFO )
+      IF( INFO.EQ.0 ) THEN
+*
+*        Solve the system A*X = B, overwriting B with X.
+*
+         CALL DPTTRS( N, NRHS, D, E, B, LDB, INFO )
+      END IF
+      RETURN
+*
+*     End of DPTSV
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpttrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,153 @@
+      SUBROUTINE DPTTRF( N, D, E, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, N
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   D( * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPTTRF computes the L*D*L' factorization of a real symmetric
+*  positive definite tridiagonal matrix A.  The factorization may also
+*  be regarded as having the form A = U'*D*U.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, the n diagonal elements of the tridiagonal matrix
+*          A.  On exit, the n diagonal elements of the diagonal matrix
+*          D from the L*D*L' factorization of A.
+*
+*  E       (input/output) DOUBLE PRECISION array, dimension (N-1)
+*          On entry, the (n-1) subdiagonal elements of the tridiagonal
+*          matrix A.  On exit, the (n-1) subdiagonal elements of the
+*          unit bidiagonal factor L from the L*D*L' factorization of A.
+*          E can also be regarded as the superdiagonal of the unit
+*          bidiagonal factor U from the U'*D*U factorization of A.
+*
+*  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; if k < N, the factorization could not
+*               be completed, while if k = N, the factorization was
+*               completed, but D(N) = 0.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO
+      PARAMETER          ( ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, I4
+      DOUBLE PRECISION   EI
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MOD
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+         CALL XERBLA( 'DPTTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Compute the L*D*L' (or U'*D*U) factorization of A.
+*
+      I4 = MOD( N-1, 4 )
+      DO 10 I = 1, I4
+         IF( D( I ).LE.ZERO ) THEN
+            INFO = I
+            GO TO 30
+         END IF
+         EI = E( I )
+         E( I ) = EI / D( I )
+         D( I+1 ) = D( I+1 ) - E( I )*EI
+   10 CONTINUE
+*
+      DO 20 I = I4 + 1, N - 4, 4
+*
+*        Drop out of the loop if d(i) <= 0: the matrix is not positive
+*        definite.
+*
+         IF( D( I ).LE.ZERO ) THEN
+            INFO = I
+            GO TO 30
+         END IF
+*
+*        Solve for e(i) and d(i+1).
+*
+         EI = E( I )
+         E( I ) = EI / D( I )
+         D( I+1 ) = D( I+1 ) - E( I )*EI
+*
+         IF( D( I+1 ).LE.ZERO ) THEN
+            INFO = I + 1
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+1) and d(i+2).
+*
+         EI = E( I+1 )
+         E( I+1 ) = EI / D( I+1 )
+         D( I+2 ) = D( I+2 ) - E( I+1 )*EI
+*
+         IF( D( I+2 ).LE.ZERO ) THEN
+            INFO = I + 2
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+2) and d(i+3).
+*
+         EI = E( I+2 )
+         E( I+2 ) = EI / D( I+2 )
+         D( I+3 ) = D( I+3 ) - E( I+2 )*EI
+*
+         IF( D( I+3 ).LE.ZERO ) THEN
+            INFO = I + 3
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+3) and d(i+4).
+*
+         EI = E( I+3 )
+         E( I+3 ) = EI / D( I+3 )
+         D( I+4 ) = D( I+4 ) - E( I+3 )*EI
+   20 CONTINUE
+*
+*     Check d(n) for positive definiteness.
+*
+      IF( D( N ).LE.ZERO )
+     $   INFO = N
+*
+   30 CONTINUE
+      RETURN
+*
+*     End of DPTTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dpttrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,115 @@
+      SUBROUTINE DPTTRS( N, NRHS, D, E, B, LDB, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPTTRS solves a tridiagonal system of the form
+*     A * X = B
+*  using the L*D*L' factorization of A computed by DPTTRF.  D is a
+*  diagonal matrix specified in the vector D, L is a unit bidiagonal
+*  matrix whose subdiagonal is specified in the vector E, and X and B
+*  are N by NRHS matrices.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the tridiagonal 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.
+*
+*  D       (input) DOUBLE PRECISION array, dimension (N)
+*          The n diagonal elements of the diagonal matrix D from the
+*          L*D*L' factorization of A.
+*
+*  E       (input) DOUBLE PRECISION array, dimension (N-1)
+*          The (n-1) subdiagonal elements of the unit bidiagonal factor
+*          L from the L*D*L' factorization of A.  E can also be regarded
+*          as the superdiagonal of the unit bidiagonal factor U from the
+*          factorization A = U'*D*U.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the right hand side vectors B for the system of
+*          linear equations.
+*          On exit, the solution vectors, X.
+*
+*  LDB     (input) INTEGER
+*          The leading dimension of the array B.  LDB >= max(1,N).
+*
+*  INFO    (output) INTEGER
+*          = 0: successful exit
+*          < 0: if INFO = -k, the k-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      INTEGER            J, JB, NB
+*     ..
+*     .. External Functions ..
+      INTEGER            ILAENV
+      EXTERNAL           ILAENV
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DPTTS2, XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input arguments.
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DPTTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+*     Determine the number of right-hand sides to solve at a time.
+*
+      IF( NRHS.EQ.1 ) THEN
+         NB = 1
+      ELSE
+         NB = MAX( 1, ILAENV( 1, 'DPTTRS', ' ', N, NRHS, -1, -1 ) )
+      END IF
+*
+      IF( NB.GE.NRHS ) THEN
+         CALL DPTTS2( N, NRHS, D, E, B, LDB )
+      ELSE
+         DO 10 J = 1, NRHS, NB
+            JB = MIN( NRHS-J+1, NB )
+            CALL DPTTS2( N, JB, D, E, B( 1, J ), LDB )
+   10    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of DPTTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/dptts2.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,94 @@
+      SUBROUTINE DPTTS2( N, NRHS, D, E, B, LDB )
+*
+*  -- 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   B( LDB, * ), D( * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  DPTTS2 solves a tridiagonal system of the form
+*     A * X = B
+*  using the L*D*L' factorization of A computed by DPTTRF.  D is a
+*  diagonal matrix specified in the vector D, L is a unit bidiagonal
+*  matrix whose subdiagonal is specified in the vector E, and X and B
+*  are N by NRHS matrices.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the tridiagonal 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.
+*
+*  D       (input) DOUBLE PRECISION array, dimension (N)
+*          The n diagonal elements of the diagonal matrix D from the
+*          L*D*L' factorization of A.
+*
+*  E       (input) DOUBLE PRECISION array, dimension (N-1)
+*          The (n-1) subdiagonal elements of the unit bidiagonal factor
+*          L from the L*D*L' factorization of A.  E can also be regarded
+*          as the superdiagonal of the unit bidiagonal factor U from the
+*          factorization A = U'*D*U.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the right hand side vectors B for the system of
+*          linear equations.
+*          On exit, the solution vectors, X.
+*
+*  LDB     (input) INTEGER
+*          The leading dimension of the array B.  LDB >= max(1,N).
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      INTEGER            I, J
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DSCAL
+*     ..
+*     .. Executable Statements ..
+*
+*     Quick return if possible
+*
+      IF( N.LE.1 ) THEN
+         IF( N.EQ.1 )
+     $      CALL DSCAL( NRHS, 1.D0 / D( 1 ), B, LDB )
+         RETURN
+      END IF
+*
+*     Solve A * X = B using the factorization A = L*D*L',
+*     overwriting each right hand side vector with its solution.
+*
+      DO 30 J = 1, NRHS
+*
+*           Solve L * x = b.
+*
+         DO 10 I = 2, N
+            B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
+   10    CONTINUE
+*
+*           Solve D * L' * x = b.
+*
+         B( N, J ) = B( N, J ) / D( N )
+         DO 20 I = N - 1, 1, -1
+            B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
+   20    CONTINUE
+   30 CONTINUE
+*
+      RETURN
+*
+*     End of DPTTS2
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgbcon.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,230 @@
+      SUBROUTINE ZGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
+     $                   WORK, RWORK, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          NORM
+      INTEGER            INFO, KL, KU, LDAB, N
+      DOUBLE PRECISION   ANORM, RCOND
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      DOUBLE PRECISION   RWORK( * )
+      COMPLEX*16         AB( LDAB, * ), WORK( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGBCON estimates the reciprocal of the condition number of a complex
+*  general band matrix A, in either the 1-norm or the infinity-norm,
+*  using the LU factorization computed by ZGBTRF.
+*
+*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
+*  condition number is computed as
+*     RCOND = 1 / ( norm(A) * norm(inv(A)) ).
+*
+*  Arguments
+*  =========
+*
+*  NORM    (input) CHARACTER*1
+*          Specifies whether the 1-norm condition number or the
+*          infinity-norm condition number is required:
+*          = '1' or 'O':  1-norm;
+*          = 'I':         Infinity-norm.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KL      (input) INTEGER
+*          The number of subdiagonals within the band of A.  KL >= 0.
+*
+*  KU      (input) INTEGER
+*          The number of superdiagonals within the band of A.  KU >= 0.
+*
+*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*          Details of the LU factorization of the band matrix A, as
+*          computed by ZGBTRF.  U is stored as an upper triangular band
+*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
+*          the multipliers used during the factorization are stored in
+*          rows KL+KU+2 to 2*KL+KU+1.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
+*
+*  IPIV    (input) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= N, row i of the matrix was
+*          interchanged with row IPIV(i).
+*
+*  ANORM   (input) DOUBLE PRECISION
+*          If NORM = '1' or 'O', the 1-norm of the original matrix A.
+*          If NORM = 'I', the infinity-norm of the original matrix A.
+*
+*  RCOND   (output) DOUBLE PRECISION
+*          The reciprocal of the condition number of the matrix A,
+*          computed as RCOND = 1/(norm(A) * norm(inv(A))).
+*
+*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
+*
+*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0: if INFO = -i, the i-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            LNOTI, ONENRM
+      CHARACTER          NORMIN
+      INTEGER            IX, J, JP, KASE, KASE1, KD, LM
+      DOUBLE PRECISION   AINVNM, SCALE, SMLNUM
+      COMPLEX*16         T, ZDUM
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IZAMAX
+      DOUBLE PRECISION   DLAMCH
+      COMPLEX*16         ZDOTC
+      EXTERNAL           LSAME, IZAMAX, DLAMCH, ZDOTC
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZAXPY, ZDRSCL, ZLACON, ZLATBS
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, DBLE, DIMAG, MIN
+*     ..
+*     .. Statement Functions ..
+      DOUBLE PRECISION   CABS1
+*     ..
+*     .. Statement Function definitions ..
+      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
+      IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KL.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( KU.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
+         INFO = -6
+      ELSE IF( ANORM.LT.ZERO ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGBCON', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      RCOND = ZERO
+      IF( N.EQ.0 ) THEN
+         RCOND = ONE
+         RETURN
+      ELSE IF( ANORM.EQ.ZERO ) THEN
+         RETURN
+      END IF
+*
+      SMLNUM = DLAMCH( 'Safe minimum' )
+*
+*     Estimate the norm of inv(A).
+*
+      AINVNM = ZERO
+      NORMIN = 'N'
+      IF( ONENRM ) THEN
+         KASE1 = 1
+      ELSE
+         KASE1 = 2
+      END IF
+      KD = KL + KU + 1
+      LNOTI = KL.GT.0
+      KASE = 0
+   10 CONTINUE
+      CALL ZLACON( N, WORK( N+1 ), WORK, AINVNM, KASE )
+      IF( KASE.NE.0 ) THEN
+         IF( KASE.EQ.KASE1 ) THEN
+*
+*           Multiply by inv(L).
+*
+            IF( LNOTI ) THEN
+               DO 20 J = 1, N - 1
+                  LM = MIN( KL, N-J )
+                  JP = IPIV( J )
+                  T = WORK( JP )
+                  IF( JP.NE.J ) THEN
+                     WORK( JP ) = WORK( J )
+                     WORK( J ) = T
+                  END IF
+                  CALL ZAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
+   20          CONTINUE
+            END IF
+*
+*           Multiply by inv(U).
+*
+            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
+         ELSE
+*
+*           Multiply by inv(U').
+*
+            CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
+     $                   NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK,
+     $                   INFO )
+*
+*           Multiply by inv(L').
+*
+            IF( LNOTI ) THEN
+               DO 30 J = N - 1, 1, -1
+                  LM = MIN( KL, N-J )
+                  WORK( J ) = WORK( J ) - ZDOTC( LM, AB( KD+1, J ), 1,
+     $                        WORK( J+1 ), 1 )
+                  JP = IPIV( J )
+                  IF( JP.NE.J ) THEN
+                     T = WORK( JP )
+                     WORK( JP ) = WORK( J )
+                     WORK( J ) = T
+                  END IF
+   30          CONTINUE
+            END IF
+         END IF
+*
+*        Divide X by 1/SCALE if doing so will not cause overflow.
+*
+         NORMIN = 'Y'
+         IF( SCALE.NE.ONE ) THEN
+            IX = IZAMAX( N, WORK, 1 )
+            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
+     $         GO TO 40
+            CALL ZDRSCL( N, SCALE, WORK, 1 )
+         END IF
+         GO TO 10
+      END IF
+*
+*     Compute the estimate of the reciprocal condition number.
+*
+      IF( AINVNM.NE.ZERO )
+     $   RCOND = ( ONE / AINVNM ) / ANORM
+*
+   40 CONTINUE
+      RETURN
+*
+*     End of ZGBCON
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgbtf2.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,203 @@
+      SUBROUTINE ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, KL, KU, LDAB, M, N
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      COMPLEX*16         AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGBTF2 computes an LU factorization of a complex m-by-n band matrix
+*  A using partial pivoting with row interchanges.
+*
+*  This is the unblocked version of the algorithm, calling Level 2 BLAS.
+*
+*  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.
+*
+*  KL      (input) INTEGER
+*          The number of subdiagonals within the band of A.  KL >= 0.
+*
+*  KU      (input) INTEGER
+*          The number of superdiagonals within the band of A.  KU >= 0.
+*
+*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
+*          On entry, the matrix A in band storage, in rows KL+1 to
+*          2*KL+KU+1; rows 1 to KL of the array need not be set.
+*          The j-th column of A is stored in the j-th column of the
+*          array AB as follows:
+*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
+*
+*          On exit, details of the factorization: U is stored as an
+*          upper triangular band matrix with KL+KU superdiagonals in
+*          rows 1 to KL+KU+1, and the multipliers used during the
+*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
+*          See below for further details.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  M = N = 6, KL = 2, KU = 1:
+*
+*  On entry:                       On exit:
+*
+*      *    *    *    +    +    +       *    *    *   u14  u25  u36
+*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
+*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
+*
+*  Array elements marked * are not used by the routine; elements marked
+*  + need not be set on entry, but are required by the routine to store
+*  elements of U, because of fill-in resulting from the row
+*  interchanges.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      COMPLEX*16         ONE, ZERO
+      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
+     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, J, JP, JU, KM, KV
+*     ..
+*     .. External Functions ..
+      INTEGER            IZAMAX
+      EXTERNAL           IZAMAX
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZGERU, ZSCAL, ZSWAP
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     KV is the number of superdiagonals in the factor U, allowing for
+*     fill-in.
+*
+      KV = KU + KL
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( M.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KL.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( KU.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGBTF2', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( M.EQ.0 .OR. N.EQ.0 )
+     $   RETURN
+*
+*     Gaussian elimination with partial pivoting
+*
+*     Set fill-in elements in columns KU+2 to KV to zero.
+*
+      DO 20 J = KU + 2, MIN( KV, N )
+         DO 10 I = KV - J + 2, KL
+            AB( I, J ) = ZERO
+   10    CONTINUE
+   20 CONTINUE
+*
+*     JU is the index of the last column affected by the current stage
+*     of the factorization.
+*
+      JU = 1
+*
+      DO 40 J = 1, MIN( M, N )
+*
+*        Set fill-in elements in column J+KV to zero.
+*
+         IF( J+KV.LE.N ) THEN
+            DO 30 I = 1, KL
+               AB( I, J+KV ) = ZERO
+   30       CONTINUE
+         END IF
+*
+*        Find pivot and test for singularity. KM is the number of
+*        subdiagonal elements in the current column.
+*
+         KM = MIN( KL, M-J )
+         JP = IZAMAX( KM+1, AB( KV+1, J ), 1 )
+         IPIV( J ) = JP + J - 1
+         IF( AB( KV+JP, J ).NE.ZERO ) THEN
+            JU = MAX( JU, MIN( J+KU+JP-1, N ) )
+*
+*           Apply interchange to columns J to JU.
+*
+            IF( JP.NE.1 )
+     $         CALL ZSWAP( JU-J+1, AB( KV+JP, J ), LDAB-1,
+     $                     AB( KV+1, J ), LDAB-1 )
+            IF( KM.GT.0 ) THEN
+*
+*              Compute multipliers.
+*
+               CALL ZSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
+*
+*              Update trailing submatrix within the band.
+*
+               IF( JU.GT.J )
+     $            CALL ZGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1,
+     $                        AB( KV, J+1 ), LDAB-1, AB( KV+1, J+1 ),
+     $                        LDAB-1 )
+            END IF
+         ELSE
+*
+*           If pivot is zero, set INFO to the index of the pivot
+*           unless a zero pivot has already been found.
+*
+            IF( INFO.EQ.0 )
+     $         INFO = J
+         END IF
+   40 CONTINUE
+      RETURN
+*
+*     End of ZGBTF2
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgbtrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,443 @@
+      SUBROUTINE ZGBTRF( M, N, KL, KU, AB, LDAB, IPIV, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, KL, KU, LDAB, M, N
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      COMPLEX*16         AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGBTRF computes an LU factorization of a complex m-by-n band matrix A
+*  using partial pivoting with row interchanges.
+*
+*  This is the blocked version of the algorithm, calling Level 3 BLAS.
+*
+*  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.
+*
+*  KL      (input) INTEGER
+*          The number of subdiagonals within the band of A.  KL >= 0.
+*
+*  KU      (input) INTEGER
+*          The number of superdiagonals within the band of A.  KU >= 0.
+*
+*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
+*          On entry, the matrix A in band storage, in rows KL+1 to
+*          2*KL+KU+1; rows 1 to KL of the array need not be set.
+*          The j-th column of A is stored in the j-th column of the
+*          array AB as follows:
+*          AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)
+*
+*          On exit, details of the factorization: U is stored as an
+*          upper triangular band matrix with KL+KU superdiagonals in
+*          rows 1 to KL+KU+1, and the multipliers used during the
+*          factorization are stored in rows KL+KU+2 to 2*KL+KU+1.
+*          See below for further details.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  M = N = 6, KL = 2, KU = 1:
+*
+*  On entry:                       On exit:
+*
+*      *    *    *    +    +    +       *    *    *   u14  u25  u36
+*      *    *    +    +    +    +       *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*     a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
+*     a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *
+*
+*  Array elements marked * are not used by the routine; elements marked
+*  + need not be set on entry, but are required by the routine to store
+*  elements of U because of fill-in resulting from the row interchanges.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      COMPLEX*16         ONE, ZERO
+      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
+     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
+      INTEGER            NBMAX, LDWORK
+      PARAMETER          ( NBMAX = 64, LDWORK = NBMAX+1 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
+     $                   JU, K2, KM, KV, NB, NW
+      COMPLEX*16         TEMP
+*     ..
+*     .. Local Arrays ..
+      COMPLEX*16         WORK13( LDWORK, NBMAX ),
+     $                   WORK31( LDWORK, NBMAX )
+*     ..
+*     .. External Functions ..
+      INTEGER            ILAENV, IZAMAX
+      EXTERNAL           ILAENV, IZAMAX
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZCOPY, ZGBTF2, ZGEMM, ZGERU, ZLASWP,
+     $                   ZSCAL, ZSWAP, ZTRSM
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     KV is the number of superdiagonals in the factor U, allowing for
+*     fill-in
+*
+      KV = KU + KL
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( M.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KL.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( KU.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.KL+KV+1 ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGBTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( M.EQ.0 .OR. N.EQ.0 )
+     $   RETURN
+*
+*     Determine the block size for this environment
+*
+      NB = ILAENV( 1, 'ZGBTRF', ' ', M, N, KL, KU )
+*
+*     The block size must not exceed the limit set by the size of the
+*     local arrays WORK13 and WORK31.
+*
+      NB = MIN( NB, NBMAX )
+*
+      IF( NB.LE.1 .OR. NB.GT.KL ) THEN
+*
+*        Use unblocked code
+*
+         CALL ZGBTF2( M, N, KL, KU, AB, LDAB, IPIV, INFO )
+      ELSE
+*
+*        Use blocked code
+*
+*        Zero the superdiagonal elements of the work array WORK13
+*
+         DO 20 J = 1, NB
+            DO 10 I = 1, J - 1
+               WORK13( I, J ) = ZERO
+   10       CONTINUE
+   20    CONTINUE
+*
+*        Zero the subdiagonal elements of the work array WORK31
+*
+         DO 40 J = 1, NB
+            DO 30 I = J + 1, NB
+               WORK31( I, J ) = ZERO
+   30       CONTINUE
+   40    CONTINUE
+*
+*        Gaussian elimination with partial pivoting
+*
+*        Set fill-in elements in columns KU+2 to KV to zero
+*
+         DO 60 J = KU + 2, MIN( KV, N )
+            DO 50 I = KV - J + 2, KL
+               AB( I, J ) = ZERO
+   50       CONTINUE
+   60    CONTINUE
+*
+*        JU is the index of the last column affected by the current
+*        stage of the factorization
+*
+         JU = 1
+*
+         DO 180 J = 1, MIN( M, N ), NB
+            JB = MIN( NB, MIN( M, N )-J+1 )
+*
+*           The active part of the matrix is partitioned
+*
+*              A11   A12   A13
+*              A21   A22   A23
+*              A31   A32   A33
+*
+*           Here A11, A21 and A31 denote the current block of JB columns
+*           which is about to be factorized. The number of rows in the
+*           partitioning are JB, I2, I3 respectively, and the numbers
+*           of columns are JB, J2, J3. The superdiagonal elements of A13
+*           and the subdiagonal elements of A31 lie outside the band.
+*
+            I2 = MIN( KL-JB, M-J-JB+1 )
+            I3 = MIN( JB, M-J-KL+1 )
+*
+*           J2 and J3 are computed after JU has been updated.
+*
+*           Factorize the current block of JB columns
+*
+            DO 80 JJ = J, J + JB - 1
+*
+*              Set fill-in elements in column JJ+KV to zero
+*
+               IF( JJ+KV.LE.N ) THEN
+                  DO 70 I = 1, KL
+                     AB( I, JJ+KV ) = ZERO
+   70             CONTINUE
+               END IF
+*
+*              Find pivot and test for singularity. KM is the number of
+*              subdiagonal elements in the current column.
+*
+               KM = MIN( KL, M-JJ )
+               JP = IZAMAX( KM+1, AB( KV+1, JJ ), 1 )
+               IPIV( JJ ) = JP + JJ - J
+               IF( AB( KV+JP, JJ ).NE.ZERO ) THEN
+                  JU = MAX( JU, MIN( JJ+KU+JP-1, N ) )
+                  IF( JP.NE.1 ) THEN
+*
+*                    Apply interchange to columns J to J+JB-1
+*
+                     IF( JP+JJ-1.LT.J+KL ) THEN
+*
+                        CALL ZSWAP( JB, AB( KV+1+JJ-J, J ), LDAB-1,
+     $                              AB( KV+JP+JJ-J, J ), LDAB-1 )
+                     ELSE
+*
+*                       The interchange affects columns J to JJ-1 of A31
+*                       which are stored in the work array WORK31
+*
+                        CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
+     $                              WORK31( JP+JJ-J-KL, 1 ), LDWORK )
+                        CALL ZSWAP( J+JB-JJ, AB( KV+1, JJ ), LDAB-1,
+     $                              AB( KV+JP, JJ ), LDAB-1 )
+                     END IF
+                  END IF
+*
+*                 Compute multipliers
+*
+                  CALL ZSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
+     $                        1 )
+*
+*                 Update trailing submatrix within the band and within
+*                 the current block. JM is the index of the last column
+*                 which needs to be updated.
+*
+                  JM = MIN( JU, J+JB-1 )
+                  IF( JM.GT.JJ )
+     $               CALL ZGERU( KM, JM-JJ, -ONE, AB( KV+2, JJ ), 1,
+     $                           AB( KV, JJ+1 ), LDAB-1,
+     $                           AB( KV+1, JJ+1 ), LDAB-1 )
+               ELSE
+*
+*                 If pivot is zero, set INFO to the index of the pivot
+*                 unless a zero pivot has already been found.
+*
+                  IF( INFO.EQ.0 )
+     $               INFO = JJ
+               END IF
+*
+*              Copy current column of A31 into the work array WORK31
+*
+               NW = MIN( JJ-J+1, I3 )
+               IF( NW.GT.0 )
+     $            CALL ZCOPY( NW, AB( KV+KL+1-JJ+J, JJ ), 1,
+     $                        WORK31( 1, JJ-J+1 ), 1 )
+   80       CONTINUE
+            IF( J+JB.LE.N ) THEN
+*
+*              Apply the row interchanges to the other blocks.
+*
+               J2 = MIN( JU-J+1, KV ) - JB
+               J3 = MAX( 0, JU-J-KV+1 )
+*
+*              Use ZLASWP to apply the row interchanges to A12, A22, and
+*              A32.
+*
+               CALL ZLASWP( J2, AB( KV+1-JB, J+JB ), LDAB-1, 1, JB,
+     $                      IPIV( J ), 1 )
+*
+*              Adjust the pivot indices.
+*
+               DO 90 I = J, J + JB - 1
+                  IPIV( I ) = IPIV( I ) + J - 1
+   90          CONTINUE
+*
+*              Apply the row interchanges to A13, A23, and A33
+*              columnwise.
+*
+               K2 = J - 1 + JB + J2
+               DO 110 I = 1, J3
+                  JJ = K2 + I
+                  DO 100 II = J + I - 1, J + JB - 1
+                     IP = IPIV( II )
+                     IF( IP.NE.II ) THEN
+                        TEMP = AB( KV+1+II-JJ, JJ )
+                        AB( KV+1+II-JJ, JJ ) = AB( KV+1+IP-JJ, JJ )
+                        AB( KV+1+IP-JJ, JJ ) = TEMP
+                     END IF
+  100             CONTINUE
+  110          CONTINUE
+*
+*              Update the relevant part of the trailing submatrix
+*
+               IF( J2.GT.0 ) THEN
+*
+*                 Update A12
+*
+                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
+     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
+     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A22
+*
+                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J2,
+     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
+     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
+     $                           AB( KV+1, J+JB ), LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Update A32
+*
+                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J2,
+     $                           JB, -ONE, WORK31, LDWORK,
+     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
+     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
+                  END IF
+               END IF
+*
+               IF( J3.GT.0 ) THEN
+*
+*                 Copy the lower triangle of A13 into the work array
+*                 WORK13
+*
+                  DO 130 JJ = 1, J3
+                     DO 120 II = JJ, JB
+                        WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
+  120                CONTINUE
+  130             CONTINUE
+*
+*                 Update A13 in the work array
+*
+                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
+     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
+     $                        WORK13, LDWORK )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A23
+*
+                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J3,
+     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
+     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
+     $                           LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Update A33
+*
+                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J3,
+     $                           JB, -ONE, WORK31, LDWORK, WORK13,
+     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
+                  END IF
+*
+*                 Copy the lower triangle of A13 back into place
+*
+                  DO 150 JJ = 1, J3
+                     DO 140 II = JJ, JB
+                        AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
+  140                CONTINUE
+  150             CONTINUE
+               END IF
+            ELSE
+*
+*              Adjust the pivot indices.
+*
+               DO 160 I = J, J + JB - 1
+                  IPIV( I ) = IPIV( I ) + J - 1
+  160          CONTINUE
+            END IF
+*
+*           Partially undo the interchanges in the current block to
+*           restore the upper triangular form of A31 and copy the upper
+*           triangle of A31 back into place
+*
+            DO 170 JJ = J + JB - 1, J, -1
+               JP = IPIV( JJ ) - JJ + 1
+               IF( JP.NE.1 ) THEN
+*
+*                 Apply interchange to columns J to JJ-1
+*
+                  IF( JP+JJ-1.LT.J+KL ) THEN
+*
+*                    The interchange does not affect A31
+*
+                     CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
+     $                           AB( KV+JP+JJ-J, J ), LDAB-1 )
+                  ELSE
+*
+*                    The interchange does affect A31
+*
+                     CALL ZSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
+     $                           WORK31( JP+JJ-J-KL, 1 ), LDWORK )
+                  END IF
+               END IF
+*
+*              Copy the current column of A31 back into place
+*
+               NW = MIN( I3, JJ-J+1 )
+               IF( NW.GT.0 )
+     $            CALL ZCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
+     $                        AB( KV+KL+1-JJ+J, JJ ), 1 )
+  170       CONTINUE
+  180    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of ZGBTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgbtrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,215 @@
+      SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
+     $                   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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          TRANS
+      INTEGER            INFO, KL, KU, LDAB, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      COMPLEX*16         AB( LDAB, * ), B( LDB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGBTRS solves a system of linear equations
+*     A * X = B,  A**T * X = B,  or  A**H * X = B
+*  with a general band matrix A using the LU factorization computed
+*  by ZGBTRF.
+*
+*  Arguments
+*  =========
+*
+*  TRANS   (input) CHARACTER*1
+*          Specifies the form of the system of equations.
+*          = 'N':  A * X = B     (No transpose)
+*          = 'T':  A**T * X = B  (Transpose)
+*          = 'C':  A**H * X = B  (Conjugate transpose)
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KL      (input) INTEGER
+*          The number of subdiagonals within the band of A.  KL >= 0.
+*
+*  KU      (input) INTEGER
+*          The number of superdiagonals within the band of A.  KU >= 0.
+*
+*  NRHS    (input) INTEGER
+*          The number of right hand sides, i.e., the number of columns
+*          of the matrix B.  NRHS >= 0.
+*
+*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*          Details of the LU factorization of the band matrix A, as
+*          computed by ZGBTRF.  U is stored as an upper triangular band
+*          matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
+*          the multipliers used during the factorization are stored in
+*          rows KL+KU+2 to 2*KL+KU+1.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= 2*KL+KU+1.
+*
+*  IPIV    (input) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= N, row i of the matrix was
+*          interchanged with row IPIV(i).
+*
+*  B       (input/output) COMPLEX*16 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
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      COMPLEX*16         ONE
+      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            LNOTI, NOTRAN
+      INTEGER            I, J, KD, L, LM
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      NOTRAN = LSAME( TRANS, 'N' )
+      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
+     $    LSAME( TRANS, 'C' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KL.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( KU.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -5
+      ELSE IF( LDAB.LT.( 2*KL+KU+1 ) ) THEN
+         INFO = -7
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -10
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGBTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+      KD = KU + KL + 1
+      LNOTI = KL.GT.0
+*
+      IF( NOTRAN ) THEN
+*
+*        Solve  A*X = B.
+*
+*        Solve L*X = B, overwriting B with X.
+*
+*        L is represented as a product of permutations and unit lower
+*        triangular matrices L = P(1) * L(1) * ... * P(n-1) * L(n-1),
+*        where each transformation L(i) is a rank-one modification of
+*        the identity matrix.
+*
+         IF( LNOTI ) THEN
+            DO 10 J = 1, N - 1
+               LM = MIN( KL, N-J )
+               L = IPIV( J )
+               IF( L.NE.J )
+     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
+               CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
+     $                     LDB, B( J+1, 1 ), LDB )
+   10       CONTINUE
+         END IF
+*
+         DO 20 I = 1, NRHS
+*
+*           Solve U*X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
+     $                  AB, LDAB, B( 1, I ), 1 )
+   20    CONTINUE
+*
+      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
+*
+*        Solve A**T * X = B.
+*
+         DO 30 I = 1, NRHS
+*
+*           Solve U**T * X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
+     $                  LDAB, B( 1, I ), 1 )
+   30    CONTINUE
+*
+*        Solve L**T * X = B, overwriting B with X.
+*
+         IF( LNOTI ) THEN
+            DO 40 J = N - 1, 1, -1
+               LM = MIN( KL, N-J )
+               CALL ZGEMV( 'Transpose', LM, NRHS, -ONE, B( J+1, 1 ),
+     $                     LDB, AB( KD+1, J ), 1, ONE, B( J, 1 ), LDB )
+               L = IPIV( J )
+               IF( L.NE.J )
+     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
+   40       CONTINUE
+         END IF
+*
+      ELSE
+*
+*        Solve A**H * X = B.
+*
+         DO 50 I = 1, NRHS
+*
+*           Solve U**H * X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
+     $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
+   50    CONTINUE
+*
+*        Solve L**H * X = B, overwriting B with X.
+*
+         IF( LNOTI ) THEN
+            DO 60 J = N - 1, 1, -1
+               LM = MIN( KL, N-J )
+               CALL ZLACGV( NRHS, B( J, 1 ), LDB )
+               CALL ZGEMV( 'Conjugate transpose', LM, NRHS, -ONE,
+     $                     B( J+1, 1 ), LDB, AB( KD+1, J ), 1, ONE,
+     $                     B( J, 1 ), LDB )
+               CALL ZLACGV( NRHS, B( J, 1 ), LDB )
+               L = IPIV( J )
+               IF( L.NE.J )
+     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
+   60       CONTINUE
+         END IF
+      END IF
+      RETURN
+*
+*     End of ZGBTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgtsv.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,174 @@
+      SUBROUTINE ZGTSV( N, NRHS, DL, D, DU, B, LDB, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGTSV  solves the equation
+*
+*     A*X = B,
+*
+*  where A is an N-by-N tridiagonal matrix, by Gaussian elimination with
+*  partial pivoting.
+*
+*  Note that the equation  A'*X = B  may be solved by interchanging the
+*  order of the arguments DU and DL.
+*
+*  Arguments
+*  =========
+*
+*  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.
+*
+*  DL      (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, DL must contain the (n-1) subdiagonal elements of
+*          A.
+*          On exit, DL is overwritten by the (n-2) elements of the
+*          second superdiagonal of the upper triangular matrix U from
+*          the LU factorization of A, in DL(1), ..., DL(n-2).
+*
+*  D       (input/output) COMPLEX*16 array, dimension (N)
+*          On entry, D must contain the diagonal elements of A.
+*          On exit, D is overwritten by the n diagonal elements of U.
+*
+*  DU      (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, DU must contain the (n-1) superdiagonal elements
+*          of A.
+*          On exit, DU is overwritten by the (n-1) elements of the first
+*          superdiagonal of U.
+*
+*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
+*          On entry, the N-by-NRHS right hand side matrix B.
+*          On exit, if INFO = 0, the N-by-NRHS 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
+*          > 0:  if INFO = i, U(i,i) is exactly zero, and the solution
+*                has not been computed.  The factorization has not been
+*                completed unless i = N.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      COMPLEX*16         ZERO
+      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            J, K
+      COMPLEX*16         MULT, TEMP, ZDUM
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, DBLE, DIMAG, MAX
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Statement Functions ..
+      DOUBLE PRECISION   CABS1
+*     ..
+*     .. Statement Function definitions ..
+      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -7
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGTSV ', -INFO )
+         RETURN
+      END IF
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+      DO 30 K = 1, N - 1
+         IF( DL( K ).EQ.ZERO ) THEN
+*
+*           Subdiagonal is zero, no elimination is required.
+*
+            IF( D( K ).EQ.ZERO ) THEN
+*
+*              Diagonal is zero: set INFO = K and return; a unique
+*              solution can not be found.
+*
+               INFO = K
+               RETURN
+            END IF
+         ELSE IF( CABS1( D( K ) ).GE.CABS1( DL( K ) ) ) THEN
+*
+*           No row interchange required
+*
+            MULT = DL( K ) / D( K )
+            D( K+1 ) = D( K+1 ) - MULT*DU( K )
+            DO 10 J = 1, NRHS
+               B( K+1, J ) = B( K+1, J ) - MULT*B( K, J )
+   10       CONTINUE
+            IF( K.LT.( N-1 ) )
+     $         DL( K ) = ZERO
+         ELSE
+*
+*           Interchange rows K and K+1
+*
+            MULT = D( K ) / DL( K )
+            D( K ) = DL( K )
+            TEMP = D( K+1 )
+            D( K+1 ) = DU( K ) - MULT*TEMP
+            IF( K.LT.( N-1 ) ) THEN
+               DL( K ) = DU( K+1 )
+               DU( K+1 ) = -MULT*DL( K )
+            END IF
+            DU( K ) = TEMP
+            DO 20 J = 1, NRHS
+               TEMP = B( K, J )
+               B( K, J ) = B( K+1, J )
+               B( K+1, J ) = TEMP - MULT*B( K+1, J )
+   20       CONTINUE
+         END IF
+   30 CONTINUE
+      IF( D( N ).EQ.ZERO ) THEN
+         INFO = N
+         RETURN
+      END IF
+*
+*     Back solve with the matrix U from the factorization.
+*
+      DO 50 J = 1, NRHS
+         B( N, J ) = B( N, J ) / D( N )
+         IF( N.GT.1 )
+     $      B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) / D( N-1 )
+         DO 40 K = N - 2, 1, -1
+            B( K, J ) = ( B( K, J )-DU( K )*B( K+1, J )-DL( K )*
+     $                  B( K+2, J ) ) / D( K )
+   40    CONTINUE
+   50 CONTINUE
+*
+      RETURN
+*
+*     End of ZGTSV
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgttrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,155 @@
+      SUBROUTINE ZGTTRF( N, DL, D, DU, DU2, IPIV, INFO )
+*
+*  -- LAPACK routine (version 2.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     September 30, 1994
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, N
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      COMPLEX*16         D( * ), DL( * ), DU( * ), DU2( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGTTRF computes an LU factorization of a complex tridiagonal matrix A
+*  using elimination with partial pivoting and row interchanges.
+*
+*  The factorization has the form
+*     A = L * U
+*  where L is a product of permutation and unit lower bidiagonal
+*  matrices and U is upper triangular with nonzeros in only the main
+*  diagonal and first two superdiagonals.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  DL      (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, DL must contain the (n-1) subdiagonal elements of
+*          A.
+*          On exit, DL is overwritten by the (n-1) multipliers that
+*          define the matrix L from the LU factorization of A.
+*
+*  D       (input/output) COMPLEX*16 array, dimension (N)
+*          On entry, D must contain the diagonal elements of A.
+*          On exit, D is overwritten by the n diagonal elements of the
+*          upper triangular matrix U from the LU factorization of A.
+*
+*  DU      (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, DU must contain the (n-1) superdiagonal elements
+*          of A.
+*          On exit, DU is overwritten by the (n-1) elements of the first
+*          superdiagonal of U.
+*
+*  DU2     (output) COMPLEX*16 array, dimension (N-2)
+*          On exit, DU2 is overwritten by the (n-2) elements of the
+*          second superdiagonal of U.
+*
+*  IPIV    (output) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= n, row i of the matrix was
+*          interchanged with row IPIV(i).  IPIV(i) will always be either
+*          i or i+1; IPIV(i) = i indicates a row interchange was not
+*          required.
+*
+*  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.
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      INTEGER            I
+      COMPLEX*16         FACT, TEMP, ZDUM
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, DBLE, DIMAG
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Parameters ..
+      COMPLEX*16         CZERO
+      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ) )
+*     ..
+*     .. Statement Functions ..
+      DOUBLE PRECISION   CABS1
+*     ..
+*     .. Statement Function definitions ..
+      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+         CALL XERBLA( 'ZGTTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Initialize IPIV(i) = i
+*
+      DO 10 I = 1, N
+         IPIV( I ) = I
+   10 CONTINUE
+*
+      DO 20 I = 1, N - 1
+         IF( DL( I ).EQ.CZERO ) THEN
+*
+*           Subdiagonal is zero, no elimination is required.
+*
+            IF( D( I ).EQ.CZERO .AND. INFO.EQ.0 )
+     $         INFO = I
+            IF( I.LT.N-1 )
+     $         DU2( I ) = CZERO
+         ELSE IF( CABS1( D( I ) ).GE.CABS1( DL( I ) ) ) THEN
+*
+*           No row interchange required, eliminate DL(I)
+*
+            FACT = DL( I ) / D( I )
+            DL( I ) = FACT
+            D( I+1 ) = D( I+1 ) - FACT*DU( I )
+            IF( I.LT.N-1 )
+     $         DU2( I ) = CZERO
+         ELSE
+*
+*           Interchange rows I and I+1, eliminate DL(I)
+*
+            FACT = D( I ) / DL( I )
+            D( I ) = DL( I )
+            DL( I ) = FACT
+            TEMP = DU( I )
+            DU( I ) = D( I+1 )
+            D( I+1 ) = TEMP - FACT*D( I+1 )
+            IF( I.LT.N-1 ) THEN
+               DU2( I ) = DU( I+1 )
+               DU( I+1 ) = -FACT*DU( I+1 )
+            END IF
+            IPIV( I ) = IPIV( I ) + 1
+         END IF
+   20 CONTINUE
+      IF( D( N ).EQ.CZERO .AND. INFO.EQ.0 ) THEN
+         INFO = N
+         RETURN
+      END IF
+*
+      RETURN
+*
+*     End of ZGTTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zgttrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,206 @@
+      SUBROUTINE ZGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
+     $                   INFO )
+*
+*  -- LAPACK routine (version 2.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     September 30, 1994
+*
+*     .. Scalar Arguments ..
+      CHARACTER          TRANS
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      INTEGER            IPIV( * )
+      COMPLEX*16         B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZGTTRS solves one of the systems of equations
+*     A * X = B,  A**T * X = B,  or  A**H * X = B,
+*  with a tridiagonal matrix A using the LU factorization computed
+*  by ZGTTRF.
+*
+*  Arguments
+*  =========
+*
+*  TRANS   (input) CHARACTER
+*          Specifies the form of the system of equations:
+*          = 'N':  A * X = B     (No transpose)
+*          = 'T':  A**T * X = B  (Transpose)
+*          = 'C':  A**H * X = B  (Conjugate 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.
+*
+*  DL      (input) COMPLEX*16 array, dimension (N-1)
+*          The (n-1) multipliers that define the matrix L from the
+*          LU factorization of A.
+*
+*  D       (input) COMPLEX*16 array, dimension (N)
+*          The n diagonal elements of the upper triangular matrix U from
+*          the LU factorization of A.
+*
+*  DU      (input) COMPLEX*16 array, dimension (N-1)
+*          The (n-1) elements of the first superdiagonal of U.
+*
+*  DU2     (input) COMPLEX*16 array, dimension (N-2)
+*          The (n-2) elements of the second superdiagonal of U.
+*
+*  IPIV    (input) INTEGER array, dimension (N)
+*          The pivot indices; for 1 <= i <= n, row i of the matrix was
+*          interchanged with row IPIV(i).  IPIV(i) will always be either
+*          i or i+1; IPIV(i) = i indicates a row interchange was not
+*          required.
+*
+*  B       (input/output) COMPLEX*16 array, dimension (LDB,NRHS)
+*          On entry, the right hand side matrix B.
+*          On exit, B is overwritten by 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
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      LOGICAL            NOTRAN
+      INTEGER            I, J
+      COMPLEX*16         TEMP
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          DCONJG, MAX
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      NOTRAN = LSAME( TRANS, 'N' )
+      IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
+     $    LSAME( TRANS, 'C' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN
+         INFO = -10
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZGTTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+      IF( NOTRAN ) THEN
+*
+*        Solve A*X = B using the LU factorization of A,
+*        overwriting each right hand side vector with its solution.
+*
+         DO 30 J = 1, NRHS
+*
+*           Solve L*x = b.
+*
+            DO 10 I = 1, N - 1
+               IF( IPIV( I ).EQ.I ) THEN
+                  B( I+1, J ) = B( I+1, J ) - DL( I )*B( I, J )
+               ELSE
+                  TEMP = B( I, J )
+                  B( I, J ) = B( I+1, J )
+                  B( I+1, J ) = TEMP - DL( I )*B( I, J )
+               END IF
+   10       CONTINUE
+*
+*           Solve U*x = b.
+*
+            B( N, J ) = B( N, J ) / D( N )
+            IF( N.GT.1 )
+     $         B( N-1, J ) = ( B( N-1, J )-DU( N-1 )*B( N, J ) ) /
+     $                       D( N-1 )
+            DO 20 I = N - 2, 1, -1
+               B( I, J ) = ( B( I, J )-DU( I )*B( I+1, J )-DU2( I )*
+     $                     B( I+2, J ) ) / D( I )
+   20       CONTINUE
+   30    CONTINUE
+      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
+*
+*        Solve A**T * X = B.
+*
+         DO 60 J = 1, NRHS
+*
+*           Solve U**T * x = b.
+*
+            B( 1, J ) = B( 1, J ) / D( 1 )
+            IF( N.GT.1 )
+     $         B( 2, J ) = ( B( 2, J )-DU( 1 )*B( 1, J ) ) / D( 2 )
+            DO 40 I = 3, N
+               B( I, J ) = ( B( I, J )-DU( I-1 )*B( I-1, J )-DU2( I-2 )*
+     $                     B( I-2, J ) ) / D( I )
+   40       CONTINUE
+*
+*           Solve L**T * x = b.
+*
+            DO 50 I = N - 1, 1, -1
+               IF( IPIV( I ).EQ.I ) THEN
+                  B( I, J ) = B( I, J ) - DL( I )*B( I+1, J )
+               ELSE
+                  TEMP = B( I+1, J )
+                  B( I+1, J ) = B( I, J ) - DL( I )*TEMP
+                  B( I, J ) = TEMP
+               END IF
+   50       CONTINUE
+   60    CONTINUE
+      ELSE
+*
+*        Solve A**H * X = B.
+*
+         DO 90 J = 1, NRHS
+*
+*           Solve U**H * x = b.
+*
+            B( 1, J ) = B( 1, J ) / DCONJG( D( 1 ) )
+            IF( N.GT.1 )
+     $         B( 2, J ) = ( B( 2, J )-DCONJG( DU( 1 ) )*B( 1, J ) ) /
+     $                     DCONJG( D( 2 ) )
+            DO 70 I = 3, N
+               B( I, J ) = ( B( I, J )-DCONJG( DU( I-1 ) )*B( I-1, J )-
+     $                     DCONJG( DU2( I-2 ) )*B( I-2, J ) ) /
+     $                     DCONJG( D( I ) )
+   70       CONTINUE
+*
+*           Solve L**H * x = b.
+*
+            DO 80 I = N - 1, 1, -1
+               IF( IPIV( I ).EQ.I ) THEN
+                  B( I, J ) = B( I, J ) - DCONJG( DL( I ) )*B( I+1, J )
+               ELSE
+                  TEMP = B( I+1, J )
+                  B( I+1, J ) = B( I, J ) - DCONJG( DL( I ) )*TEMP
+                  B( I, J ) = TEMP
+               END IF
+   80       CONTINUE
+   90    CONTINUE
+      END IF
+*
+*     End of ZGTTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zlatbs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,909 @@
+      SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
+     $                   SCALE, CNORM, INFO )
+*
+*  -- 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, 1992
+*
+*     .. Scalar Arguments ..
+      CHARACTER          DIAG, NORMIN, TRANS, UPLO
+      INTEGER            INFO, KD, LDAB, N
+      DOUBLE PRECISION   SCALE
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   CNORM( * )
+      COMPLEX*16         AB( LDAB, * ), X( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZLATBS solves one of the triangular systems
+*
+*     A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b,
+*
+*  with scaling to prevent overflow, where A is an upper or lower
+*  triangular band matrix.  Here A' denotes the transpose of A, x and b
+*  are n-element vectors, and s is a scaling factor, usually less than
+*  or equal to 1, chosen so that the components of x will be less than
+*  the overflow threshold.  If the unscaled problem will not cause
+*  overflow, the Level 2 BLAS routine ZTBSV is called.  If the matrix A
+*  is singular (A(j,j) = 0 for some j), then s is set to 0 and a
+*  non-trivial solution to A*x = 0 is returned.
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          Specifies whether the matrix A is upper or lower triangular.
+*          = 'U':  Upper triangular
+*          = 'L':  Lower triangular
+*
+*  TRANS   (input) CHARACTER*1
+*          Specifies the operation applied to A.
+*          = 'N':  Solve A * x = s*b     (No transpose)
+*          = 'T':  Solve A**T * x = s*b  (Transpose)
+*          = 'C':  Solve A**H * x = s*b  (Conjugate transpose)
+*
+*  DIAG    (input) CHARACTER*1
+*          Specifies whether or not the matrix A is unit triangular.
+*          = 'N':  Non-unit triangular
+*          = 'U':  Unit triangular
+*
+*  NORMIN  (input) CHARACTER*1
+*          Specifies whether CNORM has been set or not.
+*          = 'Y':  CNORM contains the column norms on entry
+*          = 'N':  CNORM is not set on entry.  On exit, the norms will
+*                  be computed and stored in CNORM.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of subdiagonals or superdiagonals in the
+*          triangular matrix A.  KD >= 0.
+*
+*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*          The upper or lower triangular band matrix A, stored in the
+*          first KD+1 rows of the array. The j-th column of A is stored
+*          in the j-th column of the array AB as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  X       (input/output) COMPLEX*16 array, dimension (N)
+*          On entry, the right hand side b of the triangular system.
+*          On exit, X is overwritten by the solution vector x.
+*
+*  SCALE   (output) DOUBLE PRECISION
+*          The scaling factor s for the triangular system
+*             A * x = s*b,  A**T * x = s*b,  or  A**H * x = s*b.
+*          If SCALE = 0, the matrix A is singular or badly scaled, and
+*          the vector x is an exact or approximate solution to A*x = 0.
+*
+*  CNORM   (input or output) DOUBLE PRECISION array, dimension (N)
+*
+*          If NORMIN = 'Y', CNORM is an input argument and CNORM(j)
+*          contains the norm of the off-diagonal part of the j-th column
+*          of A.  If TRANS = 'N', CNORM(j) must be greater than or equal
+*          to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j)
+*          must be greater than or equal to the 1-norm.
+*
+*          If NORMIN = 'N', CNORM is an output argument and CNORM(j)
+*          returns the 1-norm of the offdiagonal part of the j-th column
+*          of A.
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0:  if INFO = -k, the k-th argument had an illegal value
+*
+*  Further Details
+*  ======= =======
+*
+*  A rough bound on x is computed; if that is less than overflow, ZTBSV
+*  is called, otherwise, specific code is used which checks for possible
+*  overflow or divide-by-zero at every operation.
+*
+*  A columnwise scheme is used for solving A*x = b.  The basic algorithm
+*  if A is lower triangular is
+*
+*       x[1:n] := b[1:n]
+*       for j = 1, ..., n
+*            x(j) := x(j) / A(j,j)
+*            x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j]
+*       end
+*
+*  Define bounds on the components of x after j iterations of the loop:
+*     M(j) = bound on x[1:j]
+*     G(j) = bound on x[j+1:n]
+*  Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}.
+*
+*  Then for iteration j+1 we have
+*     M(j+1) <= G(j) / | A(j+1,j+1) |
+*     G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] |
+*            <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | )
+*
+*  where CNORM(j+1) is greater than or equal to the infinity-norm of
+*  column j+1 of A, not counting the diagonal.  Hence
+*
+*     G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | )
+*                  1<=i<=j
+*  and
+*
+*     |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| )
+*                                   1<=i< j
+*
+*  Since |x(j)| <= M(j), we use the Level 2 BLAS routine ZTBSV if the
+*  reciprocal of the largest M(j), j=1,..,n, is larger than
+*  max(underflow, 1/overflow).
+*
+*  The bound on x(j) is also used to determine when a step in the
+*  columnwise method can be performed without fear of overflow.  If
+*  the computed bound is greater than a large constant, x is scaled to
+*  prevent overflow, but if the bound overflows, x is set to 0, x(j) to
+*  1, and scale to 0, and a non-trivial solution to A*x = 0 is found.
+*
+*  Similarly, a row-wise scheme is used to solve A**T *x = b  or
+*  A**H *x = b.  The basic algorithm for A upper triangular is
+*
+*       for j = 1, ..., n
+*            x(j) := ( b(j) - A[1:j-1,j]' * x[1:j-1] ) / A(j,j)
+*       end
+*
+*  We simultaneously compute two bounds
+*       G(j) = bound on ( b(i) - A[1:i-1,i]' * x[1:i-1] ), 1<=i<=j
+*       M(j) = bound on x(i), 1<=i<=j
+*
+*  The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we
+*  add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1.
+*  Then the bound on x(j) is
+*
+*       M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) |
+*
+*            <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| )
+*                      1<=i<=j
+*
+*  and we can safely call ZTBSV if 1/M(n) and 1/G(n) are both greater
+*  than max(underflow, 1/overflow).
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO, HALF, ONE, TWO
+      PARAMETER          ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0,
+     $                   TWO = 2.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            NOTRAN, NOUNIT, UPPER
+      INTEGER            I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
+      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
+     $                   XBND, XJ, XMAX
+      COMPLEX*16         CSUMJ, TJJS, USCAL, ZDUM
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IDAMAX, IZAMAX
+      DOUBLE PRECISION   DLAMCH, DZASUM
+      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
+      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
+     $                   ZDOTU, ZLADIV
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
+*     ..
+*     .. Statement Functions ..
+      DOUBLE PRECISION   CABS1, CABS2
+*     ..
+*     .. Statement Function definitions ..
+      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
+      CABS2( ZDUM ) = ABS( DBLE( ZDUM ) / 2.D0 ) +
+     $                ABS( DIMAG( ZDUM ) / 2.D0 )
+*     ..
+*     .. Executable Statements ..
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      NOTRAN = LSAME( TRANS, 'N' )
+      NOUNIT = LSAME( DIAG, 'N' )
+*
+*     Test the input parameters.
+*
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
+     $         LSAME( TRANS, 'C' ) ) THEN
+         INFO = -2
+      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
+         INFO = -3
+      ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT.
+     $         LSAME( NORMIN, 'N' ) ) THEN
+         INFO = -4
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -5
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -6
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZLATBS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Determine machine dependent parameters to control overflow.
+*
+      SMLNUM = DLAMCH( 'Safe minimum' )
+      BIGNUM = ONE / SMLNUM
+      CALL DLABAD( SMLNUM, BIGNUM )
+      SMLNUM = SMLNUM / DLAMCH( 'Precision' )
+      BIGNUM = ONE / SMLNUM
+      SCALE = ONE
+*
+      IF( LSAME( NORMIN, 'N' ) ) THEN
+*
+*        Compute the 1-norm of each column, not including the diagonal.
+*
+         IF( UPPER ) THEN
+*
+*           A is upper triangular.
+*
+            DO 10 J = 1, N
+               JLEN = MIN( KD, J-1 )
+               CNORM( J ) = DZASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
+   10       CONTINUE
+         ELSE
+*
+*           A is lower triangular.
+*
+            DO 20 J = 1, N
+               JLEN = MIN( KD, N-J )
+               IF( JLEN.GT.0 ) THEN
+                  CNORM( J ) = DZASUM( JLEN, AB( 2, J ), 1 )
+               ELSE
+                  CNORM( J ) = ZERO
+               END IF
+   20       CONTINUE
+         END IF
+      END IF
+*
+*     Scale the column norms by TSCAL if the maximum element in CNORM is
+*     greater than BIGNUM/2.
+*
+      IMAX = IDAMAX( N, CNORM, 1 )
+      TMAX = CNORM( IMAX )
+      IF( TMAX.LE.BIGNUM*HALF ) THEN
+         TSCAL = ONE
+      ELSE
+         TSCAL = HALF / ( SMLNUM*TMAX )
+         CALL DSCAL( N, TSCAL, CNORM, 1 )
+      END IF
+*
+*     Compute a bound on the computed solution vector to see if the
+*     Level 2 BLAS routine ZTBSV can be used.
+*
+      XMAX = ZERO
+      DO 30 J = 1, N
+         XMAX = MAX( XMAX, CABS2( X( J ) ) )
+   30 CONTINUE
+      XBND = XMAX
+      IF( NOTRAN ) THEN
+*
+*        Compute the growth in A * x = b.
+*
+         IF( UPPER ) THEN
+            JFIRST = N
+            JLAST = 1
+            JINC = -1
+            MAIND = KD + 1
+         ELSE
+            JFIRST = 1
+            JLAST = N
+            JINC = 1
+            MAIND = 1
+         END IF
+*
+         IF( TSCAL.NE.ONE ) THEN
+            GROW = ZERO
+            GO TO 60
+         END IF
+*
+         IF( NOUNIT ) THEN
+*
+*           A is non-unit triangular.
+*
+*           Compute GROW = 1/G(j) and XBND = 1/M(j).
+*           Initially, G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = HALF / MAX( XBND, SMLNUM )
+            XBND = GROW
+            DO 40 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 60
+*
+               TJJS = AB( MAIND, J )
+               TJJ = CABS1( TJJS )
+*
+               IF( TJJ.GE.SMLNUM ) THEN
+*
+*                 M(j) = G(j-1) / abs(A(j,j))
+*
+                  XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
+               ELSE
+*
+*                 M(j) could overflow, set XBND to 0.
+*
+                  XBND = ZERO
+               END IF
+*
+               IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN
+*
+*                 G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) )
+*
+                  GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
+               ELSE
+*
+*                 G(j) could overflow, set GROW to 0.
+*
+                  GROW = ZERO
+               END IF
+   40       CONTINUE
+            GROW = XBND
+         ELSE
+*
+*           A is unit triangular.
+*
+*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
+            DO 50 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 60
+*
+*              G(j) = G(j-1)*( 1 + CNORM(j) )
+*
+               GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
+   50       CONTINUE
+         END IF
+   60    CONTINUE
+*
+      ELSE
+*
+*        Compute the growth in A**T * x = b  or  A**H * x = b.
+*
+         IF( UPPER ) THEN
+            JFIRST = 1
+            JLAST = N
+            JINC = 1
+            MAIND = KD + 1
+         ELSE
+            JFIRST = N
+            JLAST = 1
+            JINC = -1
+            MAIND = 1
+         END IF
+*
+         IF( TSCAL.NE.ONE ) THEN
+            GROW = ZERO
+            GO TO 90
+         END IF
+*
+         IF( NOUNIT ) THEN
+*
+*           A is non-unit triangular.
+*
+*           Compute GROW = 1/G(j) and XBND = 1/M(j).
+*           Initially, M(0) = max{x(i), i=1,...,n}.
+*
+            GROW = HALF / MAX( XBND, SMLNUM )
+            XBND = GROW
+            DO 70 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 90
+*
+*              G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) )
+*
+               XJ = ONE + CNORM( J )
+               GROW = MIN( GROW, XBND / XJ )
+*
+               TJJS = AB( MAIND, J )
+               TJJ = CABS1( TJJS )
+*
+               IF( TJJ.GE.SMLNUM ) THEN
+*
+*                 M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j))
+*
+                  IF( XJ.GT.TJJ )
+     $               XBND = XBND*( TJJ / XJ )
+               ELSE
+*
+*                 M(j) could overflow, set XBND to 0.
+*
+                  XBND = ZERO
+               END IF
+   70       CONTINUE
+            GROW = MIN( GROW, XBND )
+         ELSE
+*
+*           A is unit triangular.
+*
+*           Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}.
+*
+            GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
+            DO 80 J = JFIRST, JLAST, JINC
+*
+*              Exit the loop if the growth factor is too small.
+*
+               IF( GROW.LE.SMLNUM )
+     $            GO TO 90
+*
+*              G(j) = ( 1 + CNORM(j) )*G(j-1)
+*
+               XJ = ONE + CNORM( J )
+               GROW = GROW / XJ
+   80       CONTINUE
+         END IF
+   90    CONTINUE
+      END IF
+*
+      IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN
+*
+*        Use the Level 2 BLAS solve if the reciprocal of the bound on
+*        elements of X is not too small.
+*
+         CALL ZTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
+      ELSE
+*
+*        Use a Level 1 BLAS solve, scaling intermediate results.
+*
+         IF( XMAX.GT.BIGNUM*HALF ) THEN
+*
+*           Scale X so that its components are less than or equal to
+*           BIGNUM in absolute value.
+*
+            SCALE = ( BIGNUM*HALF ) / XMAX
+            CALL ZDSCAL( N, SCALE, X, 1 )
+            XMAX = BIGNUM
+         ELSE
+            XMAX = XMAX*TWO
+         END IF
+*
+         IF( NOTRAN ) THEN
+*
+*           Solve A * x = b
+*
+            DO 120 J = JFIRST, JLAST, JINC
+*
+*              Compute x(j) = b(j) / A(j,j), scaling x if necessary.
+*
+               XJ = CABS1( X( J ) )
+               IF( NOUNIT ) THEN
+                  TJJS = AB( MAIND, J )*TSCAL
+               ELSE
+                  TJJS = TSCAL
+                  IF( TSCAL.EQ.ONE )
+     $               GO TO 110
+               END IF
+               TJJ = CABS1( TJJS )
+               IF( TJJ.GT.SMLNUM ) THEN
+*
+*                    abs(A(j,j)) > SMLNUM:
+*
+                  IF( TJJ.LT.ONE ) THEN
+                     IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                          Scale x by 1/b(j).
+*
+                        REC = ONE / XJ
+                        CALL ZDSCAL( N, REC, X, 1 )
+                        SCALE = SCALE*REC
+                        XMAX = XMAX*REC
+                     END IF
+                  END IF
+                  X( J ) = ZLADIV( X( J ), TJJS )
+                  XJ = CABS1( X( J ) )
+               ELSE IF( TJJ.GT.ZERO ) THEN
+*
+*                    0 < abs(A(j,j)) <= SMLNUM:
+*
+                  IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                       Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM
+*                       to avoid overflow when dividing by A(j,j).
+*
+                     REC = ( TJJ*BIGNUM ) / XJ
+                     IF( CNORM( J ).GT.ONE ) THEN
+*
+*                          Scale by 1/CNORM(j) to avoid overflow when
+*                          multiplying x(j) times column j.
+*
+                        REC = REC / CNORM( J )
+                     END IF
+                     CALL ZDSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                     XMAX = XMAX*REC
+                  END IF
+                  X( J ) = ZLADIV( X( J ), TJJS )
+                  XJ = CABS1( X( J ) )
+               ELSE
+*
+*                    A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
+*                    scale = 0, and compute a solution to A*x = 0.
+*
+                  DO 100 I = 1, N
+                     X( I ) = ZERO
+  100             CONTINUE
+                  X( J ) = ONE
+                  XJ = ONE
+                  SCALE = ZERO
+                  XMAX = ZERO
+               END IF
+  110          CONTINUE
+*
+*              Scale x if necessary to avoid overflow when adding a
+*              multiple of column j of A.
+*
+               IF( XJ.GT.ONE ) THEN
+                  REC = ONE / XJ
+                  IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN
+*
+*                    Scale x by 1/(2*abs(x(j))).
+*
+                     REC = REC*HALF
+                     CALL ZDSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                  END IF
+               ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN
+*
+*                 Scale x by 1/2.
+*
+                  CALL ZDSCAL( N, HALF, X, 1 )
+                  SCALE = SCALE*HALF
+               END IF
+*
+               IF( UPPER ) THEN
+                  IF( J.GT.1 ) THEN
+*
+*                    Compute the update
+*                       x(max(1,j-kd):j-1) := x(max(1,j-kd):j-1) -
+*                                             x(j)* A(max(1,j-kd):j-1,j)
+*
+                     JLEN = MIN( KD, J-1 )
+                     CALL ZAXPY( JLEN, -X( J )*TSCAL,
+     $                           AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
+                     I = IZAMAX( J-1, X, 1 )
+                     XMAX = CABS1( X( I ) )
+                  END IF
+               ELSE IF( J.LT.N ) THEN
+*
+*                 Compute the update
+*                    x(j+1:min(j+kd,n)) := x(j+1:min(j+kd,n)) -
+*                                          x(j) * A(j+1:min(j+kd,n),j)
+*
+                  JLEN = MIN( KD, N-J )
+                  IF( JLEN.GT.0 )
+     $               CALL ZAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
+     $                           X( J+1 ), 1 )
+                  I = J + IZAMAX( N-J, X( J+1 ), 1 )
+                  XMAX = CABS1( X( I ) )
+               END IF
+  120       CONTINUE
+*
+         ELSE IF( LSAME( TRANS, 'T' ) ) THEN
+*
+*           Solve A**T * x = b
+*
+            DO 170 J = JFIRST, JLAST, JINC
+*
+*              Compute x(j) = b(j) - sum A(k,j)*x(k).
+*                                    k<>j
+*
+               XJ = CABS1( X( J ) )
+               USCAL = TSCAL
+               REC = ONE / MAX( XMAX, ONE )
+               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
+*
+*                 If x(j) could overflow, scale x by 1/(2*XMAX).
+*
+                  REC = REC*HALF
+                  IF( NOUNIT ) THEN
+                     TJJS = AB( MAIND, J )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                  END IF
+                  TJJ = CABS1( TJJS )
+                  IF( TJJ.GT.ONE ) THEN
+*
+*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
+*
+                     REC = MIN( ONE, REC*TJJ )
+                     USCAL = ZLADIV( USCAL, TJJS )
+                  END IF
+                  IF( REC.LT.ONE ) THEN
+                     CALL ZDSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                     XMAX = XMAX*REC
+                  END IF
+               END IF
+*
+               CSUMJ = ZERO
+               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
+*
+*                 If the scaling needed for A in the dot product is 1,
+*                 call ZDOTU to perform the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     CSUMJ = ZDOTU( JLEN, AB( KD+1-JLEN, J ), 1,
+     $                       X( J-JLEN ), 1 )
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     IF( JLEN.GT.1 )
+     $                  CSUMJ = ZDOTU( JLEN, AB( 2, J ), 1, X( J+1 ),
+     $                          1 )
+                  END IF
+               ELSE
+*
+*                 Otherwise, use in-line code for the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     DO 130 I = 1, JLEN
+                        CSUMJ = CSUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
+     $                          X( J-JLEN-1+I )
+  130                CONTINUE
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     DO 140 I = 1, JLEN
+                        CSUMJ = CSUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
+  140                CONTINUE
+                  END IF
+               END IF
+*
+               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
+*
+*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
+*                 was not used to scale the dotproduct.
+*
+                  X( J ) = X( J ) - CSUMJ
+                  XJ = CABS1( X( J ) )
+                  IF( NOUNIT ) THEN
+*
+*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
+*
+                     TJJS = AB( MAIND, J )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                     IF( TSCAL.EQ.ONE )
+     $                  GO TO 160
+                  END IF
+                  TJJ = CABS1( TJJS )
+                  IF( TJJ.GT.SMLNUM ) THEN
+*
+*                       abs(A(j,j)) > SMLNUM:
+*
+                     IF( TJJ.LT.ONE ) THEN
+                        IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                             Scale X by 1/abs(x(j)).
+*
+                           REC = ONE / XJ
+                           CALL ZDSCAL( N, REC, X, 1 )
+                           SCALE = SCALE*REC
+                           XMAX = XMAX*REC
+                        END IF
+                     END IF
+                     X( J ) = ZLADIV( X( J ), TJJS )
+                  ELSE IF( TJJ.GT.ZERO ) THEN
+*
+*                       0 < abs(A(j,j)) <= SMLNUM:
+*
+                     IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
+*
+                        REC = ( TJJ*BIGNUM ) / XJ
+                        CALL ZDSCAL( N, REC, X, 1 )
+                        SCALE = SCALE*REC
+                        XMAX = XMAX*REC
+                     END IF
+                     X( J ) = ZLADIV( X( J ), TJJS )
+                  ELSE
+*
+*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
+*                       scale = 0 and compute a solution to A**T *x = 0.
+*
+                     DO 150 I = 1, N
+                        X( I ) = ZERO
+  150                CONTINUE
+                     X( J ) = ONE
+                     SCALE = ZERO
+                     XMAX = ZERO
+                  END IF
+  160             CONTINUE
+               ELSE
+*
+*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
+*                 product has already been divided by 1/A(j,j).
+*
+                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
+               END IF
+               XMAX = MAX( XMAX, CABS1( X( J ) ) )
+  170       CONTINUE
+*
+         ELSE
+*
+*           Solve A**H * x = b
+*
+            DO 220 J = JFIRST, JLAST, JINC
+*
+*              Compute x(j) = b(j) - sum A(k,j)*x(k).
+*                                    k<>j
+*
+               XJ = CABS1( X( J ) )
+               USCAL = TSCAL
+               REC = ONE / MAX( XMAX, ONE )
+               IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN
+*
+*                 If x(j) could overflow, scale x by 1/(2*XMAX).
+*
+                  REC = REC*HALF
+                  IF( NOUNIT ) THEN
+                     TJJS = DCONJG( AB( MAIND, J ) )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                  END IF
+                  TJJ = CABS1( TJJS )
+                  IF( TJJ.GT.ONE ) THEN
+*
+*                       Divide by A(j,j) when scaling x if A(j,j) > 1.
+*
+                     REC = MIN( ONE, REC*TJJ )
+                     USCAL = ZLADIV( USCAL, TJJS )
+                  END IF
+                  IF( REC.LT.ONE ) THEN
+                     CALL ZDSCAL( N, REC, X, 1 )
+                     SCALE = SCALE*REC
+                     XMAX = XMAX*REC
+                  END IF
+               END IF
+*
+               CSUMJ = ZERO
+               IF( USCAL.EQ.DCMPLX( ONE ) ) THEN
+*
+*                 If the scaling needed for A in the dot product is 1,
+*                 call ZDOTC to perform the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     CSUMJ = ZDOTC( JLEN, AB( KD+1-JLEN, J ), 1,
+     $                       X( J-JLEN ), 1 )
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     IF( JLEN.GT.1 )
+     $                  CSUMJ = ZDOTC( JLEN, AB( 2, J ), 1, X( J+1 ),
+     $                          1 )
+                  END IF
+               ELSE
+*
+*                 Otherwise, use in-line code for the dot product.
+*
+                  IF( UPPER ) THEN
+                     JLEN = MIN( KD, J-1 )
+                     DO 180 I = 1, JLEN
+                        CSUMJ = CSUMJ + ( DCONJG( AB( KD+I-JLEN, J ) )*
+     $                          USCAL )*X( J-JLEN-1+I )
+  180                CONTINUE
+                  ELSE
+                     JLEN = MIN( KD, N-J )
+                     DO 190 I = 1, JLEN
+                        CSUMJ = CSUMJ + ( DCONJG( AB( I+1, J ) )*USCAL )
+     $                          *X( J+I )
+  190                CONTINUE
+                  END IF
+               END IF
+*
+               IF( USCAL.EQ.DCMPLX( TSCAL ) ) THEN
+*
+*                 Compute x(j) := ( x(j) - CSUMJ ) / A(j,j) if 1/A(j,j)
+*                 was not used to scale the dotproduct.
+*
+                  X( J ) = X( J ) - CSUMJ
+                  XJ = CABS1( X( J ) )
+                  IF( NOUNIT ) THEN
+*
+*                    Compute x(j) = x(j) / A(j,j), scaling if necessary.
+*
+                     TJJS = DCONJG( AB( MAIND, J ) )*TSCAL
+                  ELSE
+                     TJJS = TSCAL
+                     IF( TSCAL.EQ.ONE )
+     $                  GO TO 210
+                  END IF
+                  TJJ = CABS1( TJJS )
+                  IF( TJJ.GT.SMLNUM ) THEN
+*
+*                       abs(A(j,j)) > SMLNUM:
+*
+                     IF( TJJ.LT.ONE ) THEN
+                        IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                             Scale X by 1/abs(x(j)).
+*
+                           REC = ONE / XJ
+                           CALL ZDSCAL( N, REC, X, 1 )
+                           SCALE = SCALE*REC
+                           XMAX = XMAX*REC
+                        END IF
+                     END IF
+                     X( J ) = ZLADIV( X( J ), TJJS )
+                  ELSE IF( TJJ.GT.ZERO ) THEN
+*
+*                       0 < abs(A(j,j)) <= SMLNUM:
+*
+                     IF( XJ.GT.TJJ*BIGNUM ) THEN
+*
+*                          Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM.
+*
+                        REC = ( TJJ*BIGNUM ) / XJ
+                        CALL ZDSCAL( N, REC, X, 1 )
+                        SCALE = SCALE*REC
+                        XMAX = XMAX*REC
+                     END IF
+                     X( J ) = ZLADIV( X( J ), TJJS )
+                  ELSE
+*
+*                       A(j,j) = 0:  Set x(1:n) = 0, x(j) = 1, and
+*                       scale = 0 and compute a solution to A**H *x = 0.
+*
+                     DO 200 I = 1, N
+                        X( I ) = ZERO
+  200                CONTINUE
+                     X( J ) = ONE
+                     SCALE = ZERO
+                     XMAX = ZERO
+                  END IF
+  210             CONTINUE
+               ELSE
+*
+*                 Compute x(j) := x(j) / A(j,j) - CSUMJ if the dot
+*                 product has already been divided by 1/A(j,j).
+*
+                  X( J ) = ZLADIV( X( J ), TJJS ) - CSUMJ
+               END IF
+               XMAX = MAX( XMAX, CABS1( X( J ) ) )
+  220       CONTINUE
+         END IF
+         SCALE = SCALE / TSCAL
+      END IF
+*
+*     Scale the column norms by 1/TSCAL for return.
+*
+      IF( TSCAL.NE.ONE ) THEN
+         CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
+      END IF
+*
+      RETURN
+*
+*     End of ZLATBS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpbcon.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,194 @@
+      SUBROUTINE ZPBCON( UPLO, N, KD, AB, LDAB, ANORM, RCOND, WORK,
+     $                   RWORK, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+      DOUBLE PRECISION   ANORM, RCOND
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   RWORK( * )
+      COMPLEX*16         AB( LDAB, * ), WORK( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPBCON estimates the reciprocal of the condition number (in the
+*  1-norm) of a complex Hermitian positive definite band matrix using
+*  the Cholesky factorization A = U**H*U or A = L*L**H computed by
+*  ZPBTRF.
+*
+*  An estimate is obtained for norm(inv(A)), and the reciprocal of the
+*  condition number is computed as RCOND = 1 / (ANORM * norm(inv(A))).
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          = 'U':  Upper triangular factor stored in AB;
+*          = 'L':  Lower triangular factor stored in AB.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*          The triangular factor U or L from the Cholesky factorization
+*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
+*          first KD+1 rows of the array.  The j-th column of U or L is
+*          stored in the j-th column of the array AB as follows:
+*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  ANORM   (input) DOUBLE PRECISION
+*          The 1-norm (or infinity-norm) of the Hermitian band matrix A.
+*
+*  RCOND   (output) DOUBLE PRECISION
+*          The reciprocal of the condition number of the matrix A,
+*          computed as RCOND = 1/(ANORM * AINVNM), where AINVNM is an
+*          estimate of the 1-norm of inv(A) computed in this routine.
+*
+*  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
+*
+*  RWORK   (workspace) DOUBLE PRECISION array, dimension (N)
+*
+*  INFO    (output) INTEGER
+*          = 0:  successful exit
+*          < 0:  if INFO = -i, the i-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      CHARACTER          NORMIN
+      INTEGER            IX, KASE
+      DOUBLE PRECISION   AINVNM, SCALE, SCALEL, SCALEU, SMLNUM
+      COMPLEX*16         ZDUM
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            IZAMAX
+      DOUBLE PRECISION   DLAMCH
+      EXTERNAL           LSAME, IZAMAX, DLAMCH
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZDRSCL, ZLACON, ZLATBS
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          ABS, DBLE, DIMAG
+*     ..
+*     .. Statement Functions ..
+      DOUBLE PRECISION   CABS1
+*     ..
+*     .. Statement Function definitions ..
+      CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      ELSE IF( ANORM.LT.ZERO ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPBCON', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      RCOND = ZERO
+      IF( N.EQ.0 ) THEN
+         RCOND = ONE
+         RETURN
+      ELSE IF( ANORM.EQ.ZERO ) THEN
+         RETURN
+      END IF
+*
+      SMLNUM = DLAMCH( 'Safe minimum' )
+*
+*     Estimate the 1-norm of the inverse.
+*
+      KASE = 0
+      NORMIN = 'N'
+   10 CONTINUE
+      CALL ZLACON( N, WORK( N+1 ), WORK, AINVNM, KASE )
+      IF( KASE.NE.0 ) THEN
+         IF( UPPER ) THEN
+*
+*           Multiply by inv(U').
+*
+            CALL ZLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
+     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEL, RWORK,
+     $                   INFO )
+            NORMIN = 'Y'
+*
+*           Multiply by inv(U).
+*
+            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEU, RWORK, INFO )
+         ELSE
+*
+*           Multiply by inv(L).
+*
+            CALL ZLATBS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
+     $                   KD, AB, LDAB, WORK, SCALEL, RWORK, INFO )
+            NORMIN = 'Y'
+*
+*           Multiply by inv(L').
+*
+            CALL ZLATBS( 'Lower', 'Conjugate transpose', 'Non-unit',
+     $                   NORMIN, N, KD, AB, LDAB, WORK, SCALEU, RWORK,
+     $                   INFO )
+         END IF
+*
+*        Multiply by 1/SCALE if doing so will not cause overflow.
+*
+         SCALE = SCALEL*SCALEU
+         IF( SCALE.NE.ONE ) THEN
+            IX = IZAMAX( N, WORK, 1 )
+            IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
+     $         GO TO 20
+            CALL ZDRSCL( N, SCALE, WORK, 1 )
+         END IF
+         GO TO 10
+      END IF
+*
+*     Compute the estimate of the reciprocal condition number.
+*
+      IF( AINVNM.NE.ZERO )
+     $   RCOND = ( ONE / AINVNM ) / ANORM
+*
+   20 CONTINUE
+*
+      RETURN
+*
+*     End of ZPBCON
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpbtf2.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,201 @@
+      SUBROUTINE ZPBTF2( UPLO, N, KD, AB, LDAB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+*     ..
+*     .. Array Arguments ..
+      COMPLEX*16         AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPBTF2 computes the Cholesky factorization of a complex Hermitian
+*  positive definite band 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, U' is the conjugate transpose
+*  of U, 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
+*          Hermitian matrix A is stored:
+*          = 'U':  Upper triangular
+*          = 'L':  Lower triangular
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of super-diagonals of the matrix A if UPLO = 'U',
+*          or the number of sub-diagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
+*          On entry, the upper or lower triangle of the Hermitian band
+*          matrix A, stored in the first KD+1 rows of the array.  The
+*          j-th column of A is stored in the j-th column of the array AB
+*          as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*          On exit, if INFO = 0, the triangular factor U or L from the
+*          Cholesky factorization A = U'*U or A = L*L' of the band
+*          matrix A, in the same storage format as A.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  N = 6, KD = 2, and UPLO = 'U':
+*
+*  On entry:                       On exit:
+*
+*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*
+*  Similarly, if UPLO = 'L' the format of A is as follows:
+*
+*  On entry:                       On exit:
+*
+*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
+*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
+*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
+*
+*  Array elements marked * are not used by the routine.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      INTEGER            J, KLD, KN
+      DOUBLE PRECISION   AJJ
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZDSCAL, ZHER, ZLACGV
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          DBLE, MAX, MIN, SQRT
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPBTF2', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+      KLD = MAX( 1, LDAB-1 )
+*
+      IF( UPPER ) THEN
+*
+*        Compute the Cholesky factorization A = U'*U.
+*
+         DO 10 J = 1, N
+*
+*           Compute U(J,J) and test for non-positive-definiteness.
+*
+            AJJ = DBLE( AB( KD+1, J ) )
+            IF( AJJ.LE.ZERO ) THEN
+               AB( KD+1, J ) = AJJ
+               GO TO 30
+            END IF
+            AJJ = SQRT( AJJ )
+            AB( KD+1, J ) = AJJ
+*
+*           Compute elements J+1:J+KN of row J and update the
+*           trailing submatrix within the band.
+*
+            KN = MIN( KD, N-J )
+            IF( KN.GT.0 ) THEN
+               CALL ZDSCAL( KN, ONE / AJJ, AB( KD, J+1 ), KLD )
+               CALL ZLACGV( KN, AB( KD, J+1 ), KLD )
+               CALL ZHER( 'Upper', KN, -ONE, AB( KD, J+1 ), KLD,
+     $                    AB( KD+1, J+1 ), KLD )
+               CALL ZLACGV( KN, AB( KD, J+1 ), KLD )
+            END IF
+   10    CONTINUE
+      ELSE
+*
+*        Compute the Cholesky factorization A = L*L'.
+*
+         DO 20 J = 1, N
+*
+*           Compute L(J,J) and test for non-positive-definiteness.
+*
+            AJJ = DBLE( AB( 1, J ) )
+            IF( AJJ.LE.ZERO ) THEN
+               AB( 1, J ) = AJJ
+               GO TO 30
+            END IF
+            AJJ = SQRT( AJJ )
+            AB( 1, J ) = AJJ
+*
+*           Compute elements J+1:J+KN of column J and update the
+*           trailing submatrix within the band.
+*
+            KN = MIN( KD, N-J )
+            IF( KN.GT.0 ) THEN
+               CALL ZDSCAL( KN, ONE / AJJ, AB( 2, J ), 1 )
+               CALL ZHER( 'Lower', KN, -ONE, AB( 2, J ), 1,
+     $                    AB( 1, J+1 ), KLD )
+            END IF
+   20    CONTINUE
+      END IF
+      RETURN
+*
+   30 CONTINUE
+      INFO = J
+      RETURN
+*
+*     End of ZPBTF2
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpbtrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,372 @@
+      SUBROUTINE ZPBTRF( UPLO, N, KD, AB, LDAB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, N
+*     ..
+*     .. Array Arguments ..
+      COMPLEX*16         AB( LDAB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPBTRF computes the Cholesky factorization of a complex Hermitian
+*  positive definite band matrix A.
+*
+*  The factorization has the form
+*     A = U**H * U,  if UPLO = 'U', or
+*     A = L  * L**H,  if UPLO = 'L',
+*  where U is an upper triangular matrix and L is lower triangular.
+*
+*  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.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
+*
+*  AB      (input/output) COMPLEX*16 array, dimension (LDAB,N)
+*          On entry, the upper or lower triangle of the Hermitian band
+*          matrix A, stored in the first KD+1 rows of the array.  The
+*          j-th column of A is stored in the j-th column of the array AB
+*          as follows:
+*          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).
+*
+*          On exit, if INFO = 0, the triangular factor U or L from the
+*          Cholesky factorization A = U**H*U or A = L*L**H of the band
+*          matrix A, in the same storage format as A.
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  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.
+*
+*  Further Details
+*  ===============
+*
+*  The band storage scheme is illustrated by the following example, when
+*  N = 6, KD = 2, and UPLO = 'U':
+*
+*  On entry:                       On exit:
+*
+*      *    *   a13  a24  a35  a46      *    *   u13  u24  u35  u46
+*      *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
+*     a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
+*
+*  Similarly, if UPLO = 'L' the format of A is as follows:
+*
+*  On entry:                       On exit:
+*
+*     a11  a22  a33  a44  a55  a66     l11  l22  l33  l44  l55  l66
+*     a21  a32  a43  a54  a65   *      l21  l32  l43  l54  l65   *
+*     a31  a42  a53  a64   *    *      l31  l42  l53  l64   *    *
+*
+*  Array elements marked * are not used by the routine.
+*
+*  Contributed by
+*  Peter Mayes and Giuseppe Radicati, IBM ECSEC, Rome, March 23, 1989
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ONE, ZERO
+      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
+      COMPLEX*16         CONE
+      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
+      INTEGER            NBMAX, LDWORK
+      PARAMETER          ( NBMAX = 32, LDWORK = NBMAX+1 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, I2, I3, IB, II, J, JJ, NB
+*     ..
+*     .. Local Arrays ..
+      COMPLEX*16         WORK( LDWORK, NBMAX )
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      INTEGER            ILAENV
+      EXTERNAL           LSAME, ILAENV
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2, ZTRSM
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
+     $    ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -5
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPBTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Determine the block size for this environment
+*
+      NB = ILAENV( 1, 'ZPBTRF', UPLO, N, KD, -1, -1 )
+*
+*     The block size must not exceed the semi-bandwidth KD, and must not
+*     exceed the limit set by the size of the local array WORK.
+*
+      NB = MIN( NB, NBMAX )
+*
+      IF( NB.LE.1 .OR. NB.GT.KD ) THEN
+*
+*        Use unblocked code
+*
+         CALL ZPBTF2( UPLO, N, KD, AB, LDAB, INFO )
+      ELSE
+*
+*        Use blocked code
+*
+         IF( LSAME( UPLO, 'U' ) ) THEN
+*
+*           Compute the Cholesky factorization of a Hermitian band
+*           matrix, given the upper triangle of the matrix in band
+*           storage.
+*
+*           Zero the upper triangle of the work array.
+*
+            DO 20 J = 1, NB
+               DO 10 I = 1, J - 1
+                  WORK( I, J ) = ZERO
+   10          CONTINUE
+   20       CONTINUE
+*
+*           Process the band matrix one diagonal block at a time.
+*
+            DO 70 I = 1, N, NB
+               IB = MIN( NB, N-I+1 )
+*
+*              Factorize the diagonal block
+*
+               CALL ZPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
+               IF( II.NE.0 ) THEN
+                  INFO = I + II - 1
+                  GO TO 150
+               END IF
+               IF( I+IB.LE.N ) THEN
+*
+*                 Update the relevant part of the trailing submatrix.
+*                 If A11 denotes the diagonal block which has just been
+*                 factorized, then we need to update the remaining
+*                 blocks in the diagram:
+*
+*                    A11   A12   A13
+*                          A22   A23
+*                                A33
+*
+*                 The numbers of rows and columns in the partitioning
+*                 are IB, I2, I3 respectively. The blocks A12, A22 and
+*                 A23 are empty if IB = KD. The upper triangle of A13
+*                 lies outside the band.
+*
+                  I2 = MIN( KD-IB, N-I-IB+1 )
+                  I3 = MIN( IB, N-I-KD+1 )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A12
+*
+                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
+     $                           'Non-unit', IB, I2, CONE,
+     $                           AB( KD+1, I ), LDAB-1,
+     $                           AB( KD+1-IB, I+IB ), LDAB-1 )
+*
+*                    Update A22
+*
+                     CALL ZHERK( 'Upper', 'Conjugate transpose', I2, IB,
+     $                           -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
+     $                           AB( KD+1, I+IB ), LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Copy the lower triangle of A13 into the work array.
+*
+                     DO 40 JJ = 1, I3
+                        DO 30 II = JJ, IB
+                           WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
+   30                   CONTINUE
+   40                CONTINUE
+*
+*                    Update A13 (in the work array).
+*
+                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
+     $                           'Non-unit', IB, I3, CONE,
+     $                           AB( KD+1, I ), LDAB-1, WORK, LDWORK )
+*
+*                    Update A23
+*
+                     IF( I2.GT.0 )
+     $                  CALL ZGEMM( 'Conjugate transpose',
+     $                              'No transpose', I2, I3, IB, -CONE,
+     $                              AB( KD+1-IB, I+IB ), LDAB-1, WORK,
+     $                              LDWORK, CONE, AB( 1+IB, I+KD ),
+     $                              LDAB-1 )
+*
+*                    Update A33
+*
+                     CALL ZHERK( 'Upper', 'Conjugate transpose', I3, IB,
+     $                           -ONE, WORK, LDWORK, ONE,
+     $                           AB( KD+1, I+KD ), LDAB-1 )
+*
+*                    Copy the lower triangle of A13 back into place.
+*
+                     DO 60 JJ = 1, I3
+                        DO 50 II = JJ, IB
+                           AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
+   50                   CONTINUE
+   60                CONTINUE
+                  END IF
+               END IF
+   70       CONTINUE
+         ELSE
+*
+*           Compute the Cholesky factorization of a Hermitian band
+*           matrix, given the lower triangle of the matrix in band
+*           storage.
+*
+*           Zero the lower triangle of the work array.
+*
+            DO 90 J = 1, NB
+               DO 80 I = J + 1, NB
+                  WORK( I, J ) = ZERO
+   80          CONTINUE
+   90       CONTINUE
+*
+*           Process the band matrix one diagonal block at a time.
+*
+            DO 140 I = 1, N, NB
+               IB = MIN( NB, N-I+1 )
+*
+*              Factorize the diagonal block
+*
+               CALL ZPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
+               IF( II.NE.0 ) THEN
+                  INFO = I + II - 1
+                  GO TO 150
+               END IF
+               IF( I+IB.LE.N ) THEN
+*
+*                 Update the relevant part of the trailing submatrix.
+*                 If A11 denotes the diagonal block which has just been
+*                 factorized, then we need to update the remaining
+*                 blocks in the diagram:
+*
+*                    A11
+*                    A21   A22
+*                    A31   A32   A33
+*
+*                 The numbers of rows and columns in the partitioning
+*                 are IB, I2, I3 respectively. The blocks A21, A22 and
+*                 A32 are empty if IB = KD. The lower triangle of A31
+*                 lies outside the band.
+*
+                  I2 = MIN( KD-IB, N-I-IB+1 )
+                  I3 = MIN( IB, N-I-KD+1 )
+*
+                  IF( I2.GT.0 ) THEN
+*
+*                    Update A21
+*
+                     CALL ZTRSM( 'Right', 'Lower',
+     $                           'Conjugate transpose', 'Non-unit', I2,
+     $                           IB, CONE, AB( 1, I ), LDAB-1,
+     $                           AB( 1+IB, I ), LDAB-1 )
+*
+*                    Update A22
+*
+                     CALL ZHERK( 'Lower', 'No transpose', I2, IB, -ONE,
+     $                           AB( 1+IB, I ), LDAB-1, ONE,
+     $                           AB( 1, I+IB ), LDAB-1 )
+                  END IF
+*
+                  IF( I3.GT.0 ) THEN
+*
+*                    Copy the upper triangle of A31 into the work array.
+*
+                     DO 110 JJ = 1, IB
+                        DO 100 II = 1, MIN( JJ, I3 )
+                           WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
+  100                   CONTINUE
+  110                CONTINUE
+*
+*                    Update A31 (in the work array).
+*
+                     CALL ZTRSM( 'Right', 'Lower',
+     $                           'Conjugate transpose', 'Non-unit', I3,
+     $                           IB, CONE, AB( 1, I ), LDAB-1, WORK,
+     $                           LDWORK )
+*
+*                    Update A32
+*
+                     IF( I2.GT.0 )
+     $                  CALL ZGEMM( 'No transpose',
+     $                              'Conjugate transpose', I3, I2, IB,
+     $                              -CONE, WORK, LDWORK, AB( 1+IB, I ),
+     $                              LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
+     $                              LDAB-1 )
+*
+*                    Update A33
+*
+                     CALL ZHERK( 'Lower', 'No transpose', I3, IB, -ONE,
+     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
+     $                           LDAB-1 )
+*
+*                    Copy the upper triangle of A31 back into place.
+*
+                     DO 130 JJ = 1, IB
+                        DO 120 II = 1, MIN( JJ, I3 )
+                           AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
+  120                   CONTINUE
+  130                CONTINUE
+                  END IF
+               END IF
+  140       CONTINUE
+         END IF
+      END IF
+      RETURN
+*
+  150 CONTINUE
+      RETURN
+*
+*     End of ZPBTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpbtrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,146 @@
+      SUBROUTINE ZPBTRS( UPLO, N, KD, NRHS, AB, LDAB, B, LDB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, KD, LDAB, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      COMPLEX*16         AB( LDAB, * ), B( LDB, * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPBTRS solves a system of linear equations A*X = B with a Hermitian
+*  positive definite band matrix A using the Cholesky factorization
+*  A = U**H*U or A = L*L**H computed by ZPBTRF.
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          = 'U':  Upper triangular factor stored in AB;
+*          = 'L':  Lower triangular factor stored in AB.
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  KD      (input) INTEGER
+*          The number of superdiagonals of the matrix A if UPLO = 'U',
+*          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
+*
+*  NRHS    (input) INTEGER
+*          The number of right hand sides, i.e., the number of columns
+*          of the matrix B.  NRHS >= 0.
+*
+*  AB      (input) COMPLEX*16 array, dimension (LDAB,N)
+*          The triangular factor U or L from the Cholesky factorization
+*          A = U**H*U or A = L*L**H of the band matrix A, stored in the
+*          first KD+1 rows of the array.  The j-th column of U or L is
+*          stored in the j-th column of the array AB as follows:
+*          if UPLO ='U', AB(kd+1+i-j,j) = U(i,j) for max(1,j-kd)<=i<=j;
+*          if UPLO ='L', AB(1+i-j,j)    = L(i,j) for j<=i<=min(n,j+kd).
+*
+*  LDAB    (input) INTEGER
+*          The leading dimension of the array AB.  LDAB >= KD+1.
+*
+*  B       (input/output) COMPLEX*16 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
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      INTEGER            J
+*     ..
+*     .. External Functions ..
+      LOGICAL            LSAME
+      EXTERNAL           LSAME
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZTBSV
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      UPPER = LSAME( UPLO, 'U' )
+      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( KD.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -4
+      ELSE IF( LDAB.LT.KD+1 ) THEN
+         INFO = -6
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -8
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPBTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+      IF( UPPER ) THEN
+*
+*        Solve A*X = B where A = U'*U.
+*
+         DO 10 J = 1, NRHS
+*
+*           Solve U'*X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
+     $                  KD, AB, LDAB, B( 1, J ), 1 )
+*
+*           Solve U*X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+   10    CONTINUE
+      ELSE
+*
+*        Solve A*X = B where A = L*L'.
+*
+         DO 20 J = 1, NRHS
+*
+*           Solve L*X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Lower', 'No transpose', 'Non-unit', N, KD, AB,
+     $                  LDAB, B( 1, J ), 1 )
+*
+*           Solve L'*X = B, overwriting B with X.
+*
+            CALL ZTBSV( 'Lower', 'Conjugate transpose', 'Non-unit', N,
+     $                  KD, AB, LDAB, B( 1, J ), 1 )
+   20    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of ZPBTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zptsv.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,101 @@
+      SUBROUTINE ZPTSV( N, NRHS, D, E, B, LDB, INFO )
+*
+*  -- LAPACK routine (version 3.0) --
+*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
+*     Courant Institute, Argonne National Lab, and Rice University
+*     February 25, 1997
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   D( * )
+      COMPLEX*16         B( LDB, * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPTSV computes the solution to a complex system of linear equations
+*  A*X = B, where A is an N-by-N Hermitian positive definite tridiagonal
+*  matrix, and X and B are N-by-NRHS matrices.
+*
+*  A is factored as A = L*D*L**H, and the factored form of A is then
+*  used to solve the system of equations.
+*
+*  Arguments
+*  =========
+*
+*  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.
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, the n diagonal elements of the tridiagonal matrix
+*          A.  On exit, the n diagonal elements of the diagonal matrix
+*          D from the factorization A = L*D*L**H.
+*
+*  E       (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, the (n-1) subdiagonal elements of the tridiagonal
+*          matrix A.  On exit, the (n-1) subdiagonal elements of the
+*          unit bidiagonal factor L from the L*D*L**H factorization of
+*          A.  E can also be regarded as the superdiagonal of the unit
+*          bidiagonal factor U from the U**H*D*U factorization of A.
+*
+*  B       (input/output) COMPLEX*16 array, dimension (LDB,N)
+*          On entry, the N-by-NRHS right hand side matrix B.
+*          On exit, if INFO = 0, the N-by-NRHS 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
+*          > 0:  if INFO = i, the leading minor of order i is not
+*                positive definite, and the solution has not been
+*                computed.  The factorization has not been completed
+*                unless i = N.
+*
+*  =====================================================================
+*
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZPTTRF, ZPTTRS
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -6
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPTSV ', -INFO )
+         RETURN
+      END IF
+*
+*     Compute the L*D*L' (or U'*D*U) factorization of A.
+*
+      CALL ZPTTRF( N, D, E, INFO )
+      IF( INFO.EQ.0 ) THEN
+*
+*        Solve the system A*X = B, overwriting B with X.
+*
+         CALL ZPTTRS( 'Lower', N, NRHS, D, E, B, LDB, INFO )
+      END IF
+      RETURN
+*
+*     End of ZPTSV
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpttrf.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,169 @@
+      SUBROUTINE ZPTTRF( N, D, E, 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            INFO, N
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   D( * )
+      COMPLEX*16         E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPTTRF computes the L*D*L' factorization of a complex Hermitian
+*  positive definite tridiagonal matrix A.  The factorization may also
+*  be regarded as having the form A = U'*D*U.
+*
+*  Arguments
+*  =========
+*
+*  N       (input) INTEGER
+*          The order of the matrix A.  N >= 0.
+*
+*  D       (input/output) DOUBLE PRECISION array, dimension (N)
+*          On entry, the n diagonal elements of the tridiagonal matrix
+*          A.  On exit, the n diagonal elements of the diagonal matrix
+*          D from the L*D*L' factorization of A.
+*
+*  E       (input/output) COMPLEX*16 array, dimension (N-1)
+*          On entry, the (n-1) subdiagonal elements of the tridiagonal
+*          matrix A.  On exit, the (n-1) subdiagonal elements of the
+*          unit bidiagonal factor L from the L*D*L' factorization of A.
+*          E can also be regarded as the superdiagonal of the unit
+*          bidiagonal factor U from the U'*D*U factorization of A.
+*
+*  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; if k < N, the factorization could not
+*               be completed, while if k = N, the factorization was
+*               completed, but D(N) = 0.
+*
+*  =====================================================================
+*
+*     .. Parameters ..
+      DOUBLE PRECISION   ZERO
+      PARAMETER          ( ZERO = 0.0D+0 )
+*     ..
+*     .. Local Scalars ..
+      INTEGER            I, I4
+      DOUBLE PRECISION   EII, EIR, F, G
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          DBLE, DCMPLX, DIMAG, MOD
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input parameters.
+*
+      INFO = 0
+      IF( N.LT.0 ) THEN
+         INFO = -1
+         CALL XERBLA( 'ZPTTRF', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 )
+     $   RETURN
+*
+*     Compute the L*D*L' (or U'*D*U) factorization of A.
+*
+      I4 = MOD( N-1, 4 )
+      DO 10 I = 1, I4
+         IF( D( I ).LE.ZERO ) THEN
+            INFO = I
+            GO TO 30
+         END IF
+         EIR = DBLE( E( I ) )
+         EII = DIMAG( E( I ) )
+         F = EIR / D( I )
+         G = EII / D( I )
+         E( I ) = DCMPLX( F, G )
+         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
+   10 CONTINUE
+*
+      DO 20 I = I4 + 1, N - 4, 4
+*
+*        Drop out of the loop if d(i) <= 0: the matrix is not positive
+*        definite.
+*
+         IF( D( I ).LE.ZERO ) THEN
+            INFO = I
+            GO TO 30
+         END IF
+*
+*        Solve for e(i) and d(i+1).
+*
+         EIR = DBLE( E( I ) )
+         EII = DIMAG( E( I ) )
+         F = EIR / D( I )
+         G = EII / D( I )
+         E( I ) = DCMPLX( F, G )
+         D( I+1 ) = D( I+1 ) - F*EIR - G*EII
+*
+         IF( D( I+1 ).LE.ZERO ) THEN
+            INFO = I + 1
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+1) and d(i+2).
+*
+         EIR = DBLE( E( I+1 ) )
+         EII = DIMAG( E( I+1 ) )
+         F = EIR / D( I+1 )
+         G = EII / D( I+1 )
+         E( I+1 ) = DCMPLX( F, G )
+         D( I+2 ) = D( I+2 ) - F*EIR - G*EII
+*
+         IF( D( I+2 ).LE.ZERO ) THEN
+            INFO = I + 2
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+2) and d(i+3).
+*
+         EIR = DBLE( E( I+2 ) )
+         EII = DIMAG( E( I+2 ) )
+         F = EIR / D( I+2 )
+         G = EII / D( I+2 )
+         E( I+2 ) = DCMPLX( F, G )
+         D( I+3 ) = D( I+3 ) - F*EIR - G*EII
+*
+         IF( D( I+3 ).LE.ZERO ) THEN
+            INFO = I + 3
+            GO TO 30
+         END IF
+*
+*        Solve for e(i+3) and d(i+4).
+*
+         EIR = DBLE( E( I+3 ) )
+         EII = DIMAG( E( I+3 ) )
+         F = EIR / D( I+3 )
+         G = EII / D( I+3 )
+         E( I+3 ) = DCMPLX( F, G )
+         D( I+4 ) = D( I+4 ) - F*EIR - G*EII
+   20 CONTINUE
+*
+*     Check d(n) for positive definiteness.
+*
+      IF( D( N ).LE.ZERO )
+     $   INFO = N
+*
+   30 CONTINUE
+      RETURN
+*
+*     End of ZPTTRF
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zpttrs.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,136 @@
+      SUBROUTINE ZPTTRS( UPLO, N, NRHS, D, E, B, LDB, 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
+*
+*     .. Scalar Arguments ..
+      CHARACTER          UPLO
+      INTEGER            INFO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   D( * )
+      COMPLEX*16         B( LDB, * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPTTRS solves a tridiagonal system of the form
+*     A * X = B
+*  using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF.
+*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
+*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
+*  the vector E, and X and B are N by NRHS matrices.
+*
+*  Arguments
+*  =========
+*
+*  UPLO    (input) CHARACTER*1
+*          Specifies the form of the factorization and whether the
+*          vector E is the superdiagonal of the upper bidiagonal factor
+*          U or the subdiagonal of the lower bidiagonal factor L.
+*          = 'U':  A = U'*D*U, E is the superdiagonal of U
+*          = 'L':  A = L*D*L', E is the subdiagonal of L
+*
+*  N       (input) INTEGER
+*          The order of the tridiagonal 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.
+*
+*  D       (input) DOUBLE PRECISION array, dimension (N)
+*          The n diagonal elements of the diagonal matrix D from the
+*          factorization A = U'*D*U or A = L*D*L'.
+*
+*  E       (input) COMPLEX*16 array, dimension (N-1)
+*          If UPLO = 'U', the (n-1) superdiagonal elements of the unit
+*          bidiagonal factor U from the factorization A = U'*D*U.
+*          If UPLO = 'L', the (n-1) subdiagonal elements of the unit
+*          bidiagonal factor L from the factorization A = L*D*L'.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the right hand side vectors B for the system of
+*          linear equations.
+*          On exit, the solution vectors, X.
+*
+*  LDB     (input) INTEGER
+*          The leading dimension of the array B.  LDB >= max(1,N).
+*
+*  INFO    (output) INTEGER
+*          = 0: successful exit
+*          < 0: if INFO = -k, the k-th argument had an illegal value
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      LOGICAL            UPPER
+      INTEGER            IUPLO, J, JB, NB
+*     ..
+*     .. External Functions ..
+      INTEGER            ILAENV
+      EXTERNAL           ILAENV
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           XERBLA, ZPTTS2
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          MAX, MIN
+*     ..
+*     .. Executable Statements ..
+*
+*     Test the input arguments.
+*
+      INFO = 0
+      UPPER = ( UPLO.EQ.'U' .OR. UPLO.EQ.'u' )
+      IF( .NOT.UPPER .AND. .NOT.( UPLO.EQ.'L' .OR. UPLO.EQ.'l' ) ) THEN
+         INFO = -1
+      ELSE IF( N.LT.0 ) THEN
+         INFO = -2
+      ELSE IF( NRHS.LT.0 ) THEN
+         INFO = -3
+      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
+         INFO = -7
+      END IF
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'ZPTTRS', -INFO )
+         RETURN
+      END IF
+*
+*     Quick return if possible
+*
+      IF( N.EQ.0 .OR. NRHS.EQ.0 )
+     $   RETURN
+*
+*     Determine the number of right-hand sides to solve at a time.
+*
+      IF( NRHS.EQ.1 ) THEN
+         NB = 1
+      ELSE
+         NB = MAX( 1, ILAENV( 1, 'ZPTTRS', UPLO, N, NRHS, -1, -1 ) )
+      END IF
+*
+*     Decode UPLO
+*
+      IF( UPPER ) THEN
+         IUPLO = 1
+      ELSE
+         IUPLO = 0
+      END IF
+*
+      IF( NB.GE.NRHS ) THEN
+         CALL ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
+      ELSE
+         DO 10 J = 1, NRHS, NB
+            JB = MIN( NRHS-J+1, NB )
+            CALL ZPTTS2( IUPLO, N, JB, D, E, B( 1, J ), LDB )
+   10    CONTINUE
+      END IF
+*
+      RETURN
+*
+*     End of ZPTTRS
+*
+      END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcruft/lapack/zptts2.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,177 @@
+      SUBROUTINE ZPTTS2( IUPLO, N, NRHS, D, E, B, LDB )
+*
+*  -- 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
+*
+*     .. Scalar Arguments ..
+      INTEGER            IUPLO, LDB, N, NRHS
+*     ..
+*     .. Array Arguments ..
+      DOUBLE PRECISION   D( * )
+      COMPLEX*16         B( LDB, * ), E( * )
+*     ..
+*
+*  Purpose
+*  =======
+*
+*  ZPTTS2 solves a tridiagonal system of the form
+*     A * X = B
+*  using the factorization A = U'*D*U or A = L*D*L' computed by ZPTTRF.
+*  D is a diagonal matrix specified in the vector D, U (or L) is a unit
+*  bidiagonal matrix whose superdiagonal (subdiagonal) is specified in
+*  the vector E, and X and B are N by NRHS matrices.
+*
+*  Arguments
+*  =========
+*
+*  IUPLO   (input) INTEGER
+*          Specifies the form of the factorization and whether the
+*          vector E is the superdiagonal of the upper bidiagonal factor
+*          U or the subdiagonal of the lower bidiagonal factor L.
+*          = 1:  A = U'*D*U, E is the superdiagonal of U
+*          = 0:  A = L*D*L', E is the subdiagonal of L
+*
+*  N       (input) INTEGER
+*          The order of the tridiagonal 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.
+*
+*  D       (input) DOUBLE PRECISION array, dimension (N)
+*          The n diagonal elements of the diagonal matrix D from the
+*          factorization A = U'*D*U or A = L*D*L'.
+*
+*  E       (input) COMPLEX*16 array, dimension (N-1)
+*          If IUPLO = 1, the (n-1) superdiagonal elements of the unit
+*          bidiagonal factor U from the factorization A = U'*D*U.
+*          If IUPLO = 0, the (n-1) subdiagonal elements of the unit
+*          bidiagonal factor L from the factorization A = L*D*L'.
+*
+*  B       (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
+*          On entry, the right hand side vectors B for the system of
+*          linear equations.
+*          On exit, the solution vectors, X.
+*
+*  LDB     (input) INTEGER
+*          The leading dimension of the array B.  LDB >= max(1,N).
+*
+*  =====================================================================
+*
+*     .. Local Scalars ..
+      INTEGER            I, J
+*     ..
+*     .. External Subroutines ..
+      EXTERNAL           ZDSCAL
+*     ..
+*     .. Intrinsic Functions ..
+      INTRINSIC          DCONJG
+*     ..
+*     .. Executable Statements ..
+*
+*     Quick return if possible
+*
+      IF( N.LE.1 ) THEN
+         IF( N.EQ.1 )
+     $      CALL ZDSCAL( NRHS, 1.D0 / D( 1 ), B, LDB )
+         RETURN
+      END IF
+*
+      IF( IUPLO.EQ.1 ) THEN
+*
+*        Solve A * X = B using the factorization A = U'*D*U,
+*        overwriting each right hand side vector with its solution.
+*
+         IF( NRHS.LE.2 ) THEN
+            J = 1
+   10       CONTINUE
+*
+*           Solve U' * x = b.
+*
+            DO 20 I = 2, N
+               B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
+   20       CONTINUE
+*
+*           Solve D * U * x = b.
+*
+            DO 30 I = 1, N
+               B( I, J ) = B( I, J ) / D( I )
+   30       CONTINUE
+            DO 40 I = N - 1, 1, -1
+               B( I, J ) = B( I, J ) - B( I+1, J )*E( I )
+   40       CONTINUE
+            IF( J.LT.NRHS ) THEN
+               J = J + 1
+               GO TO 10
+            END IF
+         ELSE
+            DO 70 J = 1, NRHS
+*
+*              Solve U' * x = b.
+*
+               DO 50 I = 2, N
+                  B( I, J ) = B( I, J ) - B( I-1, J )*DCONJG( E( I-1 ) )
+   50          CONTINUE
+*
+*              Solve D * U * x = b.
+*
+               B( N, J ) = B( N, J ) / D( N )
+               DO 60 I = N - 1, 1, -1
+                  B( I, J ) = B( I, J ) / D( I ) - B( I+1, J )*E( I )
+   60          CONTINUE
+   70       CONTINUE
+         END IF
+      ELSE
+*
+*        Solve A * X = B using the factorization A = L*D*L',
+*        overwriting each right hand side vector with its solution.
+*
+         IF( NRHS.LE.2 ) THEN
+            J = 1
+   80       CONTINUE
+*
+*           Solve L * x = b.
+*
+            DO 90 I = 2, N
+               B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
+   90       CONTINUE
+*
+*           Solve D * L' * x = b.
+*
+            DO 100 I = 1, N
+               B( I, J ) = B( I, J ) / D( I )
+  100       CONTINUE
+            DO 110 I = N - 1, 1, -1
+               B( I, J ) = B( I, J ) - B( I+1, J )*DCONJG( E( I ) )
+  110       CONTINUE
+            IF( J.LT.NRHS ) THEN
+               J = J + 1
+               GO TO 80
+            END IF
+         ELSE
+            DO 140 J = 1, NRHS
+*
+*              Solve L * x = b.
+*
+               DO 120 I = 2, N
+                  B( I, J ) = B( I, J ) - B( I-1, J )*E( I-1 )
+  120          CONTINUE
+*
+*              Solve D * L' * x = b.
+*
+               B( N, J ) = B( N, J ) / D( N )
+               DO 130 I = N - 1, 1, -1
+                  B( I, J ) = B( I, J ) / D( I ) -
+     $                        B( I+1, J )*DCONJG( E( I ) )
+  130          CONTINUE
+  140       CONTINUE
+         END IF
+      END IF
+*
+      RETURN
+*
+*     End of ZPTTS2
+*
+      END
--- a/liboctave/CNDArray.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/CNDArray.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -26,6 +26,7 @@
 #endif
 
 #include <cfloat>
+
 #include <vector>
 
 #include "Array-util.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD.README	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,25 @@
+This directory contains an unmodified copy of COLAMD version 2.3 in
+the subdirectory COLAMD.  COLAMD was written by Stefan I. Larimore and
+Timothy A. Davis (davis@cise.ufl.edu), University of Florida.  The
+algorithm was developed in collaboration with John Gilbert, Xerox
+PARC, and Esmond Ng, Oak Ridge National Laboratory.  COLAMD is
+distributed under the following terms:
+
+  Copyright (c) 1998-2003 by the University of Florida.
+  All Rights Reserved.
+
+  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+  EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+  Permission is hereby granted to use, copy, modify, and/or distribute
+  this program, provided that the Copyright, this License, and the
+  Availability of the original version is retained on all copies and made
+  accessible to the end-user of any code or package that includes COLAMD
+  or any modified version of COLAMD. 
+
+John W. Eaton
+jwe@bevo.che.wisc.edu
+University of Wisconsin-Madison
+Department of Chemical & Biological Engineering
+
+Wed Dec 29 20:20:56 2004
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD.files	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+
+COLAMD_SRC := colamd.c
+
+COLAMD_OBJ := $(COLAMD_SRC:.c=.o)
+
+COLAMD_DEP := $(COLAMD_SRC:.c=.d)
+
+$(COLAMD_OBJ) $(COLAMD_DEP) := INCFLAGS += -I$(top_srcdir)/liboctave/COLAMD
+
+COLAMD_EXTRAS := COLAMD.files COLAMD.README
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,69 @@
+    Changes from Version 2.2 to 2.3 (Sept. 8, 2003)
+
+	* removed the call to the MATLAB spparms ('spumoni') function.
+	    This can take a lot of time if you are ordering many small
+	    matrices.  Only affects the MATLAB interface (colamdmex.c,
+	    symamdmex.c, colamdtestmex.c, and symamdtestmex.c).  The
+	    usage of the optional 2nd argument to the colamd and symamd
+	    mexFunctions was changed accordingly.
+
+    Changes from Version 2.1 to 2.2 (Sept. 23, 2002)
+
+	* extensive testing routines added (colamd_test.m, colamdtestmex.c,
+	    and symamdtestmex.c), and the Makefile modified accordingly.
+
+	* a few typos in the comments corrected 
+
+	* use of the MATLAB "flops" command removed from colamd_demo, and an
+	    m-file routine luflops.m added.
+
+	* an explicit typecast from unsigned to int added, for COLAMD_C and
+	    COLAMD_R in colamd.h.
+
+	* #include <stdio.h> added to colamd_example.c
+
+
+    Changes from Version 2.0 to 2.1 (May 4, 2001)
+
+	* TRUE and FALSE are predefined on some systems, so they are defined
+		here only if not already defined.
+	
+	* web site changed
+
+	* UNIX Makefile modified, to handle the case if "." is not in your path.
+
+
+    Changes from Version 1.0 to 2.0 (January 31, 2000)
+
+	No bugs were found in version 1.1.  These changes merely add new
+	functionality.
+
+    	* added the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.
+
+	* moved the output statistics, from A, to a separate output argument.
+		The arguments changed for the C-callable routines.
+
+	* added colamd_report and symamd_report.
+
+	* added a C-callable symamd routine.  Formerly, symamd was only
+		available as a mexFunction from MATLAB.
+
+	* added error-checking to symamd.  Formerly, it assumed its input
+		was error-free.
+
+	* added the optional stats and knobs arguments to the symamd mexFunction
+
+	* deleted colamd_help.  A help message is still available from
+		"help colamd" and "help symamd" in MATLAB.
+
+	* deleted colamdtree.m and symamdtree.m.  Now, colamd.m and symamd.m
+		also do the elimination tree post-ordering.  The Version 1.1
+		colamd and symamd mexFunctions, which do not do the post-
+		ordering, are now visible as colamdmex and symamdmex from
+		MATLAB.  Essentialy, the post-ordering is now the default
+		behavior of colamd.m and symamd.m, to match the behavior of
+		colmmd and symmmd.  The post-ordering is only available in the
+		MATLAB interface, not the C-callable interface.
+
+	* made a slight change to the dense row/column detection in symamd,
+		to match the stated specifications.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,19 @@
+colamd_example:  colamd_example.c colamd.c colamd.h
+	cc -O -o colamd_example colamd_example.c colamd.c
+	- ./colamd_example
+
+clean:
+	- rm *.o colamd_example
+	- rm colamdmex.mex* symamdmex.mex*
+	- rm colamdtestmex.mex* symamdtestmex.mex*
+
+# Compiles the MATLAB-callable routines
+matlab: colamdmex.c colamd.c colamd.h
+	mex -O colamdmex.c colamd.c
+	mex -O symamdmex.c colamd.c
+
+# Compiles the extensive test code
+test: matlab colamdmex.c colamd.c colamd.h
+	mex -O colamdtestmex.c colamd.c
+	mex -O symamdtestmex.c colamd.c
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/README	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,104 @@
+The COLAMD ordering method - Version 2.3
+-------------------------------------------------------------------------------
+
+The COLAMD column approximate minimum degree ordering algorithm computes
+a permutation vector P such that the LU factorization of A (:,P)
+tends to be sparser than that of A.  The Cholesky factorization of
+(A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A.
+SYMAMD is a symmetric minimum degree ordering method based on COLAMD,
+available as a MATLAB-callable function.  It constructs a matrix M such
+that M'*M has the same pattern as A, and then uses COLAMD to compute a column
+ordering of M.  Colamd and symamd tend to be faster and generate better
+orderings than their MATLAB counterparts, colmmd and symmmd.
+
+To compile and test the colamd m-files and mexFunctions, just unpack the
+colamd2.3/ directory from the colamd2.3.tar.gz file, and run MATLAB from
+within that directory.  Next, type colamd_test to compile and test colamd
+and symamd.  This will work on any computer with MATLAB (Unix, PC, or Mac).
+Alternatively, type "make" (in Unix) to compile and run a simple example C
+code, without using MATLAB.
+
+Colamd 2.0 is a built-in routine in MATLAB V6.0, available from The 
+Mathworks, Inc.  Under most cases, the compiled codes from Versions 2.0
+through 2.2 do not differ.  Colamd Versions 2.2 and 2.3 differ only in their
+mexFunction interaces to MATLAB.
+
+To use colamd and symamd within an application written in C, all you need are
+colamd.c and colamd.h, which are the C-callable colamd/symamd codes.
+See colamd.c for more information on how to call colamd from a C program.
+
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+	file) for the License.
+
+
+Related papers:
+
+	"A column approximate minimum degree ordering algorithm", Timothy A.
+	Davis, John R. Gilbert, Stefan I. Larimore, and Esmond G. Ng. 
+	ACM Trans. on Mathematical Software.
+
+	"Algorithm 8xx: COLAMD, a column approximate minimum degree ordering
+	algorithm", Timothy A. Davis, John R. Gilbert, Stefan I. Larimore, and
+	Esmond G. Ng.  ACM Trans. on Mathematical Software.
+
+	"An approximate minimum degree column ordering algorithm",
+	S. I. Larimore, MS Thesis, Dept. of Computer and Information
+	Science and Engineering, University of Florida, Gainesville, FL,
+	1998.  CISE Tech Report TR-98-016.  Available at 
+	ftp://ftp.cise.ufl.edu/cis/tech-reports/tr98/tr98-016.ps
+	via anonymous ftp.
+
+	Approximate Deficiency for Ordering the Columns of a Matrix,
+	J. L. Kern, Senior Thesis, Dept. of Computer and Information
+	Science and Engineering, University of Florida, Gainesville, FL,
+	1999.  Available at http://www.cise.ufl.edu/~davis/Kern/kern.ps 
+
+
+Authors:  Stefan I. Larimore and Timothy A. Davis, University of Florida,
+in collaboration with John Gilbert, Xerox PARC (now at UC Santa Barbara),
+and Esmong Ng, Lawrence Berkeley National Laboratory (much of this work
+he did while at Oak Ridge National Laboratory). 
+
+COLAMD files (Version 2.3, September 8, 2003):
+
+	colamd2.3.tar.gz:
+		All files, as a gzipped, Unix tar file.
+		The *.m, and *mex.c files are for use in MATLAB.
+
+	colamd.c: the primary colamd computational kernel.
+
+	colamd.h: include file for colamd/symamd library.
+
+	colamd.m: the MATLAB interface to colamd.
+
+	colamd_demo.m: MATLAB demo file for colamd and symamd
+		(also compiles the colamdmex and symamdmex mexFunctions).
+
+	colamdmex.c: colamd mexFunction for use in MATLAB.
+
+	colamd_example.c: example C main program that calls colamd and symamd.
+
+	colamd_example.out: output of colamd_example.c.
+
+	Makefile: Makefile for colamd_example.c
+
+	symamd.m: the MATLAB interface to symamd.
+
+	symamdmex.c: symamd mexFunction for use in MATLAB.
+
+	README:  this file
+
+	ChangeLog: a log of changes since Version 1.0.
+
+	colamd_test.m:	test code
+
+	colamdtestmex.c:  test code
+
+	luflops.m:  test code
+
+	symamdtestmex.c:  test code
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,3412 @@
+/* ========================================================================== */
+/* === colamd/symamd - a sparse matrix column ordering algorithm ============ */
+/* ========================================================================== */
+
+/*
+    colamd:  an approximate minimum degree column ordering algorithm,
+    	for LU factorization of symmetric or unsymmetric matrices,
+	QR factorization, least squares, interior point methods for
+	linear programming problems, and other related problems.
+
+    symamd:  an approximate minimum degree ordering algorithm for Cholesky
+    	factorization of symmetric matrices.
+
+    Purpose:
+
+	Colamd computes a permutation Q such that the Cholesky factorization of
+	(AQ)'(AQ) has less fill-in and requires fewer floating point operations
+	than A'A.  This also provides a good ordering for sparse partial
+	pivoting methods, P(AQ) = LU, where Q is computed prior to numerical
+	factorization, and P is computed during numerical factorization via
+	conventional partial pivoting with row interchanges.  Colamd is the
+	column ordering method used in SuperLU, part of the ScaLAPACK library.
+	It is also available as built-in function in MATLAB Version 6,
+	available from MathWorks, Inc. (http://www.mathworks.com).  This
+	routine can be used in place of colmmd in MATLAB.
+
+    	Symamd computes a permutation P of a symmetric matrix A such that the
+	Cholesky factorization of PAP' has less fill-in and requires fewer
+	floating point operations than A.  Symamd constructs a matrix M such
+	that M'M has the same nonzero pattern of A, and then orders the columns
+	of M using colmmd.  The column ordering of M is then returned as the
+	row and column ordering P of A. 
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Copyright and License:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+	EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+	Permission is hereby granted to use, copy, modify, and/or distribute
+	this program, provided that the Copyright, this License, and the
+	Availability of the original version is retained on all copies and made
+	accessible to the end-user of any code or package that includes COLAMD
+	or any modified version of COLAMD. 
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.c
+	file.  It requires the colamd.h file.  It is required by the colamdmex.c
+	and symamdmex.c files, for the MATLAB interface to colamd and symamd.
+
+    See the ChangeLog file for changes since Version 1.0.
+
+*/
+
+/* ========================================================================== */
+/* === Description of user-callable routines ================================ */
+/* ========================================================================== */
+
+/*
+    ----------------------------------------------------------------------------
+    colamd_recommended:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    int colamd_recommended (int nnz, int n_row, int n_col) ;
+
+	    or as a C macro
+
+	    #include "colamd.h"
+	    Alen = COLAMD_RECOMMENDED (int nnz, int n_row, int n_col) ;
+
+	Purpose:
+
+	    Returns recommended value of Alen for use by colamd.  Returns -1
+	    if any input argument is negative.  The use of this routine
+	    or macro is optional.  Note that the macro uses its arguments
+	    more than once, so be careful for side effects, if you pass
+	    expressions as arguments to COLAMD_RECOMMENDED.  Not needed for
+	    symamd, which dynamically allocates its own memory.
+
+	Arguments (all input arguments):
+
+	    int nnz ;		Number of nonzeros in the matrix A.  This must
+				be the same value as p [n_col] in the call to
+				colamd - otherwise you will get a wrong value
+				of the recommended memory to use.
+
+	    int n_row ;		Number of rows in the matrix A.
+
+	    int n_col ;		Number of columns in the matrix A.
+
+    ----------------------------------------------------------------------------
+    colamd_set_defaults:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    colamd_set_defaults (double knobs [COLAMD_KNOBS]) ;
+
+	Purpose:
+
+	    Sets the default parameters.  The use of this routine is optional.
+
+	Arguments:
+
+	    double knobs [COLAMD_KNOBS] ;	Output only.
+
+		Colamd: rows with more than (knobs [COLAMD_DENSE_ROW] * n_col)
+		entries are removed prior to ordering.  Columns with more than
+		(knobs [COLAMD_DENSE_COL] * n_row) entries are removed prior to
+		ordering, and placed last in the output column ordering. 
+
+		Symamd: uses only knobs [COLAMD_DENSE_ROW], which is knobs [0].
+		Rows and columns with more than (knobs [COLAMD_DENSE_ROW] * n)
+		entries are removed prior to ordering, and placed last in the
+		output ordering.
+
+		COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1,
+		respectively, in colamd.h.  Default values of these two knobs
+		are both 0.5.  Currently, only knobs [0] and knobs [1] are
+		used, but future versions may use more knobs.  If so, they will
+		be properly set to their defaults by the future version of
+		colamd_set_defaults, so that the code that calls colamd will
+		not need to change, assuming that you either use
+		colamd_set_defaults, or pass a (double *) NULL pointer as the
+		knobs array to colamd or symamd.
+
+    ----------------------------------------------------------------------------
+    colamd:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    int colamd (int n_row, int n_col, int Alen, int *A, int *p,
+	    	double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS]) ;
+
+	Purpose:
+
+	    Computes a column ordering (Q) of A such that P(AQ)=LU or
+	    (AQ)'AQ=LL' have less fill-in and require fewer floating point
+	    operations than factorizing the unpermuted matrix A or A'A,
+	    respectively.
+	    
+	Returns:
+
+	    TRUE (1) if successful, FALSE (0) otherwise.
+
+	Arguments:
+
+	    int n_row ;		Input argument.
+
+		Number of rows in the matrix A.
+		Restriction:  n_row >= 0.
+		Colamd returns FALSE if n_row is negative.
+
+	    int n_col ;		Input argument.
+
+		Number of columns in the matrix A.
+		Restriction:  n_col >= 0.
+		Colamd returns FALSE if n_col is negative.
+
+	    int Alen ;		Input argument.
+
+		Restriction (see note):
+		Alen >= 2*nnz + 6*(n_col+1) + 4*(n_row+1) + n_col
+		Colamd returns FALSE if these conditions are not met.
+
+		Note:  this restriction makes an modest assumption regarding
+		the size of the two typedef's structures in colamd.h.
+		We do, however, guarantee that
+
+			Alen >= colamd_recommended (nnz, n_row, n_col)
+		
+		or equivalently as a C preprocessor macro: 
+
+			Alen >= COLAMD_RECOMMENDED (nnz, n_row, n_col)
+
+		will be sufficient.
+
+	    int A [Alen] ;	Input argument, undefined on output.
+
+		A is an integer array of size Alen.  Alen must be at least as
+		large as the bare minimum value given above, but this is very
+		low, and can result in excessive run time.  For best
+		performance, we recommend that Alen be greater than or equal to
+		colamd_recommended (nnz, n_row, n_col), which adds
+		nnz/5 to the bare minimum value given above.
+
+		On input, the row indices of the entries in column c of the
+		matrix are held in A [(p [c]) ... (p [c+1]-1)].  The row indices
+		in a given column c need not be in ascending order, and
+		duplicate row indices may be be present.  However, colamd will
+		work a little faster if both of these conditions are met
+		(Colamd puts the matrix into this format, if it finds that the
+		the conditions are not met).
+
+		The matrix is 0-based.  That is, rows are in the range 0 to
+		n_row-1, and columns are in the range 0 to n_col-1.  Colamd
+		returns FALSE if any row index is out of range.
+
+		The contents of A are modified during ordering, and are
+		undefined on output.
+
+	    int p [n_col+1] ;	Both input and output argument.
+
+		p is an integer array of size n_col+1.  On input, it holds the
+		"pointers" for the column form of the matrix A.  Column c of
+		the matrix A is held in A [(p [c]) ... (p [c+1]-1)].  The first
+		entry, p [0], must be zero, and p [c] <= p [c+1] must hold
+		for all c in the range 0 to n_col-1.  The value p [n_col] is
+		thus the total number of entries in the pattern of the matrix A.
+		Colamd returns FALSE if these conditions are not met.
+
+		On output, if colamd returns TRUE, the array p holds the column
+		permutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is
+		the first column index in the new ordering, and p [n_col-1] is
+		the last.  That is, p [k] = j means that column j of A is the
+		kth pivot column, in AQ, where k is in the range 0 to n_col-1
+		(p [0] = j means that column j of A is the first column in AQ).
+
+		If colamd returns FALSE, then no permutation is returned, and
+		p is undefined on output.
+
+	    double knobs [COLAMD_KNOBS] ;	Input argument.
+
+		See colamd_set_defaults for a description.
+
+	    int stats [COLAMD_STATS] ;		Output argument.
+
+		Statistics on the ordering, and error status.
+		See colamd.h for related definitions.
+		Colamd returns FALSE if stats is not present.
+
+		stats [0]:  number of dense or empty rows ignored.
+
+		stats [1]:  number of dense or empty columns ignored (and
+				ordered last in the output permutation p)
+				Note that a row can become "empty" if it
+				contains only "dense" and/or "empty" columns,
+				and similarly a column can become "empty" if it
+				only contains "dense" and/or "empty" rows.
+
+		stats [2]:  number of garbage collections performed.
+				This can be excessively high if Alen is close
+				to the minimum required value.
+
+		stats [3]:  status code.  < 0 is an error code.
+			    > 1 is a warning or notice.
+
+			0	OK.  Each column of the input matrix contained
+				row indices in increasing order, with no
+				duplicates.
+
+			1	OK, but columns of input matrix were jumbled
+				(unsorted columns or duplicate entries).  Colamd
+				had to do some extra work to sort the matrix
+				first and remove duplicate entries, but it
+				still was able to return a valid permutation
+				(return value of colamd was TRUE).
+
+					stats [4]: highest numbered column that
+						is unsorted or has duplicate
+						entries.
+					stats [5]: last seen duplicate or
+						unsorted row index.
+					stats [6]: number of duplicate or
+						unsorted row indices.
+
+			-1	A is a null pointer
+
+			-2	p is a null pointer
+
+			-3 	n_row is negative
+
+					stats [4]: n_row
+
+			-4	n_col is negative
+
+					stats [4]: n_col
+
+			-5	number of nonzeros in matrix is negative
+
+					stats [4]: number of nonzeros, p [n_col]
+
+			-6	p [0] is nonzero
+
+					stats [4]: p [0]
+
+			-7	A is too small
+
+					stats [4]: required size
+					stats [5]: actual size (Alen)
+
+			-8	a column has a negative number of entries
+
+					stats [4]: column with < 0 entries
+					stats [5]: number of entries in col
+
+			-9	a row index is out of bounds
+
+					stats [4]: column with bad row index
+					stats [5]: bad row index
+					stats [6]: n_row, # of rows of matrx
+
+			-10	(unused; see symamd.c)
+
+			-999	(unused; see symamd.c)
+
+		Future versions may return more statistics in the stats array.
+
+	Example:
+	
+	    See http://www.cise.ufl.edu/research/sparse/colamd/example.c
+	    for a complete example.
+
+	    To order the columns of a 5-by-4 matrix with 11 nonzero entries in
+	    the following nonzero pattern
+
+	    	x 0 x 0
+		x 0 x x
+		0 x x 0
+		0 0 x x
+		x x 0 0
+
+	    with default knobs and no output statistics, do the following:
+
+		#include "colamd.h"
+		#define ALEN COLAMD_RECOMMENDED (11, 5, 4)
+		int A [ALEN] = {1, 2, 5, 3, 5, 1, 2, 3, 4, 2, 4} ;
+		int p [ ] = {0, 3, 5, 9, 11} ;
+		int stats [COLAMD_STATS] ;
+		colamd (5, 4, ALEN, A, p, (double *) NULL, stats) ;
+
+	    The permutation is returned in the array p, and A is destroyed.
+
+    ----------------------------------------------------------------------------
+    symamd:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    int symamd (int n, int *A, int *p, int *perm,
+	    	double knobs [COLAMD_KNOBS], int stats [COLAMD_STATS],
+		void (*allocate) (size_t, size_t), void (*release) (void *)) ;
+
+	Purpose:
+
+    	    The symamd routine computes an ordering P of a symmetric sparse
+	    matrix A such that the Cholesky factorization PAP' = LL' remains
+	    sparse.  It is based on a column ordering of a matrix M constructed
+	    so that the nonzero pattern of M'M is the same as A.  The matrix A
+	    is assumed to be symmetric; only the strictly lower triangular part
+	    is accessed.  You must pass your selected memory allocator (usually
+	    calloc/free or mxCalloc/mxFree) to symamd, for it to allocate
+	    memory for the temporary matrix M.
+
+	Returns:
+
+	    TRUE (1) if successful, FALSE (0) otherwise.
+
+	Arguments:
+
+	    int n ;		Input argument.
+
+	    	Number of rows and columns in the symmetrix matrix A.
+		Restriction:  n >= 0.
+		Symamd returns FALSE if n is negative.
+
+	    int A [nnz] ;	Input argument.
+
+	    	A is an integer array of size nnz, where nnz = p [n].
+		
+		The row indices of the entries in column c of the matrix are
+		held in A [(p [c]) ... (p [c+1]-1)].  The row indices in a
+		given column c need not be in ascending order, and duplicate
+		row indices may be present.  However, symamd will run faster
+		if the columns are in sorted order with no duplicate entries. 
+
+		The matrix is 0-based.  That is, rows are in the range 0 to
+		n-1, and columns are in the range 0 to n-1.  Symamd
+		returns FALSE if any row index is out of range.
+
+		The contents of A are not modified.
+
+	    int p [n+1] ;   	Input argument.
+
+		p is an integer array of size n+1.  On input, it holds the
+		"pointers" for the column form of the matrix A.  Column c of
+		the matrix A is held in A [(p [c]) ... (p [c+1]-1)].  The first
+		entry, p [0], must be zero, and p [c] <= p [c+1] must hold
+		for all c in the range 0 to n-1.  The value p [n] is
+		thus the total number of entries in the pattern of the matrix A.
+		Symamd returns FALSE if these conditions are not met.
+
+		The contents of p are not modified.
+
+	    int perm [n+1] ;   	Output argument.
+
+		On output, if symamd returns TRUE, the array perm holds the
+		permutation P, where perm [0] is the first index in the new
+		ordering, and perm [n-1] is the last.  That is, perm [k] = j
+		means that row and column j of A is the kth column in PAP',
+		where k is in the range 0 to n-1 (perm [0] = j means
+		that row and column j of A are the first row and column in
+		PAP').  The array is used as a workspace during the ordering,
+		which is why it must be of length n+1, not just n.
+
+	    double knobs [COLAMD_KNOBS] ;	Input argument.
+
+		See colamd_set_defaults for a description.
+
+	    int stats [COLAMD_STATS] ;		Output argument.
+
+		Statistics on the ordering, and error status.
+		See colamd.h for related definitions.
+		Symamd returns FALSE if stats is not present.
+
+		stats [0]:  number of dense or empty row and columns ignored
+				(and ordered last in the output permutation 
+				perm).  Note that a row/column can become
+				"empty" if it contains only "dense" and/or
+				"empty" columns/rows.
+
+		stats [1]:  (same as stats [0])
+
+		stats [2]:  number of garbage collections performed.
+
+		stats [3]:  status code.  < 0 is an error code.
+			    > 1 is a warning or notice.
+
+			0	OK.  Each column of the input matrix contained
+				row indices in increasing order, with no
+				duplicates.
+
+			1	OK, but columns of input matrix were jumbled
+				(unsorted columns or duplicate entries).  Symamd
+				had to do some extra work to sort the matrix
+				first and remove duplicate entries, but it
+				still was able to return a valid permutation
+				(return value of symamd was TRUE).
+
+					stats [4]: highest numbered column that
+						is unsorted or has duplicate
+						entries.
+					stats [5]: last seen duplicate or
+						unsorted row index.
+					stats [6]: number of duplicate or
+						unsorted row indices.
+
+			-1	A is a null pointer
+
+			-2	p is a null pointer
+
+			-3	(unused, see colamd.c)
+
+			-4 	n is negative
+
+					stats [4]: n
+
+			-5	number of nonzeros in matrix is negative
+
+					stats [4]: # of nonzeros (p [n]).
+
+			-6	p [0] is nonzero
+
+					stats [4]: p [0]
+
+			-7	(unused)
+
+			-8	a column has a negative number of entries
+
+					stats [4]: column with < 0 entries
+					stats [5]: number of entries in col
+
+			-9	a row index is out of bounds
+
+					stats [4]: column with bad row index
+					stats [5]: bad row index
+					stats [6]: n_row, # of rows of matrx
+
+			-10	out of memory (unable to allocate temporary
+				workspace for M or count arrays using the
+				"allocate" routine passed into symamd).
+
+			-999	internal error.  colamd failed to order the
+				matrix M, when it should have succeeded.  This
+				indicates a bug.  If this (and *only* this)
+				error code occurs, please contact the authors.
+				Don't contact the authors if you get any other
+				error code.
+
+		Future versions may return more statistics in the stats array.
+
+	    void * (*allocate) (size_t, size_t)
+
+	    	A pointer to a function providing memory allocation.  The
+		allocated memory must be returned initialized to zero.  For a
+		C application, this argument should normally be a pointer to
+		calloc.  For a MATLAB mexFunction, the routine mxCalloc is
+		passed instead.
+
+	    void (*release) (size_t, size_t)
+
+	    	A pointer to a function that frees memory allocated by the
+		memory allocation routine above.  For a C application, this
+		argument should normally be a pointer to free.  For a MATLAB
+		mexFunction, the routine mxFree is passed instead.
+
+
+    ----------------------------------------------------------------------------
+    colamd_report:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    colamd_report (int stats [COLAMD_STATS]) ;
+
+	Purpose:
+
+	    Prints the error status and statistics recorded in the stats
+	    array on the standard error output (for a standard C routine)
+	    or on the MATLAB output (for a mexFunction).
+
+	Arguments:
+
+	    int stats [COLAMD_STATS] ;	Input only.  Statistics from colamd.
+
+
+    ----------------------------------------------------------------------------
+    symamd_report:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    symamd_report (int stats [COLAMD_STATS]) ;
+
+	Purpose:
+
+	    Prints the error status and statistics recorded in the stats
+	    array on the standard error output (for a standard C routine)
+	    or on the MATLAB output (for a mexFunction).
+
+	Arguments:
+
+	    int stats [COLAMD_STATS] ;	Input only.  Statistics from symamd.
+
+
+*/
+
+/* ========================================================================== */
+/* === Scaffolding code definitions  ======================================== */
+/* ========================================================================== */
+
+/* Ensure that debugging is turned off: */
+#ifndef NDEBUG
+#define NDEBUG
+#endif /* NDEBUG */
+
+/*
+   Our "scaffolding code" philosophy:  In our opinion, well-written library
+   code should keep its "debugging" code, and just normally have it turned off
+   by the compiler so as not to interfere with performance.  This serves
+   several purposes:
+
+   (1) assertions act as comments to the reader, telling you what the code
+	expects at that point.  All assertions will always be true (unless
+	there really is a bug, of course).
+
+   (2) leaving in the scaffolding code assists anyone who would like to modify
+	the code, or understand the algorithm (by reading the debugging output,
+	one can get a glimpse into what the code is doing).
+
+   (3) (gasp!) for actually finding bugs.  This code has been heavily tested
+	and "should" be fully functional and bug-free ... but you never know...
+
+    To enable debugging, comment out the "#define NDEBUG" above.  For a MATLAB
+    mexFunction, you will also need to modify mexopts.sh to remove the -DNDEBUG
+    definition.  The code will become outrageously slow when debugging is
+    enabled.  To control the level of debugging output, set an environment
+    variable D to 0 (little), 1 (some), 2, 3, or 4 (lots).  When debugging,
+    you should see the following message on the standard output:
+
+    	colamd: debug version, D = 1 (THIS WILL BE SLOW!)
+
+    or a similar message for symamd.  If you don't, then debugging has not
+    been enabled.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include "colamd.h"
+#include <limits.h>
+
+#ifdef MATLAB_MEX_FILE
+#include "mex.h"
+#include "matrix.h"
+#else
+#include <stdio.h>
+#include <assert.h>
+#endif /* MATLAB_MEX_FILE */
+
+/* ========================================================================== */
+/* === Definitions ========================================================== */
+/* ========================================================================== */
+
+/* Routines are either PUBLIC (user-callable) or PRIVATE (not user-callable) */
+#define PUBLIC
+#define PRIVATE static
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+#define ONES_COMPLEMENT(r) (-(r)-1)
+
+/* -------------------------------------------------------------------------- */
+/* Change for version 2.1:  define TRUE and FALSE only if not yet defined */  
+/* -------------------------------------------------------------------------- */
+
+#ifndef TRUE
+#define TRUE (1)
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+
+#define EMPTY	(-1)
+
+/* Row and column status */
+#define ALIVE	(0)
+#define DEAD	(-1)
+
+/* Column status */
+#define DEAD_PRINCIPAL		(-1)
+#define DEAD_NON_PRINCIPAL	(-2)
+
+/* Macros for row and column status update and checking. */
+#define ROW_IS_DEAD(r)			ROW_IS_MARKED_DEAD (Row[r].shared2.mark)
+#define ROW_IS_MARKED_DEAD(row_mark)	(row_mark < ALIVE)
+#define ROW_IS_ALIVE(r)			(Row [r].shared2.mark >= ALIVE)
+#define COL_IS_DEAD(c)			(Col [c].start < ALIVE)
+#define COL_IS_ALIVE(c)			(Col [c].start >= ALIVE)
+#define COL_IS_DEAD_PRINCIPAL(c)	(Col [c].start == DEAD_PRINCIPAL)
+#define KILL_ROW(r)			{ Row [r].shared2.mark = DEAD ; }
+#define KILL_PRINCIPAL_COL(c)		{ Col [c].start = DEAD_PRINCIPAL ; }
+#define KILL_NON_PRINCIPAL_COL(c)	{ Col [c].start = DEAD_NON_PRINCIPAL ; }
+
+/* ========================================================================== */
+/* === Colamd reporting mechanism =========================================== */
+/* ========================================================================== */
+
+#ifdef MATLAB_MEX_FILE
+
+/* use mexPrintf in a MATLAB mexFunction, for debugging and statistics output */
+#define PRINTF mexPrintf
+
+/* In MATLAB, matrices are 1-based to the user, but 0-based internally */
+#define INDEX(i) ((i)+1)
+
+#else
+
+/* Use printf in standard C environment, for debugging and statistics output. */
+/* Output is generated only if debugging is enabled at compile time, or if */
+/* the caller explicitly calls colamd_report or symamd_report. */
+#define PRINTF printf
+
+/* In C, matrices are 0-based and indices are reported as such in *_report */
+#define INDEX(i) (i)
+
+#endif /* MATLAB_MEX_FILE */
+
+/* ========================================================================== */
+/* === Prototypes of PRIVATE routines ======================================= */
+/* ========================================================================== */
+
+PRIVATE int init_rows_cols
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int p [],
+    int stats [COLAMD_STATS]
+) ;
+
+PRIVATE void init_scoring
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int head [],
+    double knobs [COLAMD_KNOBS],
+    int *p_n_row2,
+    int *p_n_col2,
+    int *p_max_deg
+) ;
+
+PRIVATE int find_ordering
+(
+    int n_row,
+    int n_col,
+    int Alen,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int head [],
+    int n_col2,
+    int max_deg,
+    int pfree
+) ;
+
+PRIVATE void order_children
+(
+    int n_col,
+    Colamd_Col Col [],
+    int p []
+) ;
+
+PRIVATE void detect_super_cols
+(
+
+#ifndef NDEBUG
+    int n_col,
+    Colamd_Row Row [],
+#endif /* NDEBUG */
+
+    Colamd_Col Col [],
+    int A [],
+    int head [],
+    int row_start,
+    int row_length
+) ;
+
+PRIVATE int garbage_collection
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int *pfree
+) ;
+
+PRIVATE int clear_mark
+(
+    int n_row,
+    Colamd_Row Row []
+) ;
+
+PRIVATE void print_report
+(
+    char *method,
+    int stats [COLAMD_STATS]
+) ;
+
+/* ========================================================================== */
+/* === Debugging prototypes and definitions ================================= */
+/* ========================================================================== */
+
+#ifndef NDEBUG
+
+/* colamd_debug is the *ONLY* global variable, and is only */
+/* present when debugging */
+
+PRIVATE int colamd_debug ;	/* debug print level */
+
+#define DEBUG0(params) { (void) PRINTF params ; }
+#define DEBUG1(params) { if (colamd_debug >= 1) (void) PRINTF params ; }
+#define DEBUG2(params) { if (colamd_debug >= 2) (void) PRINTF params ; }
+#define DEBUG3(params) { if (colamd_debug >= 3) (void) PRINTF params ; }
+#define DEBUG4(params) { if (colamd_debug >= 4) (void) PRINTF params ; }
+
+#ifdef MATLAB_MEX_FILE
+#define ASSERT(expression) (mxAssert ((expression), ""))
+#else
+#define ASSERT(expression) (assert (expression))
+#endif /* MATLAB_MEX_FILE */
+
+PRIVATE void colamd_get_debug	/* gets the debug print level from getenv */
+(
+    char *method
+) ;
+
+PRIVATE void debug_deg_lists
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int head [],
+    int min_score,
+    int should,
+    int max_deg
+) ;
+
+PRIVATE void debug_mark
+(
+    int n_row,
+    Colamd_Row Row [],
+    int tag_mark,
+    int max_mark
+) ;
+
+PRIVATE void debug_matrix
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A []
+) ;
+
+PRIVATE void debug_structures
+(
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int n_col2
+) ;
+
+#else /* NDEBUG */
+
+/* === No debugging ========================================================= */
+
+#define DEBUG0(params) ;
+#define DEBUG1(params) ;
+#define DEBUG2(params) ;
+#define DEBUG3(params) ;
+#define DEBUG4(params) ;
+
+#define ASSERT(expression) ((void) 0)
+
+#endif /* NDEBUG */
+
+/* ========================================================================== */
+
+
+
+/* ========================================================================== */
+/* === USER-CALLABLE ROUTINES: ============================================== */
+/* ========================================================================== */
+
+
+/* ========================================================================== */
+/* === colamd_recommended =================================================== */
+/* ========================================================================== */
+
+/*
+    The colamd_recommended routine returns the suggested size for Alen.  This
+    value has been determined to provide good balance between the number of
+    garbage collections and the memory requirements for colamd.  If any
+    argument is negative, a -1 is returned as an error condition.  This
+    function is also available as a macro defined in colamd.h, so that you
+    can use it for a statically-allocated array size.
+*/
+
+PUBLIC int colamd_recommended	/* returns recommended value of Alen. */
+(
+    /* === Parameters ======================================================= */
+
+    int nnz,			/* number of nonzeros in A */
+    int n_row,			/* number of rows in A */
+    int n_col			/* number of columns in A */
+)
+{
+    return (COLAMD_RECOMMENDED (nnz, n_row, n_col)) ; 
+}
+
+
+/* ========================================================================== */
+/* === colamd_set_defaults ================================================== */
+/* ========================================================================== */
+
+/*
+    The colamd_set_defaults routine sets the default values of the user-
+    controllable parameters for colamd:
+
+	knobs [0]	rows with knobs[0]*n_col entries or more are removed
+			prior to ordering in colamd.  Rows and columns with
+			knobs[0]*n_col entries or more are removed prior to
+			ordering in symamd and placed last in the output
+			ordering.
+
+	knobs [1]	columns with knobs[1]*n_row entries or more are removed
+			prior to ordering in colamd, and placed last in the
+			column permutation.  Symamd ignores this knob.
+
+	knobs [2..19]	unused, but future versions might use this
+*/
+
+PUBLIC void colamd_set_defaults
+(
+    /* === Parameters ======================================================= */
+
+    double knobs [COLAMD_KNOBS]		/* knob array */
+)
+{
+    /* === Local variables ================================================== */
+
+    int i ;
+
+    if (!knobs)
+    {
+	return ;			/* no knobs to initialize */
+    }
+    for (i = 0 ; i < COLAMD_KNOBS ; i++)
+    {
+	knobs [i] = 0 ;
+    }
+    knobs [COLAMD_DENSE_ROW] = 0.5 ;	/* ignore rows over 50% dense */
+    knobs [COLAMD_DENSE_COL] = 0.5 ;	/* ignore columns over 50% dense */
+}
+
+
+/* ========================================================================== */
+/* === symamd =============================================================== */
+/* ========================================================================== */
+
+PUBLIC int symamd			/* return TRUE if OK, FALSE otherwise */
+(
+    /* === Parameters ======================================================= */
+
+    int n,				/* number of rows and columns of A */
+    int A [],				/* row indices of A */
+    int p [],				/* column pointers of A */
+    int perm [],			/* output permutation, size n+1 */
+    double knobs [COLAMD_KNOBS],	/* parameters (uses defaults if NULL) */
+    int stats [COLAMD_STATS],		/* output statistics and error codes */
+    void * (*allocate) (size_t, size_t),
+    					/* pointer to calloc (ANSI C) or */
+					/* mxCalloc (for MATLAB mexFunction) */
+    void (*release) (void *)
+    					/* pointer to free (ANSI C) or */
+    					/* mxFree (for MATLAB mexFunction) */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *count ;		/* length of each column of M, and col pointer*/
+    int *mark ;			/* mark array for finding duplicate entries */
+    int *M ;			/* row indices of matrix M */
+    int Mlen ;			/* length of M */
+    int n_row ;			/* number of rows in M */
+    int nnz ;			/* number of entries in A */
+    int i ;			/* row index of A */
+    int j ;			/* column index of A */
+    int k ;			/* row index of M */ 
+    int mnz ;			/* number of nonzeros in M */
+    int pp ;			/* index into a column of A */
+    int last_row ;		/* last row seen in the current column */
+    int length ;		/* number of nonzeros in a column */
+
+    double cknobs [COLAMD_KNOBS] ;		/* knobs for colamd */
+    double default_knobs [COLAMD_KNOBS] ;	/* default knobs for colamd */
+    int cstats [COLAMD_STATS] ;			/* colamd stats */
+
+#ifndef NDEBUG
+    colamd_get_debug ("symamd") ;
+#endif /* NDEBUG */
+
+    /* === Check the input arguments ======================================== */
+
+    if (!stats)
+    {
+	DEBUG0 (("symamd: stats not present\n")) ;
+	return (FALSE) ;
+    }
+    for (i = 0 ; i < COLAMD_STATS ; i++)
+    {
+	stats [i] = 0 ;
+    }
+    stats [COLAMD_STATUS] = COLAMD_OK ;
+    stats [COLAMD_INFO1] = -1 ;
+    stats [COLAMD_INFO2] = -1 ;
+
+    if (!A)
+    {
+    	stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;
+	DEBUG0 (("symamd: A not present\n")) ;
+	return (FALSE) ;
+    }
+
+    if (!p)		/* p is not present */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;
+	DEBUG0 (("symamd: p not present\n")) ;
+    	return (FALSE) ;
+    }
+
+    if (n < 0)		/* n must be >= 0 */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;
+	stats [COLAMD_INFO1] = n ;
+	DEBUG0 (("symamd: n negative %d\n", n)) ;
+    	return (FALSE) ;
+    }
+
+    nnz = p [n] ;
+    if (nnz < 0)	/* nnz must be >= 0 */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;
+	stats [COLAMD_INFO1] = nnz ;
+	DEBUG0 (("symamd: number of entries negative %d\n", nnz)) ;
+	return (FALSE) ;
+    }
+
+    if (p [0] != 0)
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ;
+	stats [COLAMD_INFO1] = p [0] ;
+	DEBUG0 (("symamd: p[0] not zero %d\n", p [0])) ;
+	return (FALSE) ;
+    }
+
+    /* === If no knobs, set default knobs =================================== */
+
+    if (!knobs)
+    {
+	colamd_set_defaults (default_knobs) ;
+	knobs = default_knobs ;
+    }
+
+    /* === Allocate count and mark ========================================== */
+
+    count = (int *) ((*allocate) (n+1, sizeof (int))) ;
+    if (!count)
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;
+	DEBUG0 (("symamd: allocate count (size %d) failed\n", n+1)) ;
+	return (FALSE) ;
+    }
+
+    mark = (int *) ((*allocate) (n+1, sizeof (int))) ;
+    if (!mark)
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;
+	(*release) ((void *) count) ;
+	DEBUG0 (("symamd: allocate mark (size %d) failed\n", n+1)) ;
+	return (FALSE) ;
+    }
+
+    /* === Compute column counts of M, check if A is valid ================== */
+
+    stats [COLAMD_INFO3] = 0 ;  /* number of duplicate or unsorted row indices*/
+
+    for (i = 0 ; i < n ; i++)
+    {
+    	mark [i] = -1 ;
+    }
+
+    for (j = 0 ; j < n ; j++)
+    {
+	last_row = -1 ;
+
+	length = p [j+1] - p [j] ;
+	if (length < 0)
+	{
+	    /* column pointers must be non-decreasing */
+	    stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;
+	    stats [COLAMD_INFO1] = j ;
+	    stats [COLAMD_INFO2] = length ;
+	    (*release) ((void *) count) ;
+	    (*release) ((void *) mark) ;
+	    DEBUG0 (("symamd: col %d negative length %d\n", j, length)) ;
+	    return (FALSE) ;
+	}
+
+	for (pp = p [j] ; pp < p [j+1] ; pp++)
+	{
+	    i = A [pp] ;
+	    if (i < 0 || i >= n)
+	    {
+		/* row index i, in column j, is out of bounds */
+		stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;
+		stats [COLAMD_INFO1] = j ;
+		stats [COLAMD_INFO2] = i ;
+		stats [COLAMD_INFO3] = n ;
+		(*release) ((void *) count) ;
+		(*release) ((void *) mark) ;
+		DEBUG0 (("symamd: row %d col %d out of bounds\n", i, j)) ;
+		return (FALSE) ;
+	    }
+
+	    if (i <= last_row || mark [i] == j)
+	    {
+		/* row index is unsorted or repeated (or both), thus col */
+		/* is jumbled.  This is a notice, not an error condition. */
+		stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;
+		stats [COLAMD_INFO1] = j ;
+		stats [COLAMD_INFO2] = i ;
+		(stats [COLAMD_INFO3]) ++ ;
+		DEBUG1 (("symamd: row %d col %d unsorted/duplicate\n", i, j)) ;
+	    }
+
+	    if (i > j && mark [i] != j)
+	    {
+		/* row k of M will contain column indices i and j */
+		count [i]++ ;
+		count [j]++ ;
+	    }
+
+	    /* mark the row as having been seen in this column */
+	    mark [i] = j ;
+
+	    last_row = i ;
+	}
+    }
+
+    if (stats [COLAMD_STATUS] == COLAMD_OK)
+    {
+	/* if there are no duplicate entries, then mark is no longer needed */
+	(*release) ((void *) mark) ;
+    }
+
+    /* === Compute column pointers of M ===================================== */
+
+    /* use output permutation, perm, for column pointers of M */
+    perm [0] = 0 ;
+    for (j = 1 ; j <= n ; j++)
+    {
+	perm [j] = perm [j-1] + count [j-1] ;
+    }
+    for (j = 0 ; j < n ; j++)
+    {
+	count [j] = perm [j] ;
+    }
+
+    /* === Construct M ====================================================== */
+
+    mnz = perm [n] ;
+    n_row = mnz / 2 ;
+    Mlen = colamd_recommended (mnz, n_row, n) ;
+    M = (int *) ((*allocate) (Mlen, sizeof (int))) ;
+    DEBUG0 (("symamd: M is %d-by-%d with %d entries, Mlen = %d\n",
+    	n_row, n, mnz, Mlen)) ;
+
+    if (!M)
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;
+	(*release) ((void *) count) ;
+	(*release) ((void *) mark) ;
+	DEBUG0 (("symamd: allocate M (size %d) failed\n", Mlen)) ;
+	return (FALSE) ;
+    }
+
+    k = 0 ;
+
+    if (stats [COLAMD_STATUS] == COLAMD_OK)
+    {
+	/* Matrix is OK */
+	for (j = 0 ; j < n ; j++)
+	{
+	    ASSERT (p [j+1] - p [j] >= 0) ;
+	    for (pp = p [j] ; pp < p [j+1] ; pp++)
+	    {
+		i = A [pp] ;
+		ASSERT (i >= 0 && i < n) ;
+		if (i > j)
+		{
+		    /* row k of M contains column indices i and j */
+		    M [count [i]++] = k ;
+		    M [count [j]++] = k ;
+		    k++ ;
+		}
+	    }
+	}
+    }
+    else
+    {
+	/* Matrix is jumbled.  Do not add duplicates to M.  Unsorted cols OK. */
+	DEBUG0 (("symamd: Duplicates in A.\n")) ;
+	for (i = 0 ; i < n ; i++)
+	{
+	    mark [i] = -1 ;
+	}
+	for (j = 0 ; j < n ; j++)
+	{
+	    ASSERT (p [j+1] - p [j] >= 0) ;
+	    for (pp = p [j] ; pp < p [j+1] ; pp++)
+	    {
+		i = A [pp] ;
+		ASSERT (i >= 0 && i < n) ;
+		if (i > j && mark [i] != j)
+		{
+		    /* row k of M contains column indices i and j */
+		    M [count [i]++] = k ;
+		    M [count [j]++] = k ;
+		    k++ ;
+		    mark [i] = j ;
+		}
+	    }
+	}
+	(*release) ((void *) mark) ;
+    }
+
+    /* count and mark no longer needed */
+    (*release) ((void *) count) ;
+    ASSERT (k == n_row) ;
+
+    /* === Adjust the knobs for M =========================================== */
+
+    for (i = 0 ; i < COLAMD_KNOBS ; i++)
+    {
+	cknobs [i] = knobs [i] ;
+    }
+
+    /* there are no dense rows in M */
+    cknobs [COLAMD_DENSE_ROW] = 1.0 ;
+
+    if (n_row != 0 && n < n_row)
+    {
+	/* On input, the knob is a fraction of 1..n, the number of rows of A. */
+	/* Convert it to a fraction of 1..n_row, of the number of rows of M. */
+    	cknobs [COLAMD_DENSE_COL] = (knobs [COLAMD_DENSE_ROW] * n) / n_row ;
+    }
+    else
+    {
+	/* no dense columns in M */
+    	cknobs [COLAMD_DENSE_COL] = 1.0 ;
+    }
+
+    DEBUG0 (("symamd: dense col knob for M: %g\n", cknobs [COLAMD_DENSE_COL])) ;
+
+    /* === Order the columns of M =========================================== */
+
+    if (!colamd (n_row, n, Mlen, M, perm, cknobs, cstats))
+    {
+	/* This "cannot" happen, unless there is a bug in the code. */
+	stats [COLAMD_STATUS] = COLAMD_ERROR_internal_error ;
+	(*release) ((void *) M) ;
+	DEBUG0 (("symamd: internal error!\n")) ;
+	return (FALSE) ;
+    }
+
+    /* Note that the output permutation is now in perm */
+
+    /* === get the statistics for symamd from colamd ======================== */
+
+    /* note that a dense column in colamd means a dense row and col in symamd */
+    stats [COLAMD_DENSE_ROW]    = cstats [COLAMD_DENSE_COL] ;
+    stats [COLAMD_DENSE_COL]    = cstats [COLAMD_DENSE_COL] ;
+    stats [COLAMD_DEFRAG_COUNT] = cstats [COLAMD_DEFRAG_COUNT] ;
+
+    /* === Free M =========================================================== */
+
+    (*release) ((void *) M) ;
+    DEBUG0 (("symamd: done.\n")) ;
+    return (TRUE) ;
+
+}
+
+/* ========================================================================== */
+/* === colamd =============================================================== */
+/* ========================================================================== */
+
+/*
+    The colamd routine computes a column ordering Q of a sparse matrix
+    A such that the LU factorization P(AQ) = LU remains sparse, where P is
+    selected via partial pivoting.   The routine can also be viewed as
+    providing a permutation Q such that the Cholesky factorization
+    (AQ)'(AQ) = LL' remains sparse.
+*/
+
+PUBLIC int colamd		/* returns TRUE if successful, FALSE otherwise*/
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,			/* number of rows in A */
+    int n_col,			/* number of columns in A */
+    int Alen,			/* length of A */
+    int A [],			/* row indices of A */
+    int p [],			/* pointers to columns in A */
+    double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */
+    int stats [COLAMD_STATS]	/* output statistics and error codes */
+)
+{
+    /* === Local variables ================================================== */
+
+    int i ;			/* loop index */
+    int nnz ;			/* nonzeros in A */
+    int Row_size ;		/* size of Row [], in integers */
+    int Col_size ;		/* size of Col [], in integers */
+    int need ;			/* minimum required length of A */
+    Colamd_Row *Row ;		/* pointer into A of Row [0..n_row] array */
+    Colamd_Col *Col ;		/* pointer into A of Col [0..n_col] array */
+    int n_col2 ;		/* number of non-dense, non-empty columns */
+    int n_row2 ;		/* number of non-dense, non-empty rows */
+    int ngarbage ;		/* number of garbage collections performed */
+    int max_deg ;		/* maximum row degree */
+    double default_knobs [COLAMD_KNOBS] ;	/* default knobs array */
+
+#ifndef NDEBUG
+    colamd_get_debug ("colamd") ;
+#endif /* NDEBUG */
+
+    /* === Check the input arguments ======================================== */
+
+    if (!stats)
+    {
+	DEBUG0 (("colamd: stats not present\n")) ;
+	return (FALSE) ;
+    }
+    for (i = 0 ; i < COLAMD_STATS ; i++)
+    {
+	stats [i] = 0 ;
+    }
+    stats [COLAMD_STATUS] = COLAMD_OK ;
+    stats [COLAMD_INFO1] = -1 ;
+    stats [COLAMD_INFO2] = -1 ;
+
+    if (!A)		/* A is not present */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;
+	DEBUG0 (("colamd: A not present\n")) ;
+	return (FALSE) ;
+    }
+
+    if (!p)		/* p is not present */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;
+	DEBUG0 (("colamd: p not present\n")) ;
+    	return (FALSE) ;
+    }
+
+    if (n_row < 0)	/* n_row must be >= 0 */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ;
+	stats [COLAMD_INFO1] = n_row ;
+	DEBUG0 (("colamd: nrow negative %d\n", n_row)) ;
+    	return (FALSE) ;
+    }
+
+    if (n_col < 0)	/* n_col must be >= 0 */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;
+	stats [COLAMD_INFO1] = n_col ;
+	DEBUG0 (("colamd: ncol negative %d\n", n_col)) ;
+    	return (FALSE) ;
+    }
+
+    nnz = p [n_col] ;
+    if (nnz < 0)	/* nnz must be >= 0 */
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;
+	stats [COLAMD_INFO1] = nnz ;
+	DEBUG0 (("colamd: number of entries negative %d\n", nnz)) ;
+	return (FALSE) ;
+    }
+
+    if (p [0] != 0)
+    {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero	;
+	stats [COLAMD_INFO1] = p [0] ;
+	DEBUG0 (("colamd: p[0] not zero %d\n", p [0])) ;
+	return (FALSE) ;
+    }
+
+    /* === If no knobs, set default knobs =================================== */
+
+    if (!knobs)
+    {
+	colamd_set_defaults (default_knobs) ;
+	knobs = default_knobs ;
+    }
+
+    /* === Allocate the Row and Col arrays from array A ===================== */
+
+    Col_size = COLAMD_C (n_col) ;
+    Row_size = COLAMD_R (n_row) ;
+    need = 2*nnz + n_col + Col_size + Row_size ;
+
+    if (need > Alen)
+    {
+	/* not enough space in array A to perform the ordering */
+	stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ;
+	stats [COLAMD_INFO1] = need ;
+	stats [COLAMD_INFO2] = Alen ;
+	DEBUG0 (("colamd: Need Alen >= %d, given only Alen = %d\n", need,Alen));
+	return (FALSE) ;
+    }
+
+    Alen -= Col_size + Row_size ;
+    Col = (Colamd_Col *) &A [Alen] ;
+    Row = (Colamd_Row *) &A [Alen + Col_size] ;
+
+    /* === Construct the row and column data structures ===================== */
+
+    if (!init_rows_cols (n_row, n_col, Row, Col, A, p, stats))
+    {
+	/* input matrix is invalid */
+	DEBUG0 (("colamd: Matrix invalid\n")) ;
+	return (FALSE) ;
+    }
+
+    /* === Initialize scores, kill dense rows/columns ======================= */
+
+    init_scoring (n_row, n_col, Row, Col, A, p, knobs,
+	&n_row2, &n_col2, &max_deg) ;
+
+    /* === Order the supercolumns =========================================== */
+
+    ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p,
+	n_col2, max_deg, 2*nnz) ;
+
+    /* === Order the non-principal columns ================================== */
+
+    order_children (n_col, Col, p) ;
+
+    /* === Return statistics in stats ======================================= */
+
+    stats [COLAMD_DENSE_ROW] = n_row - n_row2 ;
+    stats [COLAMD_DENSE_COL] = n_col - n_col2 ;
+    stats [COLAMD_DEFRAG_COUNT] = ngarbage ;
+    DEBUG0 (("colamd: done.\n")) ; 
+    return (TRUE) ;
+}
+
+
+/* ========================================================================== */
+/* === colamd_report ======================================================== */
+/* ========================================================================== */
+
+PUBLIC void colamd_report
+(
+    int stats [COLAMD_STATS]
+)
+{
+    print_report ("colamd", stats) ;
+}
+
+
+/* ========================================================================== */
+/* === symamd_report ======================================================== */
+/* ========================================================================== */
+
+PUBLIC void symamd_report
+(
+    int stats [COLAMD_STATS]
+)
+{
+    print_report ("symamd", stats) ;
+}
+
+
+
+/* ========================================================================== */
+/* === NON-USER-CALLABLE ROUTINES: ========================================== */
+/* ========================================================================== */
+
+/* There are no user-callable routines beyond this point in the file */
+
+
+/* ========================================================================== */
+/* === init_rows_cols ======================================================= */
+/* ========================================================================== */
+
+/*
+    Takes the column form of the matrix in A and creates the row form of the
+    matrix.  Also, row and column attributes are stored in the Col and Row
+    structs.  If the columns are un-sorted or contain duplicate row indices,
+    this routine will also sort and remove duplicate row indices from the
+    column form of the matrix.  Returns FALSE if the matrix is invalid,
+    TRUE otherwise.  Not user-callable.
+*/
+
+PRIVATE int init_rows_cols	/* returns TRUE if OK, or FALSE otherwise */
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,			/* number of rows of A */
+    int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    int A [],			/* row indices of A, of size Alen */
+    int p [],			/* pointers to columns in A, of size n_col+1 */
+    int stats [COLAMD_STATS]	/* colamd statistics */ 
+)
+{
+    /* === Local variables ================================================== */
+
+    int col ;			/* a column index */
+    int row ;			/* a row index */
+    int *cp ;			/* a column pointer */
+    int *cp_end ;		/* a pointer to the end of a column */
+    int *rp ;			/* a row pointer */
+    int *rp_end ;		/* a pointer to the end of a row */
+    int last_row ;		/* previous row */
+
+    /* === Initialize columns, and check column pointers ==================== */
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	Col [col].start = p [col] ;
+	Col [col].length = p [col+1] - p [col] ;
+
+	if (Col [col].length < 0)
+	{
+	    /* column pointers must be non-decreasing */
+	    stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;
+	    stats [COLAMD_INFO1] = col ;
+	    stats [COLAMD_INFO2] = Col [col].length ;
+	    DEBUG0 (("colamd: col %d length %d < 0\n", col, Col [col].length)) ;
+	    return (FALSE) ;
+	}
+
+	Col [col].shared1.thickness = 1 ;
+	Col [col].shared2.score = 0 ;
+	Col [col].shared3.prev = EMPTY ;
+	Col [col].shared4.degree_next = EMPTY ;
+    }
+
+    /* p [0..n_col] no longer needed, used as "head" in subsequent routines */
+
+    /* === Scan columns, compute row degrees, and check row indices ========= */
+
+    stats [COLAMD_INFO3] = 0 ;	/* number of duplicate or unsorted row indices*/
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Row [row].length = 0 ;
+	Row [row].shared2.mark = -1 ;
+    }
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	last_row = -1 ;
+
+	cp = &A [p [col]] ;
+	cp_end = &A [p [col+1]] ;
+
+	while (cp < cp_end)
+	{
+	    row = *cp++ ;
+
+	    /* make sure row indices within range */
+	    if (row < 0 || row >= n_row)
+	    {
+		stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;
+		stats [COLAMD_INFO1] = col ;
+		stats [COLAMD_INFO2] = row ;
+		stats [COLAMD_INFO3] = n_row ;
+		DEBUG0 (("colamd: row %d col %d out of bounds\n", row, col)) ;
+		return (FALSE) ;
+	    }
+
+	    if (row <= last_row || Row [row].shared2.mark == col)
+	    {
+		/* row index are unsorted or repeated (or both), thus col */
+		/* is jumbled.  This is a notice, not an error condition. */
+		stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;
+		stats [COLAMD_INFO1] = col ;
+		stats [COLAMD_INFO2] = row ;
+		(stats [COLAMD_INFO3]) ++ ;
+		DEBUG1 (("colamd: row %d col %d unsorted/duplicate\n",row,col));
+	    }
+
+	    if (Row [row].shared2.mark != col)
+	    {
+		Row [row].length++ ;
+	    }
+	    else
+	    {
+		/* this is a repeated entry in the column, */
+		/* it will be removed */
+		Col [col].length-- ;
+	    }
+
+	    /* mark the row as having been seen in this column */
+	    Row [row].shared2.mark = col ;
+
+	    last_row = row ;
+	}
+    }
+
+    /* === Compute row pointers ============================================= */
+
+    /* row form of the matrix starts directly after the column */
+    /* form of matrix in A */
+    Row [0].start = p [n_col] ;
+    Row [0].shared1.p = Row [0].start ;
+    Row [0].shared2.mark = -1 ;
+    for (row = 1 ; row < n_row ; row++)
+    {
+	Row [row].start = Row [row-1].start + Row [row-1].length ;
+	Row [row].shared1.p = Row [row].start ;
+	Row [row].shared2.mark = -1 ;
+    }
+
+    /* === Create row form ================================================== */
+
+    if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)
+    {
+	/* if cols jumbled, watch for repeated row indices */
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    cp = &A [p [col]] ;
+	    cp_end = &A [p [col+1]] ;
+	    while (cp < cp_end)
+	    {
+		row = *cp++ ;
+		if (Row [row].shared2.mark != col)
+		{
+		    A [(Row [row].shared1.p)++] = col ;
+		    Row [row].shared2.mark = col ;
+		}
+	    }
+	}
+    }
+    else
+    {
+	/* if cols not jumbled, we don't need the mark (this is faster) */
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    cp = &A [p [col]] ;
+	    cp_end = &A [p [col+1]] ;
+	    while (cp < cp_end)
+	    {
+		A [(Row [*cp++].shared1.p)++] = col ;
+	    }
+	}
+    }
+
+    /* === Clear the row marks and set row degrees ========================== */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Row [row].shared2.mark = 0 ;
+	Row [row].shared1.degree = Row [row].length ;
+    }
+
+    /* === See if we need to re-create columns ============================== */
+
+    if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)
+    {
+    	DEBUG0 (("colamd: reconstructing column form, matrix jumbled\n")) ;
+
+#ifndef NDEBUG
+	/* make sure column lengths are correct */
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    p [col] = Col [col].length ;
+	}
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    rp = &A [Row [row].start] ;
+	    rp_end = rp + Row [row].length ;
+	    while (rp < rp_end)
+	    {
+		p [*rp++]-- ;
+	    }
+	}
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    ASSERT (p [col] == 0) ;
+	}
+	/* now p is all zero (different than when debugging is turned off) */
+#endif /* NDEBUG */
+
+	/* === Compute col pointers ========================================= */
+
+	/* col form of the matrix starts at A [0]. */
+	/* Note, we may have a gap between the col form and the row */
+	/* form if there were duplicate entries, if so, it will be */
+	/* removed upon the first garbage collection */
+	Col [0].start = 0 ;
+	p [0] = Col [0].start ;
+	for (col = 1 ; col < n_col ; col++)
+	{
+	    /* note that the lengths here are for pruned columns, i.e. */
+	    /* no duplicate row indices will exist for these columns */
+	    Col [col].start = Col [col-1].start + Col [col-1].length ;
+	    p [col] = Col [col].start ;
+	}
+
+	/* === Re-create col form =========================================== */
+
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    rp = &A [Row [row].start] ;
+	    rp_end = rp + Row [row].length ;
+	    while (rp < rp_end)
+	    {
+		A [(p [*rp++])++] = row ;
+	    }
+	}
+    }
+
+    /* === Done.  Matrix is not (or no longer) jumbled ====================== */
+
+    return (TRUE) ;
+}
+
+
+/* ========================================================================== */
+/* === init_scoring ========================================================= */
+/* ========================================================================== */
+
+/*
+    Kills dense or empty columns and rows, calculates an initial score for
+    each column, and places all columns in the degree lists.  Not user-callable.
+*/
+
+PRIVATE void init_scoring
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,			/* number of rows of A */
+    int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    int A [],			/* column form and row form of A */
+    int head [],		/* of size n_col+1 */
+    double knobs [COLAMD_KNOBS],/* parameters */
+    int *p_n_row2,		/* number of non-dense, non-empty rows */
+    int *p_n_col2,		/* number of non-dense, non-empty columns */
+    int *p_max_deg		/* maximum row degree */
+)
+{
+    /* === Local variables ================================================== */
+
+    int c ;			/* a column index */
+    int r, row ;		/* a row index */
+    int *cp ;			/* a column pointer */
+    int deg ;			/* degree of a row or column */
+    int *cp_end ;		/* a pointer to the end of a column */
+    int *new_cp ;		/* new column pointer */
+    int col_length ;		/* length of pruned column */
+    int score ;			/* current column score */
+    int n_col2 ;		/* number of non-dense, non-empty columns */
+    int n_row2 ;		/* number of non-dense, non-empty rows */
+    int dense_row_count ;	/* remove rows with more entries than this */
+    int dense_col_count ;	/* remove cols with more entries than this */
+    int min_score ;		/* smallest column score */
+    int max_deg ;		/* maximum row degree */
+    int next_col ;		/* Used to add to degree list.*/
+
+#ifndef NDEBUG
+    int debug_count ;		/* debug only. */
+#endif /* NDEBUG */
+
+    /* === Extract knobs ==================================================== */
+
+    dense_row_count = MAX (0, MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ;
+    dense_col_count = MAX (0, MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ;
+    DEBUG1 (("colamd: densecount: %d %d\n", dense_row_count, dense_col_count)) ;
+    max_deg = 0 ;
+    n_col2 = n_col ;
+    n_row2 = n_row ;
+
+    /* === Kill empty columns =============================================== */
+
+    /* Put the empty columns at the end in their natural order, so that LU */
+    /* factorization can proceed as far as possible. */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	deg = Col [c].length ;
+	if (deg == 0)
+	{
+	    /* this is a empty column, kill and order it last */
+	    Col [c].shared2.order = --n_col2 ;
+	    KILL_PRINCIPAL_COL (c) ;
+	}
+    }
+    DEBUG1 (("colamd: null columns killed: %d\n", n_col - n_col2)) ;
+
+    /* === Kill dense columns =============================================== */
+
+    /* Put the dense columns at the end, in their natural order */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	/* skip any dead columns */
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+	deg = Col [c].length ;
+	if (deg > dense_col_count)
+	{
+	    /* this is a dense column, kill and order it last */
+	    Col [c].shared2.order = --n_col2 ;
+	    /* decrement the row degrees */
+	    cp = &A [Col [c].start] ;
+	    cp_end = cp + Col [c].length ;
+	    while (cp < cp_end)
+	    {
+		Row [*cp++].shared1.degree-- ;
+	    }
+	    KILL_PRINCIPAL_COL (c) ;
+	}
+    }
+    DEBUG1 (("colamd: Dense and null columns killed: %d\n", n_col - n_col2)) ;
+
+    /* === Kill dense and empty rows ======================================== */
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	deg = Row [r].shared1.degree ;
+	ASSERT (deg >= 0 && deg <= n_col) ;
+	if (deg > dense_row_count || deg == 0)
+	{
+	    /* kill a dense or empty row */
+	    KILL_ROW (r) ;
+	    --n_row2 ;
+	}
+	else
+	{
+	    /* keep track of max degree of remaining rows */
+	    max_deg = MAX (max_deg, deg) ;
+	}
+    }
+    DEBUG1 (("colamd: Dense and null rows killed: %d\n", n_row - n_row2)) ;
+
+    /* === Compute initial column scores ==================================== */
+
+    /* At this point the row degrees are accurate.  They reflect the number */
+    /* of "live" (non-dense) columns in each row.  No empty rows exist. */
+    /* Some "live" columns may contain only dead rows, however.  These are */
+    /* pruned in the code below. */
+
+    /* now find the initial matlab score for each column */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	/* skip dead column */
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+	score = 0 ;
+	cp = &A [Col [c].start] ;
+	new_cp = cp ;
+	cp_end = cp + Col [c].length ;
+	while (cp < cp_end)
+	{
+	    /* get a row */
+	    row = *cp++ ;
+	    /* skip if dead */
+	    if (ROW_IS_DEAD (row))
+	    {
+		continue ;
+	    }
+	    /* compact the column */
+	    *new_cp++ = row ;
+	    /* add row's external degree */
+	    score += Row [row].shared1.degree - 1 ;
+	    /* guard against integer overflow */
+	    score = MIN (score, n_col) ;
+	}
+	/* determine pruned column length */
+	col_length = (int) (new_cp - &A [Col [c].start]) ;
+	if (col_length == 0)
+	{
+	    /* a newly-made null column (all rows in this col are "dense" */
+	    /* and have already been killed) */
+	    DEBUG2 (("Newly null killed: %d\n", c)) ;
+	    Col [c].shared2.order = --n_col2 ;
+	    KILL_PRINCIPAL_COL (c) ;
+	}
+	else
+	{
+	    /* set column length and set score */
+	    ASSERT (score >= 0) ;
+	    ASSERT (score <= n_col) ;
+	    Col [c].length = col_length ;
+	    Col [c].shared2.score = score ;
+	}
+    }
+    DEBUG1 (("colamd: Dense, null, and newly-null columns killed: %d\n",
+    	n_col-n_col2)) ;
+
+    /* At this point, all empty rows and columns are dead.  All live columns */
+    /* are "clean" (containing no dead rows) and simplicial (no supercolumns */
+    /* yet).  Rows may contain dead columns, but all live rows contain at */
+    /* least one live column. */
+
+#ifndef NDEBUG
+    debug_structures (n_row, n_col, Row, Col, A, n_col2) ;
+#endif /* NDEBUG */
+
+    /* === Initialize degree lists ========================================== */
+
+#ifndef NDEBUG
+    debug_count = 0 ;
+#endif /* NDEBUG */
+
+    /* clear the hash buckets */
+    for (c = 0 ; c <= n_col ; c++)
+    {
+	head [c] = EMPTY ;
+    }
+    min_score = n_col ;
+    /* place in reverse order, so low column indices are at the front */
+    /* of the lists.  This is to encourage natural tie-breaking */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	/* only add principal columns to degree lists */
+	if (COL_IS_ALIVE (c))
+	{
+	    DEBUG4 (("place %d score %d minscore %d ncol %d\n",
+		c, Col [c].shared2.score, min_score, n_col)) ;
+
+	    /* === Add columns score to DList =============================== */
+
+	    score = Col [c].shared2.score ;
+
+	    ASSERT (min_score >= 0) ;
+	    ASSERT (min_score <= n_col) ;
+	    ASSERT (score >= 0) ;
+	    ASSERT (score <= n_col) ;
+	    ASSERT (head [score] >= EMPTY) ;
+
+	    /* now add this column to dList at proper score location */
+	    next_col = head [score] ;
+	    Col [c].shared3.prev = EMPTY ;
+	    Col [c].shared4.degree_next = next_col ;
+
+	    /* if there already was a column with the same score, set its */
+	    /* previous pointer to this new column */
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = c ;
+	    }
+	    head [score] = c ;
+
+	    /* see if this score is less than current min */
+	    min_score = MIN (min_score, score) ;
+
+#ifndef NDEBUG
+	    debug_count++ ;
+#endif /* NDEBUG */
+
+	}
+    }
+
+#ifndef NDEBUG
+    DEBUG1 (("colamd: Live cols %d out of %d, non-princ: %d\n",
+	debug_count, n_col, n_col-debug_count)) ;
+    ASSERT (debug_count == n_col2) ;
+    debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ;
+#endif /* NDEBUG */
+
+    /* === Return number of remaining columns, and max row degree =========== */
+
+    *p_n_col2 = n_col2 ;
+    *p_n_row2 = n_row2 ;
+    *p_max_deg = max_deg ;
+}
+
+
+/* ========================================================================== */
+/* === find_ordering ======================================================== */
+/* ========================================================================== */
+
+/*
+    Order the principal columns of the supercolumn form of the matrix
+    (no supercolumns on input).  Uses a minimum approximate column minimum
+    degree ordering method.  Not user-callable.
+*/
+
+PRIVATE int find_ordering	/* return the number of garbage collections */
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,			/* number of rows of A */
+    int n_col,			/* number of columns of A */
+    int Alen,			/* size of A, 2*nnz + n_col or larger */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    int A [],			/* column form and row form of A */
+    int head [],		/* of size n_col+1 */
+    int n_col2,			/* Remaining columns to order */
+    int max_deg,		/* Maximum row degree */
+    int pfree			/* index of first free slot (2*nnz on entry) */
+)
+{
+    /* === Local variables ================================================== */
+
+    int k ;			/* current pivot ordering step */
+    int pivot_col ;		/* current pivot column */
+    int *cp ;			/* a column pointer */
+    int *rp ;			/* a row pointer */
+    int pivot_row ;		/* current pivot row */
+    int *new_cp ;		/* modified column pointer */
+    int *new_rp ;		/* modified row pointer */
+    int pivot_row_start ;	/* pointer to start of pivot row */
+    int pivot_row_degree ;	/* number of columns in pivot row */
+    int pivot_row_length ;	/* number of supercolumns in pivot row */
+    int pivot_col_score ;	/* score of pivot column */
+    int needed_memory ;		/* free space needed for pivot row */
+    int *cp_end ;		/* pointer to the end of a column */
+    int *rp_end ;		/* pointer to the end of a row */
+    int row ;			/* a row index */
+    int col ;			/* a column index */
+    int max_score ;		/* maximum possible score */
+    int cur_score ;		/* score of current column */
+    unsigned int hash ;		/* hash value for supernode detection */
+    int head_column ;		/* head of hash bucket */
+    int first_col ;		/* first column in hash bucket */
+    int tag_mark ;		/* marker value for mark array */
+    int row_mark ;		/* Row [row].shared2.mark */
+    int set_difference ;	/* set difference size of row with pivot row */
+    int min_score ;		/* smallest column score */
+    int col_thickness ;		/* "thickness" (no. of columns in a supercol) */
+    int max_mark ;		/* maximum value of tag_mark */
+    int pivot_col_thickness ;	/* number of columns represented by pivot col */
+    int prev_col ;		/* Used by Dlist operations. */
+    int next_col ;		/* Used by Dlist operations. */
+    int ngarbage ;		/* number of garbage collections performed */
+
+#ifndef NDEBUG
+    int debug_d ;		/* debug loop counter */
+    int debug_step = 0 ;	/* debug loop counter */
+#endif /* NDEBUG */
+
+    /* === Initialization and clear mark ==================================== */
+
+    max_mark = INT_MAX - n_col ;	/* INT_MAX defined in <limits.h> */
+    tag_mark = clear_mark (n_row, Row) ;
+    min_score = 0 ;
+    ngarbage = 0 ;
+    DEBUG1 (("colamd: Ordering, n_col2=%d\n", n_col2)) ;
+
+    /* === Order the columns ================================================ */
+
+    for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)
+    {
+
+#ifndef NDEBUG
+	if (debug_step % 100 == 0)
+	{
+	    DEBUG2 (("\n...       Step k: %d out of n_col2: %d\n", k, n_col2)) ;
+	}
+	else
+	{
+	    DEBUG3 (("\n----------Step k: %d out of n_col2: %d\n", k, n_col2)) ;
+	}
+	debug_step++ ;
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k, max_deg) ;
+	debug_matrix (n_row, n_col, Row, Col, A) ;
+#endif /* NDEBUG */
+
+	/* === Select pivot column, and order it ============================ */
+
+	/* make sure degree list isn't empty */
+	ASSERT (min_score >= 0) ;
+	ASSERT (min_score <= n_col) ;
+	ASSERT (head [min_score] >= EMPTY) ;
+
+#ifndef NDEBUG
+	for (debug_d = 0 ; debug_d < min_score ; debug_d++)
+	{
+	    ASSERT (head [debug_d] == EMPTY) ;
+	}
+#endif /* NDEBUG */
+
+	/* get pivot column from head of minimum degree list */
+	while (head [min_score] == EMPTY && min_score < n_col)
+	{
+	    min_score++ ;
+	}
+	pivot_col = head [min_score] ;
+	ASSERT (pivot_col >= 0 && pivot_col <= n_col) ;
+	next_col = Col [pivot_col].shared4.degree_next ;
+	head [min_score] = next_col ;
+	if (next_col != EMPTY)
+	{
+	    Col [next_col].shared3.prev = EMPTY ;
+	}
+
+	ASSERT (COL_IS_ALIVE (pivot_col)) ;
+	DEBUG3 (("Pivot col: %d\n", pivot_col)) ;
+
+	/* remember score for defrag check */
+	pivot_col_score = Col [pivot_col].shared2.score ;
+
+	/* the pivot column is the kth column in the pivot order */
+	Col [pivot_col].shared2.order = k ;
+
+	/* increment order count by column thickness */
+	pivot_col_thickness = Col [pivot_col].shared1.thickness ;
+	k += pivot_col_thickness ;
+	ASSERT (pivot_col_thickness > 0) ;
+
+	/* === Garbage_collection, if necessary ============================= */
+
+	needed_memory = MIN (pivot_col_score, n_col - k) ;
+	if (pfree + needed_memory >= Alen)
+	{
+	    pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;
+	    ngarbage++ ;
+	    /* after garbage collection we will have enough */
+	    ASSERT (pfree + needed_memory < Alen) ;
+	    /* garbage collection has wiped out the Row[].shared2.mark array */
+	    tag_mark = clear_mark (n_row, Row) ;
+
+#ifndef NDEBUG
+	    debug_matrix (n_row, n_col, Row, Col, A) ;
+#endif /* NDEBUG */
+	}
+
+	/* === Compute pivot row pattern ==================================== */
+
+	/* get starting location for this new merged row */
+	pivot_row_start = pfree ;
+
+	/* initialize new row counts to zero */
+	pivot_row_degree = 0 ;
+
+	/* tag pivot column as having been visited so it isn't included */
+	/* in merged pivot row */
+	Col [pivot_col].shared1.thickness = -pivot_col_thickness ;
+
+	/* pivot row is the union of all rows in the pivot column pattern */
+	cp = &A [Col [pivot_col].start] ;
+	cp_end = cp + Col [pivot_col].length ;
+	while (cp < cp_end)
+	{
+	    /* get a row */
+	    row = *cp++ ;
+	    DEBUG4 (("Pivot col pattern %d %d\n", ROW_IS_ALIVE (row), row)) ;
+	    /* skip if row is dead */
+	    if (ROW_IS_DEAD (row))
+	    {
+		continue ;
+	    }
+	    rp = &A [Row [row].start] ;
+	    rp_end = rp + Row [row].length ;
+	    while (rp < rp_end)
+	    {
+		/* get a column */
+		col = *rp++ ;
+		/* add the column, if alive and untagged */
+		col_thickness = Col [col].shared1.thickness ;
+		if (col_thickness > 0 && COL_IS_ALIVE (col))
+		{
+		    /* tag column in pivot row */
+		    Col [col].shared1.thickness = -col_thickness ;
+		    ASSERT (pfree < Alen) ;
+		    /* place column in pivot row */
+		    A [pfree++] = col ;
+		    pivot_row_degree += col_thickness ;
+		}
+	    }
+	}
+
+	/* clear tag on pivot column */
+	Col [pivot_col].shared1.thickness = pivot_col_thickness ;
+	max_deg = MAX (max_deg, pivot_row_degree) ;
+
+#ifndef NDEBUG
+	DEBUG3 (("check2\n")) ;
+	debug_mark (n_row, Row, tag_mark, max_mark) ;
+#endif /* NDEBUG */
+
+	/* === Kill all rows used to construct pivot row ==================== */
+
+	/* also kill pivot row, temporarily */
+	cp = &A [Col [pivot_col].start] ;
+	cp_end = cp + Col [pivot_col].length ;
+	while (cp < cp_end)
+	{
+	    /* may be killing an already dead row */
+	    row = *cp++ ;
+	    DEBUG3 (("Kill row in pivot col: %d\n", row)) ;
+	    KILL_ROW (row) ;
+	}
+
+	/* === Select a row index to use as the new pivot row =============== */
+
+	pivot_row_length = pfree - pivot_row_start ;
+	if (pivot_row_length > 0)
+	{
+	    /* pick the "pivot" row arbitrarily (first row in col) */
+	    pivot_row = A [Col [pivot_col].start] ;
+	    DEBUG3 (("Pivotal row is %d\n", pivot_row)) ;
+	}
+	else
+	{
+	    /* there is no pivot row, since it is of zero length */
+	    pivot_row = EMPTY ;
+	    ASSERT (pivot_row_length == 0) ;
+	}
+	ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;
+
+	/* === Approximate degree computation =============================== */
+
+	/* Here begins the computation of the approximate degree.  The column */
+	/* score is the sum of the pivot row "length", plus the size of the */
+	/* set differences of each row in the column minus the pattern of the */
+	/* pivot row itself.  The column ("thickness") itself is also */
+	/* excluded from the column score (we thus use an approximate */
+	/* external degree). */
+
+	/* The time taken by the following code (compute set differences, and */
+	/* add them up) is proportional to the size of the data structure */
+	/* being scanned - that is, the sum of the sizes of each column in */
+	/* the pivot row.  Thus, the amortized time to compute a column score */
+	/* is proportional to the size of that column (where size, in this */
+	/* context, is the column "length", or the number of row indices */
+	/* in that column).  The number of row indices in a column is */
+	/* monotonically non-decreasing, from the length of the original */
+	/* column on input to colamd. */
+
+	/* === Compute set differences ====================================== */
+
+	DEBUG3 (("** Computing set differences phase. **\n")) ;
+
+	/* pivot row is currently dead - it will be revived later. */
+
+	DEBUG3 (("Pivot row: ")) ;
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    col = *rp++ ;
+	    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+	    DEBUG3 (("Col: %d\n", col)) ;
+
+	    /* clear tags used to construct pivot row pattern */
+	    col_thickness = -Col [col].shared1.thickness ;
+	    ASSERT (col_thickness > 0) ;
+	    Col [col].shared1.thickness = col_thickness ;
+
+	    /* === Remove column from degree list =========================== */
+
+	    cur_score = Col [col].shared2.score ;
+	    prev_col = Col [col].shared3.prev ;
+	    next_col = Col [col].shared4.degree_next ;
+	    ASSERT (cur_score >= 0) ;
+	    ASSERT (cur_score <= n_col) ;
+	    ASSERT (cur_score >= EMPTY) ;
+	    if (prev_col == EMPTY)
+	    {
+		head [cur_score] = next_col ;
+	    }
+	    else
+	    {
+		Col [prev_col].shared4.degree_next = next_col ;
+	    }
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = prev_col ;
+	    }
+
+	    /* === Scan the column ========================================== */
+
+	    cp = &A [Col [col].start] ;
+	    cp_end = cp + Col [col].length ;
+	    while (cp < cp_end)
+	    {
+		/* get a row */
+		row = *cp++ ;
+		row_mark = Row [row].shared2.mark ;
+		/* skip if dead */
+		if (ROW_IS_MARKED_DEAD (row_mark))
+		{
+		    continue ;
+		}
+		ASSERT (row != pivot_row) ;
+		set_difference = row_mark - tag_mark ;
+		/* check if the row has been seen yet */
+		if (set_difference < 0)
+		{
+		    ASSERT (Row [row].shared1.degree <= max_deg) ;
+		    set_difference = Row [row].shared1.degree ;
+		}
+		/* subtract column thickness from this row's set difference */
+		set_difference -= col_thickness ;
+		ASSERT (set_difference >= 0) ;
+		/* absorb this row if the set difference becomes zero */
+		if (set_difference == 0)
+		{
+		    DEBUG3 (("aggressive absorption. Row: %d\n", row)) ;
+		    KILL_ROW (row) ;
+		}
+		else
+		{
+		    /* save the new mark */
+		    Row [row].shared2.mark = set_difference + tag_mark ;
+		}
+	    }
+	}
+
+#ifndef NDEBUG
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k-pivot_row_degree, max_deg) ;
+#endif /* NDEBUG */
+
+	/* === Add up set differences for each column ======================= */
+
+	DEBUG3 (("** Adding set differences phase. **\n")) ;
+
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    /* get a column */
+	    col = *rp++ ;
+	    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+	    hash = 0 ;
+	    cur_score = 0 ;
+	    cp = &A [Col [col].start] ;
+	    /* compact the column */
+	    new_cp = cp ;
+	    cp_end = cp + Col [col].length ;
+
+	    DEBUG4 (("Adding set diffs for Col: %d.\n", col)) ;
+
+	    while (cp < cp_end)
+	    {
+		/* get a row */
+		row = *cp++ ;
+		ASSERT(row >= 0 && row < n_row) ;
+		row_mark = Row [row].shared2.mark ;
+		/* skip if dead */
+		if (ROW_IS_MARKED_DEAD (row_mark))
+		{
+		    continue ;
+		}
+		ASSERT (row_mark > tag_mark) ;
+		/* compact the column */
+		*new_cp++ = row ;
+		/* compute hash function */
+		hash += row ;
+		/* add set difference */
+		cur_score += row_mark - tag_mark ;
+		/* integer overflow... */
+		cur_score = MIN (cur_score, n_col) ;
+	    }
+
+	    /* recompute the column's length */
+	    Col [col].length = (int) (new_cp - &A [Col [col].start]) ;
+
+	    /* === Further mass elimination ================================= */
+
+	    if (Col [col].length == 0)
+	    {
+		DEBUG4 (("further mass elimination. Col: %d\n", col)) ;
+		/* nothing left but the pivot row in this column */
+		KILL_PRINCIPAL_COL (col) ;
+		pivot_row_degree -= Col [col].shared1.thickness ;
+		ASSERT (pivot_row_degree >= 0) ;
+		/* order it */
+		Col [col].shared2.order = k ;
+		/* increment order count by column thickness */
+		k += Col [col].shared1.thickness ;
+	    }
+	    else
+	    {
+		/* === Prepare for supercolumn detection ==================== */
+
+		DEBUG4 (("Preparing supercol detection for Col: %d.\n", col)) ;
+
+		/* save score so far */
+		Col [col].shared2.score = cur_score ;
+
+		/* add column to hash table, for supercolumn detection */
+		hash %= n_col + 1 ;
+
+		DEBUG4 ((" Hash = %d, n_col = %d.\n", hash, n_col)) ;
+		ASSERT (hash <= n_col) ;
+
+		head_column = head [hash] ;
+		if (head_column > EMPTY)
+		{
+		    /* degree list "hash" is non-empty, use prev (shared3) of */
+		    /* first column in degree list as head of hash bucket */
+		    first_col = Col [head_column].shared3.headhash ;
+		    Col [head_column].shared3.headhash = col ;
+		}
+		else
+		{
+		    /* degree list "hash" is empty, use head as hash bucket */
+		    first_col = - (head_column + 2) ;
+		    head [hash] = - (col + 2) ;
+		}
+		Col [col].shared4.hash_next = first_col ;
+
+		/* save hash function in Col [col].shared3.hash */
+		Col [col].shared3.hash = (int) hash ;
+		ASSERT (COL_IS_ALIVE (col)) ;
+	    }
+	}
+
+	/* The approximate external column degree is now computed.  */
+
+	/* === Supercolumn detection ======================================== */
+
+	DEBUG3 (("** Supercolumn detection phase. **\n")) ;
+
+	detect_super_cols (
+
+#ifndef NDEBUG
+		n_col, Row,
+#endif /* NDEBUG */
+
+		Col, A, head, pivot_row_start, pivot_row_length) ;
+
+	/* === Kill the pivotal column ====================================== */
+
+	KILL_PRINCIPAL_COL (pivot_col) ;
+
+	/* === Clear mark =================================================== */
+
+	tag_mark += (max_deg + 1) ;
+	if (tag_mark >= max_mark)
+	{
+	    DEBUG2 (("clearing tag_mark\n")) ;
+	    tag_mark = clear_mark (n_row, Row) ;
+	}
+
+#ifndef NDEBUG
+	DEBUG3 (("check3\n")) ;
+	debug_mark (n_row, Row, tag_mark, max_mark) ;
+#endif /* NDEBUG */
+
+	/* === Finalize the new pivot row, and column scores ================ */
+
+	DEBUG3 (("** Finalize scores phase. **\n")) ;
+
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	/* compact the pivot row */
+	new_rp = rp ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    col = *rp++ ;
+	    /* skip dead columns */
+	    if (COL_IS_DEAD (col))
+	    {
+		continue ;
+	    }
+	    *new_rp++ = col ;
+	    /* add new pivot row to column */
+	    A [Col [col].start + (Col [col].length++)] = pivot_row ;
+
+	    /* retrieve score so far and add on pivot row's degree. */
+	    /* (we wait until here for this in case the pivot */
+	    /* row's degree was reduced due to mass elimination). */
+	    cur_score = Col [col].shared2.score + pivot_row_degree ;
+
+	    /* calculate the max possible score as the number of */
+	    /* external columns minus the 'k' value minus the */
+	    /* columns thickness */
+	    max_score = n_col - k - Col [col].shared1.thickness ;
+
+	    /* make the score the external degree of the union-of-rows */
+	    cur_score -= Col [col].shared1.thickness ;
+
+	    /* make sure score is less or equal than the max score */
+	    cur_score = MIN (cur_score, max_score) ;
+	    ASSERT (cur_score >= 0) ;
+
+	    /* store updated score */
+	    Col [col].shared2.score = cur_score ;
+
+	    /* === Place column back in degree list ========================= */
+
+	    ASSERT (min_score >= 0) ;
+	    ASSERT (min_score <= n_col) ;
+	    ASSERT (cur_score >= 0) ;
+	    ASSERT (cur_score <= n_col) ;
+	    ASSERT (head [cur_score] >= EMPTY) ;
+	    next_col = head [cur_score] ;
+	    Col [col].shared4.degree_next = next_col ;
+	    Col [col].shared3.prev = EMPTY ;
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = col ;
+	    }
+	    head [cur_score] = col ;
+
+	    /* see if this score is less than current min */
+	    min_score = MIN (min_score, cur_score) ;
+
+	}
+
+#ifndef NDEBUG
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k, max_deg) ;
+#endif /* NDEBUG */
+
+	/* === Resurrect the new pivot row ================================== */
+
+	if (pivot_row_degree > 0)
+	{
+	    /* update pivot row length to reflect any cols that were killed */
+	    /* during super-col detection and mass elimination */
+	    Row [pivot_row].start  = pivot_row_start ;
+	    Row [pivot_row].length = (int) (new_rp - &A[pivot_row_start]) ;
+	    Row [pivot_row].shared1.degree = pivot_row_degree ;
+	    Row [pivot_row].shared2.mark = 0 ;
+	    /* pivot row is no longer dead */
+	}
+    }
+
+    /* === All principal columns have now been ordered ====================== */
+
+    return (ngarbage) ;
+}
+
+
+/* ========================================================================== */
+/* === order_children ======================================================= */
+/* ========================================================================== */
+
+/*
+    The find_ordering routine has ordered all of the principal columns (the
+    representatives of the supercolumns).  The non-principal columns have not
+    yet been ordered.  This routine orders those columns by walking up the
+    parent tree (a column is a child of the column which absorbed it).  The
+    final permutation vector is then placed in p [0 ... n_col-1], with p [0]
+    being the first column, and p [n_col-1] being the last.  It doesn't look
+    like it at first glance, but be assured that this routine takes time linear
+    in the number of columns.  Although not immediately obvious, the time
+    taken by this routine is O (n_col), that is, linear in the number of
+    columns.  Not user-callable.
+*/
+
+PRIVATE void order_children
+(
+    /* === Parameters ======================================================= */
+
+    int n_col,			/* number of columns of A */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    int p []			/* p [0 ... n_col-1] is the column permutation*/
+)
+{
+    /* === Local variables ================================================== */
+
+    int i ;			/* loop counter for all columns */
+    int c ;			/* column index */
+    int parent ;		/* index of column's parent */
+    int order ;			/* column's order */
+
+    /* === Order each non-principal column ================================== */
+
+    for (i = 0 ; i < n_col ; i++)
+    {
+	/* find an un-ordered non-principal column */
+	ASSERT (COL_IS_DEAD (i)) ;
+	if (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == EMPTY)
+	{
+	    parent = i ;
+	    /* once found, find its principal parent */
+	    do
+	    {
+		parent = Col [parent].shared1.parent ;
+	    } while (!COL_IS_DEAD_PRINCIPAL (parent)) ;
+
+	    /* now, order all un-ordered non-principal columns along path */
+	    /* to this parent.  collapse tree at the same time */
+	    c = i ;
+	    /* get order of parent */
+	    order = Col [parent].shared2.order ;
+
+	    do
+	    {
+		ASSERT (Col [c].shared2.order == EMPTY) ;
+
+		/* order this column */
+		Col [c].shared2.order = order++ ;
+		/* collaps tree */
+		Col [c].shared1.parent = parent ;
+
+		/* get immediate parent of this column */
+		c = Col [c].shared1.parent ;
+
+		/* continue until we hit an ordered column.  There are */
+		/* guarranteed not to be anymore unordered columns */
+		/* above an ordered column */
+	    } while (Col [c].shared2.order == EMPTY) ;
+
+	    /* re-order the super_col parent to largest order for this group */
+	    Col [parent].shared2.order = order ;
+	}
+    }
+
+    /* === Generate the permutation ========================================= */
+
+    for (c = 0 ; c < n_col ; c++)
+    {
+	p [Col [c].shared2.order] = c ;
+    }
+}
+
+
+/* ========================================================================== */
+/* === detect_super_cols ==================================================== */
+/* ========================================================================== */
+
+/*
+    Detects supercolumns by finding matches between columns in the hash buckets.
+    Check amongst columns in the set A [row_start ... row_start + row_length-1].
+    The columns under consideration are currently *not* in the degree lists,
+    and have already been placed in the hash buckets.
+
+    The hash bucket for columns whose hash function is equal to h is stored
+    as follows:
+
+	if head [h] is >= 0, then head [h] contains a degree list, so:
+
+		head [h] is the first column in degree bucket h.
+		Col [head [h]].headhash gives the first column in hash bucket h.
+
+	otherwise, the degree list is empty, and:
+
+		-(head [h] + 2) is the first column in hash bucket h.
+
+    For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous
+    column" pointer.  Col [c].shared3.hash is used instead as the hash number
+    for that column.  The value of Col [c].shared4.hash_next is the next column
+    in the same hash bucket.
+
+    Assuming no, or "few" hash collisions, the time taken by this routine is
+    linear in the sum of the sizes (lengths) of each column whose score has
+    just been computed in the approximate degree computation.
+    Not user-callable.
+*/
+
+PRIVATE void detect_super_cols
+(
+    /* === Parameters ======================================================= */
+
+#ifndef NDEBUG
+    /* these two parameters are only needed when debugging is enabled: */
+    int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+#endif /* NDEBUG */
+
+    Colamd_Col Col [],		/* of size n_col+1 */
+    int A [],			/* row indices of A */
+    int head [],		/* head of degree lists and hash buckets */
+    int row_start,		/* pointer to set of columns to check */
+    int row_length		/* number of columns to check */
+)
+{
+    /* === Local variables ================================================== */
+
+    int hash ;			/* hash value for a column */
+    int *rp ;			/* pointer to a row */
+    int c ;			/* a column index */
+    int super_c ;		/* column index of the column to absorb into */
+    int *cp1 ;			/* column pointer for column super_c */
+    int *cp2 ;			/* column pointer for column c */
+    int length ;		/* length of column super_c */
+    int prev_c ;		/* column preceding c in hash bucket */
+    int i ;			/* loop counter */
+    int *rp_end ;		/* pointer to the end of the row */
+    int col ;			/* a column index in the row to check */
+    int head_column ;		/* first column in hash bucket or degree list */
+    int first_col ;		/* first column in hash bucket */
+
+    /* === Consider each column in the row ================================== */
+
+    rp = &A [row_start] ;
+    rp_end = rp + row_length ;
+    while (rp < rp_end)
+    {
+	col = *rp++ ;
+	if (COL_IS_DEAD (col))
+	{
+	    continue ;
+	}
+
+	/* get hash number for this column */
+	hash = Col [col].shared3.hash ;
+	ASSERT (hash <= n_col) ;
+
+	/* === Get the first column in this hash bucket ===================== */
+
+	head_column = head [hash] ;
+	if (head_column > EMPTY)
+	{
+	    first_col = Col [head_column].shared3.headhash ;
+	}
+	else
+	{
+	    first_col = - (head_column + 2) ;
+	}
+
+	/* === Consider each column in the hash bucket ====================== */
+
+	for (super_c = first_col ; super_c != EMPTY ;
+	    super_c = Col [super_c].shared4.hash_next)
+	{
+	    ASSERT (COL_IS_ALIVE (super_c)) ;
+	    ASSERT (Col [super_c].shared3.hash == hash) ;
+	    length = Col [super_c].length ;
+
+	    /* prev_c is the column preceding column c in the hash bucket */
+	    prev_c = super_c ;
+
+	    /* === Compare super_c with all columns after it ================ */
+
+	    for (c = Col [super_c].shared4.hash_next ;
+		 c != EMPTY ; c = Col [c].shared4.hash_next)
+	    {
+		ASSERT (c != super_c) ;
+		ASSERT (COL_IS_ALIVE (c)) ;
+		ASSERT (Col [c].shared3.hash == hash) ;
+
+		/* not identical if lengths or scores are different */
+		if (Col [c].length != length ||
+		    Col [c].shared2.score != Col [super_c].shared2.score)
+		{
+		    prev_c = c ;
+		    continue ;
+		}
+
+		/* compare the two columns */
+		cp1 = &A [Col [super_c].start] ;
+		cp2 = &A [Col [c].start] ;
+
+		for (i = 0 ; i < length ; i++)
+		{
+		    /* the columns are "clean" (no dead rows) */
+		    ASSERT (ROW_IS_ALIVE (*cp1))  ;
+		    ASSERT (ROW_IS_ALIVE (*cp2))  ;
+		    /* row indices will same order for both supercols, */
+		    /* no gather scatter nessasary */
+		    if (*cp1++ != *cp2++)
+		    {
+			break ;
+		    }
+		}
+
+		/* the two columns are different if the for-loop "broke" */
+		if (i != length)
+		{
+		    prev_c = c ;
+		    continue ;
+		}
+
+		/* === Got it!  two columns are identical =================== */
+
+		ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;
+
+		Col [super_c].shared1.thickness += Col [c].shared1.thickness ;
+		Col [c].shared1.parent = super_c ;
+		KILL_NON_PRINCIPAL_COL (c) ;
+		/* order c later, in order_children() */
+		Col [c].shared2.order = EMPTY ;
+		/* remove c from hash bucket */
+		Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;
+	    }
+	}
+
+	/* === Empty this hash bucket ======================================= */
+
+	if (head_column > EMPTY)
+	{
+	    /* corresponding degree list "hash" is not empty */
+	    Col [head_column].shared3.headhash = EMPTY ;
+	}
+	else
+	{
+	    /* corresponding degree list "hash" is empty */
+	    head [hash] = EMPTY ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === garbage_collection =================================================== */
+/* ========================================================================== */
+
+/*
+    Defragments and compacts columns and rows in the workspace A.  Used when
+    all avaliable memory has been used while performing row merging.  Returns
+    the index of the first free position in A, after garbage collection.  The
+    time taken by this routine is linear is the size of the array A, which is
+    itself linear in the number of nonzeros in the input matrix.
+    Not user-callable.
+*/
+
+PRIVATE int garbage_collection  /* returns the new value of pfree */
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,			/* number of rows */
+    int n_col,			/* number of columns */
+    Colamd_Row Row [],		/* row info */
+    Colamd_Col Col [],		/* column info */
+    int A [],			/* A [0 ... Alen-1] holds the matrix */
+    int *pfree			/* &A [0] ... pfree is in use */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *psrc ;			/* source pointer */
+    int *pdest ;		/* destination pointer */
+    int j ;			/* counter */
+    int r ;			/* a row index */
+    int c ;			/* a column index */
+    int length ;		/* length of a row or column */
+
+#ifndef NDEBUG
+    int debug_rows ;
+    DEBUG2 (("Defrag..\n")) ;
+    for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ;
+    debug_rows = 0 ;
+#endif /* NDEBUG */
+
+    /* === Defragment the columns =========================================== */
+
+    pdest = &A[0] ;
+    for (c = 0 ; c < n_col ; c++)
+    {
+	if (COL_IS_ALIVE (c))
+	{
+	    psrc = &A [Col [c].start] ;
+
+	    /* move and compact the column */
+	    ASSERT (pdest <= psrc) ;
+	    Col [c].start = (int) (pdest - &A [0]) ;
+	    length = Col [c].length ;
+	    for (j = 0 ; j < length ; j++)
+	    {
+		r = *psrc++ ;
+		if (ROW_IS_ALIVE (r))
+		{
+		    *pdest++ = r ;
+		}
+	    }
+	    Col [c].length = (int) (pdest - &A [Col [c].start]) ;
+	}
+    }
+
+    /* === Prepare to defragment the rows =================================== */
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    if (Row [r].length == 0)
+	    {
+		/* this row is of zero length.  cannot compact it, so kill it */
+		DEBUG3 (("Defrag row kill\n")) ;
+		KILL_ROW (r) ;
+	    }
+	    else
+	    {
+		/* save first column index in Row [r].shared2.first_column */
+		psrc = &A [Row [r].start] ;
+		Row [r].shared2.first_column = *psrc ;
+		ASSERT (ROW_IS_ALIVE (r)) ;
+		/* flag the start of the row with the one's complement of row */
+		*psrc = ONES_COMPLEMENT (r) ;
+
+#ifndef NDEBUG
+		debug_rows++ ;
+#endif /* NDEBUG */
+
+	    }
+	}
+    }
+
+    /* === Defragment the rows ============================================== */
+
+    psrc = pdest ;
+    while (psrc < pfree)
+    {
+	/* find a negative number ... the start of a row */
+	if (*psrc++ < 0)
+	{
+	    psrc-- ;
+	    /* get the row index */
+	    r = ONES_COMPLEMENT (*psrc) ;
+	    ASSERT (r >= 0 && r < n_row) ;
+	    /* restore first column index */
+	    *psrc = Row [r].shared2.first_column ;
+	    ASSERT (ROW_IS_ALIVE (r)) ;
+
+	    /* move and compact the row */
+	    ASSERT (pdest <= psrc) ;
+	    Row [r].start = (int) (pdest - &A [0]) ;
+	    length = Row [r].length ;
+	    for (j = 0 ; j < length ; j++)
+	    {
+		c = *psrc++ ;
+		if (COL_IS_ALIVE (c))
+		{
+		    *pdest++ = c ;
+		}
+	    }
+	    Row [r].length = (int) (pdest - &A [Row [r].start]) ;
+
+#ifndef NDEBUG
+	    debug_rows-- ;
+#endif /* NDEBUG */
+
+	}
+    }
+    /* ensure we found all the rows */
+    ASSERT (debug_rows == 0) ;
+
+    /* === Return the new value of pfree ==================================== */
+
+    return ((int) (pdest - &A [0])) ;
+}
+
+
+/* ========================================================================== */
+/* === clear_mark =========================================================== */
+/* ========================================================================== */
+
+/*
+    Clears the Row [].shared2.mark array, and returns the new tag_mark.
+    Return value is the new tag_mark.  Not user-callable.
+*/
+
+PRIVATE int clear_mark	/* return the new value for tag_mark */
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,		/* number of rows in A */
+    Colamd_Row Row []	/* Row [0 ... n_row-1].shared2.mark is set to zero */
+)
+{
+    /* === Local variables ================================================== */
+
+    int r ;
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    Row [r].shared2.mark = 0 ;
+	}
+    }
+    return (1) ;
+}
+
+
+/* ========================================================================== */
+/* === print_report ========================================================= */
+/* ========================================================================== */
+
+PRIVATE void print_report
+(
+    char *method,
+    int stats [COLAMD_STATS]
+)
+{
+
+    int i1, i2, i3 ;
+
+    if (!stats)
+    {
+    	PRINTF ("%s: No statistics available.\n", method) ;
+	return ;
+    }
+
+    i1 = stats [COLAMD_INFO1] ;
+    i2 = stats [COLAMD_INFO2] ;
+    i3 = stats [COLAMD_INFO3] ;
+
+    if (stats [COLAMD_STATUS] >= 0)
+    {
+    	PRINTF ("%s: OK.  ", method) ;
+    }
+    else
+    {
+    	PRINTF ("%s: ERROR.  ", method) ;
+    }
+
+    switch (stats [COLAMD_STATUS])
+    {
+
+	case COLAMD_OK_BUT_JUMBLED:
+
+	    PRINTF ("Matrix has unsorted or duplicate row indices.\n") ;
+
+	    PRINTF ("%s: number of duplicate or out-of-order row indices: %d\n",
+	    method, i3) ;
+
+	    PRINTF ("%s: last seen duplicate or out-of-order row index:   %d\n",
+	    method, INDEX (i2)) ;
+
+	    PRINTF ("%s: last seen in column:                             %d",
+	    method, INDEX (i1)) ;
+
+	    /* no break - fall through to next case instead */
+
+	case COLAMD_OK:
+
+	    PRINTF ("\n") ;
+
+ 	    PRINTF ("%s: number of dense or empty rows ignored:           %d\n",
+	    method, stats [COLAMD_DENSE_ROW]) ;
+
+	    PRINTF ("%s: number of dense or empty columns ignored:        %d\n",
+	    method, stats [COLAMD_DENSE_COL]) ;
+
+	    PRINTF ("%s: number of garbage collections performed:         %d\n",
+	    method, stats [COLAMD_DEFRAG_COUNT]) ;
+	    break ;
+
+	case COLAMD_ERROR_A_not_present:
+
+	    PRINTF ("Array A (row indices of matrix) not present.\n") ;
+	    break ;
+
+	case COLAMD_ERROR_p_not_present:
+
+	    PRINTF ("Array p (column pointers for matrix) not present.\n") ;
+	    break ;
+
+	case COLAMD_ERROR_nrow_negative:
+
+	    PRINTF ("Invalid number of rows (%d).\n", i1) ;
+	    break ;
+
+	case COLAMD_ERROR_ncol_negative:
+
+	    PRINTF ("Invalid number of columns (%d).\n", i1) ;
+	    break ;
+
+	case COLAMD_ERROR_nnz_negative:
+
+	    PRINTF ("Invalid number of nonzero entries (%d).\n", i1) ;
+	    break ;
+
+	case COLAMD_ERROR_p0_nonzero:
+
+	    PRINTF ("Invalid column pointer, p [0] = %d, must be zero.\n", i1) ;
+	    break ;
+
+	case COLAMD_ERROR_A_too_small:
+
+	    PRINTF ("Array A too small.\n") ;
+	    PRINTF ("        Need Alen >= %d, but given only Alen = %d.\n",
+	    i1, i2) ;
+	    break ;
+
+	case COLAMD_ERROR_col_length_negative:
+
+	    PRINTF
+	    ("Column %d has a negative number of nonzero entries (%d).\n",
+	    INDEX (i1), i2) ;
+	    break ;
+
+	case COLAMD_ERROR_row_index_out_of_bounds:
+
+	    PRINTF
+	    ("Row index (row %d) out of bounds (%d to %d) in column %d.\n",
+	    INDEX (i2), INDEX (0), INDEX (i3-1), INDEX (i1)) ;
+	    break ;
+
+	case COLAMD_ERROR_out_of_memory:
+
+	    PRINTF ("Out of memory.\n") ;
+	    break ;
+
+	case COLAMD_ERROR_internal_error:
+
+	    /* if this happens, there is a bug in the code */
+	    PRINTF
+	    ("Internal error! Please contact authors (davis@cise.ufl.edu).\n") ;
+	    break ;
+    }
+}
+
+
+
+
+/* ========================================================================== */
+/* === colamd debugging routines ============================================ */
+/* ========================================================================== */
+
+/* When debugging is disabled, the remainder of this file is ignored. */
+
+#ifndef NDEBUG
+
+
+/* ========================================================================== */
+/* === debug_structures ===================================================== */
+/* ========================================================================== */
+
+/*
+    At this point, all empty rows and columns are dead.  All live columns
+    are "clean" (containing no dead rows) and simplicial (no supercolumns
+    yet).  Rows may contain dead columns, but all live rows contain at
+    least one live column.
+*/
+
+PRIVATE void debug_structures
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A [],
+    int n_col2
+)
+{
+    /* === Local variables ================================================== */
+
+    int i ;
+    int c ;
+    int *cp ;
+    int *cp_end ;
+    int len ;
+    int score ;
+    int r ;
+    int *rp ;
+    int *rp_end ;
+    int deg ;
+
+    /* === Check A, Row, and Col ============================================ */
+
+    for (c = 0 ; c < n_col ; c++)
+    {
+	if (COL_IS_ALIVE (c))
+	{
+	    len = Col [c].length ;
+	    score = Col [c].shared2.score ;
+	    DEBUG4 (("initial live col %5d %5d %5d\n", c, len, score)) ;
+	    ASSERT (len > 0) ;
+	    ASSERT (score >= 0) ;
+	    ASSERT (Col [c].shared1.thickness == 1) ;
+	    cp = &A [Col [c].start] ;
+	    cp_end = cp + len ;
+	    while (cp < cp_end)
+	    {
+		r = *cp++ ;
+		ASSERT (ROW_IS_ALIVE (r)) ;
+	    }
+	}
+	else
+	{
+	    i = Col [c].shared2.order ;
+	    ASSERT (i >= n_col2 && i < n_col) ;
+	}
+    }
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    i = 0 ;
+	    len = Row [r].length ;
+	    deg = Row [r].shared1.degree ;
+	    ASSERT (len > 0) ;
+	    ASSERT (deg > 0) ;
+	    rp = &A [Row [r].start] ;
+	    rp_end = rp + len ;
+	    while (rp < rp_end)
+	    {
+		c = *rp++ ;
+		if (COL_IS_ALIVE (c))
+		{
+		    i++ ;
+		}
+	    }
+	    ASSERT (i > 0) ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_deg_lists ====================================================== */
+/* ========================================================================== */
+
+/*
+    Prints the contents of the degree lists.  Counts the number of columns
+    in the degree list and compares it to the total it should have.  Also
+    checks the row degrees.
+*/
+
+PRIVATE void debug_deg_lists
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int head [],
+    int min_score,
+    int should,
+    int max_deg
+)
+{
+    /* === Local variables ================================================== */
+
+    int deg ;
+    int col ;
+    int have ;
+    int row ;
+
+    /* === Check the degree lists =========================================== */
+
+    if (n_col > 10000 && colamd_debug <= 0)
+    {
+	return ;
+    }
+    have = 0 ;
+    DEBUG4 (("Degree lists: %d\n", min_score)) ;
+    for (deg = 0 ; deg <= n_col ; deg++)
+    {
+	col = head [deg] ;
+	if (col == EMPTY)
+	{
+	    continue ;
+	}
+	DEBUG4 (("%d:", deg)) ;
+	while (col != EMPTY)
+	{
+	    DEBUG4 ((" %d", col)) ;
+	    have += Col [col].shared1.thickness ;
+	    ASSERT (COL_IS_ALIVE (col)) ;
+	    col = Col [col].shared4.degree_next ;
+	}
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("should %d have %d\n", should, have)) ;
+    ASSERT (should == have) ;
+
+    /* === Check the row degrees ============================================ */
+
+    if (n_row > 10000 && colamd_debug <= 0)
+    {
+	return ;
+    }
+    for (row = 0 ; row < n_row ; row++)
+    {
+	if (ROW_IS_ALIVE (row))
+	{
+	    ASSERT (Row [row].shared1.degree <= max_deg) ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_mark =========================================================== */
+/* ========================================================================== */
+
+/*
+    Ensures that the tag_mark is less that the maximum and also ensures that
+    each entry in the mark array is less than the tag mark.
+*/
+
+PRIVATE void debug_mark
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,
+    Colamd_Row Row [],
+    int tag_mark,
+    int max_mark
+)
+{
+    /* === Local variables ================================================== */
+
+    int r ;
+
+    /* === Check the Row marks ============================================== */
+
+    ASSERT (tag_mark > 0 && tag_mark <= max_mark) ;
+    if (n_row > 10000 && colamd_debug <= 0)
+    {
+	return ;
+    }
+    for (r = 0 ; r < n_row ; r++)
+    {
+	ASSERT (Row [r].shared2.mark < tag_mark) ;
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_matrix ========================================================= */
+/* ========================================================================== */
+
+/*
+    Prints out the contents of the columns and the rows.
+*/
+
+PRIVATE void debug_matrix
+(
+    /* === Parameters ======================================================= */
+
+    int n_row,
+    int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    int A []
+)
+{
+    /* === Local variables ================================================== */
+
+    int r ;
+    int c ;
+    int *rp ;
+    int *rp_end ;
+    int *cp ;
+    int *cp_end ;
+
+    /* === Dump the rows and columns of the matrix ========================== */
+
+    if (colamd_debug < 3)
+    {
+	return ;
+    }
+    DEBUG3 (("DUMP MATRIX:\n")) ;
+    for (r = 0 ; r < n_row ; r++)
+    {
+	DEBUG3 (("Row %d alive? %d\n", r, ROW_IS_ALIVE (r))) ;
+	if (ROW_IS_DEAD (r))
+	{
+	    continue ;
+	}
+	DEBUG3 (("start %d length %d degree %d\n",
+		Row [r].start, Row [r].length, Row [r].shared1.degree)) ;
+	rp = &A [Row [r].start] ;
+	rp_end = rp + Row [r].length ;
+	while (rp < rp_end)
+	{
+	    c = *rp++ ;
+	    DEBUG4 (("	%d col %d\n", COL_IS_ALIVE (c), c)) ;
+	}
+    }
+
+    for (c = 0 ; c < n_col ; c++)
+    {
+	DEBUG3 (("Col %d alive? %d\n", c, COL_IS_ALIVE (c))) ;
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+	DEBUG3 (("start %d length %d shared1 %d shared2 %d\n",
+		Col [c].start, Col [c].length,
+		Col [c].shared1.thickness, Col [c].shared2.score)) ;
+	cp = &A [Col [c].start] ;
+	cp_end = cp + Col [c].length ;
+	while (cp < cp_end)
+	{
+	    r = *cp++ ;
+	    DEBUG4 (("	%d row %d\n", ROW_IS_ALIVE (r), r)) ;
+	}
+    }
+}
+
+PRIVATE void colamd_get_debug
+(
+    char *method
+)
+{
+    colamd_debug = 0 ;		/* no debug printing */
+
+    /* get "D" environment variable, which gives the debug printing level */
+    if (getenv ("D"))
+    {
+    	colamd_debug = atoi (getenv ("D")) ;
+    }
+
+    DEBUG0 (("%s: debug version, D = %d (THIS WILL BE SLOW!)\n",
+    	method, colamd_debug)) ;
+}
+
+#endif /* NDEBUG */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,246 @@
+/* ========================================================================== */
+/* === colamd/symamd prototypes and definitions ============================= */
+/* ========================================================================== */
+
+/*
+    You must include this file (colamd.h) in any routine that uses colamd,
+    symamd, or the related macros and definitions.
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Notice:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+	EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+	Permission is hereby granted to use, copy, modify, and/or distribute
+	this program, provided that the Copyright, this License, and the
+	Availability of the original version is retained on all copies and made
+	accessible to the end-user of any code or package that includes COLAMD
+	or any modified version of COLAMD. 
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.h
+	file.  It is required by the colamd.c, colamdmex.c, and symamdmex.c
+	files, and by any C code that calls the routines whose prototypes are
+	listed below, or that uses the colamd/symamd definitions listed below.
+
+*/
+
+#ifndef COLAMD_H
+#define COLAMD_H
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include <stdlib.h>
+
+/* ========================================================================== */
+/* === Knob and statistics definitions ====================================== */
+/* ========================================================================== */
+
+/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */
+#define COLAMD_KNOBS 20
+
+/* number of output statistics.  Only stats [0..6] are currently used. */
+#define COLAMD_STATS 20
+
+/* knobs [0] and stats [0]: dense row knob and output statistic. */
+#define COLAMD_DENSE_ROW 0
+
+/* knobs [1] and stats [1]: dense column knob and output statistic. */
+#define COLAMD_DENSE_COL 1
+
+/* stats [2]: memory defragmentation count output statistic */
+#define COLAMD_DEFRAG_COUNT 2
+
+/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */
+#define COLAMD_STATUS 3
+
+/* stats [4..6]: error info, or info on jumbled columns */ 
+#define COLAMD_INFO1 4
+#define COLAMD_INFO2 5
+#define COLAMD_INFO3 6
+
+/* error codes returned in stats [3]: */
+#define COLAMD_OK				(0)
+#define COLAMD_OK_BUT_JUMBLED			(1)
+#define COLAMD_ERROR_A_not_present		(-1)
+#define COLAMD_ERROR_p_not_present		(-2)
+#define COLAMD_ERROR_nrow_negative		(-3)
+#define COLAMD_ERROR_ncol_negative		(-4)
+#define COLAMD_ERROR_nnz_negative		(-5)
+#define COLAMD_ERROR_p0_nonzero			(-6)
+#define COLAMD_ERROR_A_too_small		(-7)
+#define COLAMD_ERROR_col_length_negative	(-8)
+#define COLAMD_ERROR_row_index_out_of_bounds	(-9)
+#define COLAMD_ERROR_out_of_memory		(-10)
+#define COLAMD_ERROR_internal_error		(-999)
+
+/* ========================================================================== */
+/* === Row and Column structures ============================================ */
+/* ========================================================================== */
+
+/* User code that makes use of the colamd/symamd routines need not directly */
+/* reference these structures.  They are used only for the COLAMD_RECOMMENDED */
+/* macro. */
+
+typedef struct Colamd_Col_struct
+{
+    int start ;		/* index for A of first row in this column, or DEAD */
+			/* if column is dead */
+    int length ;	/* number of rows in this column */
+    union
+    {
+	int thickness ;	/* number of original columns represented by this */
+			/* col, if the column is alive */
+	int parent ;	/* parent in parent tree super-column structure, if */
+			/* the column is dead */
+    } shared1 ;
+    union
+    {
+	int score ;	/* the score used to maintain heap, if col is alive */
+	int order ;	/* pivot ordering of this column, if col is dead */
+    } shared2 ;
+    union
+    {
+	int headhash ;	/* head of a hash bucket, if col is at the head of */
+			/* a degree list */
+	int hash ;	/* hash value, if col is not in a degree list */
+	int prev ;	/* previous column in degree list, if col is in a */
+			/* degree list (but not at the head of a degree list) */
+    } shared3 ;
+    union
+    {
+	int degree_next ;	/* next column, if col is in a degree list */
+	int hash_next ;		/* next column, if col is in a hash list */
+    } shared4 ;
+
+} Colamd_Col ;
+
+typedef struct Colamd_Row_struct
+{
+    int start ;		/* index for A of first col in this row */
+    int length ;	/* number of principal columns in this row */
+    union
+    {
+	int degree ;	/* number of principal & non-principal columns in row */
+	int p ;		/* used as a row pointer in init_rows_cols () */
+    } shared1 ;
+    union
+    {
+	int mark ;	/* for computing set differences and marking dead rows*/
+	int first_column ;/* first column in row (used in garbage collection) */
+    } shared2 ;
+
+} Colamd_Row ;
+
+/* ========================================================================== */
+/* === Colamd recommended memory size ======================================= */
+/* ========================================================================== */
+
+/*
+    The recommended length Alen of the array A passed to colamd is given by
+    the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any
+    argument is negative.  2*nnz space is required for the row and column
+    indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is
+    required for the Col and Row arrays, respectively, which are internal to
+    colamd.  An additional n_col space is the minimal amount of "elbow room",
+    and nnz/5 more space is recommended for run time efficiency.
+
+    This macro is not needed when using symamd.
+
+    Explicit typecast to int added Sept. 23, 2002, COLAMD version 2.2, to avoid
+    gcc -pedantic warning messages.
+*/
+
+#define COLAMD_C(n_col) ((int) (((n_col) + 1) * sizeof (Colamd_Col) / sizeof (int)))
+#define COLAMD_R(n_row) ((int) (((n_row) + 1) * sizeof (Colamd_Row) / sizeof (int)))
+
+#define COLAMD_RECOMMENDED(nnz, n_row, n_col)                                 \
+(                                                                             \
+((nnz) < 0 || (n_row) < 0 || (n_col) < 0)                                     \
+?                                                                             \
+    (-1)                                                                      \
+:                                                                             \
+    (2 * (nnz) + COLAMD_C (n_col) + COLAMD_R (n_row) + (n_col) + ((nnz) / 5)) \
+)
+
+/* ========================================================================== */
+/* === Prototypes of user-callable routines ================================= */
+/* ========================================================================== */
+
+int colamd_recommended		/* returns recommended value of Alen, */
+				/* or (-1) if input arguments are erroneous */
+(
+    int nnz,			/* nonzeros in A */
+    int n_row,			/* number of rows in A */
+    int n_col			/* number of columns in A */
+) ;
+
+void colamd_set_defaults	/* sets default parameters */
+(				/* knobs argument is modified on output */
+    double knobs [COLAMD_KNOBS]	/* parameter settings for colamd */
+) ;
+
+int colamd			/* returns (1) if successful, (0) otherwise*/
+(				/* A and p arguments are modified on output */
+    int n_row,			/* number of rows in A */
+    int n_col,			/* number of columns in A */
+    int Alen,			/* size of the array A */
+    int A [],			/* row indices of A, of size Alen */
+    int p [],			/* column pointers of A, of size n_col+1 */
+    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */
+    int stats [COLAMD_STATS]	/* colamd output statistics and error codes */
+) ;
+
+int symamd				/* return (1) if OK, (0) otherwise */
+(
+    int n,				/* number of rows and columns of A */
+    int A [],				/* row indices of A */
+    int p [],				/* column pointers of A */
+    int perm [],			/* output permutation, size n_col+1 */
+    double knobs [COLAMD_KNOBS],	/* parameters (uses defaults if NULL) */
+    int stats [COLAMD_STATS],		/* output statistics and error codes */
+    void * (*allocate) (size_t, size_t),
+    					/* pointer to calloc (ANSI C) or */
+					/* mxCalloc (for MATLAB mexFunction) */
+    void (*release) (void *)
+    					/* pointer to free (ANSI C) or */
+    					/* mxFree (for MATLAB mexFunction) */
+) ;
+
+void colamd_report
+(
+    int stats [COLAMD_STATS]
+) ;
+
+void symamd_report
+(
+    int stats [COLAMD_STATS]
+) ;
+
+#endif /* COLAMD_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,109 @@
+function [p,stats] = colamd (S, knobs)
+%COLAMD Column approximate minimum degree permutation.
+%    P = COLAMD (S) returns the column approximate minimum degree permutation
+%    vector for the sparse matrix S.  For a non-symmetric matrix S, S (:,P)
+%    tends to have sparser LU factors than S.  The Cholesky factorization of
+%    S (:,P)' * S (:,P) also tends to be sparser than that of S'*S.  COLAMD
+%    tends to be faster than COLMMD and tends to return a better ordering.
+%
+%    See also COLMMD, COLPERM, SPPARMS, SYMAMD, SYMMMD, SYMRCM.
+%
+%    Usage:  P = colamd (S)
+%            P = colamd (S, knobs)
+%            [P, stats] = colamd (S)
+%            [P, stats] = colamd (S, knobs)
+%
+%    knobs is an optional two-element input vector.  If S is m-by-n, then
+%    rows with more than (knobs (1))*n entries are ignored.  Columns with
+%    more than (knobs (2))*m entries are removed prior to ordering, and
+%    ordered last in the output permutation P.  If the knobs parameter is not
+%    present, then 0.5 is used instead, for both knobs (1) and knobs (2). 
+%    knobs (3) controls the printing of statistics and error messages.
+%
+%    stats is an optional 20-element output vector that provides data about the
+%    ordering and the validity of the input matrix S.  Ordering statistics are
+%    in stats (1:3).  stats (1) and stats (2) are the number of dense or empty
+%    rows and columns ignored by COLAMD and stats (3) is the number of
+%    garbage collections performed on the internal data structure used by
+%    COLAMD (roughly of size 2.2*nnz(S) + 4*m + 7*n integers).
+%
+%    MATLAB built-in functions are intended to generate valid sparse matrices,
+%    with no duplicate entries, with ascending row indices of the nonzeros
+%    in each column, with a non-negative number of entries in each column (!)
+%    and so on.  If a matrix is invalid, then COLAMD may or may not be able
+%    to continue.  If there are duplicate entries (a row index appears two or
+%    more times in the same column) or if the row indices in a column are out
+%    of order, then COLAMD can correct these errors by ignoring the duplicate
+%    entries and sorting each column of its internal copy of the matrix S (the
+%    input matrix S is not repaired, however).  If a matrix is invalid in other
+%    ways then COLAMD cannot continue, an error message is printed, and no
+%    output arguments (P or stats) are returned.  COLAMD is thus a simple way
+%    to check a sparse matrix to see if it's valid.
+%
+%    stats (4:7) provide information if COLAMD was able to continue.  The
+%    matrix is OK if stats (4) is zero, or 1 if invalid.  stats (5) is the
+%    rightmost column index that is unsorted or contains duplicate entries,
+%    or zero if no such column exists.  stats (6) is the last seen duplicate
+%    or out-of-order row index in the column index given by stats (5), or zero
+%    if no such row index exists.  stats (7) is the number of duplicate or
+%    out-of-order row indices.
+%
+%    stats (8:20) is always zero in the current version of COLAMD (reserved
+%    for future use).
+%
+%    The ordering is followed by a column elimination tree post-ordering.
+%
+%    Authors:
+%
+%	The authors of the code itself are Stefan I. Larimore and Timothy A.
+%	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+%	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+%	Ng, Oak Ridge National Laboratory.
+%
+%    Date:
+%
+%	September 8, 2003.  Version 2.3.
+%
+%    Acknowledgements:
+%
+%	This work was supported by the National Science Foundation, under
+%	grants DMS-9504974 and DMS-9803599.
+
+%    Notice:
+%
+%	Copyright (c) 1998-2003 by the University of Florida.
+%	All Rights Reserved.
+%
+%	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+%	file) for the License.
+%
+%    Availability:
+%
+%	The colamd/symamd library is available at
+%
+%	    http://www.cise.ufl.edu/research/sparse/colamd/
+%
+
+%-------------------------------------------------------------------------------
+% Perform the colamd ordering:
+%-------------------------------------------------------------------------------
+
+if (nargout <= 1 & nargin == 1)
+    p = colamdmex (S) ;
+elseif (nargout <= 1 & nargin == 2)
+    p = colamdmex (S, knobs) ;
+elseif (nargout == 2 & nargin == 1)
+    [p, stats] = colamdmex (S) ;
+elseif (nargout == 2 & nargin == 2)
+    [p, stats] = colamdmex (S, knobs) ;
+else
+    error ('colamd:  incorrect number of input and/or output arguments') ;
+end
+
+%-------------------------------------------------------------------------------
+% column elimination tree post-ordering:
+%-------------------------------------------------------------------------------
+
+[ignore, q] = sparsfun ('coletree', S (:,p)) ;
+p = p (q) ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd_demo.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,170 @@
+% Demo for colamd:  column approximate minimum degree ordering algorithm.
+% 
+% The following m-files and mexFunctions provide alternative sparse matrix
+% ordering methods for MATLAB.  They are typically faster (sometimes much
+% faster) and typically provide better orderings than their MATLAB counterparts:
+% 
+%	colamd		a replacement for colmmd.
+%
+%			Typical usage:  p = colamd (A) ;
+%
+%	symamd		a replacement for symmmd.  Based on colamd.
+%
+%			Typical usage:  p = symamd (A) ;
+%
+% For a description of the methods used, see the colamd.c file.
+%
+% September 8, 2003.  Version 2.3.
+% http://www.cise.ufl.edu/research/sparse/colamd/
+%
+
+%-------------------------------------------------------------------------------
+% Print the introduction, the help info, and compile the mexFunctions
+%-------------------------------------------------------------------------------
+
+more on
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Colamd/symamd demo.') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+help colamd_demo ;
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Colamd help information:') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+help colamd ;
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Symamd help information:') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+help symamd ;
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'colamd and symamd mexFunctions will now be compiled.') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+s = input ('\n\nHit any key (or type ''n'' to skip compilation): ', 's') ;
+if (~strcmp (s, 'n'))
+    disp ('mex -O colamdmex.c colamd.c') ; mex -O colamdmex.c colamd.c
+    disp ('mex -O symamdmex.c colamd.c') ; mex -O symamdmex.c colamd.c
+end
+
+%-------------------------------------------------------------------------------
+% Solving Ax=b
+%-------------------------------------------------------------------------------
+
+n = 100 ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Solving Ax=b for a small %d-by-%d random matrix:', n, n) ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, '\nNOTE: Random sparse matrices are AWFUL test cases.\n') ;
+fprintf (1, 'They''re just easy to generate in a demo.\n') ;
+
+% set up the system
+
+rand ('state', 0) ;
+randn ('state', 0) ;
+spparms ('default') ;
+A = sprandn (n, n, 5/n) + speye (n) ;
+b = (1:n)' ;
+
+fprintf (1, '\n\nSolving via lu (PAQ = LU), where Q is from colamd:\n') ;
+q = colamd (A) ;
+I = speye (n) ;
+Q = I (:, q) ;
+[L,U,P] = lu (A*Q) ;
+fl = luflops (L, U) ;
+x = Q * (U \ (L \ (P * b))) ;
+fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q):          %d\n', fl) ;
+fprintf (1, 'residual:                                     %e\n', norm (A*x-b));
+
+fprintf (1, '\n\nSolving via lu (PAQ = LU), where Q is from colmmd:\n') ;
+q = colmmd (A) ;
+I = speye (n) ;
+Q = I (:, q) ;
+[L,U,P] = lu (A*Q) ;
+fl = luflops (L, U) ;
+x = Q * (U \ (L \ (P * b))) ;
+fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q):          %d\n', fl) ;
+fprintf (1, 'residual:                                     %e\n', norm (A*x-b));
+
+fprintf (1, '\n\nSolving via lu (PA = LU), without regard for sparsity:\n') ;
+[L,U,P] = lu (A) ;
+fl = luflops (L, U) ;
+x = U \ (L \ (P * b)) ;
+fprintf (1, '\nFlop count for [L,U,P] = lu (A*Q):          %d\n', fl) ;
+fprintf (1, 'residual:                                     %e\n', norm (A*x-b));
+
+%-------------------------------------------------------------------------------
+% Large demo for colamd
+%-------------------------------------------------------------------------------
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Large demo for colamd (symbolic analysis only):') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+
+rand ('state', 0) ;
+randn ('state', 0) ;
+spparms ('default') ;
+n = 1000 ;
+fprintf (1, 'Generating a random %d-by-%d sparse matrix.\n', n, n) ;
+A = sprandn (n, n, 5/n) + speye (n) ;
+
+fprintf (1, '\n\nUnordered matrix:\n') ;
+lnz = symbfact (A, 'col') ;
+fprintf (1, 'nz in Cholesky factors of A''A:            %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A''A:           %d\n', sum (lnz.^2)) ;
+
+tic ;
+p = colamd (A) ;
+t = toc ;
+lnz = symbfact (A (:,p), 'col') ;
+fprintf (1, '\n\nColamd run time:                          %f\n', t) ;
+fprintf (1, 'colamd ordering quality: \n') ;
+fprintf (1, 'nz in Cholesky factors of A(:,p)''A(:,p):  %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A(:,p)''A(:,p): %d\n', sum (lnz.^2)) ;
+
+tic ;
+p = colmmd (A) ;
+t = toc ;
+lnz = symbfact (A (:,p), 'col') ;
+fprintf (1, '\n\nColmmd run time:                          %f\n', t) ;
+fprintf (1, 'colmmd ordering quality: \n') ;
+fprintf (1, 'nz in Cholesky factors of A(:,p)''A(:,p):  %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A(:,p)''A(:,p): %d\n', sum (lnz.^2)) ;
+
+%-------------------------------------------------------------------------------
+% Large demo for symamd
+%-------------------------------------------------------------------------------
+
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+fprintf (1, 'Large demo for symamd (symbolic analysis only):') ;
+fprintf (1, '\n-----------------------------------------------------------\n') ;
+
+fprintf (1, 'Generating a random symmetric %d-by-%d sparse matrix.\n', n, n) ;
+A = A+A' ;
+
+fprintf (1, '\n\nUnordered matrix:\n') ;
+lnz = symbfact (A, 'sym') ;
+fprintf (1, 'nz in Cholesky factors of A:       %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A:      %d\n', sum (lnz.^2)) ;
+
+tic ;
+p = symamd (A) ;
+t = toc ;
+lnz = symbfact (A (p,p), 'sym') ;
+fprintf (1, '\n\nSymamd run time:                   %f\n', t) ;
+fprintf (1, 'symamd ordering quality: \n') ;
+fprintf (1, 'nz in Cholesky factors of A(p,p):  %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A(p,p): %d\n', sum (lnz.^2)) ;
+
+tic ;
+p = symmmd (A) ;
+t = toc ;
+lnz = symbfact (A (p,p), 'sym') ;
+fprintf (1, '\n\nSymmmd run time:                   %f\n', t) ;
+fprintf (1, 'symmmd ordering quality: \n') ;
+fprintf (1, 'nz in Cholesky factors of A(p,p):  %d\n', sum (lnz)) ;
+fprintf (1, 'flop count for Cholesky of A(p,p): %d\n', sum (lnz.^2)) ;
+
+more off
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd_example.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,182 @@
+/* ========================================================================== */
+/* === colamd and symamd example ============================================ */
+/* ========================================================================== */
+
+/*
+    colamd example of use, to order the columns of a 5-by-4 matrix with
+    11 nonzero entries in the following nonzero pattern, with default knobs.
+
+       x 0 x 0
+       x 0 x x
+       0 x x 0
+       0 0 x x
+       x x 0 0
+
+    symamd example of use, to order the rows and columns of a 5-by-5
+    matrix with 13 nonzero entries in the following nonzero pattern,
+    with default knobs.
+
+       x x 0 0 0
+       x x x x 0
+       0 x x 0 0
+       0 x 0 x x
+       0 0 0 x x
+
+    (where x denotes a nonzero value).
+
+    September 8, 2003.  Version 2.3.
+
+    See http://www.cise.ufl.edu/research/sparse/colamd/ (the colamd.c file)
+    for the routines this program calls, and for the License.
+*/
+
+/* ========================================================================== */
+
+#include <stdio.h>
+#include "colamd.h"
+
+#define A_NNZ 11
+#define A_NROW 5
+#define A_NCOL 4
+#define ALEN (COLAMD_RECOMMENDED (A_NNZ, A_NCOL, A_NROW))
+
+#define B_NNZ 4
+#define B_N 5
+
+int main (int argc, char **argv)
+{
+
+    /* ====================================================================== */
+    /* input matrix A definition */
+    /* ====================================================================== */
+
+    int A [ALEN] = {
+
+    	0, 1, 4,		/* row indices of nonzeros in column 0 */
+	2, 4,			/* row indices of nonzeros in column 1 */
+	0, 1, 2, 3,		/* row indices of nonzeros in column 2 */
+	1, 3} ;			/* row indices of nonzeros in column 3 */
+
+    int p [ ] = {
+
+    	0,			/* column 0 is in A [0..2] */
+	3,			/* column 1 is in A [3..4] */ 
+	5,			/* column 2 is in A [5..8] */
+	9,			/* column 3 is in A [9..10] */
+	A_NNZ} ;		/* number of nonzeros in A */
+
+    /* ====================================================================== */
+    /* input matrix B definition */
+    /* ====================================================================== */
+
+    int B [ ] = {		/* Note: only strictly lower triangular part */
+    				/* is included, since symamd ignores the */
+				/* diagonal and upper triangular part of B. */
+
+    	1,			/* row indices of nonzeros in column 0 */
+    	2, 3,			/* row indices of nonzeros in column 1 */
+    				/* row indices of nonzeros in column 2 (none) */
+    	4			/* row indices of nonzeros in column 3 */
+    	} ;			/* row indices of nonzeros in column 4 (none) */
+
+    int q [ ] = {
+
+    	0,			/* column 0 is in B [0] */
+	1,			/* column 1 is in B [1..2] */ 
+	3,			/* column 2 is empty */
+	3,			/* column 3 is in B [3] */
+	4,			/* column 4 is empty */
+	B_NNZ} ;		/* number of nonzeros in strictly lower B */
+
+    /* ====================================================================== */
+    /* other variable definitions */
+    /* ====================================================================== */
+
+    int perm [B_N+1] ;		/* note the size is N+1 */
+    int stats [COLAMD_STATS] ;	/* for colamd and symamd output statistics */
+
+    int row, col, pp, length, ok ;
+
+    /* ====================================================================== */
+    /* dump the input matrix A */
+    /* ====================================================================== */
+
+    printf ("colamd %d-by-%d input matrix:\n", A_NROW, A_NCOL) ;
+    for (col = 0 ; col < A_NCOL ; col++)
+    {
+	length = p [col+1] - p [col] ;
+    	printf ("Column %d, with %d entries:\n", col, length) ;
+	for (pp = p [col] ; pp < p [col+1] ; pp++)
+	{
+	    row = A [pp] ;
+	    printf ("    row %d\n", row) ;
+	}
+    }
+
+    /* ====================================================================== */
+    /* order the matrix.  Note that this destroys A and overwrites p */
+    /* ====================================================================== */
+
+    ok = colamd (A_NROW, A_NCOL, ALEN, A, p, (double *) NULL, stats) ;
+    colamd_report (stats) ;
+
+    if (!ok)
+    {
+	printf ("colamd error!\n") ;
+	exit (1) ;
+    }
+
+    /* ====================================================================== */
+    /* print the column ordering */
+    /* ====================================================================== */
+
+    printf ("colamd column ordering:\n") ;
+    printf ("1st column: %d\n", p [0]) ;
+    printf ("2nd column: %d\n", p [1]) ;
+    printf ("3rd column: %d\n", p [2]) ;
+    printf ("4th column: %d\n", p [3]) ;
+
+    /* ====================================================================== */
+    /* dump the strictly lower triangular part of symmetric input matrix B */
+    /* ====================================================================== */
+
+    printf ("\n\nsymamd %d-by-%d input matrix:\n", B_N, B_N) ;
+    printf ("Entries in strictly lower triangular part:\n") ;
+    for (col = 0 ; col < B_N ; col++)
+    {
+	length = q [col+1] - q [col] ;
+    	printf ("Column %d, with %d entries:\n", col, length) ;
+	for (pp = q [col] ; pp < q [col+1] ; pp++)
+	{
+	    row = B [pp] ;
+	    printf ("    row %d\n", row) ;
+	}
+    }
+
+    /* ====================================================================== */
+    /* order the matrix B.  Note that this does not modify B or q. */
+    /* ====================================================================== */
+
+    ok = symamd (B_N, B, q, perm, (double *) NULL, stats, &calloc, &free) ;
+    symamd_report (stats) ;
+
+    if (!ok)
+    {
+	printf ("symamd error!\n") ;
+	exit (1) ;
+    }
+
+    /* ====================================================================== */
+    /* print the symmetric ordering */
+    /* ====================================================================== */
+
+    printf ("symamd column ordering:\n") ;
+    printf ("1st row/column: %d\n", perm [0]) ;
+    printf ("2nd row/column: %d\n", perm [1]) ;
+    printf ("3rd row/column: %d\n", perm [2]) ;
+    printf ("4th row/column: %d\n", perm [3]) ;
+    printf ("5th row/column: %d\n", perm [4]) ;
+
+    exit (0) ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd_example.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,48 @@
+colamd 5-by-4 input matrix:
+Column 0, with 3 entries:
+    row 0
+    row 1
+    row 4
+Column 1, with 2 entries:
+    row 2
+    row 4
+Column 2, with 4 entries:
+    row 0
+    row 1
+    row 2
+    row 3
+Column 3, with 2 entries:
+    row 1
+    row 3
+colamd: OK.  
+colamd: number of dense or empty rows ignored:           1
+colamd: number of dense or empty columns ignored:        2
+colamd: number of garbage collections performed:         0
+colamd column ordering:
+1st column: 1
+2nd column: 3
+3rd column: 0
+4th column: 2
+
+
+symamd 5-by-5 input matrix:
+Entries in strictly lower triangular part:
+Column 0, with 1 entries:
+    row 1
+Column 1, with 2 entries:
+    row 2
+    row 3
+Column 2, with 0 entries:
+Column 3, with 1 entries:
+    row 4
+Column 4, with 0 entries:
+symamd: OK.  
+symamd: number of dense or empty rows ignored:           0
+symamd: number of dense or empty columns ignored:        0
+symamd: number of garbage collections performed:         0
+symamd column ordering:
+1st row/column: 0
+2nd row/column: 2
+3rd row/column: 1
+4th row/column: 3
+5th row/column: 4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamd_test.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,521 @@
+function colamd_test (spumoni)
+%
+% colamd_test (spumoni)
+%
+% COLAMD and SYMAMD testing function.  Here we try to give colamd and symamd
+% every possible type of matrix and erroneous input that they may encounter. 
+% We want either a valid permutation returned or we want them to fail
+% gracefully.  If the optional spumoni argument is present, additional
+% diagnostic messages are printed during the test:
+%
+% spumoni:
+%   0: very little, just a progress meter (default)
+%   1: lots
+%   2: far too much
+%
+% You are prompted as to whether or not the colamd and symand routines and
+% the test mexFunctions are to be compiled.
+%
+% Tim Davis
+% September 8, 2003.  Version 2.3.
+% http://www.cise.ufl.edu/research/sparse/colamd/
+
+help colamd_test
+
+s = input (...
+'Compile colamd, symand, and the test codes? (y/n, default is yes): ', 's') ;
+
+do_compile = 1 ;
+if (~isempty (s))
+    if (s (1) == 'n' | s (1) == 'N')
+	do_compile = 0 ;
+    end
+end
+
+if (do_compile)
+    fprintf ('Compiling colamd, symamd, and test mexFunctions.\n') ;
+    fprintf ('mex -O colamdmex.c colamd.c\n') ;
+    mex -O colamdmex.c colamd.c
+    fprintf ('mex -O symamdmex.c colamd.c\n') ;
+    mex -O symamdmex.c colamd.c
+    fprintf ('mex -O colamdtestmex.c colamd.c\n') ;
+    mex -O colamdtestmex.c colamd.c
+    fprintf ('mex -O symamdtestmex.c colamd.c\n') ;
+    mex -O symamdtestmex.c colamd.c
+    fprintf ('Done compiling.\n') ; 
+end
+    
+fprintf ('\nThe following codes will be tested:\n') ;
+which colamd 
+which symamd
+which colamdmex
+which symamdmex
+
+fprintf ('\nStarting the tests.  Please be patient.\n') ;
+
+rand ('state', 0) ;
+randn ('state', 0) ;
+if (nargin < 1)
+    spumoni = 0 ;
+end
+old = spparms ('spumoni') ;
+spparms ('spumoni', spumoni) ;
+
+
+fprintf ('Null matrices') ;
+A = zeros (0,0) ;
+A = sparse (A) ;
+
+[p, stats] = colamd (A, [.5 .5 spumoni]) ;
+check_perm (p, A) ;
+
+[p, stats] = symamd (A, [.5 spumoni]) ;
+check_perm (p, A) ;
+
+A = zeros (0, 100) ;
+A = sparse (A) ;
+[p, stats] = colamd (A, [.5 .5 spumoni]) ;
+check_perm (p, A) ;
+
+A = zeros (100, 0) ;
+A = sparse (A) ;
+[p, stats] = colamd (A, [.5 .5 spumoni]) ;
+check_perm (p, A) ;
+fprintf (' OK\n') ;
+
+
+fprintf ('Matrices with a few dense row/cols\n') ;
+
+for trial = 1:20
+
+    % random square unsymmetric matrix
+    A = rand_matrix (1000, 1000, 1, 10, 20) ;
+    [m n] = size (A) ;
+
+
+    for tol = [0 0.001 0.005 0.01:0.01:0.10 0.5:.1:1]
+
+	[p, stats] = colamd (A, [tol tol spumoni]) ;
+	check_perm (p, A) ;
+
+	B = A + A' ;
+	[p, stats] = symamd (B, [tol spumoni]) ;
+	check_perm (p, A) ;
+
+	[p, stats] = colamd (A, [tol 1 spumoni]) ;
+	check_perm (p, A) ;
+
+	[p, stats] = colamd (A, [1 tol spumoni]) ;
+	check_perm (p, A) ;
+
+	fprintf ('.') ;
+
+    end
+end
+fprintf (' OK\n') ;
+
+fprintf ('General matrices\n') ;
+for trial = 1:400
+
+    % matrix of random mtype
+    mtype = irand (3) ;
+    A = rand_matrix (2000, 2000, mtype, 0, 0) ;
+    [m n] = size (A) ;
+    p = colamd (A) ;
+    check_perm (p, A) ;
+    if (mtype == 3)
+	p = symamd (A) ;
+	check_perm (p, A) ;
+    end
+
+    fprintf ('.') ;
+end
+fprintf (' OK\n') ;
+
+fprintf ('Test error handling with invalid inputs\n') ;
+
+% Check different erroneous input.
+for trial = 1:30
+
+    A = rand_matrix (1000, 1000, 2, 0, 0) ;
+    [m n] = size (A) ;
+
+    for err = 1:13
+
+        p = Tcolamd (A, [1 1 spumoni 0 err]) ;
+        if p ~= -1 
+	    check_perm (p, A) ;
+	end
+
+	if (err == 1)
+	    % check different (valid) input args to colamd
+	    p = Acolamd (A, spumoni) ;
+
+	    p2 = Acolamd (A, spumoni, [.5 .5 spumoni 0 0]) ;
+	    if (any (p ~= p2))
+		error ('colamd: mismatch 1!') ;
+	    end
+	    [p2 stats] = Acolamd (A, spumoni) ;
+	    if (any (p ~= p2))
+		error ('colamd: mismatch 2!') ;
+	    end
+	    [p2 stats] = Acolamd (A, spumoni, [.5 .5 spumoni 0 0]) ;
+	    if (any (p ~= p2))
+		error ('colamd: mismatch 3!') ;
+	    end
+	end
+
+	B = A'*A ;
+        p = Tsymamd (B, [1 spumoni err]) ;
+        if p ~= -1 
+	    check_perm (p, A) ;
+	end
+
+	if (err == 1)
+
+	    % check different (valid) input args to symamd
+	    p = Asymamd (B, spumoni) ;
+	    check_perm (p, A) ;
+	    p2 = Asymamd (B, spumoni, [.5 spumoni 0]) ;
+	    if (any (p ~= p2))
+		error ('symamd: mismatch 1!') ;
+	    end
+	    [p2 stats] = Asymamd (B, spumoni) ;
+	    if (any (p ~= p2))
+		error ('symamd: mismatch 2!') ;
+	    end
+	    [p2 stats] = Asymamd (B, spumoni, [.5 spumoni 0]) ;
+	    if (any (p ~= p2))
+		error ('symamd: mismatch 3!') ;
+	    end
+	end
+
+	fprintf ('.') ;
+    end
+
+end
+fprintf (' OK\n') ;
+
+fprintf ('Matrices with a few empty columns\n') ;
+
+for trial = 1:400
+
+    % some are square, some are rectangular
+    n = 0 ;
+    while (n < 5)
+	A = rand_matrix (1000, 1000, irand (2), 0, 0) ;
+	[m n] = size (A) ;
+    end
+
+    % Add 5 null columns at random locations.
+    null_col = randperm (n) ;
+    null_col = sort (null_col (1:5)) ;
+    A (:, null_col) = 0 ;
+
+    % Order the matrix and make sure that the null columns are ordered last.
+    [p, stats] = colamd (A, [1 1 spumoni]) ;
+    check_perm (p, A) ;
+
+    if (stats (2) ~= 5)
+	error ('colamd: wrong number of null columns') ;
+    end
+    if (any (null_col ~= p ((n-4):n)))
+	error ('colamd: Null cols are not ordered last in natural order') ;
+    end
+
+    fprintf ('.') ;
+
+end
+fprintf (' OK\n') ;
+
+fprintf ('Matrices with a few empty rows and columns\n') ;
+
+for trial = 1:400
+
+    % symmetric matrices
+    n = 0 ;
+    while (n < 5)
+	A = rand_matrix (1000, 1000, 3, 0, 0) ;
+	[m n] = size (A) ;
+    end
+
+    % Add 5 null columns and rows at random locations.
+    null_col = randperm (n) ;
+    null_col = sort (null_col (1:5)) ;
+    A (:, null_col) = 0 ;
+    A (null_col, :) = 0 ;
+
+    % Order the matrix and make sure that the null rows/cols are ordered last.
+    [p,stats] = symamd (A, [1 spumoni]) ;
+    check_perm (p, A) ;
+
+    % find actual number of null rows and columns
+    Alo = tril (A, -1) ;
+    nnull = length (find (sum (Alo') == 0 & sum (Alo) == 0)) ;
+
+    if (stats (2) ~= nnull | nnull < 5)
+	error ('symamd: wrong number of null columns') ;
+    end
+    if (any (null_col ~= p ((n-4):n)))
+	error ('symamd: Null cols are not ordered last in natural order') ;
+    end
+
+    fprintf ('.') ;
+
+end
+fprintf (' OK\n') ;
+
+fprintf ('Matrices with a few empty rows\n') ;
+
+% Test matrices with null rows inserted.
+
+for trial = 1:400
+
+    m = 0 ;
+    while (m < 5)
+	A = rand_matrix (1000, 1000, 2, 0, 0) ;
+	[m n] = size (A) ;
+    end
+
+    % Add 5 null rows at random locations.
+    null_row = randperm (m) ;
+    null_row = sort (null_row (1:5)) ;
+    A (null_row, :) = 0 ;
+
+    p = colamd (A, [.5 .5 spumoni]) ;
+    check_perm (p, A) ;
+    if (stats (1) ~= 5)
+	error ('colamd: wrong number of null rows') ;
+    end
+    fprintf ('.') ;
+end
+fprintf (' OK\n') ;
+
+
+fprintf ('\ncolamd and symamd:  all tests passed\n\n') ;
+spparms ('spumoni', old) ;
+
+%-------------------------------------------------------------------------------
+% Acolamd:  compare colamd and Tcolamd results
+%-------------------------------------------------------------------------------
+
+function [p,stats] = Acolamd (S, spumoni, knobs)
+
+if (nargin < 2)
+    spumoni = 0 ;
+end
+
+if (nargin < 3)
+    if (nargout == 1)
+	[p] = colamd (S) ;
+	[p1] = Tcolamd (S, [.5 .5 spumoni 0 0]) ;
+    else
+	[p, stats] = colamd (S) ;
+	[p1, stats1] = Tcolamd (S, [.5 .5 spumoni 0 0]) ;
+    end
+else
+    if (nargout == 1)
+	[p] = colamd (S, knobs (1:3)) ;
+	[p1] = Tcolamd (S, knobs) ;
+    else
+	[p, stats] = colamd (S, knobs (1:3)) ;
+	[p1, stats1] = Tcolamd (S, knobs) ;
+    end
+end
+
+check_perm (p, S) ;
+check_perm (p1, S) ;
+
+if (any (p1 ~= p))
+    error ('Acolamd mismatch!') ;
+end
+
+
+%-------------------------------------------------------------------------------
+% Asymamd:  compare symamd and Tsymamd results
+%-------------------------------------------------------------------------------
+
+function [p,stats] = Asymamd (S, spumoni, knobs)
+
+if (nargin < 2)
+    spumoni = 0 ;
+end
+
+if (nargin < 3)
+    if (nargout == 1)
+	[p] = symamd (S) ;
+	[p1] = Tsymamd (S, [.5 spumoni 0]) ;
+    else
+	[p, stats] = symamd (S) ;
+	[p1, stats1] = Tsymamd (S, [.5 spumoni 0]) ;
+    end
+else
+    if (nargout == 1)
+	[p] = symamd (S, knobs (1:2)) ;
+	[p1] = Tsymamd (S, knobs) ;
+    else
+	[p, stats] = symamd (S, knobs (1:2)) ;
+	[p1, stats1] = Tsymamd (S, knobs) ;
+    end
+end
+
+if (any (p1 ~= p))
+    error ('Asymamd mismatch!') ;
+end
+
+
+%-------------------------------------------------------------------------------
+% check_perm:  check for a valid permutation vector
+%-------------------------------------------------------------------------------
+
+function check_perm (p, A)
+
+if (isempty (A) & isempty (p))
+    % empty permutation vectors of empty matrices are OK
+    return
+end
+
+if (isempty (p))
+    error ('bad permutation: cannot be empty') ;
+end
+
+[m n] = size (A) ;
+[pm pn] = size (p) ;
+if (pn == 1)
+    % force p to be a row vector
+    p = p' ;
+    [pm pn] = size (p) ;
+end
+
+if (n ~= pn)
+    error ('bad permutation: wrong size') ;
+end
+
+if (pm ~= 1) ;
+    % p must be a vector
+    error ('bad permutation: not a vector') ;
+else
+    if (any (sort (p) - (1:pn)))
+	error ('bad permutation') ;
+    end
+end
+
+%-------------------------------------------------------------------------------
+% irand: return a random integer between 1 and n
+%-------------------------------------------------------------------------------
+
+function i = irand (n)
+i = min (n, 1 + floor (rand * n)) ;
+
+%-------------------------------------------------------------------------------
+% rand_matrix:  return a random sparse matrix
+%-------------------------------------------------------------------------------
+
+function A = rand_matrix (nmax, mmax, mtype, drows, dcols)
+%
+% A = rand_matrix (nmax, mmax, mtype, drows, dcols)
+%
+% A binary matrix of random size, at most nmax-by-mmax, with drows dense rows
+% and dcols dense columns.
+%
+% mtype 1: square unsymmetric (mmax is ignored)
+% mtype 2: rectangular
+% mtype 3: symmetric (mmax is ignored)
+
+n = irand (nmax) ;
+if (mtype ~= 2)
+    % square
+    m = n ;
+else
+    m = irand (mmax) ;
+end
+
+A = sprand (m, n, 10 / max (m,n)) ;
+
+if (drows > 0)
+    % add dense rows
+    for k = 1:drows
+	i = irand (m) ;
+	nz = irand (n) ;
+	p = randperm (n) ;
+	p = p (1:nz) ;
+	A (i,p) = 1 ;
+    end
+end
+
+if (dcols > 0)
+    % add dense cols
+    for k = 1:dcols
+	j = irand (n) ;
+	nz = irand (m) ;
+	p = randperm (m) ;
+	p = p (1:nz) ;
+	A (p,j) = 1 ;
+    end
+end
+
+A = spones (A) ;
+
+% ensure that there are no empty columns
+d = find (full (sum (A)) == 0) ;
+A (m,d) = 1 ;
+
+% ensure that there are no empty rows
+d = find (full (sum (A,2)) == 0) ;
+A (d,n) = 1 ;
+
+if (mtype == 3)
+    % symmetric
+    A = A + A' + speye (n) ;
+end
+
+A = spones (A) ;
+
+%-------------------------------------------------------------------------------
+% Tcolamd:  run colamd in a testing mode
+%-------------------------------------------------------------------------------
+
+function [p,stats] = Tcolamd (S, knobs)
+
+if (nargout <= 1 & nargin == 1)
+    p = colamdtestmex (S) ;
+elseif (nargout <= 1 & nargin == 2)
+    p = colamdtestmex (S, knobs) ;
+elseif (nargout == 2 & nargin == 1)
+    [p, stats] = colamdtestmex (S) ;
+elseif (nargout == 2 & nargin == 2)
+    [p, stats] = colamdtestmex (S, knobs) ;
+else
+    error ('colamd:  incorrect number of input and/or output arguments') ;
+end
+
+if (p (1) ~= -1)
+    [ignore, q] = sparsfun ('coletree', S (:,p)) ;
+    p = p (q) ;
+    check_perm (p, S) ;
+end
+
+%-------------------------------------------------------------------------------
+% Tsymamd: run symamd in a testing mode
+%-------------------------------------------------------------------------------
+
+function [p, stats] = Tsymamd (S, knobs)
+
+if (nargout <= 1 & nargin == 1)
+    p = symamdtestmex (S) ;
+elseif (nargout <= 1 & nargin == 2)
+    p = symamdtestmex (S, knobs) ;
+elseif (nargout == 2 & nargin == 1)
+    [p, stats] = symamdtestmex (S) ;
+elseif (nargout == 2 & nargin == 2)
+    [p, stats] = symamdtestmex (S, knobs) ;
+else
+    error ('symamd:  incorrect number of input and/or output arguments') ;
+end
+
+if (p (1) ~= -1)
+    [ignore, q] = sparsfun ('symetree', S (p,p)) ;
+    p = p (q) ;
+    check_perm (p, S) ;
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamdmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,250 @@
+/* ========================================================================== */
+/* === colamd mexFunction =================================================== */
+/* ========================================================================== */
+
+/*
+    Usage:
+
+	P = colamd (A) ;
+
+	P = colamd (A, knobs) ;
+
+	[ P, stats ] = colamd (A) ;
+
+	[ P, stats ] = colamd (A, knobs) ;
+
+    Returns a permutation vector P such that the LU factorization of A (:,P)
+    tends to be sparser than that of A.  The Cholesky factorization of
+    (A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A.
+    This routine provides the same functionality as COLMMD, but is much faster
+    and returns a better permutation vector.  Note that the COLMMD m-file in
+    MATLAB 5.2 also performs a column elimination tree post-ordering.  This
+    mexFunction does not do this post-ordering.  This mexFunction is a
+    replacement for the p = sparsfun ('colmmd', A) operation.
+
+    The knobs and stats vectors are optional:
+
+	knobs (1)	rows with more than (knobs (1))*n_col entries
+			are removed prior to ordering.  If knobs is not present,
+			then the default is used (0.5).
+
+	knobs (2)	columns with more than (knobs (2))*n_row entries
+			are removed prior to ordering, and placed last in the
+			column permutation.  If knobs is not present,
+			then the default is used (0.5).
+
+	knobs (3)	print level, similar to spparms ('spumoni')
+
+	stats (1)	the number of dense (or empty) rows ignored
+
+	stats (2)	the number of dense (or empty) columms.  These
+			are ordered last, in their natural order.
+
+	stats (3)	the number of garbage collections performed.
+
+	stats (4)	return status:
+
+			0:  matrix is a valid MATLAB matrix.
+
+			1:  matrix has duplicate entries or unsorted columns.
+			    This should not occur in a valid MATLAB matrix,
+			    but the ordering proceeded anyway by sorting the
+			    row indices in each column and by ignoring the
+			    duplicate row indices in each column.  See
+			    stats (5:7) for more information.
+
+	stats (5)	highest numbered column that is unsorted or has
+			duplicate entries (zero if none)
+
+	stats (6)	last seen duplicate or unsorted row index
+			(zero if none)
+
+	stats (7)	number of duplicate or unsorted row indices
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Notice:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+	file) for the License.
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the http://www.cise.ufl.edu/research/sparse/colamd/colamdmex.c
+	file.  It requires the colamd.c and colamd.h files.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include "colamd.h"
+#include "mex.h"
+#include "matrix.h"
+#include <stdlib.h>
+#include <string.h>
+
+/* ========================================================================== */
+/* === colamd mexFunction =================================================== */
+/* ========================================================================== */
+
+void mexFunction
+(
+    /* === Parameters ======================================================= */
+
+    int nlhs,			/* number of left-hand sides */
+    mxArray *plhs [],		/* left-hand side matrices */
+    int nrhs,			/* number of right--hand sides */
+    const mxArray *prhs []	/* right-hand side matrices */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *A ;			/* colamd's copy of the matrix, and workspace */
+    int *p ;			/* colamd's copy of the column pointers */
+    int Alen ;			/* size of A */
+    int n_col ;			/* number of columns of A */
+    int n_row ;			/* number of rows of A */
+    int nnz ;			/* number of entries in A */
+    int full ;			/* TRUE if input matrix full, FALSE if sparse */
+    double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */
+    double *out_perm ;		/* output permutation vector */
+    double *out_stats ;		/* output stats vector */
+    double *in_knobs ;		/* input knobs vector */
+    int i ;			/* loop counter */
+    mxArray *Ainput ;		/* input matrix handle */
+    int spumoni ;		/* verbosity variable */
+    int stats [COLAMD_STATS] ;	/* stats for colamd */
+
+    /* === Check inputs ===================================================== */
+
+    if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2)
+    {
+	mexErrMsgTxt (
+	"colamd: incorrect number of input and/or output arguments") ;
+    }
+
+    /* === Get knobs ======================================================== */
+
+    colamd_set_defaults (knobs) ;
+    spumoni = 0 ;
+
+    /* check for user-passed knobs */
+    if (nrhs == 2)
+    {
+	in_knobs = mxGetPr (prhs [1]) ;
+	i = mxGetNumberOfElements (prhs [1]) ;
+	if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ;
+	if (i > 1) knobs [COLAMD_DENSE_COL] = in_knobs [COLAMD_DENSE_COL] ;
+	if (i > 2) spumoni = (int) in_knobs [2] ;
+    }
+
+    /* print knob settings if spumoni is set */
+    if (spumoni > 0)
+    {
+	mexPrintf ("colamd: dense row fraction: %f\n",
+	    knobs [COLAMD_DENSE_ROW]) ;
+	mexPrintf ("colamd: dense col fraction: %f\n",
+	    knobs [COLAMD_DENSE_COL]) ;
+    }
+
+    /* === If A is full, convert to a sparse matrix ========================= */
+
+    Ainput = (mxArray *) prhs [0] ;
+    if (mxGetNumberOfDimensions (Ainput) != 2)
+    {
+	mexErrMsgTxt ("colamd: input matrix must be 2-dimensional") ;
+    }
+    full = !mxIsSparse (Ainput) ;
+    if (full)
+    {
+	mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ;
+    }
+
+    /* === Allocate workspace for colamd ==================================== */
+
+    /* get size of matrix */
+    n_row = mxGetM (Ainput) ;
+    n_col = mxGetN (Ainput) ;
+
+    /* get column pointer vector so we can find nnz */
+    p = (int *) mxCalloc (n_col+1, sizeof (int)) ;
+    (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ;
+    nnz = p [n_col] ;
+    Alen = colamd_recommended (nnz, n_row, n_col) ;
+
+    /* === Copy input matrix into workspace ================================= */
+
+    A = (int *) mxCalloc (Alen, sizeof (int)) ;
+    (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ;
+
+    if (full)
+    {
+	mxDestroyArray (Ainput) ;
+    }
+
+    /* === Order the columns (destroys A) =================================== */
+
+    if (!colamd (n_row, n_col, Alen, A, p, knobs, stats))
+    {
+	colamd_report (stats) ;
+	mexErrMsgTxt ("colamd error!") ;
+    }
+    mxFree (A) ;
+
+    /* === Return the permutation vector ==================================== */
+
+    plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ;
+    out_perm = mxGetPr (plhs [0]) ;
+    for (i = 0 ; i < n_col ; i++)
+    {
+	/* colamd is 0-based, but MATLAB expects this to be 1-based */
+	out_perm [i] = p [i] + 1 ;
+    }
+    mxFree (p) ;
+
+    /* === Return the stats vector ========================================== */
+
+    /* print stats if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	colamd_report (stats) ;
+    }
+
+    if (nlhs == 2)
+    {
+	plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ;
+	out_stats = mxGetPr (plhs [1]) ;
+	for (i = 0 ; i < COLAMD_STATS ; i++)
+	{
+	    out_stats [i] = stats [i] ;
+	}
+
+	/* fix stats (5) and (6), for 1-based information on jumbled matrix. */
+	/* note that this correction doesn't occur if symamd returns FALSE */
+	out_stats [COLAMD_INFO1] ++ ; 
+	out_stats [COLAMD_INFO2] ++ ; 
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/colamdtestmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,594 @@
+/* ========================================================================== */
+/* === colamdtest mexFunction =============================================== */
+/* ========================================================================== */
+
+/*
+    This MATLAB mexFunction is for testing only.  It is not meant for
+    production use.  See colamdmex.c instead.
+
+    Usage:
+
+	[ P, stats ] = colamdtest (A, knobs) ;
+
+    Returns a permutation vector P such that the LU factorization of A (:,P)
+    tends to be sparser than that of A.  The Cholesky factorization of
+    (A (:,P))'*(A (:,P)) will also tend to be sparser than that of A'*A.
+    This routine provides the same functionality as COLMMD, but is much faster
+    and returns a better permutation vector.  Note that the COLMMD m-file in
+    MATLAB 5.2 also performs a column elimination tree post-ordering.  This
+    mexFunction does not do this post-ordering.  This mexFunction is a
+    replacement for the p = sparsfun ('colmmd', A) operation.
+
+    The knobs and stats vectors are optional:
+
+	knobs (1)	rows with more than (knobs (1))*n_col entries
+			are removed prior to ordering.  If knobs is not present,
+			then the default is used (0.5).
+
+	knobs (2)	columns with more than (knobs (2))*n_row entries
+			are removed prior to ordering, and placed last in the
+			column permutation.  If knobs is not present,
+			then the default is used (0.5).
+
+	knobs (3)	print level, similar to spparms ('spumoni')
+
+	knobs (4)	for testing only.  Controls the workspace used by
+			colamd.
+
+	knobs (5)	for testing only.  Controls how the input matrix is
+			jumbled prior to calling colamd, to test its error
+			handling capability.
+
+	stats (1)	the number of dense (or empty) rows ignored
+
+	stats (2)	the number of dense (or empty) columms.  These
+			are ordered last, in their natural order.
+
+	stats (3)	the number of garbage collections performed.
+
+	stats (4)	return status:
+
+			0:  matrix is a valid MATLAB matrix.
+
+			1:  matrix has duplicate entries or unsorted columns.
+			    This should not occur in a valid MATLAB matrix,
+			    but the ordering proceeded anyway by sorting the
+			    row indices in each column and by ignoring the
+			    duplicate row indices in each column.  See
+			    stats (5:7) for more information.
+
+	stats (5)	highest numbered column that is unsorted or has
+			duplicate entries (zero if none)
+
+	stats (6)	last seen duplicate or unsorted row index
+			(zero if none)
+
+	stats (7)	number of duplicate or unsorted row indices
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Notice:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+	file) for the License.
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the
+	http://www.cise.ufl.edu/research/sparse/colamd/colamdtestmex.c
+       	file.  It requires the colamd.c and colamd.h files.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include "colamd.h"
+#include "mex.h"
+#include "matrix.h"
+#include <stdlib.h>
+#include <string.h>
+
+static void dump_matrix
+(
+    int A [ ],
+    int p [ ],
+    int n_row,
+    int n_col,
+    int Alen,
+    int limit
+) ;
+
+/* ========================================================================== */
+/* === colamd mexFunction =================================================== */
+/* ========================================================================== */
+
+void mexFunction
+(
+    /* === Parameters ======================================================= */
+
+    int nlhs,			/* number of left-hand sides */
+    mxArray *plhs [],		/* left-hand side matrices */
+    int nrhs,			/* number of right--hand sides */
+    const mxArray *prhs []	/* right-hand side matrices */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *A ;			/* colamd's copy of the matrix, and workspace */
+    int *p ;			/* colamd's copy of the column pointers */
+    int Alen ;			/* size of A */
+    int n_col ;			/* number of columns of A */
+    int n_row ;			/* number of rows of A */
+    int nnz ;			/* number of entries in A */
+    int full ;			/* TRUE if input matrix full, FALSE if sparse */
+    double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */
+    double *out_perm ;		/* output permutation vector */
+    double *out_stats ;		/* output stats vector */
+    double *in_knobs ;		/* input knobs vector */
+    int i ;			/* loop counter */
+    mxArray *Ainput ;		/* input matrix handle */
+    int spumoni ;		/* verbosity variable */
+    int stats2 [COLAMD_STATS] ;	/* stats for colamd */
+
+    int *cp, *cp_end, result, col, length ;
+    int *stats ;
+    stats = stats2 ;
+
+    /* === Check inputs ===================================================== */
+
+    if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2)
+    {
+	mexErrMsgTxt (
+	"colamd: incorrect number of input and/or output arguments") ;
+    }
+
+    if (nrhs != 2)
+    {
+	mexErrMsgTxt ("colamdtest: knobs are required") ;
+    }
+    /* for testing we require all 5 knobs */
+    if (mxGetNumberOfElements (prhs [1]) < 5)
+    {
+	mexErrMsgTxt ("colamd: must have all 5 knobs for testing") ;
+    }
+
+    /* === Get knobs ======================================================== */
+
+    colamd_set_defaults (knobs) ;
+    spumoni = 0 ;
+
+    /* check for user-passed knobs */
+    if (nrhs == 2)
+    {
+	in_knobs = mxGetPr (prhs [1]) ;
+	i = mxGetNumberOfElements (prhs [1]) ;
+	if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ;
+	if (i > 1) knobs [COLAMD_DENSE_COL] = in_knobs [COLAMD_DENSE_COL] ;
+	if (i > 2) spumoni = (int) in_knobs [2] ;
+    }
+
+    /* print knob settings if spumoni is set */
+    if (spumoni > 0)
+    {
+	mexPrintf ("colamd: dense row fraction: %f\n",
+	    knobs [COLAMD_DENSE_ROW]) ;
+	mexPrintf ("colamd: dense col fraction: %f\n",
+	    knobs [COLAMD_DENSE_COL]) ;
+    }
+
+    /* === If A is full, convert to a sparse matrix ========================= */
+
+    Ainput = (mxArray *) prhs [0] ;
+    if (mxGetNumberOfDimensions (Ainput) != 2)
+    {
+	mexErrMsgTxt ("colamd: input matrix must be 2-dimensional") ;
+    }
+    full = !mxIsSparse (Ainput) ;
+    if (full)
+    {
+	mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ;
+    }
+
+    /* === Allocate workspace for colamd ==================================== */
+
+    /* get size of matrix */
+    n_row = mxGetM (Ainput) ;
+    n_col = mxGetN (Ainput) ;
+
+    /* get column pointer vector so we can find nnz */
+    p = (int *) mxCalloc (n_col+1, sizeof (int)) ;
+    (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ;
+    nnz = p [n_col] ;
+    Alen = colamd_recommended (nnz, n_row, n_col) ;
+
+
+/* === Modify size of Alen if testing ======================================= */
+
+/*
+	knobs [3]	amount of workspace given to colamd.
+			<  0 : TIGHT memory
+			>  0 : MIN + knob [3] - 1
+			== 0 : RECOMMENDED memory
+*/
+
+/* Here only for testing */
+#ifdef MIN
+#undef MIN
+#endif
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define COLAMD_MIN_MEMORY(nnz,n_row,n_col) \
+    (2 * (nnz) + COLAMD_C (n_col) + COLAMD_R (n_row))
+
+    /* get knob [3], if negative */
+    if (in_knobs [3] < 0)
+    {
+	Alen = COLAMD_MIN_MEMORY (nnz, n_row, n_col) + n_col ;
+    }
+    else if (in_knobs [3] > 0)
+    {
+	Alen = COLAMD_MIN_MEMORY (nnz, n_row, n_col) + in_knobs [3] - 1 ;
+    }
+
+    /* otherwise, we use the recommended amount set above */
+
+    /* === Copy input matrix into workspace ================================= */
+
+    A = (int *) mxCalloc (Alen, sizeof (int)) ;
+    (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ;
+
+    if (full)
+    {
+	mxDestroyArray (Ainput) ;
+    }
+
+
+/* === Jumble matrix ======================================================== */
+
+/*
+	knobs [4]	FOR TESTING ONLY: Specifies how to jumble matrix
+			0 : No jumbling
+			1 : Make n_row less than zero
+			2 : Make first pointer non-zero
+			3 : Make column pointers not non-decreasing
+			4 : Make a column pointer greater or equal to Alen
+			5 : Make row indices not strictly increasing
+			6 : Make a row index greater or equal to n_row
+			7 : Set A = NULL
+			8 : Set p = NULL
+			9 : Repeat row index
+			10: make row indices not sorted
+			11: jumble columns massively (note this changes
+				the pattern of the matrix A.)
+			12: Set stats = NULL
+			13: Make n_col less than zero
+*/
+
+    /* jumble appropriately */
+    switch ((int) in_knobs [4])
+    {
+
+	case 0 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: no errors expected\n") ;
+	    }
+	    result = 1 ;		/* no errors */
+	    break ;
+
+	case 1 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: nrow out of range\n") ;
+	    }
+	    result = 0 ;		/* nrow out of range */
+	    n_row = -1 ;
+	    break ;
+
+	case 2 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: p [0] nonzero\n") ;
+	    }
+	    result = 0 ;		/* p [0] must be zero */
+	    p [0] = 1 ;
+	    break ;
+
+	case 3 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: negative length last column\n") ;
+	    }
+	    result = (n_col == 0) ;	/* p must be monotonically inc. */
+	    p [n_col] = p [0] ;
+	    break ;
+
+	case 4 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: Alen too small\n") ;
+	    }
+	    result = 0 ;		/* out of memory */
+	    p [n_col] = Alen ;
+	    break ;
+
+	case 5 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: row index out of range (-1)\n") ;
+	    }
+	    if (nnz > 0)		/* row index out of range */
+	    {
+		result = 0 ;
+		A [nnz-1] = -1 ;
+	    }
+	    else
+	    {
+	        if (spumoni > 0)
+		{
+		    mexPrintf ("Note: no row indices to put out of range\n") ;
+		}
+		result = 1 ;
+	    }
+	    break ;
+
+	case 6 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: row index out of range (n_row)\n") ;
+	    }
+	    if (nnz > 0)		/* row index out of range */
+	    {
+		if (spumoni > 0)
+		{
+		    mexPrintf ("Changing A[nnz-1] from %d to %d\n",
+			    A [nnz-1], n_row) ; 
+		}
+		result = 0 ;
+		A [nnz-1] = n_row ;
+	    }
+	    else
+	    {
+	        if (spumoni > 0)
+		{
+		    mexPrintf ("Note: no row indices to put out of range\n") ;
+		}
+		result = 1 ;
+	    }
+	    break ;
+
+	case 7 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: A not present\n") ;
+	    }
+	    result = 0 ;		/* A not present */
+	    A = (int *) NULL ;
+	    break ;
+
+	case 8 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: p not present\n") ;
+	    }
+	    result = 0 ;		/* p not present */
+	    p = (int *) NULL ;
+	    break ;
+
+	case 9 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: duplicate row index\n") ;
+	    }
+	    result = 1 ;		/* duplicate row index */
+
+	    for (col = 0 ; col < n_col ; col++)
+	    {
+		length = p [col+1] - p [col] ;
+	    	if (length > 1)
+		{
+		    A [p [col]] = A [p [col] + 1] ;
+		    if (spumoni > 0)
+		    {
+			mexPrintf ("Made duplicate row %d in col %d\n",
+		    	 A [p [col] + 1], col) ;
+		    }
+		    break ;
+		}
+	    }
+
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, Alen, col+2) ;
+	    }
+	    break ;
+
+	case 10 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: unsorted column\n") ;
+	    }
+	    result = 1 ;		/* jumbled columns */
+
+	    for (col = 0 ; col < n_col ; col++)
+	    {
+		length = p [col+1] - p [col] ;
+	    	if (length > 1)
+		{
+		    i = A[p [col]] ;
+		    A [p [col]] = A[p [col] + 1] ;
+		    A [p [col] + 1] = i ;
+		    if (spumoni > 0)
+		    {
+			mexPrintf ("Unsorted column %d \n", col) ;
+		    }
+		    break ;
+		}
+	    }
+
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, Alen, col+2) ;
+	    }
+	    break ;
+
+	case 11 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: massive jumbling\n") ;
+	    }
+	    result = 1 ;		/* massive jumbling, but no errors */
+	    srand (1) ;
+	    for (i = 0 ; i < n_col ; i++)
+	    {
+		cp = &A [p [i]] ;
+		cp_end = &A [p [i+1]] ;
+		while (cp < cp_end)
+		{
+		    *cp++ = rand() % n_row ;
+		}
+	    }
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, Alen, n_col) ;
+	    }
+	    break ;
+
+	case 12 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: stats not present\n") ;
+	    }
+	    result = 0 ;		/* stats not present */
+	    stats = (int *) NULL ;
+	    break ;
+
+	case 13 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("colamdtest: ncol out of range\n") ;
+	    }
+	    result = 0 ;		/* ncol out of range */
+	    n_col = -1 ;
+	    break ;
+
+    }
+
+
+    /* === Order the columns (destroys A) =================================== */
+
+    if (!colamd (n_row, n_col, Alen, A, p, knobs, stats))
+    {
+
+	/* return p = -1 if colamd failed */
+	plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ;
+	out_perm = mxGetPr (plhs [0]) ;
+	out_perm [0] = -1 ;
+	mxFree (p) ;
+	mxFree (A) ;
+
+	if (spumoni > 0 || result)
+	{
+	    colamd_report (stats) ;
+	}
+
+	if (result)
+	{
+	    mexErrMsgTxt ("colamd should have returned TRUE\n") ;
+	}
+
+	return ;
+	/* mexErrMsgTxt ("colamd error!") ; */
+    }
+
+    if (!result)
+    {
+	colamd_report (stats) ;
+	mexErrMsgTxt ("colamd should have returned FALSE\n") ;
+    }
+    mxFree (A) ;
+
+    /* === Return the permutation vector ==================================== */
+
+    plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ;
+    out_perm = mxGetPr (plhs [0]) ;
+    for (i = 0 ; i < n_col ; i++)
+    {
+	/* colamd is 0-based, but MATLAB expects this to be 1-based */
+	out_perm [i] = p [i] + 1 ;
+    }
+    mxFree (p) ;
+
+    /* === Return the stats vector ========================================== */
+
+    /* print stats if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	colamd_report (stats) ;
+    }
+
+    if (nlhs == 2)
+    {
+	plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ;
+	out_stats = mxGetPr (plhs [1]) ;
+	for (i = 0 ; i < COLAMD_STATS ; i++)
+	{
+	    out_stats [i] = stats [i] ;
+	}
+
+	/* fix stats (5) and (6), for 1-based information on jumbled matrix. */
+	/* note that this correction doesn't occur if symamd returns FALSE */
+	out_stats [COLAMD_INFO1] ++ ; 
+	out_stats [COLAMD_INFO2] ++ ; 
+    }
+}
+
+
+static void dump_matrix
+(
+    int A [ ],
+    int p [ ],
+    int n_row,
+    int n_col,
+    int Alen,
+    int limit
+)
+{
+    int col, k, row ;
+
+    mexPrintf ("dump matrix: nrow %d ncol %d Alen %d\n", n_row, n_col, Alen) ;
+
+    for (col = 0 ; col < MIN (n_col, limit) ; col++)
+    {
+	mexPrintf ("column %d, p[col] %d, p [col+1] %d, length %d\n",
+		col, p [col], p [col+1], p [col+1] - p [col]) ;
+    	for (k = p [col] ; k < p [col+1] ; k++)
+	{
+	    row = A [k] ;
+	    mexPrintf (" %d", row) ;
+	}
+	mexPrintf ("\n") ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/luflops.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,29 @@
+function fl = luflops (L, U)
+%
+%  fl = luflops (L,U)
+%
+%  Given a sparse LU factorization (L and U), return the flop count required
+%  by a conventional LU factorization algorithm to compute it.   L and U can
+%  be either sparse or full matrices.  L must be lower triangular and U must
+%  be upper triangular.  Do not attempt to use this on the permuted L from
+%  [L,U] = lu (A).  Instead, use [L,U,P] = lu (A) or [L,U,P,Q] = lu (A).
+%
+%  Note that there is a subtle undercount in this estimate.  Suppose A is
+%  completely dense, but during LU factorization exact cancellation occurs,
+%  causing some of the entries in L and U to become identically zero.  The
+%  flop count returned by this routine is an undercount.  There is a simple
+%  way to fix this (L = spones (L) + spones (tril (A))), but the fix is partial.
+%  It can also occur that some entry in L is a "symbolic" fill-in (zero in
+%  A, but a fill-in entry and thus must be computed), but numerically
+%  zero.  The only way to get a reliable LU factorization would be to do a
+%  purely symbolic factorization of A.  This cannot be done with
+%  symbfact (A, 'col').
+%
+%  See NA Digest, Vol 00, #50, Tuesday, Dec. 5, 2000
+%
+%  Tim Davis, Sept. 23, 2002.  Written for MATLAB 6.5.
+
+Lnz = full (sum (spones (L))) - 1 ;	% off diagonal nz in cols of L
+Unz = full (sum (spones (U')))' - 1 ;	% off diagonal nz in rows of U
+fl = 2*Lnz*Unz + sum (Lnz) ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/symamd.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,108 @@
+function [p, stats] = symamd (S, knobs)
+%SYMAMD Symmetric approximate minimum degree permutation.
+%    P = SYMAMD (S) for a symmetric positive definite matrix S, returns the
+%    permutation vector p such that S(p,p) tends to have a sparser Cholesky
+%    factor than S.  Sometimes SYMAMD works well for symmetric indefinite
+%    matrices too.  SYMAMD tends to be faster than SYMMMD and tends to return
+%    a better ordering.  The matrix S is assumed to be symmetric; only the
+%    strictly lower triangular part is referenced.   S must be square.
+%
+%    See also COLMMD, COLPERM, SPPARMS, COLAMD, SYMMMD, SYMRCM.
+%
+%    Usage:  P = symamd (S)
+%            P = symamd (S, knobs)
+%            [P, stats] = symamd (S)
+%            [P, stats] = symamd (S, knobs)
+%
+%    knobs is an optional input argument.  If S is n-by-n, then rows and
+%    columns with more than knobs(1)*n entries are removed prior to ordering,
+%    and ordered last in the output permutation P. If the knobs parameter is not
+%    present, then the default of 0.5 is used instead.  knobs (2) controls the
+%    printing of statistics and error messages.
+%
+%    stats is an optional 20-element output vector that provides data about the
+%    ordering and the validity of the input matrix S.  Ordering statistics are
+%    in stats (1:3).  stats (1) = stats (2) is the number of dense or empty
+%    rows and columns ignored by SYMAMD and stats (3) is the number of
+%    garbage collections performed on the internal data structure used by
+%    SYMAMD (roughly of size 8.4*nnz(tril(S,-1)) + 9*n integers).
+%
+%    MATLAB built-in functions are intended to generate valid sparse matrices,
+%    with no duplicate entries, with ascending row indices of the nonzeros
+%    in each column, with a non-negative number of entries in each column (!)
+%    and so on.  If a matrix is invalid, then SYMAMD may or may not be able
+%    to continue.  If there are duplicate entries (a row index appears two or
+%    more times in the same column) or if the row indices in a column are out
+%    of order, then SYMAMD can correct these errors by ignoring the duplicate
+%    entries and sorting each column of its internal copy of the matrix S (the
+%    input matrix S is not repaired, however).  If a matrix is invalid in other
+%    ways then SYMAMD cannot continue, an error message is printed, and no
+%    output arguments (P or stats) are returned.  SYMAMD is thus a simple way
+%    to check a sparse matrix to see if it's valid.
+%
+%    stats (4:7) provide information if SYMAMD was able to continue.  The
+%    matrix is OK if stats (4) is zero, or 1 if invalid.  stats (5) is the
+%    rightmost column index that is unsorted or contains duplicate entries,
+%    or zero if no such column exists.  stats (6) is the last seen duplicate
+%    or out-of-order row index in the column index given by stats (5), or zero
+%    if no such row index exists.  stats (7) is the number of duplicate or
+%    out-of-order row indices.
+%
+%    stats (8:20) is always zero in the current version of SYMAMD (reserved
+%    for future use).
+%
+%    The ordering is followed by a column elimination tree post-ordering.
+%
+%    Authors:
+%
+%	The authors of the code itself are Stefan I. Larimore and Timothy A.
+%	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+%	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+%	Ng, Oak Ridge National Laboratory.
+%
+%    Date:
+%
+%	September 8, 2003.  Version 2.3.
+%
+%    Acknowledgements:
+%
+%	This work was supported by the National Science Foundation, under
+%	grants DMS-9504974 and DMS-9803599.
+
+%    Notice:
+%	Copyright (c) 1998-2003 by the University of Florida.
+%	All Rights Reserved.
+%
+%	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+%	file) for the License.
+%
+%    Availability:
+%
+%	The colamd/symamd library is available at
+%
+%	    http://www.cise.ufl.edu/research/sparse/colamd/
+%
+
+%-------------------------------------------------------------------------------
+% perform the symamd ordering:
+%-------------------------------------------------------------------------------
+
+if (nargout <= 1 & nargin == 1)
+    p = symamdmex (S) ;
+elseif (nargout <= 1 & nargin == 2)
+    p = symamdmex (S, knobs) ;
+elseif (nargout == 2 & nargin == 1)
+    [p, stats] = symamdmex (S) ;
+elseif (nargout == 2 & nargin == 2)
+    [p, stats] = symamdmex (S, knobs) ;
+else
+    error ('symamd:  incorrect number of input and/or output arguments') ;
+end
+
+%-------------------------------------------------------------------------------
+% symmetric elimination tree post-ordering:
+%-------------------------------------------------------------------------------
+
+[ignore, q] = sparsfun ('symetree', S (p,p)) ;
+p = p (q) ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/symamdmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,241 @@
+/* ========================================================================== */
+/* === symamd mexFunction =================================================== */
+/* ========================================================================== */
+
+/*
+    Usage:
+
+	P = symamd (A) ;
+
+	P = symamd (A, knobs) ;
+
+	[ P, stats ] = symamd (A) ;
+
+	[ P, stats ] = symamd (A, knobs) ;
+
+    Returns a permutation vector P such that the Cholesky factorization of
+    A (P,P) tends to be sparser than that of A.  This routine provides the same
+    functionality as SYMMMD, but tends to be much faster and tends to return a
+    better permutation vector.  Note that the SYMMMD m-file in
+    MATLAB 5.2 also performs a symmetric elimination tree post-ordering.  This
+    mexFunction does not do this post-ordering.  This mexFunction is a
+    replacement for the p = sparsfun ('symmmd', A) operation.
+
+    A must be square, and is assummed to have a symmetric nonzero pattern.
+    Only the nonzero pattern of the lower triangular portion of A is accessed.
+    This routine constructs a matrix M such that the nonzero pattern of M'M is
+    equal to A (assuming A has symmetric pattern), and then performs a column
+    ordering of M using colamd.
+
+    The knobs and stats vectors are optional:
+
+	knobs (1)	rows and columns with more than (knobs(1))*n entries
+			are removed prior to ordering, and placed last in
+			the output ordering.  If knobs is not present, then the
+			default of 0.5 is used.
+
+	knobs (2)	print level, similar to spparms ('spumoni')
+
+	stats (1)	the number of dense (or empty) rows and columms.  These
+			are ordered last, in their natural order.
+
+	stats (2)	(same as stats (1))
+
+	stats (3)	the number of garbage collections performed.
+
+	stats (4)	return status:
+
+			0:  matrix is a valid MATLAB matrix.
+
+			1:  matrix has duplicate entries or unsorted columns.
+			    This should not occur in a valid MATLAB matrix,
+			    but the ordering proceeded anyway by ignoring the
+			    duplicate row indices in each column.  See
+			    stats (5:7) for more information.
+
+	stats (5)	highest numbered column that is unsorted or has
+			duplicate entries (zero if none)
+
+	stats (6)	last seen duplicate or unsorted row index
+			(zero if none)
+
+	stats (7)	number of duplicate or unsorted row indices
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Notice:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+	file) for the License.
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the http://www.cise.ufl.edu/research/sparse/colamd/symamdmex.c
+	file.  It requires the colamd.c and colamd.h files.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include "colamd.h"
+#include "mex.h"
+#include "matrix.h"
+#include <stdlib.h>
+
+/* ========================================================================== */
+/* === symamd mexFunction =================================================== */
+/* ========================================================================== */
+
+void mexFunction
+(
+    /* === Parameters ======================================================= */
+
+    int nlhs,			/* number of left-hand sides */
+    mxArray *plhs [],		/* left-hand side matrices */
+    int nrhs,			/* number of right--hand sides */
+    const mxArray *prhs []	/* right-hand side matrices */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *perm ;			/* column ordering of M and ordering of A */
+    int *A ;			/* row indices of input matrix A */
+    int *p ;			/* column pointers of input matrix A */
+    int n_col ;			/* number of columns of A */
+    int n_row ;			/* number of rows of A */
+    int full ;			/* TRUE if input matrix full, FALSE if sparse */
+    double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */
+    double *out_perm ;		/* output permutation vector */
+    double *out_stats ;		/* output stats vector */
+    double *in_knobs ;		/* input knobs vector */
+    int i ;			/* loop counter */
+    mxArray *Ainput ;		/* input matrix handle */
+    int spumoni ;		/* verbosity variable */
+    int stats [COLAMD_STATS] ;	/* stats for symamd */
+
+    /* === Check inputs ===================================================== */
+
+    if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2)
+    {
+	mexErrMsgTxt (
+	"symamd: incorrect number of input and/or output arguments.") ;
+    }
+
+    /* === Get knobs ======================================================== */
+
+    colamd_set_defaults (knobs) ;
+    spumoni = 0 ;
+
+    /* check for user-passed knobs */
+    if (nrhs == 2)
+    {
+	in_knobs = mxGetPr (prhs [1]) ;
+	i = mxGetNumberOfElements (prhs [1]) ;
+	if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ;
+	if (i > 1) spumoni = (int) in_knobs [1] ;
+    }
+
+    /* print knob settings if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	mexPrintf ("symamd: dense row/col fraction: %f\n",
+	    knobs [COLAMD_DENSE_ROW]) ;
+    }
+
+    /* === If A is full, convert to a sparse matrix ========================= */
+
+    Ainput = (mxArray *) prhs [0] ;
+    if (mxGetNumberOfDimensions (Ainput) != 2)
+    {
+	mexErrMsgTxt ("symamd: input matrix must be 2-dimensional.") ;
+    }
+    full = !mxIsSparse (Ainput) ;
+    if (full)
+    {
+	mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ;
+    }
+
+    /* === Allocate workspace for symamd ==================================== */
+
+    /* get size of matrix */
+    n_row = mxGetM (Ainput) ;
+    n_col = mxGetN (Ainput) ;
+    if (n_col != n_row)
+    {
+	mexErrMsgTxt ("symamd: matrix must be square.") ;
+    }
+
+    A = mxGetIr (Ainput) ;
+    p = mxGetJc (Ainput) ;
+    perm = (int *) mxCalloc (n_col+1, sizeof (int)) ;
+
+    /* === Order the rows and columns of A (does not destroy A) ============= */
+
+    if (!symamd (n_col, A, p, perm, knobs, stats, &mxCalloc, &mxFree))
+    {
+	symamd_report (stats) ;
+	mexErrMsgTxt ("symamd error!") ;
+    }
+
+    if (full)
+    {
+	mxDestroyArray (Ainput) ;
+    }
+
+    /* === Return the permutation vector ==================================== */
+
+    plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ;
+    out_perm = mxGetPr (plhs [0]) ;
+    for (i = 0 ; i < n_col ; i++)
+    {
+	/* symamd is 0-based, but MATLAB expects this to be 1-based */
+	out_perm [i] = perm [i] + 1 ;
+    }
+    mxFree (perm) ;
+
+    /* === Return the stats vector ========================================== */
+
+    /* print stats if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	symamd_report (stats) ;
+    }
+
+    if (nlhs == 2)
+    {
+	plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ;
+	out_stats = mxGetPr (plhs [1]) ;
+	for (i = 0 ; i < COLAMD_STATS ; i++)
+	{
+	    out_stats [i] = stats [i] ;
+	}
+
+	/* fix stats (5) and (6), for 1-based information on jumbled matrix. */
+	/* note that this correction doesn't occur if symamd returns FALSE */
+	out_stats [COLAMD_INFO1] ++ ; 
+	out_stats [COLAMD_INFO2] ++ ; 
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/COLAMD/symamdtestmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,575 @@
+/* ========================================================================== */
+/* === symamdtest mexFunction =============================================== */
+/* ========================================================================== */
+
+/*
+    This MATLAB mexFunction is for testing only.  It is not meant for
+    production use.  See symamdmex.c instead.
+
+    Usage:
+
+	[ P, stats ] = symamdtest (A, knobs) ;
+
+    Returns a permutation vector P such that the Cholesky factorization of
+    A (P,P) tends to be sparser than that of A.  This routine provides the same
+    functionality as SYMMMD, but tends to be much faster and tends to return a
+    better permutation vector.  Note that the SYMMMD m-file in
+    MATLAB 5.2 also performs a symmetric elimination tree post-ordering.  This
+    mexFunction does not do this post-ordering.  This mexFunction is a
+    replacement for the p = sparsfun ('symmmd', A) operation.
+
+    A must be square, and is assummed to have a symmetric nonzero pattern.
+    Only the nonzero pattern of the lower triangular portion of A is accessed.
+    This routine constructs a matrix M such that the nonzero pattern of M'M is
+    equal to A (assuming A has symmetric pattern), and then performs a column
+    ordering of M using colamd.
+
+    The knobs and stats vectors are optional:
+
+	knobs (1)	rows and columns with more than (knobs(1))*n entries
+			are removed prior to ordering, and placed last in
+			the output ordering.  If knobs is not present, then the
+			default of 0.5 is used.
+
+	knobs (2)	print level, similar to spparms ('spumoni')
+
+	knobs (3)	for testing only.  Controls how the input matrix is
+			jumbled prior to calling symamd, to test its error
+			handling capability.
+
+	stats (1)	the number of dense (or empty) rows and columms.  These
+			are ordered last, in their natural order.
+
+	stats (2)	(same as stats (1))
+
+	stats (3)	the number of garbage collections performed.
+
+	stats (4)	return status:
+
+			0:  matrix is a valid MATLAB matrix.
+
+			1:  matrix has duplicate entries or unsorted columns.
+			    This should not occur in a valid MATLAB matrix,
+			    but the ordering proceeded anyway by ignoring the
+			    duplicate row indices in each column.  See
+			    stats (5:7) for more information.
+
+	stats (5)	highest numbered column that is unsorted or has
+			duplicate entries (zero if none)
+
+	stats (6)	last seen duplicate or unsorted row index
+			(zero if none)
+
+	stats (7)	number of duplicate or unsorted row indices
+
+    Authors:
+
+	The authors of the code itself are Stefan I. Larimore and Timothy A.
+	Davis (davis@cise.ufl.edu), University of Florida.  The algorithm was
+	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+	Ng, Oak Ridge National Laboratory.
+
+    Date:
+
+	September 8, 2003.  Version 2.3.
+
+    Acknowledgements:
+
+	This work was supported by the National Science Foundation, under
+	grants DMS-9504974 and DMS-9803599.
+
+    Notice:
+
+	Copyright (c) 1998-2003 by the University of Florida.
+	All Rights Reserved.
+
+	See http://www.cise.ufl.edu/research/sparse/colamd (the colamd.c
+	file) for the License.
+
+    Availability:
+
+	The colamd/symamd library is available at
+
+	    http://www.cise.ufl.edu/research/sparse/colamd/
+
+	This is the
+	http://www.cise.ufl.edu/research/sparse/colamd/symamdtestmex.c
+       	file.  It requires the colamd.c and colamd.h files.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include "colamd.h"
+#include "mex.h"
+#include "matrix.h"
+#include <stdlib.h>
+#include <string.h>
+
+static void dump_matrix
+(
+    int A [ ],
+    int p [ ],
+    int n_row,
+    int n_col,
+    int Alen,
+    int limit
+) ;
+
+/* ========================================================================== */
+/* === symamd mexFunction =================================================== */
+/* ========================================================================== */
+
+void mexFunction
+(
+    /* === Parameters ======================================================= */
+
+    int nlhs,			/* number of left-hand sides */
+    mxArray *plhs [],		/* left-hand side matrices */
+    int nrhs,			/* number of right--hand sides */
+    const mxArray *prhs []	/* right-hand side matrices */
+)
+{
+    /* === Local variables ================================================== */
+
+    int *perm ;			/* column ordering of M and ordering of A */
+    int *A ;			/* row indices of input matrix A */
+    int *p ;			/* column pointers of input matrix A */
+    int n_col ;			/* number of columns of A */
+    int n_row ;			/* number of rows of A */
+    int full ;			/* TRUE if input matrix full, FALSE if sparse */
+    double knobs [COLAMD_KNOBS] ; /* colamd user-controllable parameters */
+    double *out_perm ;		/* output permutation vector */
+    double *out_stats ;		/* output stats vector */
+    double *in_knobs ;		/* input knobs vector */
+    int i ;			/* loop counter */
+    mxArray *Ainput ;		/* input matrix handle */
+    int spumoni ;		/* verbosity variable */
+    int stats2 [COLAMD_STATS] ;	/* stats for symamd */
+
+    int *cp, *cp_end, result, nnz, col, length ;
+    int *stats ;
+    stats = stats2 ;
+
+    /* === Check inputs ===================================================== */
+
+    if (nrhs < 1 || nrhs > 2 || nlhs < 0 || nlhs > 2)
+    {
+	mexErrMsgTxt (
+	"symamd: incorrect number of input and/or output arguments.") ;
+    }
+
+    if (nrhs != 2)
+    {
+	mexErrMsgTxt ("symamdtest: knobs are required") ;
+    }
+    /* for testing we require all 3 knobs */
+    if (mxGetNumberOfElements (prhs [1]) < 3)
+    {
+	mexErrMsgTxt ("symamdtest: must have all 3 knobs for testing") ;
+    }
+
+    /* === Get knobs ======================================================== */
+
+    colamd_set_defaults (knobs) ;
+    spumoni = 0 ;
+
+    /* check for user-passed knobs */
+    if (nrhs == 2)
+    {
+	in_knobs = mxGetPr (prhs [1]) ;
+	i = mxGetNumberOfElements (prhs [1]) ;
+	if (i > 0) knobs [COLAMD_DENSE_ROW] = in_knobs [COLAMD_DENSE_ROW] ;
+	if (i > 1) spumoni = (int) in_knobs [1] ;
+    }
+
+    /* print knob settings if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	mexPrintf ("symamd: dense row/col fraction: %f\n",
+	    knobs [COLAMD_DENSE_ROW]) ;
+    }
+
+    /* === If A is full, convert to a sparse matrix ========================= */
+
+    Ainput = (mxArray *) prhs [0] ;
+    if (mxGetNumberOfDimensions (Ainput) != 2)
+    {
+	mexErrMsgTxt ("symamd: input matrix must be 2-dimensional.") ;
+    }
+    full = !mxIsSparse (Ainput) ;
+    if (full)
+    {
+	mexCallMATLAB (1, &Ainput, 1, (mxArray **) prhs, "sparse") ;
+    }
+
+    /* === Allocate workspace for symamd ==================================== */
+
+    /* get size of matrix */
+    n_row = mxGetM (Ainput) ;
+    n_col = mxGetN (Ainput) ;
+    if (n_col != n_row)
+    {
+	mexErrMsgTxt ("symamd: matrix must be square.") ;
+    }
+
+    /* p = mxGetJc (Ainput) ; */
+    p = (int *) mxCalloc (n_col+1, sizeof (int)) ;
+    (void) memcpy (p, mxGetJc (Ainput), (n_col+1)*sizeof (int)) ;
+
+    nnz = p [n_col] ;
+    if (spumoni > 0)
+    {
+	mexPrintf ("symamdtest: nnz %d\n", nnz) ;
+    }
+
+    /* A = mxGetIr (Ainput) ; */
+    A = (int *) mxCalloc (nnz+1, sizeof (int)) ;
+    (void) memcpy (A, mxGetIr (Ainput), nnz*sizeof (int)) ;
+
+    perm = (int *) mxCalloc (n_col+1, sizeof (int)) ;
+
+/* === Jumble matrix ======================================================== */
+
+
+/*
+	knobs [2]	FOR TESTING ONLY: Specifies how to jumble matrix
+			0 : No jumbling
+			1 : (no errors)
+			2 : Make first pointer non-zero
+			3 : Make column pointers not non-decreasing
+			4 : (no errors)
+			5 : Make row indices not strictly increasing
+			6 : Make a row index greater or equal to n_row
+			7 : Set A = NULL
+			8 : Set p = NULL
+			9 : Repeat row index
+			10: make row indices not sorted
+			11: jumble columns massively (note this changes
+				the pattern of the matrix A.)
+			12: Set stats = NULL
+			13: Make n_col less than zero
+*/
+
+    /* jumble appropriately */
+    switch ((int) in_knobs [2])
+    {
+
+	case 0 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: no errors expected\n") ;
+	    }
+	    result = 1 ;		/* no errors */
+	    break ;
+
+	case 1 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: no errors expected (1)\n") ;
+	    }
+	    result = 1 ;
+	    break ;
+
+	case 2 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: p [0] nonzero\n") ;
+	    }
+	    result = 0 ;		/* p [0] must be zero */
+	    p [0] = 1 ;
+	    break ;
+
+	case 3 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: negative length last column\n") ;
+	    }
+	    result = (n_col == 0) ;	/* p must be monotonically inc. */
+	    p [n_col] = p [0] ;
+	    break ;
+
+	case 4 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: no errors expected (4)\n") ;
+	    }
+	    result = 1 ;
+	    break ;
+
+	case 5 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: row index out of range (-1)\n") ;
+	    }
+	    if (nnz > 0)		/* row index out of range */
+	    {
+		result = 0 ;
+		A [nnz-1] = -1 ;
+	    }
+	    else
+	    {
+	        if (spumoni > 0)
+		{
+		    mexPrintf ("Note: no row indices to put out of range\n") ;
+		}
+		result = 1 ;
+	    }
+	    break ;
+
+	case 6 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: row index out of range (ncol)\n") ;
+	    }
+	    if (nnz > 0)		/* row index out of range */
+	    {
+		result = 0 ;
+		A [nnz-1] = n_col ;
+	    }
+	    else
+	    {
+	        if (spumoni > 0)
+		{
+		    mexPrintf ("Note: no row indices to put out of range\n") ;
+		}
+		result = 1 ;
+	    }
+	    break ;
+
+	case 7 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: A not present\n") ;
+	    }
+	    result = 0 ;		/* A not present */
+	    A = (int *) NULL ;
+	    break ;
+
+	case 8 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: p not present\n") ;
+	    }
+	    result = 0 ;		/* p not present */
+	    p = (int *) NULL ;
+	    break ;
+
+	case 9 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: duplicate row index\n") ;
+	    }
+	    result = 1 ;		/* duplicate row index */
+
+	    for (col = 0 ; col < n_col ; col++)
+	    {
+		length = p [col+1] - p [col] ;
+	    	if (length > 1)
+		{
+		    A [p [col+1]-2] = A [p [col+1] - 1] ;
+		    if (spumoni > 0)
+		    {
+			mexPrintf ("Made duplicate row %d in col %d\n",
+		    	 A [p [col+1] - 1], col) ;
+		    }
+		    break ;
+		}
+	    }
+
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, nnz, col+2) ;
+	    }
+	    break ;
+
+	case 10 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: unsorted column\n") ;
+	    }
+	    result = 1 ;		/* jumbled columns */
+
+	    for (col = 0 ; col < n_col ; col++)
+	    {
+		length = p [col+1] - p [col] ;
+	    	if (length > 1)
+		{
+		    i = A[p [col]] ;
+		    A [p [col]] = A[p [col] + 1] ;
+		    A [p [col] + 1] = i ;
+		    if (spumoni > 0)
+		    {
+			mexPrintf ("Unsorted column %d \n", col) ;
+		    }
+		    break ;
+		}
+	    }
+
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, nnz, col+2) ;
+	    }
+	    break ;
+
+	case 11 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: massive jumbling\n") ;
+	    }
+	    result = 1 ;		/* massive jumbling, but no errors */
+	    srand (1) ;
+	    for (i = 0 ; i < n_col ; i++)
+	    {
+		cp = &A [p [i]] ;
+		cp_end = &A [p [i+1]] ;
+		while (cp < cp_end)
+		{
+		    *cp++ = rand() % n_row ;
+		}
+	    }
+	    if (spumoni > 1)
+	    {
+		dump_matrix (A, p, n_row, n_col, nnz, n_col) ;
+	    }
+	    break ;
+
+	case 12 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: stats not present\n") ;
+	    }
+	    result = 0 ;		/* stats not present */
+	    stats = (int *) NULL ;
+	    break ;
+
+	case 13 :
+	    if (spumoni > 0)
+	    {
+		mexPrintf ("symamdtest: ncol out of range\n") ;
+	    }
+	    result = 0 ;		/* ncol out of range */
+	    n_col = -1 ;
+	    break ;
+
+    }
+
+    /* === Order the rows and columns of A (does not destroy A) ============= */
+
+    if (!symamd (n_col, A, p, perm, knobs, stats, &mxCalloc, &mxFree))
+    {
+
+	/* return p = -1 if colamd failed */
+	plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ;
+	out_perm = mxGetPr (plhs [0]) ;
+	out_perm [0] = -1 ;
+	mxFree (p) ;
+	mxFree (A) ;
+
+	if (spumoni > 0 || result)
+	{
+	    symamd_report (stats) ;
+	}
+
+	if (result)
+	{
+	    mexErrMsgTxt ("symamd should have returned TRUE\n") ;
+	}
+
+	return ;
+	/* mexErrMsgTxt ("symamd error!") ; */
+    }
+
+    if (!result)
+    {
+	symamd_report (stats) ;
+	mexErrMsgTxt ("symamd should have returned FALSE\n") ;
+    }
+
+    if (full)
+    {
+	mxDestroyArray (Ainput) ;
+    }
+
+    /* === Return the permutation vector ==================================== */
+
+    plhs [0] = mxCreateDoubleMatrix (1, n_col, mxREAL) ;
+    out_perm = mxGetPr (plhs [0]) ;
+    for (i = 0 ; i < n_col ; i++)
+    {
+	/* symamd is 0-based, but MATLAB expects this to be 1-based */
+	out_perm [i] = perm [i] + 1 ;
+    }
+    mxFree (perm) ;
+
+    /* === Return the stats vector ========================================== */
+
+    /* print stats if spumoni > 0 */
+    if (spumoni > 0)
+    {
+	symamd_report (stats) ;
+    }
+
+    if (nlhs == 2)
+    {
+	plhs [1] = mxCreateDoubleMatrix (1, COLAMD_STATS, mxREAL) ;
+	out_stats = mxGetPr (plhs [1]) ;
+	for (i = 0 ; i < COLAMD_STATS ; i++)
+	{
+	    out_stats [i] = stats [i] ;
+	}
+
+	/* fix stats (5) and (6), for 1-based information on jumbled matrix. */
+	/* note that this correction doesn't occur if symamd returns FALSE */
+	out_stats [COLAMD_INFO1] ++ ; 
+	out_stats [COLAMD_INFO2] ++ ; 
+    }
+}
+
+
+#ifdef MIN
+#undef MIN
+#endif
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+
+static void dump_matrix
+(
+    int A [ ],
+    int p [ ],
+    int n_row,
+    int n_col,
+    int Alen,
+    int limit
+)
+{
+    int col, k, row ;
+
+    mexPrintf ("dump matrix: nrow %d ncol %d Alen %d\n", n_row, n_col, Alen) ;
+
+    if (!A)
+    {
+    	mexPrintf ("A not present\n") ;
+	return ;
+    }
+
+    if (!p)
+    {
+    	mexPrintf ("p not present\n") ;
+	return ;
+    }
+
+    for (col = 0 ; col < MIN (n_col, limit) ; col++)
+    {
+	mexPrintf ("column %d, p[col] %d, p [col+1] %d, length %d\n",
+		col, p [col], p [col+1], p [col+1] - p [col]) ;
+    	for (k = p [col] ; k < p [col+1] ; k++)
+	{
+	    row = A [k] ;
+	    mexPrintf (" %d", row) ;
+	}
+	mexPrintf ("\n") ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/CSparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,6496 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cfloat>
+
+#include <iostream>
+#include <vector>
+
+#include "quit.h"
+#include "lo-ieee.h"
+#include "lo-mappers.h"
+#include "f77-fcn.h"
+#include "dRowVector.h"
+
+#include "CSparse.h"
+#include "boolSparse.h"
+#include "dSparse.h"
+#include "oct-spparms.h"
+#include "SparseCmplxLU.h"
+
+// External UMFPACK functions in C
+extern "C" {
+#include "umfpack.h"
+}
+
+// Fortran functions we call.
+extern "C"
+{
+  F77_RET_T
+  F77_FUNC (zgbtrf, ZGBTRF) (const int&, const int&, const int&, 
+			     const int&, Complex*, const int&, int*, int&);
+
+  F77_RET_T
+  F77_FUNC (zgbtrs, ZGBTRS) (F77_CONST_CHAR_ARG_DECL, const int&,
+			     const int&, const int&, const int&, 
+			     const Complex*, const int&,
+			     const int*, Complex*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zgbcon, ZGBCON) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, const int&, Complex*, 
+			     const int&, const int*, const double&, 
+			     double&, Complex*, double*, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zpbtrf, ZPBTRF) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, Complex*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zpbtrs, ZPBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, const int&, Complex*, const int&, 
+			     Complex*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zpbcon, ZPBCON) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, Complex*, const int&, 
+			     const double&, double&, Complex*, int*, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zgttrf, ZGTTRF) (const int&, Complex*, Complex*, Complex*,
+			     Complex*, int*, int&);
+
+  F77_RET_T
+  F77_FUNC (zgttrs, ZGTTRS) (F77_CONST_CHAR_ARG_DECL, const int&,
+			     const int&, const Complex*, const Complex*,
+			     const Complex*, const Complex*, const int*,
+			     Complex *, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zptsv, ZPTSV) (const int&, const int&, Complex*, Complex*,
+			   Complex*, const int&, int&);
+
+  F77_RET_T
+  F77_FUNC (zgtsv, ZGTSV) (const int&, const int&, Complex*, Complex*,
+			   Complex*, Complex*, const int&, int&);
+}
+
+SparseComplexMatrix::SparseComplexMatrix (const SparseMatrix& a)
+  : MSparse<Complex> (a.rows (), a.cols (), a.nnz ())
+{
+  int nc = cols ();
+  int nz = nnz ();
+
+  for (int i = 0; i < nc + 1; i++)
+    cidx (i) = a.cidx (i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      data (i) = a.data (i);
+      ridx (i) = a.ridx (i);
+    }
+}
+
+SparseComplexMatrix::SparseComplexMatrix (const SparseBoolMatrix& a)
+  : MSparse<Complex> (a.rows (), a.cols (), a.nnz ())
+{
+  int nc = cols ();
+  int nz = nnz ();
+
+  for (int i = 0; i < nc + 1; i++)
+    cidx (i) = a.cidx (i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      data (i) = a.data (i);
+      ridx (i) = a.ridx (i);
+    }
+}
+
+bool
+SparseComplexMatrix::operator == (const SparseComplexMatrix& a) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  int nr_a = a.rows ();
+  int nc_a = a.cols ();
+  int nz_a = a.nnz ();
+
+  if (nr != nr_a || nc != nc_a || nz != nz_a)
+    return false;
+
+  for (int i = 0; i < nc + 1; i++)
+    if (cidx(i) != a.cidx(i))
+	return false;
+
+  for (int i = 0; i < nz; i++)
+    if (data(i) != a.data(i) || ridx(i) != a.ridx(i))
+      return false;
+
+  return true;
+}
+
+bool
+SparseComplexMatrix::operator != (const SparseComplexMatrix& a) const
+{
+  return !(*this == a);
+}
+
+bool
+SparseComplexMatrix::is_hermitian (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+
+  if (is_square () && nr > 0)
+    {
+      for (int i = 0; i < nr; i++)
+	for (int j = i; j < nc; j++)
+	  if (elem (i, j) != conj (elem (j, i)))
+	    return false;
+
+      return true;
+    }
+
+  return false;
+}
+
+static const Complex Complex_NaN_result (octave_NaN, octave_NaN);
+
+SparseComplexMatrix
+SparseComplexMatrix::max (int dim) const
+{
+  Array2<int> dummy_idx;
+  return max (dummy_idx, dim);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::max (Array2<int>& idx_arg, int dim) const
+{
+  SparseComplexMatrix result;
+  dim_vector dv = dims ();
+
+  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
+    return result;
+ 
+  int nr = dv(0);
+  int nc = dv(1);
+
+  if (dim == 0)
+    {
+      idx_arg.resize (1, nc);
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  Complex tmp_max;
+	  double abs_max = octave_NaN;
+	  int idx_j = 0;
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      if (ridx(i) != idx_j)
+		break;
+	      else
+		idx_j++;
+	    }
+
+	  if (idx_j != nr)
+	    {
+	      tmp_max = 0.;
+	      abs_max = 0.;
+	    }
+
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      Complex tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+
+	      double abs_tmp = ::abs (tmp);
+
+	      if (octave_is_NaN_or_NA (abs_max) || abs_tmp > abs_max)
+		{
+		  idx_j = ridx (i);
+		  tmp_max = tmp;
+		  abs_max = abs_tmp;
+		}
+	    }
+
+ 	  idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_max) ? 0 : idx_j;
+	  if (abs_max != 0.)
+	    nel++;
+	}
+
+      result = SparseComplexMatrix (1, nc, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  Complex tmp = elem (idx_arg(j), j);
+	  if (tmp != 0.)
+	    {
+	      result.xdata (ii) = tmp;
+	      result.xridx (ii++) = 0;
+	    }
+	  result.xcidx (j+1) = ii;
+	}
+    }
+  else
+    {
+      idx_arg.resize (nr, 1, 0);
+
+      for (int i = cidx(0); i < cidx(1); i++)
+	idx_arg.elem(ridx(i)) = -1;
+
+      for (int j = 0; j < nc; j++)
+	for (int i = 0; i < nr; i++)
+	  {
+	    if (idx_arg.elem(i) != -1)
+	      continue;
+	    bool found = false;
+	    for (int k = cidx(j); k < cidx(j+1); k++)
+	      if (ridx(k) == i)
+		{
+		  found = true;
+		  break;
+		}
+	    
+	    if (!found)
+	      idx_arg.elem(i) = j;
+
+	  }
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      int ir = ridx (i);
+	      int ix = idx_arg.elem (ir);
+	      Complex tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (ix == -1 || ::abs(tmp) > ::abs(elem (ir, ix)))
+		idx_arg.elem (ir) = j;
+	    }
+	}
+
+      int nel = 0;
+      for (int j = 0; j < nr; j++)
+	if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.)
+	  nel++;
+
+      result = SparseComplexMatrix (nr, 1, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      result.xcidx (1) = nel;
+      for (int j = 0; j < nr; j++)
+	{
+	  if (idx_arg(j) == -1)
+	    {
+	      idx_arg(j) = 0;
+	      result.xdata (ii) = Complex_NaN_result;
+	      result.xridx (ii++) = j;
+	    }
+	  else
+	    {
+	      Complex tmp = elem (j, idx_arg(j));
+	      if (tmp != 0.)
+		{
+		  result.xdata (ii) = tmp;
+		  result.xridx (ii++) = j;
+		}
+	    }
+	}
+    }
+
+  return result;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::min (int dim) const
+{
+  Array2<int> dummy_idx;
+  return min (dummy_idx, dim);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::min (Array2<int>& idx_arg, int dim) const
+{
+  SparseComplexMatrix result;
+  dim_vector dv = dims ();
+
+  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
+    return result;
+ 
+  int nr = dv(0);
+  int nc = dv(1);
+
+  if (dim == 0)
+    {
+      idx_arg.resize (1, nc);
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  Complex tmp_min;
+	  double abs_min = octave_NaN;
+	  int idx_j = 0;
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      if (ridx(i) != idx_j)
+		break;
+	      else
+		idx_j++;
+	    }
+
+	  if (idx_j != nr)
+	    {
+	      tmp_min = 0.;
+	      abs_min = 0.;
+	    }
+
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      Complex tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+
+	      double abs_tmp = ::abs (tmp);
+
+	      if (octave_is_NaN_or_NA (abs_min) || abs_tmp < abs_min)
+		{
+		  idx_j = ridx (i);
+		  tmp_min = tmp;
+		  abs_min = abs_tmp;
+		}
+	    }
+
+ 	  idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j;
+	  if (abs_min != 0.)
+	    nel++;
+	}
+
+      result = SparseComplexMatrix (1, nc, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  Complex tmp = elem (idx_arg(j), j);
+	  if (tmp != 0.)
+	    {
+	      result.xdata (ii) = tmp;
+	      result.xridx (ii++) = 0;
+	    }
+	  result.xcidx (j+1) = ii;
+	}
+    }
+  else
+    {
+      idx_arg.resize (nr, 1, 0);
+
+      for (int i = cidx(0); i < cidx(1); i++)
+	idx_arg.elem(ridx(i)) = -1;
+
+      for (int j = 0; j < nc; j++)
+	for (int i = 0; i < nr; i++)
+	  {
+	    if (idx_arg.elem(i) != -1)
+	      continue;
+	    bool found = false;
+	    for (int k = cidx(j); k < cidx(j+1); k++)
+	      if (ridx(k) == i)
+		{
+		  found = true;
+		  break;
+		}
+	    
+	    if (!found)
+	      idx_arg.elem(i) = j;
+
+	  }
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      int ir = ridx (i);
+	      int ix = idx_arg.elem (ir);
+	      Complex tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (ix == -1 || ::abs(tmp) < ::abs(elem (ir, ix)))
+		idx_arg.elem (ir) = j;
+	    }
+	}
+
+      int nel = 0;
+      for (int j = 0; j < nr; j++)
+	if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.)
+	  nel++;
+
+      result = SparseComplexMatrix (nr, 1, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      result.xcidx (1) = nel;
+      for (int j = 0; j < nr; j++)
+	{
+	  if (idx_arg(j) == -1)
+	    {
+	      idx_arg(j) = 0;
+	      result.xdata (ii) = Complex_NaN_result;
+	      result.xridx (ii++) = j;
+	    }
+	  else
+	    {
+	      Complex tmp = elem (j, idx_arg(j));
+	      if (tmp != 0.)
+		{
+		  result.xdata (ii) = tmp;
+		  result.xridx (ii++) = j;
+		}
+	    }
+	}
+    }
+
+  return result;
+}
+
+// destructive insert/delete/reorder operations
+
+SparseComplexMatrix&
+SparseComplexMatrix::insert (const SparseMatrix& a, int r, int c)
+{
+  SparseComplexMatrix tmp (a);
+  return insert (a, r, c);
+}
+
+SparseComplexMatrix&
+SparseComplexMatrix::insert (const SparseComplexMatrix& a, int r, int c)
+{
+  MSparse<Complex>::insert (a, r, c);
+  return *this;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::concat (const SparseComplexMatrix& rb, 
+			     const Array<int>& ra_idx)
+{
+  // Don't use numel to avoid all possiblity of an overflow
+  if (rb.rows () > 0 && rb.cols () > 0)
+    insert (rb, ra_idx(0), ra_idx(1));
+  return *this;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::concat (const SparseMatrix& rb, const Array<int>& ra_idx)
+{
+  SparseComplexMatrix tmp (rb);
+  if (rb.rows () > 0 && rb.cols () > 0)
+    insert (tmp, ra_idx(0), ra_idx(1));
+  return *this;
+}
+
+ComplexMatrix
+SparseComplexMatrix::matrix_value (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  ComplexMatrix retval (nr, nc, Complex (0.0, 0.0));
+
+  for (int j = 0; j < nc; j++)
+    for (int i = cidx(j); i < cidx(j+1); i++)
+      retval.elem (ridx(i), j) = data (i);
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::hermitian (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  SparseComplexMatrix retval (nc, nr, nz);
+
+  retval.cidx(0) = 0;
+  for (int i = 0, iidx = 0; i < nr; i++)
+    {
+      for (int j = 0; j < nc; j++)
+	for (int k = cidx(j); k < cidx(j+1); k++)
+	  if (ridx(k) == i)
+	    {
+	      retval.data(iidx) = conj (data(k));
+	      retval.ridx(iidx++) = j;
+	    }
+      retval.cidx(i+1) = iidx;
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+conj (const SparseComplexMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+  SparseComplexMatrix retval (nc, nr, nz);
+
+  for (int i = 0; i < nc + 1; i++)
+    retval.cidx (i) = a.cidx (i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      retval.data (i) = conj (a.data (i));
+      retval.ridx (i) = a.ridx (i);
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::inverse (void) const
+{
+  int info;
+  double rcond;
+  return inverse (info, rcond, 0, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::inverse (int& info) const
+{
+  double rcond;
+  return inverse (info, rcond, 0, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::inverse (int& info, double& rcond, int force, 
+			int calc_cond) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::inverse not implemented yet");
+  return SparseComplexMatrix ();
+}
+
+ComplexDET
+SparseComplexMatrix::determinant (void) const
+{
+  int info;
+  double rcond;
+  return determinant (info, rcond, 0);
+}
+
+ComplexDET
+SparseComplexMatrix::determinant (int& info) const
+{
+  double rcond;
+  return determinant (info, rcond, 0);
+}
+
+ComplexDET
+SparseComplexMatrix::determinant (int& err, double& rcond, int calc_cond) const
+{
+  ComplexDET retval;
+
+  int nr = rows ();
+  int nc = cols ();
+
+  if (nr == 0 || nc == 0 || nr != nc)
+    {
+      Complex d[2];
+      d[0] = 1.0;
+      d[1] = 0.0;
+      retval = ComplexDET (d);
+    }
+  else
+    {
+      err = 0;
+
+      // Setup the control parameters
+      Matrix Control (UMFPACK_CONTROL, 1);
+      double *control = Control.fortran_vec ();
+      umfpack_zi_defaults (control);
+
+      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      if (!xisnan (tmp))
+	Control (UMFPACK_PRL) = tmp;
+
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+	  Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+
+      // Set whether we are allowed to modify Q or not
+      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      if (!xisnan (tmp))
+	Control (UMFPACK_FIXQ) = tmp;
+
+      // Turn-off UMFPACK scaling for LU 
+      Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+      umfpack_zi_report_control (control);
+
+      const int *Ap = cidx ();
+      const int *Ai = ridx ();
+      const Complex *Ax = data ();
+
+      umfpack_zi_report_matrix (nr, nc, Ap, Ai, 
+				X_CAST (const double *, Ax), 
+				NULL, 1, control);
+
+      void *Symbolic;
+      Matrix Info (1, UMFPACK_INFO);
+      double *info = Info.fortran_vec ();
+      int status = umfpack_zi_qsymbolic 
+	(nr, nc, Ap, Ai, X_CAST (const double *, Ax), NULL, 
+	 NULL, &Symbolic, control, info);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseComplexMatrix::determinant symbolic factorization failed");
+
+	  umfpack_zi_report_status (control, status);
+	  umfpack_zi_report_info (control, info);
+
+	  umfpack_zi_free_symbolic (&Symbolic) ;
+	}
+      else
+	{
+	  umfpack_zi_report_symbolic (Symbolic, control);
+
+	  void *Numeric;
+	  status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), 
+				       NULL, Symbolic, &Numeric,
+				       control, info) ;
+	  umfpack_zi_free_symbolic (&Symbolic) ;
+
+	  rcond = Info (UMFPACK_RCOND);
+
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseComplexMatrix::determinant numeric factorization failed");
+
+	      umfpack_zi_report_status (control, status);
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      umfpack_zi_report_numeric (Numeric, control);
+
+	      Complex d[2];
+	      double d_exponent;
+
+	      status = umfpack_zi_get_determinant 
+		(X_CAST (double *, &d[0]), NULL, &d_exponent,
+		 Numeric, info);
+	      d[1] = d_exponent;
+
+	      if (status < 0)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseComplexMatrix::determinant error calculating determinant");
+		  
+		  umfpack_zi_report_status (control, status);
+		  umfpack_zi_report_info (control, info);
+		  
+		  umfpack_zi_free_numeric (&Numeric);
+		}
+	      else
+		retval = ComplexDET (d);
+	    }
+	}
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::dsolve (SparseType &mattype, const Matrix& b, int& err, 
+			     double& rcond, solve_singularity_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  retval.resize (b.rows (), b.cols());
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(i,j) / data (i);
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(ridx(i),j) / data (i);
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = ::abs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::dsolve (SparseType &mattype, const SparseMatrix& b,
+		       int& err, double& rcond, solve_singularity_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		  {
+		    retval.xridx (ii) = b.ridx(i);
+		    retval.xdata (ii++) = b.data(i) / data (b.ridx (i));
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = 0; i < nr; i++)
+		  {
+		    bool found = false;
+		    int k;
+		    for (k = b.cidx(j); k < b.cidx(j+1); k++)
+		      if (ridx(i) == b.ridx(k))
+			{
+			  found = true;
+			  break;
+			}
+		    if (found)
+		      {
+			retval.xridx (ii) = i;
+			retval.xdata (ii++) = b.data(k) / data (i);
+		      }
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = ::abs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::dsolve (SparseType &mattype, const ComplexMatrix& b,
+		     int& err, double& rcond, solve_singularity_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  retval.resize (b.rows (), b.cols());
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(i,j) / data (i);
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(ridx(i),j) / data (i);
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = ::abs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::dsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		  {
+		    retval.xridx (ii) = b.ridx(i);
+		    retval.xdata (ii++) = b.data(i) / data (b.ridx (i));
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = 0; i < nr; i++)
+		  {
+		    bool found = false;
+		    int k;
+		    for (k = b.cidx(j); k < b.cidx(j+1); k++)
+		      if (ridx(i) == b.ridx(k))
+			{
+			  found = true;
+			  break;
+			}
+		    if (found)
+		      {
+			retval.xridx (ii) = i;
+			retval.xdata (ii++) = b.data(k) / data (i);
+		      }
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = ::abs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::utsolve (SparseType &mattype, const Matrix& b, int& err, 
+		       double& rcond,
+		       solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_cols = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = ComplexMatrix (b);
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k+1)-1);
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::utsolve (SparseType &mattype, const SparseMatrix& b,
+			int& err, double& rcond, 
+			solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::utsolve (SparseType &mattype, const ComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_nc = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k+1)-1);
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::utsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::ltsolve (SparseType &mattype, const Matrix& b, int& err, 
+		   double& rcond, solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_cols = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = ComplexMatrix (b);
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k));
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::ltsolve (SparseType &mattype, const SparseMatrix& b, 
+			int& err, double& rcond, 
+			solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::ltsolve (SparseType &mattype, const ComplexMatrix& b,
+			int& err, double& rcond,
+			solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_nc = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k));
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::ltsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += ::abs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseComplexMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += ::abs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::trisolve (SparseType &mattype, const Matrix& b, int& err, 
+			       double& rcond,
+			       solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii);
+		  ii += 2;
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		  }
+	    }
+	      
+	  int b_nc = b.cols();
+	  retval = ComplexMatrix (b);
+	  Complex *result = retval.fortran_vec ();
+
+	  F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, 
+				   b.rows(), err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zptsv");
+	  else if (err != 0)
+	    {
+	      err = 0;
+	      mattype.mark_as_unsymmetric ();
+	      typ = SparseType::Tridiagonal;
+	    }
+	  else 
+	    rcond = 1.;
+	}
+
+      if (typ == SparseType::Tridiagonal)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  int b_nc = b.cols();
+	  retval = ComplexMatrix (b);
+	  Complex *result = retval.fortran_vec ();
+
+	  F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, 
+				   b.rows(), err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgtsv");
+	  else if (err != 0)
+	    {
+	      rcond = 0.;
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision");
+
+	    } 
+	  else 
+	    rcond = 1.;
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	       (*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::trisolve (SparseType &mattype, const SparseMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal ||
+	  typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, DU2, nr - 2);
+	  OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgttrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseComplexMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			work[i] = 0.;
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			work[b.ridx(i)] = b.data(i);
+
+		      F77_XFCN (zgttrs, ZGTTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, 1, DL, D, DU, DU2, pipvt, 
+				 work, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in zgttrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = work[i];
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::trisolve (SparseType &mattype, const ComplexMatrix& b,
+			       int& err, double& rcond, 
+			       solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii);
+		  ii += 2;
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		  }
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols();
+	  rcond = 1.;
+
+	  retval = ComplexMatrix (b);
+	  Complex *result = retval.fortran_vec ();
+		  
+	  F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, 
+				   b_nr, err));
+
+	  if (f77_exception_encountered)
+	    {
+	      (*current_liboctave_error_handler) 
+		("unrecoverable error in zptsv");
+	      err = -1;
+	    }
+	  else if (err != 0)
+	    {
+	      err = 0;
+	      mattype.mark_as_unsymmetric ();
+	      typ = SparseType::Tridiagonal;
+	    }
+	}
+
+      if (typ == SparseType::Tridiagonal)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  int b_nr = b.rows();
+	  int b_nc = b.cols();
+	  rcond = 1.;
+
+	  retval = ComplexMatrix (b);
+	  Complex *result = retval.fortran_vec ();
+	      
+	  F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, 
+				   b_nr, err));
+
+	  if (f77_exception_encountered)
+	    {
+	      (*current_liboctave_error_handler) 
+		("unrecoverable error in zgtsv");
+	      err = -1;
+	    }
+	  else if (err != 0)
+	    {
+	      rcond = 0.;
+	      err = -2;
+		      
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision");
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::trisolve (SparseType &mattype, 
+		     const SparseComplexMatrix& b, int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal ||
+	  typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, DU2, nr - 2);
+	  OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgttrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+		} 
+	      else 
+		{	
+		  rcond = 1.;
+		  char job = 'N';
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+
+		      for (int i = 0; i < b_nr; i++)
+			Bx[i] = b (i,j);
+
+		      F77_XFCN (zgttrs, ZGTTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, 1, DL, D, DU, DU2, pipvt, 
+				 Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in zgttrs");
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler)
+			    ("SparseComplexMatrix::solve solve failed");
+
+			  err = -1;
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  new_nnz++;
+		      
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+			  
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = Bx[i];
+			  }
+
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::bsolve (SparseType &mattype, const Matrix& b, int& err, 
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  // Calculate the norm of the matrix, for later use.
+	  // double anorm = m_band.abs().sum().row(0).max();
+
+	  char job = 'L';
+	  F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  // Unfortunately, the time to calculate the condition
+		  // number is dominant for narrow banded matrices and
+		  // so we rely on the "err" flag from xPBTRF to flag
+		  // singularity. The commented code below is left here
+		  // for reference
+
+		  //Array<double> z (3 * nr);
+		  //Complex *pz = z.fortran_vec ();
+		  //Array<int> iz (nr);
+		  //int *piz = iz.fortran_vec ();
+		  //
+		  //F77_XFCN (zpbcon, ZGBCON, 
+		  //	(F77_CONST_CHAR_ARG2 (&job, 1),
+		  //	 nr, n_lower, tmp_data, ldm,
+		  //	 anorm, rcond, pz, piz, err
+		  //	 F77_CHAR_ARG_LEN (1)));
+		  //
+		  //
+		  //if (f77_exception_encountered)
+		  //	(*current_liboctave_error_handler) 
+		  //	  ("unrecoverable error in zpbcon");
+		  //
+		  //if (err != 0) 
+		  //	err = -2;
+		  //
+		  //volatile double rcond_plus_one = rcond + 1.0;
+		  //
+		  //if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  //  {
+		  //    err = -2;
+		  //
+		  //    if (sing_handler)
+		  //      sing_handler (rcond);
+		  //    else
+		  //      (*current_liboctave_error_handler)
+		  //        ("matrix singular to machine precision, rcond = %g",
+		  //         rcond);
+		  //  }
+		  //else
+		  //    REST OF CODE, EXCEPT rcond=1
+
+		  rcond = 1.;
+		  retval = ComplexMatrix (b);
+		  Complex *result = retval.fortran_vec ();
+
+		  int b_nc = b.cols ();
+
+		  F77_XFCN (zpbtrs, ZPBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, b_nc, tmp_data,
+			     ldm, result, b.rows(), err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    (*current_liboctave_error_handler)
+		      ("unrecoverable error in zpbtrs");
+
+		  if (err != 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+		      err = -1;
+		    }
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgbtrf");
+	  else
+	    {
+	      // Throw-away extra info LAPACK gives so as to not 
+	      // change output.
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = '1';
+
+		  // Unfortunately, the time to calculate the condition
+		  // number is dominant for narrow banded matrices and
+		  // so we rely on the "err" flag from xPBTRF to flag
+		  // singularity. The commented code below is left here
+		  // for reference
+
+		  //F77_XFCN (zgbcon, ZGBCON, 
+		  //	(F77_CONST_CHAR_ARG2 (&job, 1),
+		  //	 nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+		  //	 anorm, rcond, pz, piz, err
+		  //	 F77_CHAR_ARG_LEN (1)));
+		  //
+		  //if (f77_exception_encountered)
+		  //  (*current_liboctave_error_handler) 
+		  //    ("unrecoverable error in zgbcon");
+		  //
+		  // if (err != 0) 
+		  //  err = -2;
+		  //
+		  //volatile double rcond_plus_one = rcond + 1.0;
+		  //
+		  //if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  //  {
+		  //    err = -2;
+		  //
+		  //    if (sing_handler)
+		  //      sing_handler (rcond);
+		  //    else
+		  //      (*current_liboctave_error_handler)
+		  //        ("matrix singular to machine precision, rcond = %g",
+		  //         rcond);
+		  //  }
+		  //else
+		  //  REST OF CODE, EXCEPT rcond=1
+
+		  rcond = 1.;
+		  retval = ComplexMatrix (b);
+		  Complex *result = retval.fortran_vec ();
+
+		  int b_nc = b.cols ();
+
+		  job = 'N';
+		  F77_XFCN (zgbtrs, ZGBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, n_upper, b_nc, tmp_data,
+			     ldm, pipvt, result, b.rows(), err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    (*current_liboctave_error_handler)
+		      ("unrecoverable error in zgbtrs");
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::bsolve (SparseType &mattype, const SparseMatrix& b,
+			     int& err, double& rcond, 
+			     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < b_nr; i++)
+			Bx[i] = b.elem (i, j);
+
+		      F77_XFCN (zpbtrs, ZPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseComplexMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+		      for (int i = 0; i < b_nr; i++)
+			{
+			  Complex tmp = Bx[i];
+			  if (tmp != 0.0)
+			    {
+			      if (ii == x_nz)
+				{
+				  // Resize the sparse matrix
+				  int sz = x_nz * (b_nc - j) / b_nc;
+				  sz = (sz > 10 ? sz : 10) + x_nz;
+				  retval.change_capacity (sz);
+				  x_nz = sz;
+				}
+			      retval.xdata(ii) = tmp;
+			      retval.xridx(ii++) = i;
+			    }
+			}
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseComplexMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			work[i] = 0.;
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			work[b.ridx(i)] = b.data(i);
+
+		      F77_XFCN (zgbtrs, ZGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, work, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in zgbtrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = work[i];
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::bsolve (SparseType &mattype, const ComplexMatrix& b, 
+			     int& err, double& rcond, 
+			     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  retval = ComplexMatrix (b);
+		  Complex *result = retval.fortran_vec ();
+
+		  F77_XFCN (zpbtrs, ZPBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, b_nc, tmp_data,
+			     ldm, result, b_nr, err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    {
+		      (*current_liboctave_error_handler)
+			("unrecoverable error in zpbtrs");
+		      err = -1;
+		    }
+
+		  if (err != 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseComplexMatrix::solve solve failed");
+		      err = -1;
+		    }
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  int b_nc = b.cols ();
+		  retval = ComplexMatrix (b);
+		  Complex *result = retval.fortran_vec ();
+
+		  F77_XFCN (zgbtrs, ZGBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, n_upper, b_nc, tmp_data,
+			     ldm, pipvt, result, b.rows (), err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    {
+		      (*current_liboctave_error_handler)
+			("unrecoverable error in dgbtrs");
+		    }
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::bsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in zpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+
+		      for (int i = 0; i < b_nr; i++)
+			Bx[i] = b (i,j);
+
+		      F77_XFCN (zpbtrs, ZPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in zpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  new_nnz++;
+			  
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+			  
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = Bx[i];
+			  }
+
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  ComplexMatrix m_band (ldm, nc);
+	  Complex *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in xgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		}
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseComplexMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (Complex, Bx, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			Bx[i] = 0.;
+
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			Bx[b.ridx(i)] = b.data(i);
+
+		      F77_XFCN (zgbtrs, ZGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, Bx, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = Bx[i]; 
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+void *
+SparseComplexMatrix::factorize (int& err, double &rcond, Matrix &Control, 
+				Matrix &Info,
+				solve_singularity_handler sing_handler) const
+{
+  // The return values
+  void *Numeric;
+  err = 0;
+
+  // Setup the control parameters
+  Control = Matrix (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_zi_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+  if (!xisnan (tmp))
+    {
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+      Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+    }
+
+  // Set whether we are allowed to modify Q or not
+  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  if (!xisnan (tmp))
+    Control (UMFPACK_FIXQ) = tmp;
+
+  umfpack_zi_report_control (control);
+
+  const int *Ap = cidx ();
+  const int *Ai = ridx ();
+  const Complex *Ax = data ();
+  int nr = rows ();
+  int nc = cols ();
+
+  umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), 
+			    NULL, 1, control);
+
+  void *Symbolic;
+  Info = Matrix (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, 
+				     X_CAST (const double *, Ax), 
+				     NULL, NULL, &Symbolic, control, info);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	("SparseComplexMatrix::solve symbolic factorization failed");
+      err = -1;
+
+      umfpack_zi_report_status (control, status);
+      umfpack_zi_report_info (control, info);
+
+      umfpack_zi_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_zi_report_symbolic (Symbolic, control);
+
+      status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL,
+				   Symbolic, &Numeric, control, info) ;
+      umfpack_zi_free_symbolic (&Symbolic) ;
+
+#ifdef HAVE_LSSOLVE
+      rcond = Info (UMFPACK_RCOND);
+      volatile double rcond_plus_one = rcond + 1.0;
+
+      if (status == UMFPACK_WARNING_singular_matrix || 
+	  rcond_plus_one == 1.0 || xisnan (rcond))
+	{
+	  umfpack_zi_report_numeric (Numeric, control);
+
+	  err = -2;
+
+	  if (sing_handler)
+	    sing_handler (rcond);
+	  else
+	    (*current_liboctave_error_handler)
+	      ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+	       rcond);
+
+	}
+      else
+#endif 
+	if (status < 0)
+	  {
+	    (*current_liboctave_error_handler) 
+	      ("SparseComplexMatrix::solve numeric factorization failed");
+
+	    umfpack_zi_report_status (control, status);
+	    umfpack_zi_report_info (control, info);
+	      
+	    err = -1;
+	  }
+	else
+	  {
+	    umfpack_zi_report_numeric (Numeric, control);
+	  }
+    }
+
+  if (err != 0)
+    umfpack_zi_free_numeric (&Numeric);
+
+  return Numeric;
+}
+
+ComplexMatrix
+SparseComplexMatrix::fsolve (SparseType &mattype, const Matrix& b, int& err, 
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, 
+				     sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const Complex *Ax = data ();
+	      const double *Bx = b.fortran_vec ();
+	      OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+	      for (int i = 0; i < b_nr; i++)
+		Bz[i] = 0.;
+
+	      retval.resize (b_nr, b_nc);
+	      Complex *Xx = retval.fortran_vec ();
+
+	      for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr)
+		{
+		  status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, 
+					     X_CAST (const double *, Ax), 
+					     NULL,
+					     X_CAST (double *, &Xx[iidx]), 
+					     NULL,
+					     &Bx[iidx], Bz, Numeric, 
+					     control, info);
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseComplexMatrix::solve solve failed");
+
+		      umfpack_zi_report_status (control, status);
+		      
+		      err = -1;
+
+		      break;
+		    }
+		}
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+		  
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::fsolve (SparseType &mattype, const SparseMatrix& b, 
+			     int& err, double& rcond,
+			     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const Complex *Ax = data ();
+
+	      OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+	      for (int i = 0; i < b_nr; i++)
+		Bz[i] = 0.;
+
+	      // Take a first guess that the number of non-zero terms
+	      // will be as many as in b
+	      int x_nz = b.nnz ();
+	      int ii = 0;
+	      retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+	      OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr);
+	      
+	      retval.xcidx(0) = 0;
+	      for (int j = 0; j < b_nc; j++)
+		{
+
+		  for (int i = 0; i < b_nr; i++)
+		    Bx[i] = b.elem (i, j);
+
+		  status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, 
+					     X_CAST (const double *, Ax),
+					     NULL,
+					     X_CAST (double *, Xx), NULL, 
+					     Bx, Bz, Numeric, control, 
+					     info);
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseComplexMatrix::solve solve failed");
+
+		      umfpack_zi_report_status (control, status);
+		      
+		      err = -1;
+
+		      break;
+		    }
+
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      Complex tmp = Xx[i];
+		      if (tmp != 0.0)
+			{
+			  if (ii == x_nz)
+			    {
+			      // Resize the sparse matrix
+			      int sz = x_nz * (b_nc - j) / b_nc;
+			      sz = (sz > 10 ? sz : 10) + x_nz;
+			      retval.change_capacity (sz);
+			      x_nz = sz;
+			    }
+			  retval.xdata(ii) = tmp;
+			  retval.xridx(ii++) = i;
+			}
+		    }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::fsolve (SparseType &mattype, const ComplexMatrix& b, 
+			     int& err, double& rcond,
+			     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const Complex *Ax = data ();
+	      const Complex *Bx = b.fortran_vec ();
+
+	      retval.resize (b_nr, b_nc);
+	      Complex *Xx = retval.fortran_vec ();
+	      
+	      for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr)
+		{
+		  status = 
+		    umfpack_zi_solve (UMFPACK_A, Ap, Ai, 
+				      X_CAST (const double *, Ax), 
+				      NULL, X_CAST (double *, &Xx[iidx]), 
+				      NULL, X_CAST (const double *, &Bx[iidx]), 
+				      NULL, Numeric, control, info);
+		  
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseComplexMatrix::solve solve failed");
+
+		      umfpack_zi_report_status (control, status);
+		      
+		      err = -1;
+
+		      break;
+		    }
+		}
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::fsolve (SparseType &mattype, const SparseComplexMatrix& b,
+			     int& err, double& rcond,
+			     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const Complex *Ax = data ();
+
+	      OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
+
+	      // Take a first guess that the number of non-zero terms
+	      // will be as many as in b
+	      int x_nz = b.nnz ();
+	      int ii = 0;
+	      retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+	      OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr);
+	      
+	      retval.xcidx(0) = 0;
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < b_nr; i++)
+		    Bx[i] = b (i,j);
+
+		  status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, 
+					     X_CAST (const double *, Ax), 
+					     NULL, X_CAST (double *, Xx), 
+					     NULL, X_CAST (double *, Bx), 
+					     NULL, Numeric, control, info);
+		  
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseComplexMatrix::solve solve failed");
+
+		      umfpack_zi_report_status (control, status);
+		  
+		      err = -1;
+
+		      break;
+		    }
+
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      Complex tmp = Xx[i];
+		      if (tmp != 0.0)
+			{
+			  if (ii == x_nz)
+			    {
+			      // Resize the sparse matrix
+			      int sz = x_nz * (b_nc - j) / b_nc;
+			      sz = (sz > 10 ? sz : 10) + x_nz;
+			      retval.change_capacity (sz);
+			      x_nz = sz;
+			    }
+			  retval.xdata(ii) = tmp;
+			  retval.xridx(ii++) = i;
+			}
+		    }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseComplexMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, int& info, 
+			    double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const Matrix& b, int& err, 
+			    double& rcond, 
+			    solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return ComplexMatrix ();
+    }
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseMatrix& b, 
+			    int& err, double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return SparseComplexMatrix ();
+    }
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return ComplexMatrix ();
+    }
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, 
+			    const SparseComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, 
+			    int& err, double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return SparseComplexMatrix ();
+    }
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b) const
+{
+  int info; double rcond;
+  return solve (mattype, b, info, rcond);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, 
+			    int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ColumnVector& b, 
+			    int& info, double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  Matrix tmp (b);
+  return solve (mattype, tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, 
+			    const ComplexColumnVector& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b,
+			    int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b,
+			    int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (SparseType &mattype, const ComplexColumnVector& b,
+			    int& info, double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix tmp (b);
+  return solve (mattype, tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const Matrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const Matrix& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const Matrix& b, int& info, 
+		     double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const Matrix& b, int& err, 
+			    double& rcond, 
+			    solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const ComplexMatrix& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const ComplexMatrix& b, 
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::solve (const ComplexMatrix& b, 
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseComplexMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseComplexMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::solve (const SparseComplexMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ColumnVector& b) const
+{
+  int info; double rcond;
+  return solve (b, info, rcond);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ColumnVector& b, int& info, 
+			    double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ColumnVector& b, int& info, double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  Matrix tmp (b);
+  return solve (tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ComplexColumnVector& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info, 
+		     double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::solve (const ComplexColumnVector& b, int& info, 
+			    double& rcond,
+			    solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix tmp (b);
+  return solve (tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const Matrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const Matrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const Matrix& b, int& info, int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return ComplexMatrix ();
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseMatrix& b, int& info, 
+			      int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return SparseComplexMatrix ();
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const ComplexMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const ComplexMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseComplexMatrix::lssolve (const ComplexMatrix& b, int& info, 
+			      int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return ComplexMatrix ();
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseComplexMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseComplexMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::lssolve (const SparseComplexMatrix& b, int& info, 
+			      int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return SparseComplexMatrix ();
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ColumnVector& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ColumnVector& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ColumnVector& b, int& info, int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return ComplexColumnVector ();
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ComplexColumnVector& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ComplexColumnVector& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseComplexMatrix::lssolve (const ComplexColumnVector& b, int& info,
+			int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseComplexMatrix::lssolve not implemented yet");
+  return ComplexColumnVector ();
+}
+
+// unary operations
+SparseBoolMatrix
+SparseComplexMatrix::operator ! (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz1 = nnz ();
+  int nz2 = nr*nc - nz1;
+   
+  SparseBoolMatrix r (nr, nc, nz2);
+   
+  int ii = 0;
+  int jj = 0;
+  r.cidx (0) = 0;
+  for (int i = 0; i < nc; i++)
+    {
+      for (int j = 0; j < nr; j++)
+	{
+	  if (jj < cidx(i+1) && ridx(jj) == j)
+	    jj++;
+	  else
+	    {
+	      r.data(ii) = true;
+	      r.ridx(ii++) = j;
+	    }
+	}
+      r.cidx (i+1) = ii;
+    }
+
+  return r;
+}
+
+SparseComplexMatrix 
+SparseComplexMatrix::squeeze (void) const
+{ 
+  return MSparse<Complex>::squeeze (); 
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::index (idx_vector& i, int resize_ok) const 
+{ 
+  return MSparse<Complex>::index (i, resize_ok); 
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const 
+{ 
+  return MSparse<Complex>::index (i, j, resize_ok); 
+}
+  
+SparseComplexMatrix
+SparseComplexMatrix::index (Array<idx_vector>& ra_idx, int resize_ok) const 
+{ 
+  return MSparse<Complex>::index (ra_idx, resize_ok); 
+}
+SparseComplexMatrix
+SparseComplexMatrix::reshape (const dim_vector& new_dims) const
+{
+  return MSparse<Complex>::reshape (new_dims);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::permute (const Array<int>& vec, bool inv) const
+{
+  return MSparse<Complex>::permute (vec, inv);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::ipermute (const Array<int>& vec) const
+{
+  return MSparse<Complex>::ipermute (vec);
+}
+
+// other operations
+
+SparseComplexMatrix
+SparseComplexMatrix::map (c_c_Mapper f) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  bool f_zero = (f(0.0) == 0.0);
+
+  // Count number of non-zero elements
+  int nel = (f_zero ? 0 : nr*nc - nz);
+  for (int i = 0; i < nz; i++)
+    if (f (data(i)) != 0.0)
+      nel++;
+
+  SparseComplexMatrix retval (nr, nc, nel);
+
+  if (f_zero)
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      Complex tmp = f (elem (i, j));
+	      if (tmp != 0.0)
+		{
+		  retval.data(ii) = tmp;
+		  retval.ridx(ii++) = i;
+		}
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+  else
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      retval.data(ii) = f (elem(i));
+	      retval.ridx(ii++) = ridx(i);
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseComplexMatrix::map (d_c_Mapper f) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  bool f_zero = (f(0.0) == 0.0);
+
+  // Count number of non-zero elements
+  int nel = (f_zero ? 0 : nr*nc - nz);
+  for (int i = 0; i < nz; i++)
+    if (f (data(i)) != 0.0)
+      nel++;
+
+  SparseMatrix retval (nr, nc, nel);
+
+  if (f_zero)
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = f (elem (i, j));
+	      if (tmp != 0.0)
+		{
+		  retval.data(ii) = tmp;
+		  retval.ridx(ii++) = i;
+		}
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+  else
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      retval.data(ii) = f (elem(i));
+	      retval.ridx(ii++) = ridx(i);
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+
+  return retval;
+}
+
+SparseBoolMatrix
+SparseComplexMatrix::map (b_c_Mapper f) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  bool f_zero = f(0.0);
+
+  // Count number of non-zero elements
+  int nel = (f_zero ? 0 : nr*nc - nz);
+  for (int i = 0; i < nz; i++)
+    if (f (data(i)) != 0.0)
+      nel++;
+
+  SparseBoolMatrix retval (nr, nc, nel);
+
+  if (f_zero)
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      bool tmp = f (elem (i, j));
+	      if (tmp)
+		{
+		  retval.data(ii) = tmp;
+		  retval.ridx(ii++) = i;
+		}
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+  else
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      retval.data(ii) = f (elem(i));
+	      retval.ridx(ii++) = ridx(i);
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix&
+SparseComplexMatrix::apply (c_c_Mapper f)
+{
+  *this = map (f);
+  return *this;
+}
+
+bool
+SparseComplexMatrix::any_element_is_inf_or_nan (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      Complex val = data (i);
+      if (xisinf (val) || xisnan (val))
+	return true;
+    }
+
+  return false;
+}
+
+// Return true if no elements have imaginary components.
+
+bool
+SparseComplexMatrix::all_elements_are_real (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double ip = imag (data (i));
+      
+      if (ip != 0.0 || lo_ieee_signbit (ip))
+	return false;
+    }
+
+  return true;
+}
+
+// Return nonzero if any element of CM has a non-integer real or
+// imaginary part.  Also extract the largest and smallest (real or
+// imaginary) values and return them in MAX_VAL and MIN_VAL. 
+
+bool
+SparseComplexMatrix::all_integers (double& max_val, double& min_val) const
+{
+  int nel = nnz ();
+
+  if (nel == 0)
+    return false;
+
+  max_val = real(data (0));
+  min_val = real(data (0));
+
+  for (int i = 0; i < nel; i++)
+    {
+	Complex val = data (i);
+
+	double r_val = real (val);
+	double i_val = imag (val);
+
+	if (r_val > max_val)
+	  max_val = r_val;
+
+	if (i_val > max_val)
+	  max_val = i_val;
+
+	if (r_val < min_val)
+	  min_val = r_val;
+
+	if (i_val < min_val)
+	  min_val = i_val;
+
+	if (D_NINT (r_val) != r_val || D_NINT (i_val) != i_val)
+	  return false;
+    }
+
+  return true;
+}
+
+bool
+SparseComplexMatrix::too_large_for_float (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+	Complex val = data (i);
+
+	double r_val = real (val);
+	double i_val = imag (val);
+
+	if (r_val > FLT_MAX
+	    || i_val > FLT_MAX
+	    || r_val < FLT_MIN
+	    || i_val < FLT_MIN)
+	  return true;
+    }
+
+  return false;
+}
+
+// XXX FIXME XXX Do these really belong here?  Maybe they should be
+// in a base class?
+
+SparseBoolMatrix
+SparseComplexMatrix::all (int dim) const
+{
+  SPARSE_ALL_OP (dim);
+}
+
+SparseBoolMatrix
+SparseComplexMatrix::any (int dim) const
+{
+  SPARSE_ANY_OP (dim);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::cumprod (int dim) const
+{
+  SPARSE_CUMPROD (SparseComplexMatrix, Complex, cumprod);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::cumsum (int dim) const
+{
+  SPARSE_CUMSUM (SparseComplexMatrix, Complex, cumsum);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::prod (int dim) const
+{
+  SPARSE_REDUCTION_OP (SparseComplexMatrix, Complex, *=, 1.0, 1.0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::sum (int dim) const
+{
+  SPARSE_REDUCTION_OP (SparseComplexMatrix, Complex, +=, 0.0, 0.0);
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::sumsq (int dim) const
+{
+#define ROW_EXPR \
+  Complex d = elem (i, j); \
+  tmp [i] += d * conj (d)
+
+#define COL_EXPR \
+  Complex d = elem (i, j); \
+  tmp [j] += d * conj (d)
+
+  SPARSE_BASE_REDUCTION_OP (SparseComplexMatrix, Complex, ROW_EXPR, 
+			    COL_EXPR, 0.0, 0.0);
+
+#undef ROW_EXPR
+#undef COL_EXPR
+}
+
+SparseMatrix SparseComplexMatrix::abs (void) const
+{
+  int nz = nnz ();
+  int nc = cols ();
+
+  SparseMatrix retval (rows(), nc, nz);
+
+  for (int i = 0; i < nc + 1; i++)
+    retval.cidx (i) = cidx (i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      retval.data (i) = ::abs (data (i));
+      retval.ridx (i) = ridx (i);
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseComplexMatrix::diag (int k) const
+{
+  int nnr = rows ();
+  int nnc = cols ();
+
+  if (k > 0)
+    nnc -= k;
+  else if (k < 0)
+    nnr += k;
+
+  SparseComplexMatrix d;
+
+  if (nnr > 0 && nnc > 0)
+    {
+      int ndiag = (nnr < nnc) ? nnr : nnc;
+
+      // Count the number of non-zero elements
+      int nel = 0;
+      if (k > 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i, i+k) != 0.)
+	      nel++;
+	}
+      else if ( k < 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i-k, i) != 0.)
+	      nel++;
+	}
+      else
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i, i) != 0.)
+	      nel++;
+	}
+      
+      d = SparseComplexMatrix (ndiag, 1, nel);
+      d.xcidx (0) = 0;
+      d.xcidx (1) = nel;
+
+      int ii = 0;
+      if (k > 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      Complex tmp = elem (i, i+k);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else if ( k < 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      Complex tmp = elem (i-k, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      Complex tmp = elem (i, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+    }
+  else
+    (*current_liboctave_error_handler) 
+      ("diag: requested diagonal out of range");
+
+  return d;
+}
+
+std::ostream&
+operator << (std::ostream& os, const SparseComplexMatrix& a)
+{
+  int nc = a.cols ();
+
+   // add one to the printed indices to go from
+   //  zero-based to one-based arrays
+   for (int j = 0; j < nc; j++)  {
+      OCTAVE_QUIT;
+      for (int i = a.cidx(j); i < a.cidx(j+1); i++) {
+	os << a.ridx(i) + 1 << " "  << j + 1 << " ";
+	octave_write_complex (os, a.data(i));
+	os << "\n";
+      }
+   }
+
+  return os;
+}
+
+std::istream&
+operator >> (std::istream& is, SparseComplexMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+
+  if (nr < 1 || nc < 1)
+    is.clear (std::ios::badbit);
+  else
+    {
+      int itmp, jtmp, jold = 0;
+      Complex tmp;
+      int ii = 0;
+       
+      a.cidx (0) = 0;
+      for (int i = 0; i < nz; i++)
+	{
+	  is >> itmp;
+	  itmp--;
+	  is >> jtmp;
+	  jtmp--;
+	  tmp = octave_read_complex (is);
+
+	  if (is)
+	    {
+	      if (jold != jtmp)
+		{
+		  for (int j = jold; j < jtmp; j++)
+		    a.cidx(j+1) = ii;
+		  
+		  jold = jtmp;
+		}
+	      a.data (ii) = tmp;
+	      a.ridx (ii++) = itmp;
+	    }
+	  else
+	    goto done;
+	}
+
+      for (int j = jold; j < nc; j++)
+	a.cidx(j+1) = ii;
+    }
+
+ done:
+
+  return is;
+}
+
+SparseComplexMatrix
+operator * (const SparseComplexMatrix& m, const SparseMatrix& a)
+{
+  SparseComplexMatrix tmp (a);
+  return m * tmp;
+}
+
+SparseComplexMatrix
+operator * (const SparseMatrix& m, const SparseComplexMatrix& a)
+{
+  SparseComplexMatrix tmp (m);
+  return tmp * a;
+}
+
+SparseComplexMatrix
+operator * (const SparseComplexMatrix& m, const SparseComplexMatrix& a)
+{
+#ifdef HAVE_SPARSE_BLAS
+  // XXX FIXME XXX Isn't there a sparse BLAS ??
+#else
+  // Use Andy's sparse matrix multiply function
+  SPARSE_SPARSE_MUL (SparseComplexMatrix, Complex);
+#endif
+}
+
+// XXX FIXME XXX -- it would be nice to share code among the min/max
+// functions below.
+
+#define EMPTY_RETURN_CHECK(T) \
+  if (nr == 0 || nc == 0) \
+    return T (nr, nc);
+
+SparseComplexMatrix
+min (const Complex& c, const SparseComplexMatrix& m)
+{
+  SparseComplexMatrix result;
+
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  EMPTY_RETURN_CHECK (SparseComplexMatrix);
+
+  if (abs(c) == 0.)
+    return SparseComplexMatrix (nr, nc);
+  else
+    {
+      result = SparseComplexMatrix (m);
+
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  result.data(i) = xmin(c, m.data(i));
+    }
+  
+  return result;
+}
+
+SparseComplexMatrix
+min (const SparseComplexMatrix& m, const Complex& c)
+{
+  return min (c, m);
+}
+
+SparseComplexMatrix
+min (const SparseComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  SparseComplexMatrix r;
+
+  if ((a.rows() == b.rows()) && (a.cols() == b.cols())) 
+    {
+      int a_nr = a.rows ();
+      int a_nc = a.cols ();
+
+      int b_nr = b.rows ();
+      int b_nc = b.cols ();
+
+      if (a_nr == 0 || b_nc == 0 || a.nnz () == 0 || b.nnz () == 0)
+	return SparseComplexMatrix (a_nr, a_nc);
+
+      if (a_nr != b_nr || a_nc != b_nc)
+	gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc);
+      else
+	{
+	  r = SparseComplexMatrix (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+	  int jx = 0;
+	  r.cidx (0) = 0;
+	  for (int i = 0 ; i < a_nc ; i++)
+	    {
+	      int  ja = a.cidx(i);
+	      int  ja_max = a.cidx(i+1);
+	      bool ja_lt_max= ja < ja_max;
+           
+	      int  jb = b.cidx(i);
+	      int  jb_max = b.cidx(i+1);
+	      bool jb_lt_max = jb < jb_max;
+           
+	      while (ja_lt_max || jb_lt_max )
+		{
+		  OCTAVE_QUIT;
+		  if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+		    {
+		      Complex tmp = xmin (a.data(ja), 0.);
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = a.ridx(ja);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		    }
+		  else if (( !ja_lt_max ) ||
+			   (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+		    {
+		      Complex tmp = xmin (0., b.data(jb));
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = b.ridx(jb);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		  else
+		    {
+		      Complex tmp = xmin (a.data(ja), b.data(jb));
+		      if (tmp != 0.)
+			{
+                          r.data(jx) = tmp;
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		}
+	      r.cidx(i+1) = jx;
+	    }
+	  
+	  r.maybe_compress ();
+	}
+    }
+  else
+    (*current_liboctave_error_handler) ("matrix size mismatch");
+
+  return r;
+}
+
+SparseComplexMatrix
+max (const Complex& c, const SparseComplexMatrix& m)
+{
+  SparseComplexMatrix result;
+
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  EMPTY_RETURN_CHECK (SparseComplexMatrix);
+
+  // Count the number of non-zero elements
+  if (xmax(c, 0.) != 0.)
+    {
+      result = SparseComplexMatrix (nr, nc, c);
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  result.xdata(m.ridx(i) + j * nr) = xmax (c, m.data(i));
+    }
+  else
+    result = SparseComplexMatrix (m);
+
+  return result;
+}
+
+SparseComplexMatrix
+max (const SparseComplexMatrix& m, const Complex& c)
+{
+  return max (c, m);
+}
+
+SparseComplexMatrix
+max (const SparseComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  SparseComplexMatrix r;
+
+  if ((a.rows() == b.rows()) && (a.cols() == b.cols())) 
+    {
+      int a_nr = a.rows ();
+      int a_nc = a.cols ();
+
+      int b_nr = b.rows ();
+      int b_nc = b.cols ();
+
+      if (a_nr == 0 || b_nc == 0)
+	return SparseComplexMatrix (a_nr, a_nc);
+      if (a.nnz () == 0)
+	return SparseComplexMatrix (b);
+      if (b.nnz () == 0)
+	return SparseComplexMatrix (a);
+
+      if (a_nr != b_nr || a_nc != b_nc)
+	gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc);
+      else
+	{
+	  r = SparseComplexMatrix (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+	  int jx = 0;
+	  r.cidx (0) = 0;
+	  for (int i = 0 ; i < a_nc ; i++)
+	    {
+	      int  ja = a.cidx(i);
+	      int  ja_max = a.cidx(i+1);
+	      bool ja_lt_max= ja < ja_max;
+           
+	      int  jb = b.cidx(i);
+	      int  jb_max = b.cidx(i+1);
+	      bool jb_lt_max = jb < jb_max;
+           
+	      while (ja_lt_max || jb_lt_max )
+		{
+		  OCTAVE_QUIT;
+		  if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+		    {
+		      Complex tmp = xmax (a.data(ja), 0.);
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = a.ridx(ja);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		    }
+		  else if (( !ja_lt_max ) ||
+			   (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+		    {
+		      Complex tmp = xmax (0., b.data(jb));
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = b.ridx(jb);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		  else
+		    {
+		      Complex tmp = xmax (a.data(ja), b.data(jb));
+		      if (tmp != 0.)
+			{
+                          r.data(jx) = tmp;
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		}
+	      r.cidx(i+1) = jx;
+	    }
+	  
+	  r.maybe_compress ();
+	}
+    }
+  else
+    (*current_liboctave_error_handler) ("matrix size mismatch");
+
+  return r;
+}
+
+SPARSE_SMS_CMP_OPS (SparseComplexMatrix, 0.0, real, Complex, 
+		   0.0, real)
+SPARSE_SMS_BOOL_OPS (SparseComplexMatrix, Complex, 0.0)
+
+SPARSE_SSM_CMP_OPS (Complex, 0.0, real, SparseComplexMatrix, 
+		   0.0, real)
+SPARSE_SSM_BOOL_OPS (Complex, SparseComplexMatrix, 0.0)
+
+SPARSE_SMSM_CMP_OPS (SparseComplexMatrix, 0.0, real, SparseComplexMatrix, 
+		     0.0, real)
+SPARSE_SMSM_BOOL_OPS (SparseComplexMatrix, SparseComplexMatrix, 0.0)
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/CSparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,431 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_CSparse_h)
+#define octave_CSparse_h 1
+
+#include "dMatrix.h"
+#include "dNDArray.h"
+#include "CNDArray.h"
+#include "dColVector.h"
+#include "CColVector.h"
+#include "oct-cmplx.h"
+
+#include "CmplxDET.h"
+#include "MSparse.h"
+#include "MSparse-defs.h"
+#include "Sparse-op-defs.h"
+#include "SparseType.h"
+
+class SparseMatrix;
+class SparseBoolMatrix;
+
+class
+SparseComplexMatrix : public MSparse<Complex>
+{
+public:
+  
+  typedef void (*solve_singularity_handler) (double rcond);
+
+  SparseComplexMatrix (void) : MSparse<Complex> () { }
+
+  SparseComplexMatrix (int r, int c) : MSparse<Complex> (r, c) { }
+
+  explicit SparseComplexMatrix (int r, int c, Complex val) 
+    : MSparse<Complex> (r, c, val) { }
+
+  SparseComplexMatrix (int r, int c, double val) 
+    : MSparse<Complex> (r, c, Complex (val)) { }
+
+  SparseComplexMatrix (const SparseComplexMatrix& a) 
+    : MSparse<Complex> (a) { }
+
+  SparseComplexMatrix (const SparseComplexMatrix& a, const dim_vector& dv) 
+    : MSparse<Complex> (a, dv) { }
+
+  SparseComplexMatrix (const MSparse<Complex>& a) : MSparse<Complex> (a) { }
+
+  explicit SparseComplexMatrix (const ComplexMatrix& a) 
+    : MSparse<Complex> (a) { }
+
+  explicit SparseComplexMatrix (const ComplexNDArray& a) 
+    : MSparse<Complex> (a) { }
+
+  explicit SparseComplexMatrix (const Array<Complex> a, const Array<int>& r, 
+			 const Array<int>& c, int nr = -1, 
+			 int nc = -1, bool sum_terms = true)
+    : MSparse<Complex> (a, r, c, nr, nc, sum_terms) { }
+
+  explicit SparseComplexMatrix (const Array<Complex> a, 
+				const Array<double>& r, 
+				const Array<double>& c, int nr = -1, 
+				int nc = -1, bool sum_terms = true)
+    : MSparse<Complex> (a, r, c, nr, nc, sum_terms) { }
+
+  explicit SparseComplexMatrix (const SparseMatrix& a);
+
+  explicit SparseComplexMatrix (const SparseBoolMatrix& a);
+
+  SparseComplexMatrix (int r, int c, int num_nz) 
+    : MSparse<Complex> (r, c, num_nz) { }
+
+  SparseComplexMatrix& operator = (const SparseComplexMatrix& a)
+    {
+      MSparse<Complex>::operator = (a);
+      return *this;
+    }
+
+  bool operator == (const SparseComplexMatrix& a) const;
+  bool operator != (const SparseComplexMatrix& a) const;
+
+  bool is_hermitian (void) const;
+
+  SparseComplexMatrix max (int dim = 0) const;
+  SparseComplexMatrix max (Array2<int>& index, int dim = 0) const;
+  SparseComplexMatrix min (int dim = 0) const;
+  SparseComplexMatrix min (Array2<int>& index, int dim = 0) const;
+
+  SparseComplexMatrix& insert (const SparseComplexMatrix& a, int r, int c);
+  SparseComplexMatrix& insert (const SparseMatrix& a, int r, int c);
+
+  SparseComplexMatrix concat (const SparseComplexMatrix& rb,
+			      const Array<int>& ra_idx);
+  SparseComplexMatrix concat (const SparseMatrix& rb,
+			      const Array<int>& ra_idx);
+
+  ComplexMatrix matrix_value (void) const;
+
+  SparseComplexMatrix hermitian (void) const;  // complex conjugate transpose
+  SparseComplexMatrix transpose (void) const
+    { return MSparse<Complex>::transpose (); }
+
+  friend SparseComplexMatrix conj (const SparseComplexMatrix& a);
+
+  SparseComplexMatrix inverse (void) const;
+  SparseComplexMatrix inverse (int& info) const;
+  SparseComplexMatrix inverse (int& info, double& rcond, int force = 0,
+			       int calc_cond = 1) const;
+
+  ComplexDET determinant (void) const;
+  ComplexDET determinant (int& info) const;
+  ComplexDET determinant (int& info, double& rcond, 
+				int calc_cond = 1) const;
+
+private:
+  // Diagonal matrix solvers
+  ComplexMatrix dsolve (SparseType &typ, const Matrix& b, int& info, 
+	        double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix dsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix dsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix dsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Upper triangular matrix solvers
+  ComplexMatrix utsolve (SparseType &typ, const Matrix& b, int& info,
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix utsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix utsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix utsolve (SparseType &typ, const SparseComplexMatrix& b, 
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Lower triangular matrix solvers
+  ComplexMatrix ltsolve (SparseType &typ, const Matrix& b, int& info, 
+	       double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix ltsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix ltsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix ltsolve (SparseType &typ, const SparseComplexMatrix& b, 
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Tridiagonal matrix solvers
+  ComplexMatrix trisolve (SparseType &typ, const Matrix& b, int& info, 
+	       double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix trisolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix trisolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix trisolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Banded matrix solvers (umfpack/cholesky)
+  ComplexMatrix bsolve (SparseType &typ, const Matrix& b, int& info,
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix bsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix bsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix bsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  // Full matrix solvers (umfpack/cholesky)
+  void * factorize (int& err, double &rcond, Matrix &Control, Matrix &Info,
+		    solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix fsolve (SparseType &typ, const Matrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix fsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix fsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix fsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+public:
+  // Generic interface to solver with no probing of type
+  ComplexMatrix solve (SparseType &typ, const Matrix& b) const;
+  ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info) const;
+  ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info, 
+		double& rcond) const;
+  ComplexMatrix solve (SparseType &typ, const Matrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, 
+		       int& info) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		       double& rcond) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, 
+		      int& info) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, 
+		      double& rcond) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (SparseType &typ, 
+			     const SparseComplexMatrix& b) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, 
+			     int& info) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, 
+			     int& info, double& rcond) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, int& info, 
+	       double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (SparseType &typ, const ColumnVector& b) const;
+  ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, 
+		      int& info) const;
+  ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, 
+		      int& info, double& rcond) const;
+  ComplexColumnVector solve (SparseType &typ, const ColumnVector& b, int& info,
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (SparseType &typ, 
+			     const ComplexColumnVector& b) const;
+  ComplexColumnVector solve (SparseType &typ, 
+			     const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b,
+			     int& info, double& rcond) const;
+  ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b,
+			     int& info, double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  // Generic interface to solver with probing of type
+  ComplexMatrix solve (const Matrix& b) const;
+  ComplexMatrix solve (const Matrix& b, int& info) const;
+  ComplexMatrix solve (const Matrix& b, int& info, double& rcond) const;
+  ComplexMatrix solve (const Matrix& b, int& info, double& rcond, 
+		       solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix solve (const ComplexMatrix& b) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info, 
+		       double& rcond) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info, double& rcond,
+		       solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (const SparseMatrix& b) const;
+  SparseComplexMatrix solve (const SparseMatrix& b, int& info) const;
+  SparseComplexMatrix solve (const SparseMatrix& b, int& info, 
+			     double& rcond) const;
+  SparseComplexMatrix solve (const SparseMatrix& b, int& info, 
+			     double& rcond, 
+		       solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (const SparseComplexMatrix& b) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, 
+			     double& rcond) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, 
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (const ColumnVector& b) const;
+  ComplexColumnVector solve (const ColumnVector& b, int& info) const;
+  ComplexColumnVector solve (const ColumnVector& b, int& info,
+			     double& rcond) const;
+  ComplexColumnVector solve (const ColumnVector& b, int& info, double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (const ComplexColumnVector& b) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info,
+			     double& rcond) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info,
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix lssolve (const Matrix& b) const;
+  ComplexMatrix lssolve (const Matrix& b, int& info) const;
+  ComplexMatrix lssolve (const Matrix& b, int& info, int& rank) const;
+
+  ComplexMatrix lssolve (const ComplexMatrix& b) const;
+  ComplexMatrix lssolve (const ComplexMatrix& b, int& info) const;
+  ComplexMatrix lssolve (const ComplexMatrix& b, int& info,
+			 int& rank) const;
+
+  SparseComplexMatrix lssolve (const SparseMatrix& b) const;
+  SparseComplexMatrix lssolve (const SparseMatrix& b, int& info) const;
+  SparseComplexMatrix lssolve (const SparseMatrix& b, int& info, 
+			       int& rank) const;
+
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b) const;
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b, 
+			       int& info) const;
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b, int& info,
+			       int& rank) const;
+
+  ComplexColumnVector lssolve (const ColumnVector& b) const;
+  ComplexColumnVector lssolve (const ColumnVector& b, int& info) const;
+  ComplexColumnVector lssolve (const ColumnVector& b, int& info,
+			       int& rank) const;
+
+  ComplexColumnVector lssolve (const ComplexColumnVector& b) const;
+  ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info,
+			       int& rank) const;
+
+  SparseComplexMatrix squeeze (void) const;
+
+  SparseComplexMatrix index (idx_vector& i, int resize_ok) const;
+
+  SparseComplexMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const;
+  
+  SparseComplexMatrix index (Array<idx_vector>& ra_idx, int resize_ok) const;
+
+  SparseComplexMatrix reshape (const dim_vector& new_dims) const;
+
+  SparseComplexMatrix permute (const Array<int>& vec, bool inv = false) const;
+
+  SparseComplexMatrix ipermute (const Array<int>& vec) const;
+
+  SparseComplexMatrix map (c_c_Mapper f) const;
+  SparseMatrix map (d_c_Mapper f) const;
+  SparseBoolMatrix map (b_c_Mapper f) const;
+
+  SparseComplexMatrix& apply (c_c_Mapper f);
+
+  bool any_element_is_inf_or_nan (void) const;
+  bool all_elements_are_real (void) const;
+  bool all_integers (double& max_val, double& min_val) const;
+  bool too_large_for_float (void) const;
+
+  SparseBoolMatrix operator ! (void) const;
+
+  SparseBoolMatrix all (int dim = -1) const;
+  SparseBoolMatrix any (int dim = -1) const;
+
+  SparseComplexMatrix cumprod (int dim = -1) const;
+  SparseComplexMatrix cumsum (int dim = -1) const;
+  SparseComplexMatrix prod (int dim = -1) const;
+  SparseComplexMatrix sum (int dim = -1) const;
+  SparseComplexMatrix sumsq (int dim = -1) const;
+  SparseMatrix abs (void) const;
+
+  SparseComplexMatrix diag (int k = 0) const;
+
+  // i/o
+  friend std::ostream& operator << (std::ostream& os, 
+				    const SparseComplexMatrix& a);
+  friend std::istream& operator >> (std::istream& is, 
+				    SparseComplexMatrix& a);
+};
+
+extern SparseComplexMatrix operator * (const SparseMatrix&,        
+				       const SparseComplexMatrix&);
+extern SparseComplexMatrix operator * (const SparseComplexMatrix&, 
+				       const SparseMatrix&);
+extern SparseComplexMatrix operator * (const SparseComplexMatrix&, 
+				       const SparseComplexMatrix&);
+
+extern SparseComplexMatrix min (const Complex& c, 
+				const SparseComplexMatrix& m);
+extern SparseComplexMatrix min (const SparseComplexMatrix& m, 
+				const Complex& c);
+extern SparseComplexMatrix min (const SparseComplexMatrix& a, 
+				const SparseComplexMatrix& b);
+
+extern SparseComplexMatrix max (const Complex& c, 
+				const SparseComplexMatrix& m);
+extern SparseComplexMatrix max (const SparseComplexMatrix& m, 
+				const Complex& c);
+extern SparseComplexMatrix max (const SparseComplexMatrix& a, 
+				const SparseComplexMatrix& b);
+
+SPARSE_SMS_CMP_OP_DECLS (SparseComplexMatrix, Complex)
+SPARSE_SMS_BOOL_OP_DECLS (SparseComplexMatrix, Complex)
+
+SPARSE_SSM_CMP_OP_DECLS (Complex, SparseComplexMatrix)
+SPARSE_SSM_BOOL_OP_DECLS (Complex, SparseComplexMatrix)
+
+SPARSE_SMSM_CMP_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix)
+SPARSE_SMSM_BOOL_OP_DECLS (SparseComplexMatrix, SparseComplexMatrix)
+
+SPARSE_FORWARD_DEFS (MSparse, SparseComplexMatrix, ComplexMatrix, Complex)
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/liboctave/ChangeLog	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -1,3 +1,219 @@
+2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	Sparse merge.
+
+	2005-02-13  David Bateman  <dbateman@free.fr>
+
+	* CSparse.cc (SparseComplexMatrix:dsolve, SparseComplexMatrix:utsolve,
+	SparseComplexMatrix::ltsolve, SparseComplexMatrix::trisolve,
+	SparseComplexMatrix::bsolve, SparseComplexMatrix:fsolve): Split sparse
+	solver into separate functions for the diagonal, upper, lower 
+	triangular, tridiagonal, banded and full cases.
+	(SparseComplexMatrix::solve): rewrite to call the above function. One
+	version that probes the matrix type and another that assumes the type
+	is passed.
+
+	* dSparse.cc (SparseMatrix:dsolve, SparseMatrix:utsolve,
+	SparseMatrix::ltsolve, SparseMatrix::trisolve,
+	SparseMatrix::bsolve, SparseMatrix:fsolve): Likewise
+	(SparseMatrix::solve): Likewise
+
+	* CSparse.h (dsolve, utsolve, ltsolve, trisolve, bsolve, fsolve):
+	Declaration of new functions
+	* dSparse.h (dsolve, utsolve, ltsolve, trisolve, bsolve, fsolve):
+	Likewise
+
+	* CSparse.cc (operator !): Reverse the sense of the test.
+	* dSpase.cc (operator !): Likewise
+
+	* dSparse.h (type, band_size, is_dense, triangular_row_perm,
+	triangular_col_perm, sparse_info): Remove matrix type code
+	* CSparse.h (type, band_size, is_dense, triangular_row_perm,
+	triangular_col_perm, sparse_info): Likewise
+	* boolSparse.h (type, band_size, is_dense, triangular_row_perm,
+	triangular_col_perm, sparse_info): Likewise
+	* MSparse.h (type, band_size, is_dense, triangular_row_perm,
+	triangular_col_perm, sparse_info): Likewise
+	* Sparse.h (type, band_size, is_dense, triangular_row_perm,
+	triangular_col_perm, sparse_info, matrix_type): Likewise
+
+	* Sparse.cc (type, sparse_info, band_size): Remove type code
+	
+	* SparseType.h: New class for the matrix type used in solvers
+	* SparseType.cc: methods of sparse matrix type class
+	
+	* Makefile.in: Add SparseType.cc
+
+	2005-02-01  David Bateman  <dbateman@free.fr>
+
+	* UMFPACK: Update to version 4.4
+	* UMFPACK.patch: Version 4.4 contains most of the previous patch. Only
+	keep octave specific test files
+
+	2005-01-23  David Bateman  <dbateman@free.fr>
+
+	* dSparse.cc (SparseMatrix::solve): Include tridiagonal, cholesky
+	tridiagonal and banded cholesky solvers. Remove calculation of
+	condition number for banded solvers.
+	* CSparse.cc (SparseComplexMatrix::solve): ditto.
+
+	* Sparse.h (int type (int) const, bool is_dense (void) const):
+	new functions.
+	* MSparse.h (int type (int) const, bool is_dense (void) const): ditto
+	* dSparse.h (int type (int) const, bool is_dense (void) const): ditto
+	* CSparse.h (int type (int) const, bool is_dense (void) const): ditto
+	* boolSparse.h (int type (int) const, bool is_dense (void) const): 
+	ditto
+
+	* Sparse.cc (int Sparse<T>::type (int) const, 
+	bool Sparse<T>::is_dense (void) const): New functions definition
+	
+	* Sparse.h (matrix_type typ): Move caching of matrix type to SparseRep,
+	so it actually is cached, but disable
+
+	* oct-spparms.cc (SparseParams::init_keys): Change spmoni to spumoni
+	for compatiability
+	
+	2005-01-18  David Bateman  <dbateman@free.fr>
+
+	* Array.cc (Array<T>::insert (const Array<T>&, const Array<int>&)):
+	Modify calculation of number elements to skip between copied blocks.
+
+	2005-01-07  David Bateman  <dbateman@free.fr>
+
+	* Sparse.h : Reverse definitions of numel and nelem.
+	* Sparse.cc (assign1): Use numel and not nelem
+	* Sparse-op-def.h: Replace all uses of nelem with numel
+	
+	2005-01-07  David Bateman  <dbateman@free.fr>
+
+	* dbleDET.h: Make SparseMatrix a friend of the class DET
+	* CmplexDET.h: Make SparseComplexMatrix a friend of the class 
+	ComplexDET
+	* dSparse.cc (SparseMatrix::determinant): Replace use of SparseDET 
+	by DET
+	* dSparse.h (determinant): ditto
+	* CSparse.cc (SparseComplexMatrix::determinant): Replace use of 
+	SparseComplexDET by ComplexDET
+	* CSparse.h (determinant): ditto
+	* SparsedbleDET.h, SparsedbleDET.cc, SparseCmplxDET.h, 
+	SparseCmplxDET.cc: delete files
+	* Makefile.in: Delete reference to SparsedbleDET.h, SparsedbleDET.cc,
+	SparseCmplxDET.h andSparseCmplxDET.cc.
+
+	* CSparse.cc (SparseComplexMatrix::solve): Store matrix type in 
+	local variable to avoid variable shadowing.
+	* dSparse.cc (SparseMatrix::solve): ditto.
+	
+        * boolSparse.cc boolSparse.h CSparse.cc CSparse.h dSparse.cc 
+	dSparse.h MSparse.cc MSparse-C.cc MSparse-d.cc MSparse-defs.h
+   	MSparse.h oct-spparms.cc oct-spparms.h Sparse-b.cc Sparse.cc 
+	Sparse-C.cc SparseCmplxLU.cc SparseCmplxLU.h SparsedbleLU.cc 
+	SparsedbleLU.h Sparse-d.cc Sparse.h Sparse-op-defs.h sparse-sort.cc 
+	sparse-sort.h: Remove additional licensing clause with authors
+	permission.
+	
+	2004-12-30  John W. Eaton  <jwe@octave.org>
+
+	* MSparse.cc (SPARSE_A2S_OP_2, SPARSE_SA2_OP_2):
+	Loop counter is int, not size_t.
+
+	* oct-spparms.cc (SparseParams::operator =): Return *this.
+
+	* Sparse-op-defs.h (SPARSE_SPARSE_MUL): Delete unused variable tmpval.
+
+	* dSparse.cc (operator << (ostream&, const SparseMatrix&), atan2):
+	Delete unused variables.
+	(SparseMatrix::solve): Avoid warnings about uninitialized
+	variables and variables that might be clobbered by longjmp.
+
+	* CSparse.cc (operator << (ostream&, const SparseComplexMatrix&),
+	min, max): Delete unused variables.
+	(SparseComplexMatrix::solve): Avoid warnings about uninitialized
+	variables and variables that might be clobbered by longjmp.
+
+	* Makefile.in (UMFPACK_SPECIAL): Include .d files in the list.
+
+	* Sparse-op-defs.h (SPARSE_SMS_BIN_OP_2, SPARSE_SSM_BIN_OP_2):
+	Loop counter is int, not size_t.
+
+	* CSparse.cc (SparseComplexMatrix::hermitian): Avoid shadow warnings.
+	* Sparse.cc (Sparse<T>::Sparse, Sparse<T>::type, assign): Likewise.
+	
+	* Sparse.h (Sparse::SparseRep): Order data members and initializer
+	lists consistently.
+
+	* mx-base.h: Include boolSparse.h, dSparse.h, and CSparse.h.
+
+	2004-12-29  John W. Eaton  <jwe@octave.org>
+
+	* COLAMD.files (COLAMD_EXTRAS): New variable.
+	* UMFPACK.files (UMFPACK_EXTRAS): New variable.
+	* Makefile.in (DISTFILES): Add $(COLAMD_EXTRAS) and
+	$(UMFPACK_EXTRAS) to the list.
+	(DISTDIRS): New variable.
+	(dist): Handle $(DISTDIRS).
+
+	Merge of sparse code from David Bateman <dbateman@free.fr> and 
+	Andy Adler <adler@site.uottawa.ca>.
+
+	* Makefile.in (VPATH): ADD @srcdir@/COLAMD to the list.
+
+	* Makefile.in (MAKEDEPS): Include $(COLAMD_SRC) and $(UMFPACK_SRC)
+	without directory prefix.
+
+	* Makefile.in (LIBOCTAVE_OBJECTS): Add $(COLAMD_OBJ) and
+	$(UMFPACK_OBJ) to the list.
+
+	* COLAMD: New directory.
+	* COLAMD.files: New file.
+	* Makefile.in: Include COLAMD.files.
+	(SOURCES): Add $(COLAMD_SOURCES) to the list.
+	(LIBOCTAVE_OBJECTS): Add $(COLAMD_OBJECTS) to the list.
+	(INCLUDES): Add $(COLAMD_INCLUDES) to the list.
+
+	* UMFPACK: New directory.
+	* UMFPACK.patch, UMFPACK.README, UMFPACK.files, UMFPACK.rules:
+	New files.
+	* Makefile.in: Include UMFPACK.files and UMFPACK.rules.
+	(SOURCES): Add $(UMFPACK_SOURCES) to the list.
+	(LIBOCTAVE_OBJECTS): Add $(UMFPACK_OBJECTS) to the list.
+	(INCLUDES): Add $(UMFPACK_INCLUDES) to the list.
+
+	* Makefile.in (SPARSE_MX_OP_INC): New variable.
+	(INCLUDES): Add it to the list.
+	(SPARSE_MX_OP_SRC): New variable.
+	(LIBOCTAVE_CXX_SOURCES): Add it to the list.
+	(distclean): Remove $(SPARSE_MX_OP_INC) and $(SPARSE_MX_OP_SRC).
+	(stamp-prereq): Depend on $(SPARSE_MX_OP_INC) and $(SPARSE_MX_OP_SRC).
+
+	* sparse-mk-ops.awk, sparse-mx-ops: New files.
+	* Makefile.in (DISTFILES): Add them to the lists.
+
+	* oct-spparms.h, sparse-sort.h: New files.
+	* Makefile.in (INCLUDES): Add them to the list.
+
+	* oct-spparms.cc, sparse-sort.cc: New files.
+	* Makefile.in (LIBOCTAVE_CXX_SOURCES): Add them to the list.
+
+	* sparse-base-lu.cc: New file.
+	* Makefile.in (TEMPLATE_SRC): Add it to the list.
+
+	* boolSparse.cc, CSparse.cc, dSparse.cc, MSparse.cc, Sparse.cc,
+	SparseCmplxDET.cc, SparseCmplxLU.cc, SparsedbleDET.cc,
+	SparsedbleLU.cc: New files.
+	* Makefile.in (MATRIX_SRC): Add them to the list.
+	
+	* boolSparse.h, CSparse.h, dSparse.h, MSparse-defs.h, MSparse.h,
+	Sparse.h, oct-spparms.h, sparse-base-lu.h, SparseCmplxDET.h,
+	SparseCmplxLU.h, SparsedbleDET.h, SparsedbleLU.h,
+	Sparse-op-defs.h: New files.
+	* Makefile.in (MATRIX_INC): Add them to the appropriate lists.
+
+	* MSparse-d.cc, MSparse-C.cc, Sparse-b.cc, Sparse-d.cc,
+	Sparse-C.cc: New files.
+	* Makefile.in (TI_SRC): Add them to the list.
+
 2005-02-18  John W. Eaton  <jwe@octave.org>
 
 	* file-ops.cc (file_ops::canonicalize_file_name) [HAVE_RESOLVEPATH]:
--- a/liboctave/CmplxDET.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/CmplxDET.h	Fri Feb 25 19:55:28 2005 +0000
@@ -31,6 +31,7 @@
 ComplexDET
 {
 friend class ComplexMatrix;
+friend class SparseComplexMatrix;
 
 public:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/MSparse-C.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,39 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "oct-cmplx.h"
+
+#include "MSparse.h"
+#include "MSparse.cc"
+
+template class MSparse<Complex>;
+
+INSTANTIATE_SPARSE_FRIENDS (Complex);
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/MSparse-d.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,37 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MSparse.h"
+#include "MSparse.cc"
+
+template class MSparse<double>;
+
+INSTANTIATE_SPARSE_FRIENDS (double);
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/MSparse-defs.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,217 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_MSparse_defs_h)
+#define octave_MSparse_defs_h 1
+
+// Nothing like a little CPP abuse to brighten everyone's day.
+
+// A macro that can be used to declare and instantiate OP= operators.
+#define SPARSE_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, LTGT, RHS_T) \
+  PFX A_T<E_T>& \
+  operator OP LTGT (A_T<E_T>&, const RHS_T&)
+
+// All the OP= operators that we care about.
+#define SPARSE_OP_ASSIGN_DECLS(A_T, E_T, PFX, LTGT, RHS_T) \
+  SPARSE_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, LTGT, RHS_T); \
+  SPARSE_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, LTGT, RHS_T);
+
+// Generate forward declarations for OP= operators.
+#define SPARSE_OP_ASSIGN_FWD_DECLS(A_T, RHS_T) \
+  SPARSE_OP_ASSIGN_DECLS (A_T, T, template <typename T>, , RHS_T)
+
+// Generate friend declarations for the OP= operators.
+#define SPARSE_OP_ASSIGN_FRIENDS(A_T, RHS_T) \
+  SPARSE_OP_ASSIGN_DECLS (A_T, T, friend, <>, RHS_T)
+
+// Instantiate the OP= operators.
+#define SPARSE_OP_ASSIGN_DEFS(A_T, E_T, RHS_T) \
+  SPARSE_OP_ASSIGN_DECLS (A_T, E_T, template, , RHS_T)
+
+// A function that can be used to forward OP= operations from derived
+// classes back to us.
+#define SPARSE_OP_ASSIGN_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \
+  inline R \
+  F (X_T& x, const Y_T& y) \
+  { \
+    return R (F (C_X (x), C_Y (y))); \
+  }
+
+// All the OP= operators that we care about forwarding.
+#define SPARSE_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T)
+
+// A macro that can be used to declare and instantiate unary operators.
+#define SPARSE_UNOP(A_T, E_T, F, PFX, LTGT) \
+  PFX A_T<E_T> \
+  F LTGT (const A_T<E_T>&)
+
+// All the unary operators that we care about.
+#define SPARSE_UNOP_DECLS(A_T, E_T, PFX, LTGT) \
+  SPARSE_UNOP (A_T, E_T, operator +, PFX, LTGT); \
+  SPARSE_UNOP (A_T, E_T, operator -, PFX, LTGT);
+
+// Generate forward declarations for unary operators.
+#define SPARSE_UNOP_FWD_DECLS(A_T) \
+  SPARSE_UNOP_DECLS (A_T, T, template <typename T>, )
+
+// Generate friend declarations for the unary operators.
+#define SPARSE_UNOP_FRIENDS(A_T) \
+  SPARSE_UNOP_DECLS (A_T, T, friend, <>)
+
+// Instantiate the unary operators.
+#define SPARSE_UNOP_DEFS(A_T, E_T) \
+  SPARSE_UNOP_DECLS (A_T, E_T, template, )
+
+// A function that can be used to forward unary operations from derived
+// classes back to us.
+#define SPARSE_UNOP_FWD_FCN(R, F, T, C_X, X_T) \
+  inline R \
+  F (const X_T& x) \
+  { \
+    return R (F (C_X (x))); \
+  }
+
+// All the unary operators that we care about forwarding.
+#define SPARSE_UNOP_FWD_DEFS(R, T, C_X, X_T) \
+  SPARSE_UNOP_FWD_FCN (R, operator +, T, C_X, X_T) \
+  SPARSE_UNOP_FWD_FCN (R, operator -, T, C_X, X_T)
+
+// A macro that can be used to declare and instantiate binary operators.
+#define SPARSE_BINOP_DECL(A_T, E_T, F, PFX, LTGT, X_T, Y_T) \
+  PFX A_T<E_T> \
+  F LTGT (const X_T&, const Y_T&)
+
+// All the binary operators that we care about.  We have two
+// sets of macros since the MArray OP MArray operations use functions
+// (product and quotient) instead of operators (*, /).
+#define SPARSE_BINOP_DECLS(A_T, F_T, E_T, PFX, LTGT, X_T, Y_T)	 \
+  SPARSE_BINOP_DECL (F_T, E_T, operator +, PFX, LTGT, X_T, Y_T); \
+  SPARSE_BINOP_DECL (F_T, E_T, operator -, PFX, LTGT, X_T, Y_T); \
+  SPARSE_BINOP_DECL (A_T, E_T, operator *, PFX, LTGT, X_T, Y_T); \
+  SPARSE_BINOP_DECL (A_T, E_T, operator /, PFX, LTGT, X_T, Y_T);
+
+#define SPARSE_AA_BINOP_DECLS(A_T, E_T, PFX, LTGT) \
+  SPARSE_BINOP_DECL (A_T, E_T, operator +, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
+  SPARSE_BINOP_DECL (A_T, E_T, operator -, PFX, LTGT, A_T<E_T>, A_T<E_T>); \
+  SPARSE_BINOP_DECL (A_T, E_T, quotient,   PFX, LTGT, A_T<E_T>, A_T<E_T>); \
+  SPARSE_BINOP_DECL (A_T, E_T, product,    PFX, LTGT, A_T<E_T>, A_T<E_T>);
+
+// Generate forward declarations for binary operators.
+#define SPARSE_BINOP_FWD_DECLS(A_T, F_T) \
+  SPARSE_BINOP_DECLS (A_T, F_T, T, template <typename T>, , A_T<T>, T)	\
+  SPARSE_BINOP_DECLS (A_T, F_T, T, template <typename T>, , T, A_T<T>) \
+  SPARSE_AA_BINOP_DECLS (A_T, T, template <typename T>, )
+
+// Generate friend declarations for the binary operators.
+#define SPARSE_BINOP_FRIENDS(A_T, F_T)		     \
+  SPARSE_BINOP_DECLS (A_T, F_T, T, friend, <>, A_T<T>, T)	\
+  SPARSE_BINOP_DECLS (A_T, F_T, T, friend, <>, T, A_T<T>)	\
+  SPARSE_AA_BINOP_DECLS (A_T, T, friend, <>)
+
+// Instantiate the binary operators.
+#define SPARSE_BINOP_DEFS(A_T, F_T, E_T) \
+  SPARSE_BINOP_DECLS (A_T, F_T, E_T, template, , A_T<E_T>, E_T)	\
+  SPARSE_BINOP_DECLS (A_T, F_T, E_T, template, , E_T, A_T<E_T>)	\
+  SPARSE_AA_BINOP_DECLS (A_T, E_T, template, )
+
+// A function that can be used to forward binary operations from derived
+// classes back to us.
+#define SPARSE_BINOP_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \
+  inline R \
+  F (const X_T& x, const Y_T& y) \
+  { \
+    return R (F (C_X (x), C_Y (y))); \
+  }
+
+// The binary operators that we care about forwarding.  We have two
+// sets of macros since the MSparse OP MSparse operations use functions
+// (product and quotient) instead of operators (*, /).
+#define SPARSE_BINOP_FWD_DEFS(R, F, T, C_X, X_T, C_Y, Y_T)     \
+  SPARSE_BINOP_FWD_FCN (F, operator +, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (F, operator -, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T)
+
+#define SPARSE_AA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, product,    T, C_X, X_T, C_Y, Y_T) \
+  SPARSE_BINOP_FWD_FCN (R, quotient,   T, C_X, X_T, C_Y, Y_T)
+
+// Forward declarations for the MSparse operators.
+#define SPARSE_OPS_FORWARD_DECLS(A_T, F_T) \
+  template <class T> \
+  class A_T; \
+ \
+  /* SPARSE_OP_ASSIGN_FWD_DECLS (A_T, T) */ \
+  SPARSE_OP_ASSIGN_FWD_DECLS (A_T, A_T<T>) \
+  SPARSE_UNOP_FWD_DECLS (A_T) \
+  SPARSE_BINOP_FWD_DECLS (A_T, F_T)
+
+// Friend declarations for the MSparse operators.
+#define SPARSE_OPS_FRIEND_DECLS(A_T, F_T)  \
+  /* SPARSE_OP_ASSIGN_FRIENDS (A_T, T) */ \
+  SPARSE_OP_ASSIGN_FRIENDS (A_T, A_T<T>) \
+  SPARSE_UNOP_FRIENDS (A_T) \
+    SPARSE_BINOP_FRIENDS (A_T, F_T)
+
+// The following macros are for external use.
+
+// Instantiate all the MSparse friends for MSparse element type T.
+#define INSTANTIATE_SPARSE_FRIENDS(T) \
+  /* SPARSE_OP_ASSIGN_DEFS (MSparse, T, T) */ \
+  SPARSE_OP_ASSIGN_DEFS (MSparse, T, MSparse<T>) \
+  SPARSE_UNOP_DEFS (MSparse, T) \
+  SPARSE_BINOP_DEFS (MSparse, MArray2, T)
+
+// Define all the MSparse forwarding functions for return type R and
+// MSparse element type T
+#define SPARSE_FORWARD_DEFS(B, R, F, T) 	\
+  /* SPARSE_OP_ASSIGN_FWD_DEFS	*/ \
+  /* (R, T, dynamic_cast<B<T>&>, R, , T) */	\
+ \
+  SPARSE_OP_ASSIGN_FWD_DEFS \
+    (R, T, \
+     dynamic_cast<B<T>&>, R, dynamic_cast<const B<T>&>, R) \
+ \
+  SPARSE_UNOP_FWD_DEFS \
+    (R, T, dynamic_cast<const B<T>&>, R) \
+ \
+  SPARSE_BINOP_FWD_DEFS \
+    (R, F, T, dynamic_cast<const B<T>&>, R, , T) \
+ \
+  SPARSE_BINOP_FWD_DEFS \
+    (R, F, T, , T, dynamic_cast<const B<T>&>, R)	\
+ \
+  SPARSE_AA_BINOP_FWD_DEFS \
+    (R, T, dynamic_cast<const B<T>&>, R, dynamic_cast<const B<T>&>, R)
+
+// Now we have all the definitions we need.
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/MSparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,506 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "quit.h"
+#include "lo-error.h"
+#include "MArray2.h"
+#include "Array-util.h"
+
+#include "MSparse.h"
+#include "MSparse-defs.h"
+
+// sparse array with math ops.
+
+// Element by element MSparse by MSparse ops.
+
+template <class T>
+MSparse<T>&
+operator += (MSparse<T>& a, const MSparse<T>& b)
+{
+    MSparse<T> r;
+
+    int a_nr = a.rows ();
+    int a_nc = a.cols ();
+
+    int b_nr = b.rows ();
+    int b_nc = b.cols ();
+
+    if (a_nr != b_nr || a_nc != b_nc)
+      gripe_nonconformant ("operator +=" , a_nr, a_nc, b_nr, b_nc);
+    else
+      {
+        r = MSparse<T> (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+        int jx = 0;
+        for (int i = 0 ; i < a_nc ; i++)
+          {
+            int  ja = a.cidx(i);
+            int  ja_max = a.cidx(i+1);
+            bool ja_lt_max= ja < ja_max;
+           
+            int  jb = b.cidx(i);
+            int  jb_max = b.cidx(i+1);
+            bool jb_lt_max = jb < jb_max;
+           
+            while (ja_lt_max || jb_lt_max )
+              {
+                OCTAVE_QUIT;
+                if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+                  {
+                    r.ridx(jx) = a.ridx(ja);
+                    r.data(jx) = a.data(ja) + 0.;
+                    jx++;
+                    ja++;
+                    ja_lt_max= ja < ja_max;
+                  }
+                else if (( !ja_lt_max ) ||
+                     (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+                  {
+		    r.ridx(jx) = b.ridx(jb);
+		    r.data(jx) = 0. + b.data(jb);
+		    jx++;
+                    jb++;
+                    jb_lt_max= jb < jb_max;
+                  }
+                else
+                  {
+		     if ((a.data(ja) + b.data(jb)) != 0.)
+	               {
+                          r.data(jx) = a.data(ja) + b.data(jb);
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+                       }
+                     ja++;
+                     ja_lt_max= ja < ja_max;
+                     jb++;
+                     jb_lt_max= jb < jb_max;
+                  }
+              }
+            r.cidx(i+1) = jx;
+          }
+       
+	a = r.maybe_compress ();
+      }
+
+    return a;
+}
+
+template <class T>
+MSparse<T>&
+operator -= (MSparse<T>& a, const MSparse<T>& b)
+{
+    MSparse<T> r;
+
+    int a_nr = a.rows ();
+    int a_nc = a.cols ();
+
+    int b_nr = b.rows ();
+    int b_nc = b.cols ();
+
+    if (a_nr != b_nr || a_nc != b_nc)
+      gripe_nonconformant ("operator -=" , a_nr, a_nc, b_nr, b_nc);
+    else
+      {
+        r = MSparse<T> (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+        int jx = 0;
+        for (int i = 0 ; i < a_nc ; i++)
+          {
+            int  ja = a.cidx(i);
+            int  ja_max = a.cidx(i+1);
+            bool ja_lt_max= ja < ja_max;
+           
+            int  jb = b.cidx(i);
+            int  jb_max = b.cidx(i+1);
+            bool jb_lt_max = jb < jb_max;
+           
+            while (ja_lt_max || jb_lt_max )
+              {
+                OCTAVE_QUIT;
+                if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+                  {
+                    r.ridx(jx) = a.ridx(ja);
+                    r.data(jx) = a.data(ja) - 0.;
+                    jx++;
+                    ja++;
+                    ja_lt_max= ja < ja_max;
+                  }
+                else if (( !ja_lt_max ) ||
+                     (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+                  {
+		    r.ridx(jx) = b.ridx(jb);
+		    r.data(jx) = 0. - b.data(jb);
+		    jx++;
+                    jb++;
+                    jb_lt_max= jb < jb_max;
+                  }
+                else
+                  {
+		     if ((a.data(ja) - b.data(jb)) != 0.)
+	               {
+                          r.data(jx) = a.data(ja) - b.data(jb);
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+                       }
+                     ja++;
+                     ja_lt_max= ja < ja_max;
+                     jb++;
+                     jb_lt_max= jb < jb_max;
+                  }
+              }
+            r.cidx(i+1) = jx;
+          }
+       
+	a = r.maybe_compress ();
+      }
+
+    return a;
+}
+
+// Element by element MSparse by scalar ops.
+
+#define SPARSE_A2S_OP_1(OP) \
+  template <class T> \
+  MArray2<T> \
+  operator OP (const MSparse<T>& a, const T& s) \
+  { \
+    int nr = a.rows (); \
+    int nc = a.cols (); \
+ \
+    MArray2<T> r (nr, nc, (0.0 OP s));	\
+ \
+    for (int j = 0; j < nc; j++) \
+      for (int i = a.cidx(j); i < a.cidx(j+1); i++)	\
+        r.elem (a.ridx (i), j) = a.data (i) OP s;	\
+    return r; \
+  }
+
+#define SPARSE_A2S_OP_2(OP) \
+  template <class T> \
+  MSparse<T> \
+  operator OP (const MSparse<T>& a, const T& s) \
+  { \
+    int nr = a.rows (); \
+    int nc = a.cols (); \
+    int nz = a.nnz (); \
+ \
+    MSparse<T> r (nr, nc, nz); \
+ \
+    for (int i = 0; i < nz; i++) \
+      { \
+	r.data(i) = a.data(i) OP s; \
+	r.ridx(i) = a.ridx(i); \
+      } \
+    for (int i = 0; i < nc + 1; i++) \
+      r.cidx(i) = a.cidx(i); \
+    r.maybe_compress (true); \
+    return r; \
+  }
+
+
+SPARSE_A2S_OP_1 (+)
+SPARSE_A2S_OP_1 (-)
+SPARSE_A2S_OP_2 (*)
+SPARSE_A2S_OP_2 (/)
+
+// Element by element scalar by MSparse ops.
+
+#define SPARSE_SA2_OP_1(OP) \
+  template <class T> \
+  MArray2<T> \
+  operator OP (const T& s, const MSparse<T>& a) \
+  { \
+    int nr = a.rows (); \
+    int nc = a.cols (); \
+ \
+    MArray2<T> r (nr, nc, (s OP 0.0));	\
+ \
+    for (int j = 0; j < nc; j++) \
+      for (int i = a.cidx(j); i < a.cidx(j+1); i++)	\
+        r.elem (a.ridx (i), j) = s OP a.data (i);	\
+    return r; \
+  }
+
+#define SPARSE_SA2_OP_2(OP) \
+  template <class T> \
+  MSparse<T> \
+  operator OP (const T& s, const MSparse<T>& a) \
+  { \
+    int nr = a.rows (); \
+    int nc = a.cols (); \
+    int nz = a.nnz (); \
+ \
+    MSparse<T> r (nr, nc, nz); \
+ \
+    for (int i = 0; i < nz; i++) \
+      { \
+	r.data(i) = s OP a.data(i); \
+	r.ridx(i) = a.ridx(i); \
+      } \
+    for (int i = 0; i < nc + 1; i++) \
+      r.cidx(i) = a.cidx(i); \
+    r.maybe_compress (true); \
+    return r; \
+  }
+
+SPARSE_SA2_OP_1 (+)
+SPARSE_SA2_OP_1 (-)
+SPARSE_SA2_OP_2 (*)
+SPARSE_SA2_OP_2 (/)
+
+// Element by element MSparse by MSparse ops.
+
+#define SPARSE_A2A2_OP(OP) \
+  template <class T> \
+  MSparse<T> \
+  operator OP (const MSparse<T>& a, const MSparse<T>& b) \
+  { \
+    MSparse<T> r; \
+ \
+    int a_nr = a.rows (); \
+    int a_nc = a.cols (); \
+ \
+    int b_nr = b.rows (); \
+    int b_nc = b.cols (); \
+ \
+    if (a_nr != b_nr || a_nc != b_nc) \
+      gripe_nonconformant ("operator " # OP, a_nr, a_nc, b_nr, b_nc); \
+    else \
+      { \
+        r = MSparse<T> (a_nr, a_nc, (a.nnz () + b.nnz ())); \
+        \
+        int jx = 0; \
+	r.cidx (0) = 0; \
+        for (int i = 0 ; i < a_nc ; i++) \
+          { \
+            int  ja = a.cidx(i); \
+            int  ja_max = a.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = b.cidx(i); \
+            int  jb_max = b.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \
+                  { \
+                    r.ridx(jx) = a.ridx(ja); \
+                    r.data(jx) = a.data(ja) OP 0.; \
+                    jx++; \
+                    ja++; \
+                    ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \
+                  { \
+		    r.ridx(jx) = b.ridx(jb); \
+		    r.data(jx) = 0. OP b.data(jb); \
+		    jx++; \
+                    jb++; \
+                    jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+		     if ((a.data(ja) OP b.data(jb)) != 0.) \
+	               { \
+                          r.data(jx) = a.data(ja) OP b.data(jb); \
+                          r.ridx(jx) = a.ridx(ja); \
+                          jx++; \
+                       } \
+                     ja++; \
+                     ja_lt_max= ja < ja_max; \
+                     jb++; \
+                     jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+            r.cidx(i+1) = jx; \
+          } \
+        \
+	r.maybe_compress (); \
+      } \
+ \
+    return r; \
+  }
+
+#define SPARSE_A2A2_FCN_1(FCN, OP)	\
+  template <class T> \
+  MSparse<T> \
+  FCN (const MSparse<T>& a, const MSparse<T>& b) \
+  { \
+    MSparse<T> r; \
+ \
+    int a_nr = a.rows (); \
+    int a_nc = a.cols (); \
+ \
+    int b_nr = b.rows (); \
+    int b_nc = b.cols (); \
+ \
+    if (a_nr != b_nr || a_nc != b_nc) \
+      gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \
+    else \
+      { \
+        r = MSparse<T> (a_nr, a_nc, (a.nnz() > b.nnz() ? a.nnz() : b.nnz())); \
+        \
+        int jx = 0; \
+	r.cidx (0) = 0; \
+        for (int i = 0 ; i < a_nc ; i++) \
+          { \
+            int  ja = a.cidx(i); \
+            int  ja_max = a.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = b.cidx(i); \
+            int  jb_max = b.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \
+                  { \
+                     ja++; ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \
+                  { \
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+		     if ((a.data(ja) OP b.data(jb)) != 0.) \
+	               { \
+                          r.data(jx) = a.data(ja) OP b.data(jb); \
+                          r.ridx(jx) = a.ridx(ja); \
+                          jx++; \
+                       } \
+                     ja++; ja_lt_max= ja < ja_max; \
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+            r.cidx(i+1) = jx; \
+          } \
+        \
+	r.maybe_compress (); \
+      } \
+ \
+    return r; \
+  }
+
+#define SPARSE_A2A2_FCN_2(FCN, OP)	\
+  template <class T> \
+  MSparse<T> \
+  FCN (const MSparse<T>& a, const MSparse<T>& b) \
+  { \
+    MSparse<T> r; \
+    T Zero = T (); \
+ \
+    int a_nr = a.rows (); \
+    int a_nc = a.cols (); \
+ \
+    int b_nr = b.rows (); \
+    int b_nc = b.cols (); \
+ \
+    if (a_nr != b_nr || a_nc != b_nc) \
+      gripe_nonconformant (#FCN, a_nr, a_nc, b_nr, b_nc); \
+    else \
+      { \
+        r = MSparse<T>( a_nr, a_nc, (Zero OP Zero)); \
+        \
+        for (int i = 0 ; i < a_nc ; i++) \
+          { \
+            int  ja = a.cidx(i); \
+            int  ja_max = a.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = b.cidx(i); \
+            int  jb_max = b.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb)))) \
+                  { \
+		     r.elem (a.ridx(ja),i) = a.data(ja) OP Zero; \
+                     ja++; ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) ) \
+                  { \
+		     r.elem (b.ridx(jb),i) = Zero OP b.data(jb);	\
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+                     r.elem (a.ridx(ja),i) = a.data(ja) OP b.data(jb); \
+                     ja++; ja_lt_max= ja < ja_max; \
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+          } \
+        \
+	r.maybe_compress (true); \
+      } \
+ \
+    return r; \
+  }
+
+SPARSE_A2A2_OP (+)
+SPARSE_A2A2_OP (-)
+SPARSE_A2A2_FCN_1 (product,    *)
+SPARSE_A2A2_FCN_2 (quotient,   /)
+
+// Unary MSparse ops.
+
+template <class T>
+MSparse<T>
+operator + (const MSparse<T>& a)
+{
+  return a;
+}
+
+template <class T>
+MSparse<T>
+operator - (const MSparse<T>& a)
+{
+  MSparse<T> retval (a);
+  int nz = a.nnz ();
+  for (int i = 0; i < nz; i++)
+    retval.data(i) = - retval.data(i);
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/MSparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,116 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_MSparse_h)
+#define octave_MSparse_h 1
+
+#include "MArray2.h"
+
+#include "Sparse.h"
+
+// Two dimensional sparse array with math ops.
+
+// But first, some preprocessor abuse...
+
+#include "MSparse-defs.h"
+
+SPARSE_OPS_FORWARD_DECLS (MSparse, MArray2)
+
+template <class T>
+class
+MSparse : public Sparse<T>
+{
+public:
+
+  MSparse (void) : Sparse<T> () { }
+
+  MSparse (int n, int m) : Sparse<T> (n, m) { }
+
+  MSparse (const MSparse<T>& a) : Sparse<T> (a) { }
+
+  MSparse (const MSparse<T>& a, const dim_vector& dv) : Sparse<T> (a, dv) { }
+
+  MSparse (const Sparse<T>& a) : Sparse<T> (a) { }
+
+  MSparse (const Array<T> a, const Array<int>& r, 
+	   const Array<int>& c, int nr = -1, 
+	   int nc = -1, bool sum_terms = true)
+    : Sparse<T> (a, r, c, nr, nc, sum_terms) { }
+
+  MSparse (const Array<T> a, const Array<double>& r, 
+	   const Array<double>& c, int nr = -1, 
+	   int nc = -1, bool sum_terms = true)
+    : Sparse<T> (a, r, c, nr, nc, sum_terms) { }
+
+  explicit MSparse (int r, int c, T val) : Sparse<T> (r, c, val) { }
+
+  MSparse (int r, int c, int num_nz) : Sparse<T> (r, c, num_nz) { }
+
+  ~MSparse (void) { }
+
+  MSparse<T>& operator = (const MSparse<T>& a)
+    {
+      Sparse<T>::operator = (a);
+      return *this;
+    }
+
+  MSparse<T>& insert (const Sparse<T>& a, int r, int c)
+  {
+    Sparse<T>::insert (a, r, c);
+    return *this;
+  }
+
+  MSparse<T> transpose (void) const { return Sparse<T>::transpose (); }
+
+  MSparse<T> squeeze (void) const { return Sparse<T>::squeeze (); }
+
+  MSparse<T> index (idx_vector& i, int resize_ok) const 
+    { return Sparse<T>::index (i, resize_ok); }
+
+  MSparse<T> index (idx_vector& i, idx_vector& j, int resize_ok) const 
+    { return Sparse<T>::index (i, j, resize_ok); }
+  
+  MSparse<T> index (Array<idx_vector>& ra_idx, int resize_ok) const 
+    { return Sparse<T>::index (ra_idx, resize_ok); }
+
+  MSparse<T> reshape (const dim_vector& new_dims) const
+    { return Sparse<T>::reshape (new_dims); }
+     
+  MSparse<T> permute (const Array<int>& vec, bool inv = false) const
+    { return Sparse<T>::permute (vec, inv); }
+
+  MSparse<T> ipermute (const Array<int>& vec) const
+    { return Sparse<T>::ipermute (vec); }
+
+
+  // Currently, the OPS functions don't need to be friends, but that
+  // may change.
+
+  // SPARSE_OPS_FRIEND_DECLS (MSparse, MArray2)
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/liboctave/Makefile.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/Makefile.in	Fri Feb 25 19:55:28 2005 +0000
@@ -10,7 +10,7 @@
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
-VPATH = @srcdir@
+VPATH = @srcdir@:@srcdir@/COLAMD
 
 include $(TOPDIR)/Makeconf
 
@@ -22,6 +22,10 @@
   -L../libcruft -L../glob -L. $(RLD_FLAG) \
   $(LIBCRUFT) $(BLAS_LIBS) $(FFTW_LIBS) $(LIBREADLINE) -lglob $(LIBS) $(FLIBS)
 
+include $(srcdir)/COLAMD.files
+
+include $(srcdir)/UMFPACK.files
+
 MATRIX_INC := Array.h Array2.h Array3.h ArrayN.h DiagArray2.h \
 	Array-flags.h Array-util.h ArrayN-idx.h MArray-defs.h \
 	MArray.h MArray2.h MDiagArray2.h Matrix.h MArrayN.h \
@@ -33,6 +37,9 @@
 	chMatrix.h chNDArray.h dColVector.h dDiagMatrix.h dMatrix.h \
 	dNDArray.h dRowVector.h dbleAEPBAL.h dbleCHOL.h dbleDET.h \
 	dbleHESS.h dbleLU.h dbleQR.h dbleQRP.h dbleSCHUR.h dbleSVD.h \
+	boolSparse.h CSparse.h dSparse.h MSparse-defs.h MSparse.h \
+	Sparse.h oct-spparms.h sparse-base-lu.h SparseCmplxLU.h \
+	SparsedbleLU.h Sparse-op-defs.h SparseType.h \
 	int8NDArray.h uint8NDArray.h int16NDArray.h uint16NDArray.h \
 	int32NDArray.h uint32NDArray.h int64NDArray.h uint64NDArray.h \
 	intNDArray.h
@@ -41,6 +48,8 @@
 
 VX_OP_INC := $(shell $(AWK) -f $(srcdir)/mk-ops.awk prefix=vx list_h_files=1 $(srcdir)/vx-ops)
 
+SPARSE_MX_OP_INC := $(shell $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx list_h_files=1 $(srcdir)/sparse-mx-ops)
+
 OPTS_INC_DATA := DASPK-opts.in DASRT-opts.in DASSL-opts.in \
 	LSODE-opts.in NLEqn-opts.in ODESSA-opts.in Quad-opts.in
 
@@ -58,21 +67,24 @@
 	lo-sysdep.h lo-utils.h mach-info.h oct-alloc.h oct-cmplx.h \
 	oct-env.h oct-fftw.h oct-getopt.h oct-group.h oct-inttypes.h \
 	oct-passwd.h oct-rand.h oct-rl-edit.h oct-rl-hist.h \
-	oct-shlib.h oct-sort.h oct-syscalls.h oct-time.h pathlen.h \
-	pathsearch.h prog-args.h so-array.h statdefs.h str-vec.h \
-	sun-utils.h sysdir.h systime.h syswait.h \
+	oct-shlib.h oct-sort.h oct-spparms.h oct-syscalls.h \
+	oct-time.h pathlen.h pathsearch.h prog-args.h so-array.h \
+	sparse-sort.h statdefs.h str-vec.h sun-utils.h sysdir.h \
+	systime.h syswait.h \
 	$(OPTS_INC) \
 	$(MATRIX_INC) \
 	$(MX_OP_INC) \
-	$(VX_OP_INC)
+	$(VX_OP_INC) \
+	$(SPARSE_MX_OP_INC)
 
 TEMPLATE_SRC := Array.cc ArrayN.cc DiagArray2.cc \
 	MArray.cc MArray2.cc MArrayN.cc MDiagArray2.cc \
-	base-lu.cc oct-sort.cc
+	base-lu.cc oct-sort.cc sparse-base-lu.cc
 
 TI_SRC := Array-C.cc Array-b.cc Array-ch.cc Array-i.cc Array-d.cc \
 	Array-s.cc Array-so.cc Array-str.cc Array-idx-vec.cc \
 	MArray-C.cc MArray-ch.cc MArray-i.cc MArray-d.cc MArray-s.cc \
+	MSparse-C.cc MSparse-d.cc Sparse-C.cc Sparse-b.cc Sparse-d.cc \
 	oct-inttypes.cc
 
 MATRIX_SRC := Array-flags.cc Array-util.cc CColVector.cc \
@@ -83,7 +95,9 @@
 	chNDArray.cc dColVector.cc dDiagMatrix.cc dMatrix.cc \
 	dNDArray.cc dRowVector.cc dbleAEPBAL.cc dbleCHOL.cc \
 	dbleDET.cc dbleHESS.cc dbleLU.cc dbleQR.cc dbleQRP.cc \
-	dbleSCHUR.cc dbleSVD.cc \
+	dbleSCHUR.cc dbleSVD.cc boolSparse.cc CSparse.cc dSparse.cc \
+	MSparse.cc Sparse.cc SparseCmplxLU.cc SparsedbleLU.cc \
+	SparseType.cc \
 	int8NDArray.cc uint8NDArray.cc int16NDArray.cc uint16NDArray.cc \
 	int32NDArray.cc uint32NDArray.cc int64NDArray.cc uint64NDArray.cc 
 
@@ -91,6 +105,8 @@
 
 VX_OP_SRC := $(shell $(AWK) -f $(srcdir)/mk-ops.awk prefix=vx list_cc_files=1 $(srcdir)/vx-ops)
 
+SPARSE_MX_OP_SRC := $(shell $(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx list_cc_files=1 $(srcdir)/sparse-mx-ops)
+
 LIBOCTAVE_CXX_SOURCES := Bounds.cc CollocWt.cc \
 	DASPK.cc DASRT.cc DASSL.cc FEGrid.cc LinConst.cc \
 	LPsolve.cc LSODE.cc NLEqn.cc ODES.cc ODESSA.cc \
@@ -99,12 +115,14 @@
 	lo-ieee.cc lo-mappers.cc lo-specfun.cc lo-sysdep.cc \
 	lo-utils.cc mach-info.cc oct-alloc.cc oct-env.cc \
 	oct-fftw.cc oct-group.cc oct-passwd.cc oct-rand.cc oct-shlib.cc \
-	oct-syscalls.cc oct-time.cc prog-args.cc so-array.cc str-vec.cc \
+	oct-spparms.cc oct-syscalls.cc oct-time.cc prog-args.cc \
+	so-array.cc sparse-sort.cc str-vec.cc \
 	$(TEMPLATE_SRC) \
 	$(TI_SRC) \
 	$(MATRIX_SRC) \
 	$(MX_OP_SRC) \
-	$(VX_OP_SRC)
+	$(VX_OP_SRC) \
+	$(SPARSE_MX_OP_SRC)
 
 LIBOCTAVE_C_SOURCES := f2c-main.c filemode.c getopt.c getopt1.c \
 	lo-cieee.c lo-cutils.c mkdir.c oct-getopt.c rename.c \
@@ -135,17 +153,25 @@
 INCLUDES_FOR_INSTALL := $(INCLUDES) $(TEMPLATE_SRC) $(EXTRAS)
 
 DISTFILES := Makefile.in ChangeLog mk-ops.awk mx-ops vx-ops \
-	$(SOURCES) $(INCLUDES) $(EXTRAS) $(OPTS_INC_DATA)
+	sparse-mk-ops.awk sparse-mx-ops \
+	$(SOURCES) $(INCLUDES) $(EXTRAS) $(OPTS_INC_DATA) \
+	$(COLAMD_EXTRAS) $(UMFPACK_EXTRAS)
+
+# Complete directory trees to distribute.
+DISTDIRS := COLAMD UMFPACK
 
 ifeq ($(SHARED_LIBS), true)
   BINDISTLIBS = liboctave/liboctave
   BINDISTFILES = liboctave.$(SHLEXT_VER)
 endif
 
-MAKEDEPS_1 := $(patsubst %.cc, %.d, $(SOURCES))
+MAKEDEPS_2 := $(SOURCES) $(COLAMD_SRC)
+MAKEDEPS_1 := $(patsubst %.cc, %.d, $(MAKEDEPS_2))
 MAKEDEPS := $(patsubst %.c, %.d, $(MAKEDEPS_1))
 
 LIBOCTAVE_OBJECTS := \
+	$(COLAMD_OBJ) \
+	$(UMFPACK_OBJ) \
 	$(LIBOCTAVE_CXX_SOURCES:.cc=.o) \
 	$(LIBOCTAVE_C_SOURCES:.c=.o) \
 	$(LIBOCT_READLINE_CXX_SOURCES:.cc=.o) \
@@ -161,11 +187,20 @@
   endif
 endif
 
+UMFPACK_SPECIAL_1 := CSparse.o dSparse.o SparseCmplxLU.o SparsedbleLU.o
+UMFPACK_SPECIAL := \
+	$(UMFPACK_SPECIAL_1) \
+	$(addprefix pic/, $(UMFPACK_SPECIAL_1)) \
+	$(UMFPACK_SPECIAL_1:.o=.d)
+$(UMFPACK_SPECIAL): INCFLAGS += $(UMFPACK_INCFLAGS)
+
 all: libraries
 .PHONY: all
 
 objects: $(OBJECTS)
 
+include $(srcdir)/UMFPACK.rules
+
 stmp-pic: pic
 	@if [ -f stmp-pic ]; then \
 	  true; \
@@ -182,7 +217,9 @@
 	  mkdir pic; \
 	fi
 
-stamp-prereq: $(OPTS_INC) $(VX_OP_INC) $(VX_OP_SRC) $(MX_OP_INC) $(MX_OP_SRC) mx-ops.h
+stamp-prereq: $(OPTS_INC) $(VX_OP_INC) $(VX_OP_SRC) \
+	$(MX_OP_INC) $(MX_OP_SRC) mx-ops.h \
+	$(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC)
 	touch stamp-prereq
 
 ifeq ($(SHARED_LIBS), true)
@@ -296,6 +333,7 @@
 distclean: clean
 	rm -f Makefile so_locations stamp-prereq $(OPTS_INC)
 	rm -f mx-ops.h $(MX_OP_INC) $(VX_OP_INC) $(MX_OP_SRC) $(VX_OP_SRC)
+	rm -f $(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC)
 .PHONY: distclean
 
 maintainer-clean: distclean
@@ -304,6 +342,7 @@
 
 dist: stamp-prereq
 	ln $(DISTFILES) ../`cat ../.fname`/liboctave
+	for dir in $(DISTDIRS); do ln -s ../../liboctave/$$dir ../`cat ../.fname/liboctave`; done
 .PHONY: dist
 
 bin-dist:
@@ -326,6 +365,9 @@
 $(MX_OP_INC) $(MX_OP_SRC) : $(srcdir)/mk-ops.awk mx-ops
 	$(AWK) -f $(srcdir)/mk-ops.awk prefix=mx $(srcdir)/mx-ops
 
+$(SPARSE_MX_OP_INC) $(SPARSE_MX_OP_SRC) : $(srcdir)/sparse-mk-ops.awk sparse-mx-ops
+	$(AWK) -f $(srcdir)/sparse-mk-ops.awk prefix=smx $(srcdir)/sparse-mx-ops
+
 mx-ops.h : $(srcdir)/mk-ops.awk mx-ops
 	$(AWK) -f $(srcdir)/mk-ops.awk prefix=mx make_inclusive_header=mx-ops.h $(srcdir)/mx-ops > $@-t
 	$(top_srcdir)/move-if-change $@-t $@
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse-C.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,45 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Instantiate Sparse matrix of complex values.
+
+#include "oct-cmplx.h"
+
+#include "Sparse.h"
+#include "Sparse.cc"
+
+INSTANTIATE_SPARSE_AND_ASSIGN (Complex);
+
+INSTANTIATE_SPARSE_ASSIGN (Complex, double);
+
+#if 0
+template std::ostream& operator << (std::ostream&, const Sparse<Complex>&);
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse-b.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,41 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Instantiate Sparse matrix of double values.
+
+#include "Sparse.h"
+#include "Sparse.cc"
+
+INSTANTIATE_SPARSE_AND_ASSIGN (bool);
+
+#if 0
+template std::ostream& operator << (std::ostream&, const Sparse<bool>&);
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse-d.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,41 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Instantiate Sparse matrix of double values.
+
+#include "Sparse.h"
+#include "Sparse.cc"
+
+INSTANTIATE_SPARSE_AND_ASSIGN (double);
+
+#if 0
+template std::ostream& operator << (std::ostream&, const Sparse<double>&);
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse-op-defs.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1609 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_op_defs_h)
+#define octave_sparse_op_defs_h 1
+
+#include "Array-util.h"
+
+#define SPARSE_BIN_OP_DECL(R, OP, X, Y) \
+  extern R OP (const X&, const Y&)
+
+#define SPARSE_CMP_OP_DECL(OP, X, Y) \
+  extern SparseBoolMatrix OP (const X&, const Y&)
+
+#define SPARSE_BOOL_OP_DECL(OP, X, Y) \
+  extern SparseBoolMatrix OP (const X&, const Y&)
+
+// matrix by scalar operations.
+
+#define SPARSE_SMS_BIN_OP_DECLS(R1, R2, M, S)  \
+  SPARSE_BIN_OP_DECL (R1, operator +, M, S); \
+  SPARSE_BIN_OP_DECL (R1, operator -, M, S); \
+  SPARSE_BIN_OP_DECL (R2, operator *, M, S); \
+  SPARSE_BIN_OP_DECL (R2, operator /, M, S);
+
+#define SPARSE_SMS_BIN_OP_1(R, F, OP, M, S)	\
+  R \
+  F (const M& m, const S& s) \
+  { \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+ \
+    R r (nr, nc, (0.0 OP s)); \
+ \
+    for (int j = 0; j < nc; j++) \
+      for (int i = m.cidx (j); i < m.cidx (j+1); i++) \
+        r.elem (m.ridx (i), j) = m.data (i) OP s; \
+    return r; \
+  }
+
+#define SPARSE_SMS_BIN_OP_2(R, F, OP, M, S)	\
+  R \
+  F (const M& m, const S& s) \
+  { \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    int nz = m.nnz (); \
+ \
+    R r (nr, nc, nz); \
+ \
+    for (int i = 0; i < nz; i++) \
+      { \
+	r.data(i) = m.data(i) OP s; \
+	r.ridx(i) = m.ridx(i); \
+      } \
+    for (int i = 0; i < nc + 1; i++) \
+      r.cidx(i) = m.cidx(i); \
+    \
+    r.maybe_compress (true); \
+    return r; \
+  }
+
+#define SPARSE_SMS_BIN_OPS(R1, R2, M, S) \
+  SPARSE_SMS_BIN_OP_1 (R1, operator +, +, M, S) \
+  SPARSE_SMS_BIN_OP_1 (R1, operator -, -, M, S) \
+  SPARSE_SMS_BIN_OP_2 (R2, operator *, *, M, S) \
+  SPARSE_SMS_BIN_OP_2 (R2, operator /, /, M, S)
+
+#define SPARSE_SMS_CMP_OP_DECLS(M, S) \
+  SPARSE_CMP_OP_DECL (mx_el_lt, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_le, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_ge, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_gt, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M, S);
+
+#define SPARSE_SMS_EQNE_OP_DECLS(M, S) \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M, S); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M, S);
+
+#define SPARSE_SMS_CMP_OP(F, OP, M, MZ, MC, S, SZ, SC)	\
+  SparseBoolMatrix \
+  F (const M& m, const S& s) \
+  { \
+    /* Count num of non-zero elements */ \
+    int nel = 0; \
+    int nz = m.nnz (); \
+    if (MC (MZ) OP SC (s))   \
+      nel += m.numel() - nz; \
+    for (int i = 0; i < nz; i++) \
+      if (MC (m.data (i)) OP SC (s)) \
+        nel++;	\
+    \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    SparseBoolMatrix r (nr, nc, nel); \
+    \
+    if (nr > 0 && nc > 0) \
+      { \
+	if (MC (MZ) OP SC (s))	\
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = 0; i < nr; i++) \
+		  { \
+		    bool el =  MC (m.elem(i, j)) OP SC (s); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+	else \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = m.cidx(j); i < m.cidx(j+1); i++) \
+		  { \
+		    bool el =  MC (m.data(i)) OP SC (s); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = m.ridx(i); \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	\
+    return r; \
+  }
+
+#define SPARSE_SMS_CMP_OPS(M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_lt, <,  M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_le, <=, M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_ge, >=, M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_gt, >,  M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ,   , S, SZ,   )	\
+  SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ,   , S, SZ,   )
+
+#define SPARSE_SMS_EQNE_OPS(M, MZ, CM, S, SZ, CS)	\
+  SPARSE_SMS_CMP_OP (mx_el_eq, ==, M, MZ,   , S, SZ,   )	\
+  SPARSE_SMS_CMP_OP (mx_el_ne, !=, M, MZ,   , S, SZ,   )
+
+#define SPARSE_SMS_BOOL_OP_DECLS(M, S) \
+  SPARSE_BOOL_OP_DECL (mx_el_and, M, S); \
+  SPARSE_BOOL_OP_DECL (mx_el_or,  M, S);
+
+#define SPARSE_SMS_BOOL_OP(F, OP, M, S, LHS_ZERO, RHS_ZERO) \
+  SparseBoolMatrix \
+  F (const M& m, const S& s) \
+  { \
+    /* Count num of non-zero elements */ \
+    int nel = 0; \
+    int nz = m.nnz (); \
+    if (LHS_ZERO OP (s != RHS_ZERO)) \
+      nel += m.numel() - nz; \
+    for (int i = 0; i < nz; i++) \
+      if ((m.data(i) != LHS_ZERO) OP (s != RHS_ZERO))\
+        nel++;	\
+    \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    SparseBoolMatrix r (nr, nc, nel); \
+    \
+    if (nr > 0 && nc > 0) \
+      { \
+	if (LHS_ZERO OP (s != RHS_ZERO)) \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = 0; i < nr; i++) \
+		  { \
+		    bool el = (m.elem(i, j) != LHS_ZERO) OP (s != RHS_ZERO); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+	else \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = m.cidx(j); i < m.cidx(j+1); i++) \
+		  { \
+		    bool el = (m.data(i) != LHS_ZERO) OP (s != RHS_ZERO); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = m.ridx(i); \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	\
+    return r; \
+  }
+
+#define SPARSE_SMS_BOOL_OPS2(M, S, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMS_BOOL_OP (mx_el_and, &&, M, S, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMS_BOOL_OP (mx_el_or,  ||, M, S, LHS_ZERO, RHS_ZERO)
+
+#define SPARSE_SMS_BOOL_OPS(M, S, ZERO) \
+  SPARSE_SMS_BOOL_OPS2(M, S, ZERO, ZERO)
+
+#define SPARSE_SMS_OP_DECLS(R1, R2, M, S) \
+  SPARSE_SMS_BIN_OP_DECLS (R1, R2, M, S)	 \
+  SPARSE_SMS_CMP_OP_DECLS (M, S) \
+  SPARSE_SMS_BOOL_OP_DECLS (M, S)
+
+// scalar by matrix operations.
+
+#define SPARSE_SSM_BIN_OP_DECLS(R1, R2, S, M)    \
+  SPARSE_BIN_OP_DECL (R1, operator +, S, M); \
+  SPARSE_BIN_OP_DECL (R1, operator -, S, M); \
+  SPARSE_BIN_OP_DECL (R2, operator *, S, M); \
+  SPARSE_BIN_OP_DECL (R2, operator /, S, M);
+
+#define SPARSE_SSM_BIN_OP_1(R, F, OP, S, M) \
+  R \
+  F (const S& s, const M& m) \
+  { \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+ \
+    R r (nr, nc, (s OP 0.0)); \
+ \
+    for (int j = 0; j < nc; j++) \
+      for (int i = m.cidx (j); i < m.cidx (j+1); i++) \
+        r.elem (m.ridx (i), j) = s OP m.data (i); \
+ \
+    return r; \
+  }
+
+#define SPARSE_SSM_BIN_OP_2(R, F, OP, S, M) \
+  R \
+  F (const S& s, const M& m) \
+  { \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    int nz = m.nnz (); \
+ \
+    R r (nr, nc, nz); \
+ \
+    for (int i = 0; i < nz; i++) \
+      { \
+	r.data(i) = s OP m.data(i); \
+	r.ridx(i) = m.ridx(i); \
+      } \
+    for (int i = 0; i < nc + 1; i++) \
+      r.cidx(i) = m.cidx(i); \
+ \
+    r.maybe_compress(true); \
+    return r; \
+  }
+
+#define SPARSE_SSM_BIN_OPS(R1, R2, S, M) \
+  SPARSE_SSM_BIN_OP_1 (R1, operator +, +, S, M) \
+  SPARSE_SSM_BIN_OP_1 (R1, operator -, -, S, M) \
+  SPARSE_SSM_BIN_OP_2 (R2, operator *, *, S, M) \
+  SPARSE_SSM_BIN_OP_2 (R2, operator /, /, S, M)
+
+#define SPARSE_SSM_CMP_OP_DECLS(S, M) \
+  SPARSE_CMP_OP_DECL (mx_el_lt, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_le, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_ge, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_gt, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_eq, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, S, M);
+
+#define SPARSE_SSM_EQNE_OP_DECLS(S, M) \
+  SPARSE_CMP_OP_DECL (mx_el_eq, S, M); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, S, M);
+
+#define SPARSE_SSM_CMP_OP(F, OP, S, SZ, SC, M, MZ, MC)	\
+  SparseBoolMatrix \
+  F (const S& s, const M& m) \
+  { \
+    /* Count num of non-zero elements */ \
+    int nel = 0; \
+    int nz = m.nnz (); \
+    if (SC (s) OP MC (MZ))   \
+      nel += m.numel() - nz; \
+    for (int i = 0; i < nz; i++) \
+      if (SC (s) OP MC (m.data (i))) \
+        nel++;	\
+    \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    SparseBoolMatrix r (nr, nc, nel); \
+    \
+    if (nr > 0 && nc > 0) \
+      { \
+	if (SC (s) OP MC (MZ))\
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = 0; i < nr; i++) \
+		  { \
+		    bool el = SC (s) OP MC (m.elem(i, j)); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+	else \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = m.cidx(j); i < m.cidx(j+1); i++) \
+		  { \
+		    bool el =  SC (s) OP MC (m.data(i)); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = m.ridx(i); \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	\
+    return r; \
+  }
+
+#define SPARSE_SSM_CMP_OPS(S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_lt, <,  S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_le, <=, S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_ge, >=, S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_gt, >,  S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ,   , M, MZ,   )	\
+  SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ,   , M, MZ,   )
+
+#define SPARSE_SSM_EQNE_OPS(S, SZ, SC, M, MZ, MC)	\
+  SPARSE_SSM_CMP_OP (mx_el_eq, ==, S, SZ,   , M, MZ,   )	\
+  SPARSE_SSM_CMP_OP (mx_el_ne, !=, S, SZ,   , M, MZ,   )
+
+#define SPARSE_SSM_BOOL_OP_DECLS(S, M) \
+  SPARSE_BOOL_OP_DECL (mx_el_and, S, M); \
+  SPARSE_BOOL_OP_DECL (mx_el_or,  S, M); \
+
+#define SPARSE_SSM_BOOL_OP(F, OP, S, M, LHS_ZERO, RHS_ZERO) \
+  SparseBoolMatrix \
+  F (const S& s, const M& m) \
+  { \
+    /* Count num of non-zero elements */ \
+    int nel = 0; \
+    int nz = m.nnz (); \
+    if ((s != LHS_ZERO) OP  RHS_ZERO) \
+      nel += m.numel() - nz; \
+    for (int i = 0; i < nz; i++) \
+      if ((s != LHS_ZERO) OP m.data(i) != RHS_ZERO) \
+        nel++;	\
+    \
+    int nr = m.rows (); \
+    int nc = m.cols (); \
+    SparseBoolMatrix r (nr, nc, nel); \
+    \
+    if (nr > 0 && nc > 0) \
+      { \
+	if ((s != LHS_ZERO) OP RHS_ZERO) \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = 0; i < nr; i++) \
+		  { \
+		    bool el = (s != LHS_ZERO) OP (m.elem(i, j) != RHS_ZERO); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+	else \
+	  { \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < nc; j++) \
+	      { \
+		for (int i = m.cidx(j); i < m.cidx(j+1); i++) \
+		  { \
+		    bool el = (s != LHS_ZERO) OP (m.data(i) != RHS_ZERO); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = m.ridx(i); \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	\
+    return r; \
+  }
+
+#define SPARSE_SSM_BOOL_OPS2(S, M, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SSM_BOOL_OP (mx_el_and, &&, S, M, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SSM_BOOL_OP (mx_el_or,  ||, S, M, LHS_ZERO, RHS_ZERO)
+
+#define SPARSE_SSM_BOOL_OPS(S, M, ZERO) \
+  SPARSE_SSM_BOOL_OPS2(S, M, ZERO, ZERO)
+
+#define SPARSE_SSM_OP_DECLS(R1, R2, S, M) \
+  SPARSE_SSM_BIN_OP_DECLS (R1, R2, S, M)	 \
+  SPARSE_SSM_CMP_OP_DECLS (S, M) \
+  SPARSE_SSM_BOOL_OP_DECLS (S, M) \
+
+// matrix by matrix operations.
+
+#define SPARSE_SMSM_BIN_OP_DECLS(R1, R2, M1, M2)	\
+  SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \
+  SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, product,    M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, quotient,   M1, M2);
+
+#define SPARSE_SMSM_BIN_OP_1(R, F, OP, M1, M2)	\
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+	r = R (m1_nr, m1_nc, (m1.nnz () + m2.nnz ())); \
+        \
+        int jx = 0; \
+        r.cidx (0) = 0; \
+        for (int i = 0 ; i < m1_nc ; i++) \
+          { \
+            int  ja = m1.cidx(i); \
+            int  ja_max = m1.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = m2.cidx(i); \
+            int  jb_max = m2.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \
+                  { \
+                    r.ridx(jx) = m1.ridx(ja); \
+                    r.data(jx) = m1.data(ja) OP 0.; \
+                    jx++; \
+                    ja++; \
+                    ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \
+                  { \
+		    r.ridx(jx) = m2.ridx(jb); \
+		    r.data(jx) = 0. OP m2.data(jb); \
+		    jx++; \
+                    jb++; \
+                    jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+		     if ((m1.data(ja) OP m2.data(jb)) != 0.) \
+	               { \
+                          r.data(jx) = m1.data(ja) OP m2.data(jb); \
+                          r.ridx(jx) = m1.ridx(ja); \
+                          jx++; \
+                       } \
+                     ja++; \
+                     ja_lt_max= ja < ja_max; \
+                     jb++; \
+                     jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+            r.cidx(i+1) = jx; \
+          } \
+        \
+	r.maybe_compress (); \
+      } \
+ \
+    return r; \
+  }
+
+#define SPARSE_SMSM_BIN_OP_2(R, F, OP, M1, M2)	\
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+        r = R (m1_nr, m1_nc, (m1.nnz () > m2.nnz () ? m1.nnz () : m2.nnz ())); \
+        \
+        int jx = 0; \
+	r.cidx (0) = 0; \
+        for (int i = 0 ; i < m1_nc ; i++) \
+          { \
+            int  ja = m1.cidx(i); \
+            int  ja_max = m1.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = m2.cidx(i); \
+            int  jb_max = m2.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \
+                  { \
+                     ja++; ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \
+                  { \
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+		     if ((m1.data(ja) OP m2.data(jb)) != 0.) \
+	               { \
+                          r.data(jx) = m1.data(ja) OP m2.data(jb); \
+                          r.ridx(jx) = m1.ridx(ja); \
+                          jx++; \
+                       } \
+                     ja++; ja_lt_max= ja < ja_max; \
+                     jb++; jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+            r.cidx(i+1) = jx; \
+          } \
+        \
+	r.maybe_compress (); \
+      } \
+ \
+    return r; \
+  }
+
+#define SPARSE_SMSM_BIN_OP_3(R, F, OP, M1, M2)	\
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+ \
+        /* XXX FIXME XXX Kludge... Always double/Complex, so Complex () */ \
+        r = R (m1_nr, m1_nc, (Complex () OP Complex ())); \
+        \
+        for (int i = 0 ; i < m1_nc ; i++) \
+          { \
+            int  ja = m1.cidx(i); \
+            int  ja_max = m1.cidx(i+1); \
+            bool ja_lt_max= ja < ja_max; \
+            \
+            int  jb = m2.cidx(i); \
+            int  jb_max = m2.cidx(i+1); \
+            bool jb_lt_max = jb < jb_max; \
+            \
+            while (ja_lt_max || jb_lt_max ) \
+              { \
+                OCTAVE_QUIT; \
+                if ((! jb_lt_max) || \
+                      (ja_lt_max && (m1.ridx(ja) < m2.ridx(jb)))) \
+                  { \
+		    /* keep those kludges coming */ \
+                    r.elem(m1.ridx(ja),i) = m1.data(ja) OP Complex (); \
+                    ja++; \
+                    ja_lt_max= ja < ja_max; \
+                  } \
+                else if (( !ja_lt_max ) || \
+                     (jb_lt_max && (m2.ridx(jb) < m1.ridx(ja)) ) ) \
+                  { \
+		    /* keep those kludges coming */ \
+                    r.elem(m2.ridx(jb),i) = Complex () OP m2.data(jb);	\
+                    jb++; \
+                    jb_lt_max= jb < jb_max; \
+                  } \
+                else \
+                  { \
+                    r.elem(m1.ridx(ja),i) = m1.data(ja) OP m2.data(jb); \
+                    ja++; \
+                    ja_lt_max= ja < ja_max; \
+                    jb++; \
+                    jb_lt_max= jb < jb_max; \
+                  } \
+              } \
+          } \
+	r.maybe_compress (true); \
+      } \
+ \
+    return r; \
+  }
+
+// Note that SM ./ SM needs to take into account the NaN and Inf values
+// implied by the division by zero.
+// XXX FIXME XXX Are the NaNs double(NaN) or Complex(NaN,Nan) in the complex
+// case?
+#define SPARSE_SMSM_BIN_OPS(R1, R2, M1, M2)  \
+  SPARSE_SMSM_BIN_OP_1 (R1, operator +,  +, M1, M2) \
+  SPARSE_SMSM_BIN_OP_1 (R1, operator -,  -, M1, M2) \
+  SPARSE_SMSM_BIN_OP_2 (R2, product,     *, M1, M2) \
+  SPARSE_SMSM_BIN_OP_3 (R2, quotient,    /, M1, M2)
+
+#define SPARSE_SMSM_CMP_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_SMSM_EQNE_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_SMSM_CMP_OP(F, OP, M1, C1, M2, C2)	\
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_SMSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_SMSM_CMP_OP (mx_el_lt, <,  M1, C1, M2, C2) \
+  SPARSE_SMSM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \
+  SPARSE_SMSM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \
+  SPARSE_SMSM_CMP_OP (mx_el_gt, >,  M1, C1, M2, C2) \
+  SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_SMSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_SMSM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_SMSM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_SMSM_BOOL_OP_DECLS(M1, M2) \
+  SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \
+  SPARSE_BOOL_OP_DECL (mx_el_or,  M1, M2);
+
+#define SPARSE_SMSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if ((m1.elem(i, j) != LHS_ZERO) \
+		    OP (m2.elem(i, j) != RHS_ZERO)) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = (m1.elem(i, j) != LHS_ZERO) \
+		      OP (m2.elem(i, j) != RHS_ZERO);	  \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_SMSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMSM_BOOL_OP (mx_el_or,  ||, M1, M2, LHS_ZERO, RHS_ZERO) \
+
+#define SPARSE_SMSM_BOOL_OPS(M1, M2, ZERO) \
+  SPARSE_SMSM_BOOL_OPS2(M1, M2, ZERO, ZERO)
+
+#define SPARSE_SMSM_OP_DECLS(R1, R2, M1, M2) \
+  SPARSE_SMSM_BIN_OP_DECLS (R1, R2, M1, M2) \
+  SPARSE_SMSM_CMP_OP_DECLS (M1, M2) \
+  SPARSE_SMSM_BOOL_OP_DECLS (M1, M2)
+
+// matrix by matrix operations.
+
+#define SPARSE_MSM_BIN_OP_DECLS(R1, R2, M1, M2)	\
+  SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \
+  SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, product,    M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, quotient,   M1, M2);
+
+#define SPARSE_MSM_BIN_OP_1(R, F, OP, M1, M2)	\
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+        r = R (m1_nr, m1_nc); \
+        \
+        for (int j = 0; j < m1_nc; j++) \
+	  for (int i = 0; i < m1_nr; i++) \
+	    r.elem (i, j) = m1.elem (i, j) OP m2.elem (i, j); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_MSM_BIN_OP_2(R, F, OP, M1, M2, ZERO) \
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+	/* Count num of non-zero elements */ \
+	int nel = 0; \
+	for (int j = 0; j < m1_nc; j++) \
+	  for (int i = 0; i < m1_nr; i++) \
+	    if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \
+	      nel++; \
+	\
+        r = R (m1_nr, m1_nc, nel); \
+        \
+	int ii = 0; \
+	r.cidx (0) = 0; \
+        for (int j = 0 ; j < m1_nc ; j++) \
+          { \
+	    for (int i = 0 ; i < m1_nr ; i++)	\
+	      {	\
+	        if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \
+		  { \
+		    r.data (ii) = m1.elem(i, j) OP m2.elem(i,j); \
+		    r.ridx (ii++) = i; \
+		  } \
+	      } \
+	    r.cidx(j+1) = ii; \
+	  } \
+      } \
+ \
+    return r; \
+  }
+
+// XXX FIXME XXX Pass a specific ZERO value
+#define SPARSE_MSM_BIN_OPS(R1, R2, M1, M2) \
+  SPARSE_MSM_BIN_OP_1 (R1, operator +,  +, M1, M2) \
+  SPARSE_MSM_BIN_OP_1 (R1, operator -,  -, M1, M2) \
+  SPARSE_MSM_BIN_OP_2 (R2, product,     *, M1, M2, 0.0) \
+  SPARSE_MSM_BIN_OP_2 (R2, quotient,    /, M1, M2, 0.0)
+
+#define SPARSE_MSM_CMP_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_MSM_EQNE_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_MSM_CMP_OP(F, OP, M1, C1, M2, C2)	\
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_MSM_CMP_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_MSM_CMP_OP (mx_el_lt, <,  M1, C1, M2, C2) \
+  SPARSE_MSM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \
+  SPARSE_MSM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \
+  SPARSE_MSM_CMP_OP (mx_el_gt, >,  M1, C1, M2, C2) \
+  SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_MSM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_MSM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_MSM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_MSM_BOOL_OP_DECLS(M1, M2) \
+  SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \
+  SPARSE_BOOL_OP_DECL (mx_el_or,  M1, M2);
+
+#define SPARSE_MSM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if ((m1.elem(i, j) != LHS_ZERO) \
+		    OP (m2.elem(i, j) != RHS_ZERO)) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = (m1.elem(i, j) != LHS_ZERO) \
+		      OP (m2.elem(i, j) != RHS_ZERO);	  \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_MSM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_MSM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_MSM_BOOL_OP (mx_el_or,  ||, M1, M2, LHS_ZERO, RHS_ZERO) \
+
+#define SPARSE_MSM_BOOL_OPS(M1, M2, ZERO) \
+  SPARSE_MSM_BOOL_OPS2(M1, M2, ZERO, ZERO)
+
+#define SPARSE_MSM_OP_DECLS(R1, R2, M1, M2) \
+  SPARSE_MSM_BIN_OP_DECLS (R1, R2, M1, M2) \
+  SPARSE_MSM_CMP_OP_DECLS (M1, M2) \
+  SPARSE_MSM_BOOL_OP_DECLS (M1, M2)
+
+// matrix by matrix operations.
+
+#define SPARSE_SMM_BIN_OP_DECLS(R1, R2, M1, M2)	\
+  SPARSE_BIN_OP_DECL (R1, operator +, M1, M2); \
+  SPARSE_BIN_OP_DECL (R1, operator -, M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, product,    M1, M2); \
+  SPARSE_BIN_OP_DECL (R2, quotient,   M1, M2);
+
+#define SPARSE_SMM_BIN_OP_1(R, F, OP, M1, M2)	\
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+        r = R (m1_nr, m1_nc); \
+        \
+        for (int j = 0; j < m1_nc; j++) \
+	  for (int i = 0; i < m1_nr; i++) \
+	    r.elem (i, j) = m1.elem (i, j) OP m2.elem (i, j); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_SMM_BIN_OP_2(R, F, OP, M1, M2, ZERO) \
+  R \
+  F (const M1& m1, const M2& m2) \
+  { \
+    R r; \
+ \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+ \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+ \
+    if (m1_nr != m2_nr || m1_nc != m2_nc) \
+      gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+    else \
+      { \
+	/* Count num of non-zero elements */ \
+	int nel = 0; \
+	for (int j = 0; j < m1_nc; j++) \
+	  for (int i = 0; i < m1_nr; i++) \
+	    if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \
+	      nel++; \
+	\
+        r = R (m1_nr, m1_nc, nel); \
+        \
+	int ii = 0; \
+	r.cidx (0) = 0; \
+        for (int j = 0 ; j < m1_nc ; j++) \
+          { \
+	    for (int i = 0 ; i < m1_nr ; i++)	\
+	      {	\
+	        if ((m1.elem(i, j) OP m2.elem(i, j)) != ZERO) \
+		  { \
+		    r.data (ii) = m1.elem(i, j) OP m2.elem(i,j); \
+		    r.ridx (ii++) = i; \
+		  } \
+	      } \
+	    r.cidx(j+1) = ii; \
+	  } \
+      } \
+ \
+    return r; \
+  }
+
+// XXX FIXME XXX Pass a specific ZERO value
+#define SPARSE_SMM_BIN_OPS(R1, R2, M1, M2) \
+  SPARSE_SMM_BIN_OP_1 (R1, operator +,  +, M1, M2) \
+  SPARSE_SMM_BIN_OP_1 (R1, operator -,  -, M1, M2) \
+  SPARSE_SMM_BIN_OP_2 (R2, product,     *, M1, M2, 0.0) \
+  SPARSE_SMM_BIN_OP_2 (R2, quotient,    /, M1, M2, 0.0)
+
+#define SPARSE_SMM_CMP_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_lt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_le, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ge, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_gt, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_SMM_EQNE_OP_DECLS(M1, M2) \
+  SPARSE_CMP_OP_DECL (mx_el_eq, M1, M2); \
+  SPARSE_CMP_OP_DECL (mx_el_ne, M1, M2);
+
+#define SPARSE_SMM_CMP_OP(F, OP, M1, C1, M2, C2)	\
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if (C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j))) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = C1 (m1.elem(i, j)) OP C2 (m2.elem(i, j)); \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_SMM_CMP_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_SMM_CMP_OP (mx_el_lt, <,  M1, C1, M2, C2) \
+  SPARSE_SMM_CMP_OP (mx_el_le, <=, M1, C1, M2, C2) \
+  SPARSE_SMM_CMP_OP (mx_el_ge, >=, M1, C1, M2, C2) \
+  SPARSE_SMM_CMP_OP (mx_el_gt, >,  M1, C1, M2, C2) \
+  SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_SMM_EQNE_OPS(M1, Z1, C1, M2, Z2, C2)  \
+  SPARSE_SMM_CMP_OP (mx_el_eq, ==, M1,   , M2,   ) \
+  SPARSE_SMM_CMP_OP (mx_el_ne, !=, M1,   , M2,   )
+
+#define SPARSE_SMM_BOOL_OP_DECLS(M1, M2) \
+  SPARSE_BOOL_OP_DECL (mx_el_and, M1, M2); \
+  SPARSE_BOOL_OP_DECL (mx_el_or,  M1, M2);
+
+#define SPARSE_SMM_BOOL_OP(F, OP, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SparseBoolMatrix \
+  F (const M1& m1, const M2& m2) \
+  { \
+    SparseBoolMatrix r; \
+    \
+    int m1_nr = m1.rows (); \
+    int m1_nc = m1.cols (); \
+    \
+    int m2_nr = m2.rows (); \
+    int m2_nc = m2.cols (); \
+    \
+    if (m1_nr == m2_nr && m1_nc == m2_nc) \
+      { \
+	if (m1_nr != 0 || m1_nc != 0) \
+	  { \
+	    /* Count num of non-zero elements */ \
+	    int nel = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      for (int i = 0; i < m1_nr; i++) \
+		if ((m1.elem(i, j) != LHS_ZERO) \
+		    OP (m2.elem(i, j) != RHS_ZERO)) \
+		  nel++; \
+            \
+            r = SparseBoolMatrix (m1_nr, m1_nc, nel); \
+            \
+	    int ii = 0; \
+	    r.cidx (0) = 0; \
+	    for (int j = 0; j < m1_nc; j++) \
+	      { \
+	        for (int i = 0; i < m1_nr; i++) \
+		  { \
+		    bool el = (m1.elem(i, j) != LHS_ZERO) \
+		      OP (m2.elem(i, j) != RHS_ZERO);	  \
+		    if (el) \
+		      { \
+			r.data(ii) = el; \
+			r.ridx(ii++) = i; \
+		      } \
+		  } \
+		r.cidx(j+1) = ii; \
+	      } \
+	  } \
+      }	      \
+    else \
+      { \
+	if ((m1_nr != 0 || m1_nc != 0) && (m2_nr != 0 || m2_nc != 0)) \
+	  gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \
+      } \
+    return r; \
+  }
+
+#define SPARSE_SMM_BOOL_OPS2(M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMM_BOOL_OP (mx_el_and, &&, M1, M2, LHS_ZERO, RHS_ZERO) \
+  SPARSE_SMM_BOOL_OP (mx_el_or,  ||, M1, M2, LHS_ZERO, RHS_ZERO) \
+
+#define SPARSE_SMM_BOOL_OPS(M1, M2, ZERO) \
+  SPARSE_SMM_BOOL_OPS2(M1, M2, ZERO, ZERO)
+
+#define SPARSE_SMM_OP_DECLS(R1, R2, M1, M2) \
+  SPARSE_SMM_BIN_OP_DECLS (R1, R2, M1, M2) \
+  SPARSE_SMM_CMP_OP_DECLS (M1, M2) \
+  SPARSE_SMM_BOOL_OP_DECLS (M1, M2)
+
+// Avoid some code duplication.  Maybe we should use templates.
+
+#define SPARSE_CUMSUM(RET_TYPE, ELT_TYPE, FCN)	\
+ \
+  int nr = rows (); \
+  int nc = cols (); \
+ \
+  RET_TYPE retval; \
+ \
+  if (nr > 0 && nc > 0) \
+    { \
+      if ((nr == 1 && dim == -1) || dim == 1) \
+	/* Ugly!! Is there a better way? */ \
+        retval = transpose (). FCN (0) .transpose (); \
+      else \
+	{ \
+          int nel = 0; \
+	  for (int i = 0; i < nc; i++) \
+            { \
+              ELT_TYPE t = ELT_TYPE (); \
+	      for (int j = cidx (i); j < cidx (i+1); j++)	\
+                { \
+                  t += data(j); \
+                  if (t != ELT_TYPE ()) \
+                    if (j == cidx(i+1) - 1) \
+		      nel += nr - ridx(j); \
+                    else \
+		      nel += ridx(j+1) - ridx(j); \
+                } \
+	    } \
+	  retval = RET_TYPE (nr, nc, nel); \
+          retval.cidx(0) = 0; \
+	  int ii = 0; \
+	  for (int i = 0; i < nc; i++) \
+            { \
+              ELT_TYPE t = ELT_TYPE (); \
+	      for (int j = cidx (i); j < cidx (i+1); j++)	\
+                { \
+                  t += data(j); \
+                  if (t != ELT_TYPE ()) \
+                    { \
+                      if (j == cidx(i+1) - 1) \
+                        { \
+                          for (int k = ridx(j); k < nr; k++) \
+                            { \
+                               retval.data (ii) = t; \
+                               retval.ridx (ii++) = k; \
+                            } \
+                        } \
+		      else \
+			{ \
+                          for (int k = ridx(j); k < ridx(j+1); k++) \
+                            { \
+                               retval.data (ii) = t; \
+                               retval.ridx (ii++) = k; \
+                            } \
+                        } \
+                    } \
+                } \
+              retval.cidx(i+1) = ii; \
+	    } \
+	} \
+    } \
+  else \
+    retval = RET_TYPE (nr,nc); \
+ \
+  return retval
+
+
+#define SPARSE_CUMPROD(RET_TYPE, ELT_TYPE, FCN)	\
+ \
+  int nr = rows (); \
+  int nc = cols (); \
+ \
+  RET_TYPE retval; \
+ \
+  if (nr > 0 && nc > 0) \
+    { \
+      if ((nr == 1 && dim == -1) || dim == 1) \
+	/* Ugly!! Is there a better way? */ \
+        retval = transpose (). FCN (0) .transpose (); \
+      else \
+	{ \
+          int nel = 0; \
+	  for (int i = 0; i < nc; i++) \
+            { \
+	      int jj = 0; \
+	      for (int j = cidx (i); j < cidx (i+1); j++) \
+                { \
+		  if (jj == ridx(j)) \
+                    { \
+                      nel++; \
+                      jj++; \
+                    } \
+                  else \
+                    break; \
+                } \
+	    } \
+	  retval = RET_TYPE (nr, nc, nel); \
+          retval.cidx(0) = 0; \
+	  int ii = 0; \
+	  for (int i = 0; i < nc; i++) \
+            { \
+              ELT_TYPE t = ELT_TYPE (1.); \
+	      int jj = 0; \
+	      for (int j = cidx (i); j < cidx (i+1); j++) \
+                { \
+		  if (jj == ridx(j)) \
+                    { \
+                      t *= data(j); \
+                      retval.data(ii) = t; \
+                      retval.ridx(ii++) = jj++; \
+                    } \
+                  else \
+                    break; \
+                } \
+              retval.cidx(i+1) = ii; \
+	    } \
+	} \
+    } \
+  else \
+    retval = RET_TYPE (nr,nc); \
+ \
+  return retval
+
+#define SPARSE_BASE_REDUCTION_OP(RET_TYPE, EL_TYPE, ROW_EXPR, COL_EXPR, \
+			         INIT_VAL, MT_RESULT) \
+ \
+  int nr = rows (); \
+  int nc = cols (); \
+ \
+  RET_TYPE retval; \
+ \
+  if (nr > 0 && nc > 0) \
+    { \
+      if ((nr == 1 && dim == -1) || dim == 1) \
+	{ \
+	  OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nr); \
+          \
+	  for (int i = 0; i < nr; i++) \
+	    { \
+	      tmp[i] = INIT_VAL; \
+	      for (int j = 0; j < nc; j++) \
+		{ \
+		  ROW_EXPR; \
+		} \
+	    } \
+	  int nel = 0; \
+	  for (int i = 0; i < nr; i++) \
+	    if (tmp[i] != EL_TYPE ())  \
+	      nel++ ; \
+	  retval = RET_TYPE (nr, 1, nel); \
+	  retval.cidx(0) = 0; \
+	  retval.cidx(1) = nel; \
+	  nel = 0; \
+	  for (int i = 0; i < nr; i++) \
+	    if (tmp[i] != EL_TYPE ())  \
+	      { \
+		retval.data(nel) = tmp[i]; \
+		retval.ridx(nel++) = i; \
+	      } \
+	} \
+      else \
+	{ \
+	  OCTAVE_LOCAL_BUFFER (EL_TYPE, tmp, nc); \
+          \
+	  for (int j = 0; j < nc; j++) \
+	    { \
+	      tmp[j] = INIT_VAL; \
+	      for (int i = 0; i < nr; i++) \
+		{ \
+		  COL_EXPR; \
+		} \
+	    } \
+	  int nel = 0; \
+	  for (int i = 0; i < nc; i++) \
+	    if (tmp[i] != EL_TYPE ())  \
+	      nel++ ; \
+	  retval = RET_TYPE (1, nc, nel); \
+	  retval.cidx(0) = 0; \
+	  nel = 0; \
+	  for (int i = 0; i < nc; i++) \
+	    if (tmp[i] != EL_TYPE ())  \
+	      { \
+		retval.data(nel) = tmp[i]; \
+		retval.ridx(nel++) = 0; \
+		retval.cidx(i+1) = retval.cidx(i) + 1; \
+	      } \
+	    else \
+	      retval.cidx(i+1) = retval.cidx(i); \
+	} \
+    } \
+  else if (nc == 0 && (nr == 0 || (nr == 1 && dim == -1))) \
+    { \
+      retval = RET_TYPE (1, 1, 1); \
+      retval.cidx(0) = 0; \
+      retval.cidx(1) = 1; \
+      retval.ridx(0) = 0; \
+      retval.data(0) = MT_RESULT; \
+    } \
+  else if (nr == 0 && (dim == 0 || dim == -1)) \
+    { \
+      retval = RET_TYPE (1, nc, nc); \
+      retval.cidx (0) = 0; \
+      for (int i = 0; i < nc ; i++) \
+        { \
+          retval.ridx (i) = 0; \
+          retval.cidx (i+1) = i; \
+	  retval.data (i) = MT_RESULT; \
+	} \
+    } \
+  else if (nc == 0 && dim == 1) \
+    { \
+      retval = RET_TYPE (nr, 1, nr); \
+      retval.cidx(0) = 0; \
+      retval.cidx(1) = nr; \
+      for (int i = 0; i < nr; i++) \
+	{ \
+	  retval.ridx(i) = i; \
+	  retval.data(i) = MT_RESULT; \
+	} \
+    } \
+  else \
+    retval.resize (nr > 0, nc > 0); \
+ \
+  return retval
+
+#define SPARSE_REDUCTION_OP_ROW_EXPR(OP) \
+  tmp[i] OP elem (i, j)
+
+#define SPARSE_REDUCTION_OP_COL_EXPR(OP) \
+  tmp[j] OP elem (i, j)
+
+#define SPARSE_REDUCTION_OP(RET_TYPE, EL_TYPE, OP, INIT_VAL, MT_RESULT)	\
+  SPARSE_BASE_REDUCTION_OP (RET_TYPE, EL_TYPE, \
+			SPARSE_REDUCTION_OP_ROW_EXPR (OP), \
+			SPARSE_REDUCTION_OP_COL_EXPR (OP), \
+			INIT_VAL, MT_RESULT)
+
+#define SPARSE_ANY_ALL_OP_ROW_CODE(TEST_OP, TEST_TRUE_VAL) \
+  if (elem (i, j) TEST_OP 0.0) \
+    { \
+      tmp[i] = TEST_TRUE_VAL; \
+      break; \
+    }
+
+#define SPARSE_ANY_ALL_OP_COL_CODE(TEST_OP, TEST_TRUE_VAL) \
+  if (elem (i, j) TEST_OP 0.0) \
+    { \
+      tmp[j] = TEST_TRUE_VAL; \
+      break; \
+    }
+
+#define SPARSE_ANY_ALL_OP(DIM, INIT_VAL, TEST_OP, TEST_TRUE_VAL) \
+  SPARSE_BASE_REDUCTION_OP (SparseBoolMatrix, char, \
+			SPARSE_ANY_ALL_OP_ROW_CODE (TEST_OP, TEST_TRUE_VAL), \
+			SPARSE_ANY_ALL_OP_COL_CODE (TEST_OP, TEST_TRUE_VAL), \
+			INIT_VAL, INIT_VAL)
+
+#define SPARSE_ALL_OP(DIM) SPARSE_ANY_ALL_OP (DIM, true, ==, false)
+
+#define SPARSE_ANY_OP(DIM) SPARSE_ANY_ALL_OP (DIM, false, !=, true)
+
+#define SPARSE_SPARSE_MUL( RET_TYPE, EL_TYPE ) \
+  int nr = m.rows (); \
+  int nc = m.cols (); \
+  \
+  int a_nr = a.rows (); \
+  int a_nc = a.cols (); \
+  \
+  if (nc != a_nr) \
+    { \
+      gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \
+      return RET_TYPE (); \
+    } \
+  else \
+    { \
+      OCTAVE_LOCAL_BUFFER (EL_TYPE, Xcol, nr); \
+      \
+      int nel = 0; \
+      \
+      for (int i = 0; i < a_nc; i++) \
+        { \
+          OCTAVE_QUIT; \
+          for (int k = 0; k < nr; k++) \
+	    Xcol[k]= 0.; \
+          for (int j = a.cidx(i); j < a.cidx(i+1); j++) \
+            { \
+              int  col = a.ridx(j); \
+              for (int k = m.cidx(col) ; k < m.cidx(col+1); k++) \
+		if (Xcol[m.ridx(k)] == 0.) \
+                  { \
+		    Xcol[m.ridx(k)] = 1.; \
+		    nel++; \
+		  } \
+	    } \
+	} \
+      \
+      if (nel == 0) \
+	return RET_TYPE (nr, a_nc); \
+      else \
+	{  \
+	  RET_TYPE retval (nr, a_nc, nel); \
+	  \
+	  int ii = 0; \
+	  \
+	  retval.cidx(0) = 0; \
+	  for (int i = 0; i < a_nc ; i++) \
+	    { \
+              OCTAVE_QUIT; \
+	      for (int k = 0; k < nr; k++) \
+		Xcol[k]= 0.; \
+	      for (int j = a.cidx(i); j < a.cidx(i+1); j++) \
+		{ \
+                  int col = a.ridx(j); \
+                  EL_TYPE tmpval = a.data(j); \
+		  for (int k = m.cidx(col) ; k < m.cidx(col+1); k++) \
+		    Xcol[m.ridx(k)] += tmpval * m.data(k); \
+		} \
+	      for (int k = 0; k < nr; k++) \
+		{ \
+		  if (Xcol[k] !=0. ) \
+		    { \
+		      retval.ridx (ii) = k; \
+		      retval.data (ii++) = Xcol[k]; \
+		    } \
+		} \
+	      retval.cidx(i+1) = ii; \
+	    } \
+	  return retval; \
+	} \
+    }
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,2834 @@
+// Template sparse array class
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cassert>
+#include <climits>
+
+#include <iostream>
+#include <vector>
+
+#include "Array.h"
+#include "Array-flags.h"
+#include "Array-util.h"
+#include "Range.h"
+#include "idx-vector.h"
+#include "lo-error.h"
+#include "lo-sstream.h"
+#include "quit.h"
+
+#include "Sparse.h"
+#include "sparse-sort.h"
+#include "oct-spparms.h"
+
+template <class T>
+T&
+Sparse<T>::SparseRep::elem (int _r, int _c)
+{
+  int i;
+
+  if (nnz > 0)
+    {
+      for (i = c[_c]; i < c[_c + 1]; i++)
+	if (r[i] == _r)
+	  return d[i];
+	else if (r[i] > _r)
+	  break;
+
+      // Ok, If we've gotten here, we're in trouble.. Have to create a 
+      // new element in the sparse array. This' gonna be slow!!!
+      if (c[ncols+1] == nnz)
+	{
+	  (*current_liboctave_error_handler)
+	    ("Sparse::SparseRep::elem (int, int): sparse matrix filled");
+	  return *d;
+	}
+
+      int to_move = c[ncols] - i;
+      if (to_move != 0)
+	{
+	  for (int j = c[ncols]; j > i; j--)
+	    {
+	      d[j] = d[j-1];
+	      r[j] = r[j-1];
+	    }
+	}
+
+      for (int j = _c + 1; j < ncols + 1; j++)
+	c[j] = c[j] + 1;
+      
+      d[i] = 0.;
+      r[i] = _r;
+
+      return d[i];
+    }
+  else
+    {
+      (*current_liboctave_error_handler)
+	("Sparse::SparseRep::elem (int, int): sparse matrix filled");
+      return *d;
+    }
+}
+
+template <class T>
+T
+Sparse<T>::SparseRep::celem (int _r, int _c) const
+{
+  if (nnz > 0)
+    for (int i = c[_c]; i < c[_c + 1]; i++)
+      if (r[i] == _r)
+	return d[i];
+  return T ();
+}
+
+template <class T>
+void
+Sparse<T>::SparseRep::maybe_compress (bool remove_zeros)
+{
+  int ndel = nnz - c[ncols];
+  int nzero = 0;
+
+  if (remove_zeros)
+    for (int i = 0; i < nnz - ndel; i++)
+      if (d[i] == T ())
+	nzero++;
+
+  if (!ndel && !nzero)
+    return;
+
+  if (!nzero)
+    {
+      int new_nnz = nnz - ndel;
+
+      T *new_data = new T [new_nnz];
+      for (int i = 0; i < new_nnz; i++)
+	new_data[i] = d[i];
+      delete [] d;
+      d = new_data;
+
+      int *new_ridx = new int [new_nnz];
+      for (int i = 0; i < new_nnz; i++)
+	new_ridx[i] = r[i];
+      delete [] r;
+      r = new_ridx;
+    }
+  else
+    {
+      int new_nnz = nnz - ndel - nzero;
+
+      T *new_data = new T [new_nnz];
+      int *new_ridx = new int [new_nnz];
+
+      int ii = 0;
+      int ic = 0;
+      for (int j = 0; j < ncols; j++)
+	{
+	  for (int k = ic; k < c[j+1]; k++)
+	    if (d[k] != T ())
+	      {
+		new_data [ii] = d[k];
+		new_ridx [ii++] = r[k];
+	      }
+	  ic = c[j+1];
+	  c[j+1] = ii;
+	}
+
+      delete [] d;
+      d = new_data;
+
+      delete [] r;
+      r = new_ridx;
+    }
+
+  nnz -= ndel + nzero;
+}
+
+template <class T>
+void
+Sparse<T>::SparseRep::change_length (int nz)
+{
+  if (nz != nnz)
+    {
+      int min_nnz = (nz < nnz ? nz : nnz);
+
+      int * new_ridx = new int [nz];
+      for (int i = 0; i < min_nnz; i++)
+	new_ridx[i] = r[i];
+
+      delete [] r;
+      r = new_ridx;
+
+      T * new_data = new T [nz];
+      for (int i = 0; i < min_nnz; i++)
+	new_data[i] = d[i];
+
+      delete [] d;
+      d = new_data;
+
+      if (nz < nnz)
+	for (int i = 0; i <= ncols; i++)
+	  if (c[i] > nz)
+	    c[i] = nz;
+
+      nnz = nz;
+    }
+}
+
+template <class T>
+template <class U>
+Sparse<T>::Sparse (const Sparse<U>& a)
+  : dimensions (a.dimensions), idx (0), idx_count (0)
+{
+  if (a.nnz () == 0)
+    rep = new typename Sparse<T>::SparseRep (rows (), cols());
+  else
+    {
+      rep = new typename Sparse<T>::SparseRep (rows (), cols (), a.nnz ());
+      
+      int nz = nnz ();
+      int nc = cols ();
+      for (int i = 0; i < nz; i++)
+	{
+	  xdata (i) = T (a.data (i));
+	  xridx (i) = a.ridx (i);
+	}
+      for (int i = 0; i < nc + 1; i++)
+	xcidx (i) = a.cidx (i);
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (int nr, int nc, T val)
+  : rep (new typename Sparse<T>::SparseRep (nr, nc, nr*nc)),
+    dimensions (dim_vector (nr, nc)), idx (0), idx_count (0)
+{ 
+
+  int ii = 0;
+  xcidx (0) = 0;
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  xdata (ii) = val;
+	  xridx (ii++) = i;
+	} 
+      xcidx (j+1) = ii;
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (const dim_vector& dv)
+  : dimensions (dv), idx (0), idx_count (0)
+{ 
+  if (dv.length() != 2)
+    (*current_liboctave_error_handler)
+      ("Sparse::Sparse (const dim_vector&): dimension mismatch");
+  else
+    rep = new typename Sparse<T>::SparseRep (dv(0), dv(1));
+}
+
+template <class T>
+Sparse<T>::Sparse (const Sparse<T>& a, const dim_vector& dv)
+  : dimensions (dv), idx (0), idx_count (0)
+{
+
+  // Work in unsigned long long to avoid overflow issues with numel
+  unsigned long long a_nel = static_cast<unsigned long long>(a.rows ()) *
+    static_cast<unsigned long long>(a.cols ());
+  unsigned long long dv_nel = static_cast<unsigned long long>(dv (0)) *
+    static_cast<unsigned long long>(dv (1));
+
+  if (a_nel != dv_nel)
+    (*current_liboctave_error_handler)
+      ("Sparse::Sparse (const Sparse&, const dim_vector&): dimension mismatch");
+  else
+    {
+      dim_vector old_dims = a.dims();
+      int new_nnz = a.nnz ();
+      int new_nr = dv (0);
+      int new_nc = dv (1);
+      int old_nr = old_dims (0);
+      int old_nc = old_dims (1);
+
+      rep = new typename Sparse<T>::SparseRep (new_nr, new_nc, new_nnz);
+
+      int kk = 0;
+      xcidx(0) = 0;
+      for (int i = 0; i < old_nc; i++)
+	for (int j = a.cidx(i); j < a.cidx(i+1); j++)
+	  {
+	    int tmp = i * old_nr + a.ridx(j);
+	    int ii = tmp % new_nr;
+	    int jj = (tmp - ii) / new_nr; 
+	    for (int k = kk; k < jj; k++)
+	      xcidx(k+1) = j;
+	    kk = jj;
+	    xdata(j) = a.data(j);
+	    xridx(j) = ii;
+	  }
+      for (int k = kk; k < new_nc; k++)
+	xcidx(k+1) = new_nnz;
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (const Array<T>& a, const Array<int>& r, 
+		   const Array<int>& c, int nr,
+		   int nc, bool sum_terms)
+  : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0)
+{
+  int a_len = a.length ();
+  int r_len = r.length ();
+  int c_len = c.length ();
+  bool ri_scalar = (r_len == 1); 
+  bool ci_scalar = (c_len == 1);
+  bool cf_scalar = (a_len == 1);
+  
+  if ((a_len != r_len && !cf_scalar && !ri_scalar) ||
+      (a_len != c_len && !cf_scalar && !ci_scalar) ||
+      (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0)
+    {
+      (*current_liboctave_error_handler)
+	("Sparse::Sparse (const Array<T>&, const Array<int>&, ...): dimension mismatch");
+      rep = nil_rep ();
+      dimensions = dim_vector (0, 0);
+    }
+  else
+    {
+      int max_nnz = (r_len > c_len ? r_len : c_len);
+
+      OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nnz);
+      OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nnz);
+
+      for (int i = 0; i < max_nnz; i++)
+	sidx[i] = &sidxX[i];
+
+      int actual_nnz = 0;
+      OCTAVE_QUIT;
+      for (int i = 0; i < max_nnz; i++) 
+	{
+	  int rowidx =  (ri_scalar ? r(0) : r(i));
+	  int colidx = (ci_scalar ? c(0) : c(i));
+	  if (rowidx < nr && rowidx >= 0 &&
+	      colidx < nc && colidx >= 0 ) 
+	    {
+	      if ( a (cf_scalar ? 0 : i ) != T ()) 
+		{
+		  sidx[actual_nnz]->r = rowidx;
+		  sidx[actual_nnz]->c = colidx;
+		  sidx[actual_nnz]->idx = i;
+		  actual_nnz++;	
+		}
+	    }
+	  else 
+	    {
+	      (*current_liboctave_error_handler)
+		("Sparse::Sparse : index (%d,%d) out of range", 
+		 rowidx + 1, colidx + 1);
+	      rep = nil_rep ();
+	      dimensions = dim_vector (0, 0);
+	      return;
+	    }
+	}
+  
+      if (actual_nnz == 0)
+	rep = new typename Sparse<T>::SparseRep (nr, nc);
+      else
+	{
+	  OCTAVE_QUIT;
+	  octave_sort<octave_sparse_sort_idxl *> 
+	    sort (octave_sparse_sidxl_comp);
+
+	  sort.sort (sidx, actual_nnz);
+	  OCTAVE_QUIT;
+
+	  // Now count the unique non-zero values
+	  int real_nnz = 1;
+	  for (int i = 1; i < actual_nnz; i++) 
+	    if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c) 
+	      real_nnz++;
+
+	  rep = new typename Sparse<T>::SparseRep (nr, nc, real_nnz);
+
+	  int cx = 0;
+	  int prev_rval = -1;
+	  int prev_cval = -1;
+	  int ii = -1;
+	  xcidx (0) = 0;
+	  for (int i = 0; i < actual_nnz; i++) 
+	    {
+	      OCTAVE_QUIT;
+	      int iidx = sidx[i]->idx;
+	      int rval = sidx[i]->r;
+	      int cval = sidx[i]->c;
+
+	      if (prev_cval < cval || (prev_rval < rval && prev_cval == cval)) 
+		{
+		  int ci = static_cast<int> (c (ci_scalar ? 0 : iidx));
+		  ii++;
+		  while (cx < ci) 
+		    xcidx (++cx) = ii;
+		  xdata(ii) = a (cf_scalar ? 0 : iidx);
+		  xridx(ii) = static_cast<int> (r (ri_scalar ? 0 : iidx));
+		} 
+	      else 
+		{
+		  if (sum_terms)
+		    xdata(ii) += a (cf_scalar ? 0 : iidx);
+		  else
+		    xdata(ii) =  a (cf_scalar ? 0 : iidx);
+		}
+	      prev_rval = rval;
+	      prev_cval = cval;
+	    } 
+
+	  while (cx < nc) 
+	    xcidx (++cx) = ii + 1;
+	}
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (const Array<T>& a, const Array<double>& r, 
+		   const Array<double>& c, int nr,
+		   int nc, bool sum_terms)
+  : dimensions (dim_vector (nr, nc)), idx (0), idx_count (0)
+{
+  int a_len = a.length ();
+  int r_len = r.length ();
+  int c_len = c.length ();
+  bool ri_scalar = (r_len == 1); 
+  bool ci_scalar = (c_len == 1);
+  bool cf_scalar = (a_len == 1);
+
+  if ((a_len != r_len && !cf_scalar && !ri_scalar) ||
+      (a_len != c_len && !cf_scalar && !ci_scalar) ||
+      (r_len != c_len && !ri_scalar && !ci_scalar) || nr < 0 || nc < 0)
+    {
+      (*current_liboctave_error_handler)
+	("Sparse::Sparse (const Array<T>&, const Array<double>&, ...): dimension mismatch");
+      rep = nil_rep ();
+      dimensions = dim_vector (0, 0);
+    }
+  else
+    {
+      int max_nnz = (r_len > c_len ? r_len : c_len);
+  
+      OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl *, sidx, max_nnz);
+      OCTAVE_LOCAL_BUFFER (octave_sparse_sort_idxl, sidxX, max_nnz);
+
+      for (int i = 0; i < max_nnz; i++)
+	sidx[i] = &sidxX[i];
+
+      int actual_nnz = 0;
+      OCTAVE_QUIT;
+
+      for (int i = 0; i < max_nnz; i++) 
+	{
+	  int rowidx = static_cast<int> (ri_scalar ? r(0) : r(i));
+	  int colidx = static_cast<int> (ci_scalar ? c(0) : c(i));
+	  if (rowidx < nr && rowidx >= 0 &&
+	      colidx < nc && colidx >= 0 ) 
+	    {
+	      if ( a (cf_scalar ? 0 : i ) != T ()) 
+		{
+		  sidx[actual_nnz]->r = rowidx;
+		  sidx[actual_nnz]->c = colidx;
+		  sidx[actual_nnz]->idx = i;
+		  actual_nnz++;	
+		}
+	    }
+	  else 
+	    {
+	      (*current_liboctave_error_handler)
+		("Sparse::Sparse : index (%d,%d) out of range", 
+		 rowidx + 1, colidx + 1);
+	      rep = nil_rep ();
+	      dimensions = dim_vector (0, 0);
+	      return;
+	    }
+	}
+
+      if (actual_nnz == 0)
+	rep = new typename Sparse<T>::SparseRep (nr, nc);
+      else
+	{
+	  OCTAVE_QUIT;
+	  octave_sort<octave_sparse_sort_idxl *> 
+	    sort (octave_sparse_sidxl_comp);
+
+	  sort.sort (sidx, actual_nnz);
+	  OCTAVE_QUIT;
+
+	  // Now count the unique non-zero values
+	  int real_nnz = 1;
+	  for (int i = 1; i < actual_nnz; i++) 
+	    if (sidx[i-1]->r != sidx[i]->r || sidx[i-1]->c != sidx[i]->c) 
+	      real_nnz++;
+
+	  rep = new typename Sparse<T>::SparseRep (nr, nc, real_nnz);
+
+	  int cx = 0;
+	  int prev_rval = -1;
+	  int prev_cval = -1;
+	  int ii = -1;
+	  xcidx (0) = 0;
+	  for (int i = 0; i < actual_nnz; i++) 
+	    {
+	      OCTAVE_QUIT;
+	      int iidx = sidx[i]->idx;
+	      int rval = sidx[i]->r;
+	      int cval = sidx[i]->c;
+
+	      if (prev_cval < cval || (prev_rval < rval && prev_cval == cval)) 
+		{
+		  int ci = static_cast<int> (c (ci_scalar ? 0 : iidx));
+		  ii++;
+
+		  while (cx < ci) 
+		    xcidx (++cx) = ii;
+		  xdata(ii) = a (cf_scalar ? 0 : iidx);
+		  xridx(ii) = static_cast<int> (r (ri_scalar ? 0 : iidx));
+		} 
+	      else 
+		{
+		  if (sum_terms)
+		    xdata(ii) += a (cf_scalar ? 0 : iidx);
+		  else
+		    xdata(ii) =  a (cf_scalar ? 0 : iidx);
+		}
+	      prev_rval = rval;
+	      prev_cval = cval;
+	    } 
+
+	  while (cx < nc) 
+	    xcidx (++cx) = ii + 1;
+	}
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (const Array2<T>& a)
+  : dimensions (a.dims ()), idx (0), idx_count (0)
+{
+  int nr = rows ();
+  int nc = cols ();
+  int len = a.length ();
+  int new_nnz = 0;
+
+  // First count the number of non-zero terms
+  for (int i = 0; i < len; i++)
+    if (a(i) != T ())
+      new_nnz++;
+
+  rep = new typename Sparse<T>::SparseRep (nr, nc, new_nnz);
+
+  int ii = 0;
+  xcidx(0) = 0;
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	if (a.elem (i,j) != T ())
+	  {
+	    xdata(ii) = a.elem (i,j);
+	    xridx(ii++) = i;
+	  }
+      xcidx(j+1) = ii;
+    }
+}
+
+template <class T>
+Sparse<T>::Sparse (const Array<T>& a)
+  : dimensions (a.dims ()), idx (0), idx_count (0)
+{
+  if (dimensions.length () > 2)
+    (*current_liboctave_error_handler)
+      ("Sparse::Sparse (const Array<T>&): dimension mismatch");
+  else
+    {
+      int nr = rows ();
+      int nc = cols ();
+      int len = a.length ();
+      int new_nnz = 0;
+
+      // First count the number of non-zero terms
+      for (int i = 0; i < len; i++)
+	if (a(i) != T ())
+	  new_nnz++;
+
+      rep = new typename Sparse<T>::SparseRep (nr, nc, new_nnz);
+
+      int ii = 0;
+      xcidx(0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    if (a.elem (i,j) != T ())
+	      {
+		xdata(ii) = a.elem (i,j);
+		xridx(ii++) = i;
+	      }
+	  xcidx(j+1) = ii;
+	}
+    }
+}
+
+template <class T>
+Sparse<T>::~Sparse (void)
+{
+  if (--rep->count <= 0)
+    delete rep;
+
+  delete [] idx;
+}
+
+template <class T>
+int
+Sparse<T>::compute_index (const Array<int>& ra_idx) const
+{
+  int retval = -1;
+
+  int n = dimensions.length ();
+
+  if (n > 0 && n == ra_idx.length ())
+    {
+      retval = ra_idx(--n);
+
+      while (--n >= 0)
+	{
+	  retval *= dimensions(n);
+	  retval += ra_idx(n);
+	}
+    }
+  else
+    (*current_liboctave_error_handler)
+      ("Sparse<T>::compute_index: invalid ra_idxing operation");
+
+  return retval;
+}
+
+template <class T>
+T
+Sparse<T>::range_error (const char *fcn, int n) const
+{
+  (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n);
+  return T ();
+}
+
+template <class T>
+T&
+Sparse<T>::range_error (const char *fcn, int n)
+{
+  (*current_liboctave_error_handler) ("%s (%d): range error", fcn, n);
+  static T foo;
+  return foo;
+}
+
+template <class T>
+T
+Sparse<T>::range_error (const char *fcn, int i, int j) const
+{
+  (*current_liboctave_error_handler)
+    ("%s (%d, %d): range error", fcn, i, j);
+  return T ();
+}
+
+template <class T>
+T&
+Sparse<T>::range_error (const char *fcn, int i, int j)
+{
+  (*current_liboctave_error_handler)
+    ("%s (%d, %d): range error", fcn, i, j);
+  static T foo;
+  return foo;
+}
+
+template <class T>
+T
+Sparse<T>::range_error (const char *fcn, const Array<int>& ra_idx) const
+{
+  OSSTREAM buf;
+
+  buf << fcn << " (";
+
+  int n = ra_idx.length ();
+
+  if (n > 0)
+    buf << ra_idx(0);
+
+  for (int i = 1; i < n; i++)
+    buf << ", " << ra_idx(i);
+
+  buf << "): range error";
+
+  buf << OSSTREAM_ENDS;
+
+  (*current_liboctave_error_handler) (OSSTREAM_C_STR (buf));
+
+  OSSTREAM_FREEZE (buf);
+
+  return T ();
+}
+
+template <class T>
+T&
+Sparse<T>::range_error (const char *fcn, const Array<int>& ra_idx)
+{
+  OSSTREAM buf;
+
+  buf << fcn << " (";
+
+  int n = ra_idx.length ();
+
+  if (n > 0)
+    buf << ra_idx(0);
+
+  for (int i = 1; i < n; i++)
+    buf << ", " << ra_idx(i);
+
+  buf << "): range error";
+
+  buf << OSSTREAM_ENDS;
+
+  (*current_liboctave_error_handler) (OSSTREAM_C_STR (buf));
+
+  OSSTREAM_FREEZE (buf);
+
+  static T foo;
+  return foo;
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::reshape (const dim_vector& new_dims) const
+{
+  Sparse<T> retval;
+
+  if (dimensions != new_dims)
+    {
+      if (dimensions.numel () == new_dims.numel ())
+	{
+	  int new_nnz = nnz ();
+	  int new_nr = new_dims (0);
+	  int new_nc = new_dims (1);
+	  int old_nr = rows ();
+	  int old_nc = cols ();
+	  retval = Sparse<T> (new_nr, new_nc, new_nnz);
+
+	  int kk = 0;
+	  retval.xcidx(0) = 0;
+	  for (int i = 0; i < old_nc; i++)
+	    for (int j = cidx(i); j < cidx(i+1); j++)
+	      {
+		int tmp = i * old_nr + ridx(j);
+		int ii = tmp % new_nr;
+		int jj = (tmp - ii) / new_nr; 
+		for (int k = kk; k < jj; k++)
+		  retval.xcidx(k+1) = j;
+		kk = jj;
+		retval.xdata(j) = data(j);
+		retval.xridx(j) = ii;
+	      }
+	  retval.xcidx(new_nc) = new_nnz;
+	}
+      else
+	(*current_liboctave_error_handler) ("reshape: size mismatch");
+    }
+  else
+    retval = *this;
+
+  return retval;
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::permute (const Array<int>& perm_vec, bool) const
+{
+  dim_vector dv = dims ();
+  dim_vector dv_new;
+
+  int nd = dv.length ();
+
+  dv_new.resize (nd);
+
+  // Need this array to check for identical elements in permutation array.
+  Array<bool> checked (nd, false);
+
+  // Find dimension vector of permuted array.
+  for (int i = 0; i < nd; i++)
+    {
+      int perm_el = perm_vec.elem (i);
+
+      if (perm_el > dv.length () || perm_el < 1)
+	{
+	  (*current_liboctave_error_handler)
+	    ("permutation vector contains an invalid element");
+
+	  return Sparse<T> ();
+	}
+
+      if (checked.elem(perm_el - 1))
+	{
+	  (*current_liboctave_error_handler)
+	    ("PERM cannot contain identical elements");
+
+	  return Sparse<T> ();
+	}
+      else
+	checked.elem(perm_el - 1) = true;
+
+      dv_new (i) = dv (perm_el - 1);
+    }
+
+  if (dv_new == dv)
+    return *this;
+  else
+    return transpose ();
+}
+
+template <class T>
+void
+Sparse<T>::resize_no_fill (const dim_vector& dv)
+{
+  int n = dv.length ();
+
+  if (n != 2)
+    {
+      (*current_liboctave_error_handler) ("sparse array must be 2-D");
+      return;
+    }
+
+  resize_no_fill (dv(0), dv(1));
+}
+
+template <class T>
+void
+Sparse<T>::resize_no_fill (int r, int c)
+{
+  if (r < 0 || c < 0)
+    {
+      (*current_liboctave_error_handler)
+	("can't resize to negative dimension");
+      return;
+    }
+
+  if (ndims () == 0)
+    dimensions = dim_vector (0, 0);
+
+  if (r == dim1 () && c == dim2 ())
+    return;
+
+  typename Sparse<T>::SparseRep *old_rep = Sparse<T>::rep;
+  int nc = cols ();
+  int nr = rows ();
+
+  if (nnz () == 0 || r == 0 || c == 0)
+    // Special case of redimensioning to/from a sparse matrix with 
+    // no elements
+    rep = new typename Sparse<T>::SparseRep (r, c);
+  else
+    {
+      int n = 0;
+      Sparse<T> tmpval;
+      if (r >= nr)
+	{
+	  if (c > nc)
+	    n = cidx(nc);
+	  else
+	    n = cidx(c);
+
+	  tmpval = Sparse<T> (r, c, n);
+
+	  if (c > nc)
+	    {
+	      for (int i = 0; i < nc; i++)
+		tmpval.cidx(i) = cidx(i);
+	      for (int i = nc+2; i < c; i++)
+		tmpval.cidx(i) = tmpval.cidx(i-1);
+	    }
+	  else if (c <= nc)
+	    for (int i = 0; i < c; i++)
+	      tmpval.cidx(i) = cidx(i);
+	  
+	  for (int i = 0; i < n; i++)
+	    {
+	      tmpval.data(i) = data(i);
+	      tmpval.ridx(i) = ridx(i);
+	    }
+	}
+      else
+	{
+	  // Count how many non zero terms before we do anything
+	  for (int i = 0; i < c; i++)
+	    for (int j = cidx(i); j < cidx(i+1); j++)
+	      if (ridx(j) < r)
+		n++;
+
+	  if (n)
+	    {
+	      // Now that we know the size we can do something
+	      tmpval = Sparse<T> (r, c, n);
+
+	      tmpval.cidx(0);
+	      for (int i = 0, ii = 0; i < c; i++)
+		{
+		  for (int j = cidx(i); j < cidx(i+1); j++)
+		    if (ridx(j) < r)
+		      {
+			tmpval.data(ii) = data(j);
+			tmpval.ridx(ii++) = ridx(j);
+		      }
+		  tmpval.cidx(i+1) = ii;
+		}
+	    }
+	  else
+	    tmpval = Sparse<T> (r, c);
+	}
+
+      rep = tmpval.rep;
+      rep->count++;
+    }
+
+  dimensions = dim_vector (r, c);
+
+  if (--old_rep->count <= 0)
+    delete old_rep;
+}
+
+template <class T>
+Sparse<T>&
+Sparse<T>::insert (const Sparse<T>& a, int r, int c)
+{
+  int a_rows = a.rows ();
+  int a_cols = a.cols ();
+  int nr = rows ();
+  int nc = cols ();
+
+  if (r < 0 || r + a_rows > rows () || c < 0 || c + a_cols > cols ())
+    {
+      (*current_liboctave_error_handler) ("range error for insert");
+      return *this;
+    }
+
+  // First count the number of elements in the final array
+  int nel = cidx(c) + a.nnz ();
+
+  if (c + a_cols < nc)
+    nel += cidx(nc) - cidx(c + a_cols);
+
+  for (int i = c; i < c + a_cols; i++)
+    for (int j = cidx(i); j < cidx(i+1); j++)
+      if (ridx(j) < r || ridx(j) >= r + a_rows)
+	nel++;
+
+  Sparse<T> tmp (*this);
+  --rep->count;
+  rep = new typename Sparse<T>::SparseRep (nr, nc, nel);
+
+  for (int i = 0; i < tmp.cidx(c); i++)
+    {
+      data(i) = tmp.data(i);
+      ridx(i) = tmp.ridx(i);
+    }
+  for (int i = 0; i < c + 1; i++)
+    cidx(i) = tmp.cidx(i);
+
+  int ii = cidx(c);
+
+  for (int i = c; i < c + a_cols; i++)
+    {
+      OCTAVE_QUIT;
+
+      for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++)
+	if (tmp.ridx(j) < r)
+	  {
+	    data(ii) = tmp.data(j);
+	    ridx(ii++) = tmp.ridx(j);
+	  }
+
+      OCTAVE_QUIT;
+
+      for (int j = a.cidx(i-c); j < a.cidx(i-c+1); j++)
+	{
+	  data(ii) = a.data(j);
+	  ridx(ii++) = r + a.ridx(j);
+	}
+
+      OCTAVE_QUIT;
+
+      for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++)
+	if (tmp.ridx(j) >= r + a_rows)
+	  {
+	    data(ii) = tmp.data(j);
+	    ridx(ii++) = tmp.ridx(j);
+	  }
+
+      cidx(i+1) = ii;
+    }
+
+  for (int i = c + a_cols; i < nc; i++)
+    {
+      for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++)
+	{
+	  data(ii) = tmp.data(j);
+	  ridx(ii++) = tmp.ridx(j);
+	}
+      cidx(i+1) = ii;
+    }
+
+  return *this;
+}
+
+template <class T>
+Sparse<T>&
+Sparse<T>::insert (const Sparse<T>& a, const Array<int>& ra_idx)
+{
+
+  if (ra_idx.length () != 2)
+    {
+      (*current_liboctave_error_handler) ("range error for insert");
+      return *this;
+    }
+
+  return insert (a, ra_idx (0), ra_idx (1));
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::transpose (void) const
+{
+  assert (ndims () == 2);
+
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  Sparse<T> retval (nc, nr, nz);
+
+  retval.cidx(0) = 0;
+  for (int i = 0, iidx = 0; i < nr; i++)
+    {
+      for (int j = 0; j < nc; j++)
+	for (int k = cidx(j); k < cidx(j+1); k++)
+	  if (ridx(k) == i)
+	    {
+	      retval.data(iidx) = data(k);
+	      retval.ridx(iidx++) = j;
+	    }
+      retval.cidx(i+1) = iidx;
+    }
+
+  return retval;
+}
+
+template <class T>
+void
+Sparse<T>::clear_index (void)
+{
+  delete [] idx;
+  idx = 0;
+  idx_count = 0;
+}
+
+template <class T>
+void
+Sparse<T>::set_index (const idx_vector& idx_arg)
+{
+  int nd = ndims ();
+
+  if (! idx && nd > 0)
+    idx = new idx_vector [nd];
+
+  if (idx_count < nd)
+    {
+      idx[idx_count++] = idx_arg;
+    }
+  else
+    {
+      idx_vector *new_idx = new idx_vector [idx_count+1];
+
+      for (int i = 0; i < idx_count; i++)
+	new_idx[i] = idx[i];
+
+      new_idx[idx_count++] = idx_arg;
+
+      delete [] idx;
+
+      idx = new_idx;
+    }
+}
+
+template <class T>
+void
+Sparse<T>::maybe_delete_elements (idx_vector& idx_arg)
+{
+  int nr = dim1 ();
+  int nc = dim2 ();
+
+  if (nr == 0 && nc == 0)
+    return;
+
+  int n;
+  if (nr == 1)
+    n = nc;
+  else if (nc == 1)
+    n = nr;
+  else
+    {
+      // Reshape to row vector for Matlab compatibility.
+
+      n = nr * nc;
+      nr = 1;
+      nc = n;
+    }
+
+  if (idx_arg.is_colon_equiv (n, 1))
+    {
+      // Either A(:) = [] or A(idx) = [] with idx enumerating all
+      // elements, so we delete all elements and return [](0x0).  To
+      // preserve the orientation of the vector, you have to use
+      // A(idx,:) = [] (delete rows) or A(:,idx) (delete columns).
+
+      resize_no_fill (0, 0);
+      return;
+    }
+
+  idx_arg.sort (true);
+
+  int num_to_delete = idx_arg.length (n);
+
+  if (num_to_delete != 0)
+    {
+      int new_n = n;
+      int new_nnz = nnz ();
+
+      int iidx = 0;
+
+      const Sparse<T> tmp (*this);
+
+      for (int i = 0; i < n; i++)
+	{
+	  OCTAVE_QUIT;
+
+	  if (i == idx_arg.elem (iidx))
+	    {
+	      iidx++;
+	      new_n--;
+
+	      if (tmp.elem (i) != T ())
+		new_nnz--;
+
+	      if (iidx == num_to_delete)
+		break;
+	    }
+	}
+
+      if (new_n > 0)
+	{
+	  rep->count--;
+
+	  if (nr == 1)
+	    rep = new typename Sparse<T>::SparseRep (1, new_n, new_nnz);
+	  else
+	    rep = new typename Sparse<T>::SparseRep (new_n, 1, new_nnz);
+
+	  int ii = 0;
+	  int jj = 0;
+	  iidx = 0;
+	  for (int i = 0; i < n; i++)
+	    {
+	      OCTAVE_QUIT;
+
+	      if (iidx < num_to_delete && i == idx_arg.elem (iidx))
+		iidx++;
+	      else
+		{
+		  T el = tmp.elem (i);
+		  if (el != T ())
+		    {
+		      data(ii) = el;
+		      ridx(ii++) = jj;
+		    }
+		  jj++;
+		}
+	    }
+
+	  dimensions.resize (2);
+
+	  if (nr == 1)
+	    {
+	      ii = 0;
+	      cidx(0) = 0;
+	      for (int i = 0; i < new_n; i++)
+		{
+		  OCTAVE_QUIT;
+		  if (ridx(ii) == i)
+		    ridx(ii++) = 0;
+		  cidx(i+1) = ii;
+		}
+
+	      dimensions(0) = 1;
+	      dimensions(1) = new_n;
+	    }
+	  else
+	    {
+	      cidx(0) = 0;
+	      cidx(1) = new_nnz;
+	      dimensions(0) = new_n;
+	      dimensions(1) = 1;
+	    }
+	}
+      else
+	(*current_liboctave_error_handler)
+	  ("A(idx) = []: index out of range");
+    }
+}
+
+template <class T>
+void
+Sparse<T>::maybe_delete_elements (idx_vector& idx_i, idx_vector& idx_j)
+{
+  assert (ndims () == 2);
+
+  int nr = dim1 ();
+  int nc = dim2 ();
+
+  if (nr == 0 && nc == 0)
+    return;
+
+  if (idx_i.is_colon ())
+    {
+      if (idx_j.is_colon ())
+	{
+	  // A(:,:) -- We are deleting columns and rows, so the result
+	  // is [](0x0).
+
+	  resize_no_fill (0, 0);
+	  return;
+	}
+
+      if (idx_j.is_colon_equiv (nc, 1))
+	{
+	  // A(:,j) -- We are deleting columns by enumerating them,
+	  // If we enumerate all of them, we should have zero columns
+	  // with the same number of rows that we started with.
+
+	  resize_no_fill (nr, 0);
+	  return;
+	}
+    }
+
+  if (idx_j.is_colon () && idx_i.is_colon_equiv (nr, 1))
+    {
+      // A(i,:) -- We are deleting rows by enumerating them.  If we
+      // enumerate all of them, we should have zero rows with the
+      // same number of columns that we started with.
+
+      resize_no_fill (0, nc);
+      return;
+    }
+
+  if (idx_i.is_colon_equiv (nr, 1))
+    {
+      if (idx_j.is_colon_equiv (nc, 1))
+	resize_no_fill (0, 0);
+      else
+	{
+	  idx_j.sort (true);
+
+	  int num_to_delete = idx_j.length (nc);
+
+	  if (num_to_delete != 0)
+	    {
+	      if (nr == 1 && num_to_delete == nc)
+		resize_no_fill (0, 0);
+	      else
+		{
+		  int new_nc = nc;
+		  int new_nnz = nnz ();
+
+		  int iidx = 0;
+
+		  for (int j = 0; j < nc; j++)
+		    {
+		      OCTAVE_QUIT;
+
+		      if (j == idx_j.elem (iidx))
+			{
+			  iidx++;
+			  new_nc--;
+			  
+			  new_nnz -= cidx(j+1) - cidx(j);
+
+			  if (iidx == num_to_delete)
+			    break;
+			}
+		    }
+
+		  if (new_nc > 0)
+		    {
+		      const Sparse<T> tmp (*this);
+		      --rep->count;
+		      rep = new typename Sparse<T>::SparseRep (nr, new_nc, 
+							       new_nnz);
+		      int ii = 0;
+		      int jj = 0;
+		      iidx = 0;
+		      cidx(0) = 0;
+		      for (int j = 0; j < nc; j++)
+			{
+			  OCTAVE_QUIT;
+
+			  if (iidx < num_to_delete && j == idx_j.elem (iidx))
+			    iidx++;
+			  else
+			    {
+			      for (int i = tmp.cidx(j); 
+				   i < tmp.cidx(j+1); i++)
+				{
+				  data(jj) = tmp.data(i);
+				  ridx(jj++) = tmp.ridx(i);
+				}
+			      cidx(++ii) = jj;
+			    }
+			}
+
+		      dimensions.resize (2);
+		      dimensions(1) = new_nc;
+		    }
+		  else
+		    (*current_liboctave_error_handler)
+		      ("A(idx) = []: index out of range");
+		}
+	    }
+	}
+    }
+  else if (idx_j.is_colon_equiv (nc, 1))
+    {
+      if (idx_i.is_colon_equiv (nr, 1))
+	resize_no_fill (0, 0);
+      else
+	{
+	  idx_i.sort (true);
+
+	  int num_to_delete = idx_i.length (nr);
+
+	  if (num_to_delete != 0)
+	    {
+	      if (nc == 1 && num_to_delete == nr)
+		resize_no_fill (0, 0);
+	      else
+		{
+		  int new_nr = nr;
+		  int new_nnz = nnz ();
+
+		  int iidx = 0;
+
+		  for (int i = 0; i < nr; i++)
+		    {
+		      OCTAVE_QUIT;
+
+		      if (i == idx_i.elem (iidx))
+			{
+			  iidx++;
+			  new_nr--;
+			  
+			  for (int j = 0; j < nnz (); j++)
+			    if (ridx(j) == i)
+			      new_nnz--;
+
+			  if (iidx == num_to_delete)
+			    break;
+			}
+		    }
+
+		  if (new_nr > 0)
+		    {
+		      const Sparse<T> tmp (*this);
+		      --rep->count;
+		      rep = new typename Sparse<T>::SparseRep (new_nr, nc, 
+							       new_nnz);
+
+		      int jj = 0;
+		      cidx(0) = 0;
+		      for (int i = 0; i < nc; i++)
+			{
+			  iidx = 0;
+			  for (int j = tmp.cidx(i); j < tmp.cidx(i+1); j++)
+			    {
+			      OCTAVE_QUIT;
+
+			      int ri = tmp.ridx(j);
+
+			      while (iidx < num_to_delete && 
+				     ri > idx_i.elem (iidx))
+				{
+				  iidx++;
+				}
+
+			      if (iidx == num_to_delete ||
+				  ri != idx_i.elem(iidx))
+				{
+				  data(jj) = tmp.data(j);
+				  ridx(jj++) = ri - iidx;
+				}
+			    }
+			  cidx(i+1) = jj;
+			}
+
+		      dimensions.resize (2);
+		      dimensions(0) = new_nr;
+		    }
+		  else
+		    (*current_liboctave_error_handler)
+		      ("A(idx) = []: index out of range");
+		}
+	    }
+	}
+    }
+}
+
+template <class T>
+void
+Sparse<T>::maybe_delete_elements (Array<idx_vector>& ra_idx)
+{
+  if (ra_idx.length () == 1)
+    maybe_delete_elements (ra_idx(0));
+  else if (ra_idx.length () == 2)
+    maybe_delete_elements (ra_idx(0), ra_idx(1));
+  else
+    (*current_liboctave_error_handler) 
+      ("range error for maybe_delete_elements");
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::value (void)
+{
+  Sparse<T> retval;
+
+  int n_idx = index_count ();
+
+  if (n_idx == 2)
+    {
+      idx_vector *tmp = get_idx ();
+
+      idx_vector idx_i = tmp[0];
+      idx_vector idx_j = tmp[1];
+
+      retval = index (idx_i, idx_j);
+    }
+  else if (n_idx == 1)
+    {
+      retval = index (idx[0]);
+    }
+  else
+    (*current_liboctave_error_handler)
+      ("Sparse<T>::value: invalid number of indices specified");
+
+  clear_index ();
+
+  return retval;
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::index (idx_vector& idx_arg, int resize_ok) const
+{
+  Sparse<T> retval;
+
+  assert (ndims () == 2);
+
+  int nr = dim1 ();
+  int nc = dim2 ();
+  int nz = nnz ();
+
+  int orig_len = nr * nc;
+
+  dim_vector idx_orig_dims = idx_arg.orig_dimensions ();
+
+  int idx_orig_rows = idx_arg.orig_rows ();
+  int idx_orig_columns = idx_arg.orig_columns ();
+
+  if (idx_orig_dims.length () > 2)
+    (*current_liboctave_error_handler)
+      ("Sparse<T>::index: Can not index Sparse<T> with an N-D Array");
+  else if (idx_arg.is_colon ())
+    {
+      // Fast magic colon processing.
+      retval = Sparse<T> (nr * nc, 1, nz);
+
+      for (int i = 0; i < nc; i++)
+	for (int j = cidx(i); j < cidx(i+1); j++)
+	  {
+	    OCTAVE_QUIT;
+	    retval.xdata(j) = data(j); 
+	    retval.xridx(j) = ridx(j) + i * nr;
+	  }
+      retval.xcidx(0) = 0;
+      retval.xcidx(1) = nz;
+    }
+  else if (nr == 1 && nc == 1)
+    {
+      // You have to be pretty sick to get to this bit of code,
+      // since you have a scalar stored as a sparse matrix, and
+      // then want to make a dense matrix with sparse 
+      // representation. Ok, we'll do it, but you deserve what 
+      // you get!!
+      int n = idx_arg.freeze (length (), "sparse vector", resize_ok);
+      if (n == 0)
+	if (idx_arg.one_zero_only ())
+	  retval = Sparse<T> (dim_vector (0, 0));
+	else
+	  retval = Sparse<T> (dim_vector (0, 1));
+      else if (nz < 1)
+	if (n >= idx_orig_dims.numel ())
+	  retval = Sparse<T> (idx_orig_dims);
+	else
+	  retval = Sparse<T> (dim_vector (n, 1));
+      else if (n >= idx_orig_dims.numel ())
+	{
+	  T el = elem (0);
+	  int new_nr = idx_orig_rows;
+	  int new_nc = idx_orig_columns;
+	  for (int i = 2; i < idx_orig_dims.length (); i++)
+	    new_nc *= idx_orig_dims (i);
+		
+	  retval = Sparse<T> (new_nr, new_nc, idx_arg.ones_count ());
+
+	  int ic = 0;
+	  for (int i = 0; i < n; i++)
+	    {
+	      if (i % new_nr == 0)
+		retval.xcidx(i % new_nr) = ic;
+
+	      int ii = idx_arg.elem (i);
+	      if (ii == 0)
+		{
+		  OCTAVE_QUIT;
+		  retval.xdata(ic) = el;
+		  retval.xridx(ic++) = i % new_nr;
+		}
+	    }
+	  retval.xcidx (new_nc) = ic;
+	}
+      else
+	{
+	  T el = elem (0);
+	  retval = Sparse<T> (n, 1, nz);
+  	 
+	  for (int i = 0; i < nz; i++) 
+	    {
+	      OCTAVE_QUIT;
+	      retval.xdata(i) = el;
+	      retval.xridx(i) = i;
+	    }
+	  retval.xcidx(0) = 0; 	 
+	  retval.xcidx(1) = n; 	 
+	}
+    }
+  else if (nr == 1 || nc == 1)
+    {
+      // If indexing a vector with a matrix, return value has same
+      // shape as the index.  Otherwise, it has same orientation as
+      // indexed object.
+      int len = length ();
+      int n = idx_arg.freeze (len, "sparse vector", resize_ok);
+
+      if (n == 0)
+	if (nr == 1)
+	  retval = Sparse<T> (dim_vector (1, 0));
+	else
+	  retval = Sparse<T> (dim_vector (0, 1));
+      else if (nz < 1)
+	if ((n != 0 && idx_arg.one_zero_only ())
+	    || idx_orig_rows == 1 || idx_orig_columns == 1)
+	  retval = Sparse<T> ((nr == 1 ? 1 : n), (nr == 1 ? n : 1));
+	else
+	  retval = Sparse<T> (idx_orig_dims);
+      else
+	{
+
+	  int new_nnz = 0;
+	  if (nr == 1)
+	    for (int i = 0; i < n; i++)
+	      {
+		OCTAVE_QUIT;
+
+		int ii = idx_arg.elem (i);
+		if (ii < len)
+		  if (cidx(ii) != cidx(ii+1))
+		    new_nnz++;
+	      }
+	  else
+	    for (int i = 0; i < n; i++)
+	      {
+		int ii = idx_arg.elem (i);
+		if (ii < len)
+		  for (int j = 0; j < nz; j++)
+		    {
+		      OCTAVE_QUIT;
+
+		      if (ridx(j) == ii)
+			new_nnz++;
+		      if (ridx(j) >= ii)
+			break;
+		    }
+	      }
+
+	  if (idx_arg.one_zero_only () || idx_orig_rows == 1 || 
+	      idx_orig_columns == 1)
+	    {
+	      if (nr == 1)
+		{
+		  retval = Sparse<T> (1, n, new_nnz);
+		  int jj = 0;
+		  retval.xcidx(0) = 0;
+		  for (int i = 0; i < n; i++)
+		    {
+		      OCTAVE_QUIT;
+
+		      int ii = idx_arg.elem (i);
+		      if (ii < len)
+			if (cidx(ii) != cidx(ii+1))
+			  {
+			    retval.xdata(jj) = data(cidx(ii));
+			    retval.xridx(jj++) = 0;
+			  }
+		      retval.xcidx(i+1) = jj;
+		    }
+		}
+	      else
+		{
+		  retval = Sparse<T> (n, 1, new_nnz);
+		  retval.xcidx(0) = 0;
+		  retval.xcidx(1) = new_nnz;
+		  int jj = 0;
+		  for (int i = 0; i < n; i++)
+		    {
+		      int ii = idx_arg.elem (i);
+		      if (ii < len)
+			for (int j = 0; j < nz; j++)
+			  {
+			    OCTAVE_QUIT;
+
+			    if (ridx(j) == ii)
+			      {
+				retval.xdata(jj) = data(j);
+				retval.xridx(jj++) = i;
+			      }
+			    if (ridx(j) >= ii)
+			      break;
+			  }
+		    }
+		}
+	    }
+	  else 
+	    {
+	      int new_nr;
+	      int new_nc;
+	      if (n >= idx_orig_dims.numel ())
+		{
+		  new_nr = idx_orig_rows;
+		  new_nc = idx_orig_columns;
+		}
+	      else
+		{
+		  new_nr = n;
+		  new_nc = 1;
+		}
+
+	      retval = Sparse<T> (new_nr, new_nc, new_nnz);
+
+	      if (nr == 1)
+		{
+		  int jj = 0;
+		  retval.xcidx(0) = 0;
+		  for (int i = 0; i < n; i++)
+		    {
+		      OCTAVE_QUIT;
+
+		      int ii = idx_arg.elem (i);
+		      if (ii < len)
+			if (cidx(ii) != cidx(ii+1))
+			  {
+			    retval.xdata(jj) = data(cidx(ii));
+			    retval.xridx(jj++) = 0;
+			  }
+		      retval.xcidx(i/new_nr+1) = jj;
+		    }
+		}
+	      else
+		{
+		  int jj = 0;
+		  retval.xcidx(0) = 0;
+		  for (int i = 0; i < n; i++)
+		    {
+		      int ii = idx_arg.elem (i);
+		      if (ii < len)
+			for (int j = 0; j < nz; j++)
+			  {
+			    OCTAVE_QUIT;
+
+			    if (ridx(j) == ii)
+			      {
+				retval.xdata(jj) = data(j);
+				retval.xridx(jj++) = i;
+			      }
+			    if (ridx(j) >= ii)
+			      break;
+			  }
+		      retval.xcidx(i/new_nr+1) = jj;
+		    }
+		}
+	    }
+	}
+    }
+  else
+    {
+      if (liboctave_wfi_flag
+	  && ! (idx_arg.one_zero_only ()
+		&& idx_orig_rows == nr
+		&& idx_orig_columns == nc))
+	(*current_liboctave_warning_handler) 
+	  ("single index used for sparse matrix");
+
+      // This code is only for indexing matrices.  The vector
+      // cases are handled above.
+
+      idx_arg.freeze (nr * nc, "matrix", resize_ok);
+
+      if (idx_arg)
+	{
+	  int result_nr = idx_orig_rows;
+	  int result_nc = idx_orig_columns;
+
+	  if (idx_arg.one_zero_only ())
+	    {
+	      result_nr = idx_arg.ones_count ();
+	      result_nc = (result_nr > 0 ? 1 : 0);
+	    }
+
+	  if (nz < 1)
+	      retval = Sparse<T> (result_nr, result_nc);
+	  else
+	    {
+	      // Count number of non-zero elements
+	      int new_nnz = 0;
+	      int kk = 0;
+	      for (int j = 0; j < result_nc; j++)
+		{
+		  for (int i = 0; i < result_nr; i++)
+		    {
+		      OCTAVE_QUIT;
+		      
+		      int ii = idx_arg.elem (kk++);
+		      if (ii < orig_len)
+			{
+			  int fr = ii % nr;
+			  int fc = (ii - fr) / nr;
+			  for (int k = cidx(fc); k < cidx(fc+1); k++)
+			    {
+			      if (ridx(k) == fr)
+				new_nnz++;
+			      if (ridx(k) >= fr)
+				break;
+			    }
+			}
+		    }
+		}
+	      
+	      retval = Sparse<T> (result_nr, result_nc, new_nnz);
+
+	      kk = 0;
+	      int jj = 0;
+	      retval.xcidx(0) = 0;
+	      for (int j = 0; j < result_nc; j++)
+		{
+		  for (int i = 0; i < result_nr; i++)
+		    {
+		      OCTAVE_QUIT;
+
+		      int ii = idx_arg.elem (kk++);
+		      if (ii < orig_len)
+			{
+			  int fr = ii % nr;
+			  int fc = (ii - fr) / nr;
+			  for (int k = cidx(fc); k < cidx(fc+1); k++)
+			    {
+			      if (ridx(k) == fr)
+				{
+				  retval.xdata(jj) = data(k);
+				  retval.xridx(jj++) = i;
+				}
+			      if (ridx(k) >= fr)
+				break;
+			    }
+			}
+		    }
+		  retval.xcidx(j+1) = jj;
+		}
+	    }
+	  // idx_vector::freeze() printed an error message for us.
+	}
+    }
+
+  return retval;
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::index (idx_vector& idx_i, idx_vector& idx_j, int resize_ok) const
+{
+  Sparse<T> retval;
+
+  assert (ndims () == 2);
+
+  int nr = dim1 ();
+  int nc = dim2 ();
+
+  int n = idx_i.freeze (nr, "row", resize_ok);
+  int m = idx_j.freeze (nc, "column", resize_ok);
+
+  if (idx_i && idx_j)
+    {
+      if (idx_i.orig_empty () || idx_j.orig_empty () || n == 0 || m == 0)
+	{
+	  retval.resize_no_fill (n, m);
+	}
+      else if (idx_i.is_colon_equiv (nr) && idx_j.is_colon_equiv (nc))
+	{
+	  retval = *this;
+	}
+      else
+	{
+	  // First count the number of non-zero elements
+	  int new_nnz = 0;
+	  for (int j = 0; j < m; j++)
+	    {
+	      int jj = idx_j.elem (j);
+	      for (int i = 0; i < n; i++)
+		{
+		  OCTAVE_QUIT;
+
+		  int ii = idx_i.elem (i);
+		  if (ii < nr && jj < nc)
+		    {
+		      for (int k = cidx(jj); k < cidx(jj+1); k++)
+			{
+			  if (ridx(k) == ii)
+			    new_nnz++;
+			  if (ridx(k) >= ii)
+			    break;
+			}
+		    }
+		}
+	    }
+
+	  retval = Sparse<T> (n, m, new_nnz);
+
+	  int kk = 0;
+	  retval.xcidx(0) = 0;
+	  for (int j = 0; j < m; j++)
+	    {
+	      int jj = idx_j.elem (j);
+	      for (int i = 0; i < n; i++)
+		{
+		  OCTAVE_QUIT;
+
+		  int ii = idx_i.elem (i);
+		  if (ii < nr && jj < nc)
+		    {
+		      for (int k = cidx(jj); k < cidx(jj+1); k++)
+			{
+			  if (ridx(k) == ii)
+			    {
+			      retval.xdata(kk) = data(k);
+			      retval.xridx(kk++) = i;
+			    }
+			  if (ridx(k) >= ii)
+			    break;
+			}
+		    }
+		}
+	      retval.xcidx(j+1) = kk;
+	    }
+	}
+    }
+
+  // idx_vector::freeze() printed an error message for us.
+
+  return retval;
+}
+
+template <class T>
+Sparse<T>
+Sparse<T>::index (Array<idx_vector>& ra_idx, int resize_ok) const
+{
+
+  if (ra_idx.length () != 2)
+    {
+      (*current_liboctave_error_handler) ("range error for index");
+      return *this;
+    }
+
+  return index (ra_idx (0), ra_idx (1), resize_ok);
+}
+
+// XXX FIXME XXX
+// Unfortunately numel can overflow for very large but very sparse matrices.
+// For now just flag an error when this happens.
+template <class LT, class RT>
+int
+assign1 (Sparse<LT>& lhs, const Sparse<RT>& rhs)
+{
+  int retval = 1;
+
+  idx_vector *idx_tmp = lhs.get_idx ();
+
+  idx_vector lhs_idx = idx_tmp[0];
+
+  int lhs_len = lhs.numel ();
+  int rhs_len = rhs.numel ();
+
+  unsigned EIGHT_BYTE_INT long_lhs_len = 
+    static_cast<unsigned EIGHT_BYTE_INT> (lhs.rows ()) *
+    static_cast<unsigned EIGHT_BYTE_INT> (lhs.cols ());
+
+  unsigned EIGHT_BYTE_INT long_rhs_len = 
+    static_cast<unsigned EIGHT_BYTE_INT> (rhs.rows ()) *
+    static_cast<unsigned EIGHT_BYTE_INT> (rhs.cols ());
+
+  if (long_rhs_len != static_cast<unsigned EIGHT_BYTE_INT>(rhs_len) ||
+      long_lhs_len != static_cast<unsigned EIGHT_BYTE_INT>(lhs_len))
+    {
+      (*current_liboctave_error_handler)
+	("A(I) = X: Matrix dimensions too large to ensure correct\n",
+	 "operation. This is an limitation that should be removed\n",
+	 "in the future.");
+
+      lhs.clear_index ();
+      return 0;
+    }
+
+  int nr = lhs.rows ();
+  int nc = lhs.cols ();
+  int nz = lhs.nnz ();
+
+  int n = lhs_idx.freeze (lhs_len, "vector", true, liboctave_wrore_flag);
+
+  if (n != 0)
+    {
+      int max_idx = lhs_idx.max () + 1;
+      max_idx = max_idx < lhs_len ? lhs_len : max_idx;
+
+      // Take a constant copy of lhs. This means that elem won't 
+      // create missing elements.
+      const Sparse<LT> c_lhs (lhs);
+
+      if (rhs_len == n)
+	{
+	  int new_nnz = lhs.nnz ();
+
+	  // First count the number of non-zero elements
+	  for (int i = 0; i < n; i++)
+	    {
+	      OCTAVE_QUIT;
+
+	      int ii = lhs_idx.elem (i);
+	      if (ii < lhs_len && c_lhs.elem(ii) != LT ())
+		new_nnz--;
+	      if (rhs.elem(i) != RT ())
+		new_nnz++;
+	    }
+
+	  if (nr > 1)
+	    {
+	      Sparse<LT> tmp (max_idx, 1, new_nnz);
+	      tmp.cidx(0) = 0;
+	      tmp.cidx(1) = tmp.nnz ();
+
+	      int i = 0;
+	      int ii = 0;
+	      if (i < nz)
+		ii = c_lhs.ridx(i);
+
+	      int j = 0;
+	      int jj = lhs_idx.elem(j);
+
+	      int kk = 0;
+
+	      while (j < n || i < nz)
+		{
+		  if (j == n || (i < nz && ii < jj))
+		    {
+		      tmp.xdata (kk) = c_lhs.data (i);
+		      tmp.xridx (kk++) = ii;
+		      if (++i < nz)
+			ii = c_lhs.ridx(i);
+		    }
+		  else
+		    {
+		      RT rtmp = rhs.elem (j);
+		      if (rtmp != RT ())
+			{
+			  tmp.xdata (kk) = rtmp;
+			  tmp.xridx (kk++) = jj;
+			}
+
+		      if (ii == jj && i < nz)
+			if (++i < nz)
+			  ii = c_lhs.ridx(i);
+		      if (++j < n)
+			jj = lhs_idx.elem(j);
+		    }
+		}
+
+	      lhs = tmp;
+	    }
+	  else
+	    {
+	      Sparse<LT> tmp (1, max_idx, new_nnz);
+
+	      int i = 0;
+	      int ii = 0;
+	      while (ii < nc && c_lhs.cidx(ii+1) <= i)
+		ii++;
+
+	      int j = 0;
+	      int jj = lhs_idx.elem(j);
+
+	      int kk = 0;
+	      int ic = 0;
+
+	      while (j < n || i < nz)
+		{
+		  if (j == n || (i < nz && ii < jj))
+		    {
+		      while (ic <= ii)
+			tmp.xcidx (ic++) = kk;
+		      tmp.xdata (kk) = c_lhs.data (i);
+		      i++;
+		      while (ii < nc && c_lhs.cidx(ii+1) <= i)
+			ii++;
+		    }
+		  else
+		    {
+		      while (ic <= jj)
+			tmp.xcidx (ic++) = kk;
+
+		      RT rtmp = rhs.elem (j);
+		      if (rtmp != RT ())
+			tmp.xdata (kk) = rtmp;
+		      if (ii == jj)
+			{
+			  i++;
+			  while (ii < nc && c_lhs.cidx(ii+1) <= i)
+			    ii++;
+			}
+		      j++;
+		      if (j < n)
+			jj = lhs_idx.elem(j);
+		    }
+		  tmp.xridx (kk++) = 0;
+		}
+
+	      for (int iidx = ic; iidx < max_idx+1; iidx++)
+		tmp.xcidx(iidx) = kk;
+
+	      lhs = tmp;
+	    }
+	}
+      else if (rhs_len == 1)
+	{
+	  int new_nnz = lhs.nnz ();
+	  RT scalar = rhs.elem (0);
+	  bool scalar_non_zero = (scalar != RT ());
+
+	  // First count the number of non-zero elements
+	  if (scalar != RT ())
+	    new_nnz += n;
+	  for (int i = 0; i < n; i++)
+	    {
+	      OCTAVE_QUIT;
+
+	      int ii = lhs_idx.elem (i);
+	      if (ii < lhs_len && c_lhs.elem(ii) != LT ())
+		new_nnz--;
+	    }
+
+	  if (nr > 1)
+	    {
+	      Sparse<LT> tmp (max_idx, 1, new_nnz);
+	      tmp.cidx(0) = 0;
+	      tmp.cidx(1) = tmp.nnz ();
+
+	      int i = 0;
+	      int ii = 0;
+	      if (i < nz)
+		ii = c_lhs.ridx(i);
+
+	      int j = 0;
+	      int jj = lhs_idx.elem(j);
+
+	      int kk = 0;
+
+	      while (j < n || i < nz)
+		{
+		  if (j == n || (i < nz && ii < jj))
+		    {
+		      tmp.xdata (kk) = c_lhs.data (i);
+		      tmp.xridx (kk++) = ii;
+		      if (++i < nz)
+			ii = c_lhs.ridx(i);
+		    }
+		  else
+		    {
+		      if (scalar_non_zero)
+			{
+			  tmp.xdata (kk) = scalar;
+			  tmp.xridx (kk++) = jj;
+			}
+
+		      if (ii == jj && i < nz)
+			if (++i < nz)
+			  ii = c_lhs.ridx(i);
+		      if (++j < n)
+			jj = lhs_idx.elem(j);
+		    }
+		}
+
+	      lhs = tmp;
+	    }
+	  else
+	    {
+	      Sparse<LT> tmp (1, max_idx, new_nnz);
+
+	      int i = 0;
+	      int ii = 0;
+	      while (ii < nc && c_lhs.cidx(ii+1) <= i)
+		ii++;
+
+	      int j = 0;
+	      int jj = lhs_idx.elem(j);
+
+	      int kk = 0;
+	      int ic = 0;
+
+	      while (j < n || i < nz)
+		{
+		  if (j == n || (i < nz && ii < jj))
+		    {
+		      while (ic <= ii)
+			tmp.xcidx (ic++) = kk;
+		      tmp.xdata (kk) = c_lhs.data (i);
+		      i++;
+		      while (ii < nc && c_lhs.cidx(ii+1) <= i)
+			ii++;
+		    }
+		  else
+		    {
+		      while (ic <= jj)
+			tmp.xcidx (ic++) = kk;
+		      if (scalar_non_zero)
+			tmp.xdata (kk) = scalar;
+		      if (ii == jj)
+			{
+			  i++;
+			  while (ii < nc && c_lhs.cidx(ii+1) <= i)
+			    ii++;
+			}
+		      j++;
+		      if (j < n)
+			jj = lhs_idx.elem(j);
+		    }
+		  tmp.xridx (kk++) = 0;
+		}
+
+	      for (int iidx = ic; iidx < max_idx+1; iidx++)
+		tmp.xcidx(iidx) = kk;
+
+	      lhs = tmp;
+	    }
+	}
+      else
+	{
+	  (*current_liboctave_error_handler)
+	    ("A(I) = X: X must be a scalar or a vector with same length as I");
+
+	  retval = 0;
+	}
+    }
+  else if (lhs_idx.is_colon ())
+    {
+      if (lhs_len == 0)
+	{
+
+	  int new_nnz = rhs.nnz ();
+	  Sparse<LT> tmp (1, rhs_len, new_nnz);
+
+	  int ii = 0;
+	  int jj = 0;
+	  for (int i = 0; i < rhs.cols(); i++)
+	    for (int j = rhs.cidx(i); j < rhs.cidx(i+1); j++)
+	      {
+		OCTAVE_QUIT;
+		for (int k = jj; k <= i * rhs.rows() + rhs.ridx(j); k++)
+		  tmp.cidx(jj++) = ii;
+
+		tmp.data(ii) = rhs.data(j);
+		tmp.ridx(ii++) = 0;
+	      }
+
+	  for (int i = jj; i < rhs_len + 1; i++)
+	    tmp.cidx(i) = ii;
+
+	  lhs = tmp;
+	}
+      else
+	(*current_liboctave_error_handler)
+	  ("A(:) = X: A must be the same size as X");
+    }
+  else if (! (rhs_len == 1 || rhs_len == 0))
+    {
+      (*current_liboctave_error_handler)
+	("A([]) = X: X must also be an empty matrix or a scalar");
+
+      retval = 0;
+    }
+
+  lhs.clear_index ();
+
+  return retval;
+}
+
+template <class LT, class RT>
+int
+assign (Sparse<LT>& lhs, const Sparse<RT>& rhs)
+{
+  int retval = 1;
+
+  int n_idx = lhs.index_count ();
+
+  int lhs_nr = lhs.rows ();
+  int lhs_nc = lhs.cols ();
+  int lhs_nz = lhs.nnz ();
+
+  int rhs_nr = rhs.rows ();
+  int rhs_nc = rhs.cols ();
+
+  idx_vector *tmp = lhs.get_idx ();
+
+  idx_vector idx_i;
+  idx_vector idx_j;
+
+  if (n_idx > 2)
+    {
+      (*current_liboctave_error_handler)
+        ("A(I, J) = X: can only have 1 or 2 indexes for sparse matrices");
+      return 0;
+    }
+
+  if (n_idx > 1)
+    idx_j = tmp[1];
+
+  if (n_idx > 0)
+    idx_i = tmp[0];
+
+  if (n_idx == 2)
+    {
+      int n = idx_i.freeze (lhs_nr, "row", true, liboctave_wrore_flag);
+      idx_i.sort (true);
+
+      int m = idx_j.freeze (lhs_nc, "column", true, liboctave_wrore_flag);
+      idx_j.sort (true);
+
+
+      int idx_i_is_colon = idx_i.is_colon ();
+      int idx_j_is_colon = idx_j.is_colon ();
+
+      if (idx_i_is_colon)
+	n = lhs_nr > 0 ? lhs_nr : rhs_nr;
+
+      if (idx_j_is_colon)
+	m = lhs_nc > 0 ? lhs_nc : rhs_nc;
+
+      if (idx_i && idx_j)
+	{
+	  if (rhs_nr == 0 && rhs_nc == 0)
+	    {
+	      lhs.maybe_delete_elements (idx_i, idx_j);
+	    }
+	  else
+	    {
+	      if (rhs_nr == 1 && rhs_nc == 1 && n >= 0 && m >= 0)
+		{
+		  // No need to do anything if either of the indices
+		  // are empty.
+
+		  if (n > 0 && m > 0)
+		    {
+		      int max_row_idx = idx_i_is_colon ? rhs_nr : 
+			idx_i.max () + 1;
+		      int max_col_idx = idx_j_is_colon ? rhs_nc : 
+			idx_j.max () + 1;
+		      int new_nr = max_row_idx > lhs_nr ? max_row_idx : 
+			lhs_nr;
+		      int new_nc = max_col_idx > lhs_nc ? max_col_idx : 
+			lhs_nc;
+		      RT scalar = rhs.elem (0, 0);
+
+		      // Count the number of non-zero terms
+		      int new_nnz = lhs.nnz ();
+		      for (int j = 0; j < m; j++)
+			{
+			  int jj = idx_j.elem (j);
+			  if (jj < lhs_nc)
+			    {
+			      for (int i = 0; i < n; i++)
+				{
+				  OCTAVE_QUIT;
+
+				  int ii = idx_i.elem (i);
+			      
+				  if (ii < lhs_nr)
+				    {
+				      for (int k = lhs.cidx(jj); 
+					   k < lhs.cidx(jj+1); k++)
+					{
+					  if (lhs.ridx(k) == ii)
+					    new_nnz--;
+					  if (lhs.ridx(k) >= ii)
+					    break;
+					}
+				    }
+				}
+			    }
+			}
+
+		      if (scalar != RT())
+			new_nnz += m * n;
+
+		      Sparse<LT> stmp (new_nr, new_nc, new_nnz);
+
+		      int jji = 0;
+		      int jj = idx_j.elem (jji);
+		      int kk = 0;
+		      stmp.cidx(0) = 0;
+		      for (int j = 0; j < new_nc; j++)
+			{
+			  if (jji < m && jj == j)
+			    {
+			      int iii = 0;
+			      int ii = idx_i.elem (iii);
+			      for (int i = 0; i < new_nr; i++)
+				{
+				  OCTAVE_QUIT;
+
+				  if (iii < n && ii == i)
+				    {
+				      if (scalar != RT ())
+					{
+					  stmp.data(kk) = scalar;
+					  stmp.ridx(kk++) = i;
+					}
+				      if (++iii < n)
+					ii = idx_i.elem(iii);
+				    }
+				  else if (j < lhs.cols()) 
+				    {
+				      for (int k = lhs.cidx(j); 
+					   k < lhs.cidx(j+1); k++)
+					{
+					  if (lhs.ridx(k) == i)
+					    {
+					      stmp.data(kk) = lhs.data(k);
+					      stmp.ridx(kk++) = i;
+					    }
+					  if (lhs.ridx(k) >= i)
+					    break;
+					}
+				    }
+				}
+			      if (++jji < m)
+				jj = idx_j.elem(jji);
+			    }
+			  else if (j < lhs.cols()) 
+			    {
+			      for (int i = lhs.cidx(j); 
+				   i < lhs.cidx(j+1); i++)
+				{
+				  stmp.data(kk) = lhs.data(i);
+				  stmp.ridx(kk++) = lhs.ridx(i);
+				}
+			    }
+			  stmp.cidx(j+1) = kk;
+			}
+		      
+		      lhs = stmp;
+		    }
+		}
+	      else if (n == rhs_nr && m == rhs_nc)
+		{
+		  if (n > 0 && m > 0)
+		    {
+		      int max_row_idx = idx_i_is_colon ? rhs_nr : 
+			idx_i.max () + 1;
+		      int max_col_idx = idx_j_is_colon ? rhs_nc : 
+			idx_j.max () + 1;
+		      int new_nr = max_row_idx > lhs_nr ? max_row_idx : 
+			lhs_nr;
+		      int new_nc = max_col_idx > lhs_nc ? max_col_idx : 
+			lhs_nc;
+
+		      // Count the number of non-zero terms
+		      int new_nnz = lhs.nnz ();
+		      for (int j = 0; j < m; j++)
+			{
+			  int jj = idx_j.elem (j);
+			  for (int i = 0; i < n; i++)
+			    {
+			      OCTAVE_QUIT;
+
+			      if (jj < lhs_nc)
+				{
+				  int ii = idx_i.elem (i);
+			      
+				  if (ii < lhs_nr)
+				    {
+				      for (int k = lhs.cidx(jj); 
+					   k < lhs.cidx(jj+1); k++)
+					{
+					  if (lhs.ridx(k) == ii)
+					    new_nnz--;
+					  if (lhs.ridx(k) >= ii)
+					    break;
+					}
+				    }
+				}
+			      
+			      if (rhs.elem(i,j) != RT ())
+				new_nnz++;
+			    }
+			}
+
+		      Sparse<LT> stmp (new_nr, new_nc, new_nnz);
+
+		      int jji = 0;
+		      int jj = idx_j.elem (jji);
+		      int kk = 0;
+		      stmp.cidx(0) = 0;
+		      for (int j = 0; j < new_nc; j++)
+			{
+			  if (jji < m && jj == j)
+			    {
+			      int iii = 0;
+			      int ii = idx_i.elem (iii);
+			      for (int i = 0; i < new_nr; i++)
+				{
+				  OCTAVE_QUIT;
+
+				  if (iii < n && ii == i)
+				    {
+				      RT rtmp = rhs.elem (iii, jji);
+				      if (rtmp != RT ())
+					{
+					  stmp.data(kk) = rtmp;
+					  stmp.ridx(kk++) = i;
+					}
+				      if (++iii < n)
+					ii = idx_i.elem(iii);
+				    }
+				  else if (j < lhs.cols()) 
+				    {
+				      for (int k = lhs.cidx(j); 
+					   k < lhs.cidx(j+1); k++)
+					{
+					  if (lhs.ridx(k) == i)
+					    {
+					      stmp.data(kk) = lhs.data(k);
+					      stmp.ridx(kk++) = i;
+					    }
+					  if (lhs.ridx(k) >= i)
+					    break;
+					}
+				    }
+				}
+			      if (++jji < m)
+				jj = idx_j.elem(jji);
+			    }
+			  else if (j < lhs.cols()) 
+			    {
+			      for (int i = lhs.cidx(j); 
+				   i < lhs.cidx(j+1); i++)
+				{
+				  stmp.data(kk) = lhs.data(i);
+				  stmp.ridx(kk++) = lhs.ridx(i);
+				}
+			    }
+			  stmp.cidx(j+1) = kk;
+			}
+
+		      lhs = stmp;
+		    }
+		}
+	      else if (n == 0 && m == 0)
+		{
+		  if (! ((rhs_nr == 1 && rhs_nc == 1)
+			 || (rhs_nr == 0 || rhs_nc == 0)))
+		    {
+		      (*current_liboctave_error_handler)
+		("A([], []) = X: X must be an empty matrix or a scalar");
+
+		      retval = 0;
+		    }
+		}
+	      else
+		{
+		  (*current_liboctave_error_handler)
+    ("A(I, J) = X: X must be a scalar or the number of elements in I must");
+		  (*current_liboctave_error_handler)
+    ("match the number of rows in X and the number of elements in J must");
+		  (*current_liboctave_error_handler)
+    ("match the number of columns in X");
+
+		  retval = 0;
+		}
+	    }
+	}
+      // idx_vector::freeze() printed an error message for us.
+    }
+  else if (n_idx == 1)
+    {
+      int lhs_is_empty = lhs_nr == 0 || lhs_nc == 0;
+
+      if (lhs_is_empty || (lhs_nr == 1 && lhs_nc == 1))
+	{
+	  int lhs_len = lhs.length ();
+
+	  int n = idx_i.freeze (lhs_len, 0, true, liboctave_wrore_flag);
+	  idx_i.sort (true);
+
+	  if (idx_i)
+	    {
+	      if (rhs_nr == 0 && rhs_nc == 0)
+		{
+		  if (n != 0 && (lhs_nr != 0 || lhs_nc != 0))
+		    lhs.maybe_delete_elements (idx_i);
+		}
+	      else
+		{
+		  if (liboctave_wfi_flag)
+		    {
+		      if (lhs_is_empty
+			  && idx_i.is_colon ()
+			  && ! (rhs_nr == 1 || rhs_nc == 1))
+			{
+			  (*current_liboctave_warning_handler)
+			    ("A(:) = X: X is not a vector or scalar");
+			}
+		      else
+			{
+			  int idx_nr = idx_i.orig_rows ();
+			  int idx_nc = idx_i.orig_columns ();
+
+			  if (! (rhs_nr == idx_nr && rhs_nc == idx_nc))
+			    (*current_liboctave_warning_handler)
+			      ("A(I) = X: X does not have same shape as I");
+			}
+		    }
+
+		  if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+		    retval = 0;
+		}
+	    }
+	  // idx_vector::freeze() printed an error message for us.
+	}
+      else if (lhs_nr == 1)
+	{
+	  idx_i.freeze (lhs_nc, "vector", true, liboctave_wrore_flag);
+	  idx_i.sort (true);
+
+	  if (idx_i)
+	    {
+	      if (rhs_nr == 0 && rhs_nc == 0)
+		lhs.maybe_delete_elements (idx_i);
+	      else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+		retval = 0;
+	    }
+	  // idx_vector::freeze() printed an error message for us.
+	}
+      else if (lhs_nc == 1)
+	{
+	  idx_i.freeze (lhs_nr, "vector", true, liboctave_wrore_flag);
+	  idx_i.sort (true);
+
+	  if (idx_i)
+	    {
+	      if (rhs_nr == 0 && rhs_nc == 0)
+		lhs.maybe_delete_elements (idx_i);
+	      else if (! assign1 ((Sparse<LT>&) lhs, (Sparse<RT>&) rhs))
+		retval = 0;
+	    }
+	  // idx_vector::freeze() printed an error message for us.
+	}
+      else
+	{
+	  if (liboctave_wfi_flag
+	      && ! (idx_i.is_colon ()
+		    || (idx_i.one_zero_only ()
+			&& idx_i.orig_rows () == lhs_nr
+			&& idx_i.orig_columns () == lhs_nc)))
+	    (*current_liboctave_warning_handler)
+	      ("single index used for matrix");
+
+	  int lhs_len = lhs.length ();
+
+	  int len = idx_i.freeze (lhs_nr * lhs_nc, "matrix");
+	  idx_i.sort (true);
+
+	  if (idx_i)
+	    {
+	      // Take a constant copy of lhs. This means that elem won't 
+	      // create missing elements.
+	      const Sparse<LT> c_lhs (lhs);
+
+	      if (rhs_nr == 0 && rhs_nc == 0)
+		lhs.maybe_delete_elements (idx_i);
+	      else if (len == 0)
+		{
+		  if (! ((rhs_nr == 1 && rhs_nc == 1)
+			 || (rhs_nr == 0 || rhs_nc == 0)))
+		    (*current_liboctave_error_handler)
+		      ("A([]) = X: X must be an empty matrix or scalar");
+		}
+	      else if (len == rhs_nr * rhs_nc)
+		{
+		  int new_nnz = lhs_nz;
+
+		  // First count the number of non-zero elements
+		  for (int i = 0; i < len; i++)
+		    {
+		      OCTAVE_QUIT;
+		      
+		      int ii = idx_i.elem (i);
+		      if (ii < lhs_len && c_lhs.elem(ii) != LT ())
+			new_nnz--;
+		      if (rhs.elem(i) != RT ())
+			new_nnz++;
+		    }
+
+		  Sparse<LT> stmp (lhs_nr, lhs_nc, new_nnz);
+
+		  int i = 0;
+		  int ii = 0;
+		  int ic = 0;
+		  if (i < lhs_nz)
+		    {
+		      while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+			ic++;
+		      ii = ic * lhs_nr + c_lhs.ridx(i);
+		    }
+
+		  int j = 0;
+		  int jj = idx_i.elem (j);
+		  int jr = jj % lhs_nr;
+		  int jc = (jj - jr) / lhs_nr;
+
+		  int kk = 0;
+		  int kc = 0;
+
+		  while (j < len || i < lhs_nz)
+		    {
+		      if (j == len || (i < lhs_nz && ii < jj))
+			{
+			  while (kc <= ic)
+			    stmp.xcidx (kc++) = kk;
+			  stmp.xdata (kk) = c_lhs.data (i);
+			  stmp.xridx (kk++) = c_lhs.ridx (i);
+			  i++;
+			  while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+			    ic++;
+			  if (i < lhs_nz)
+			    ii = ic * lhs_nr + c_lhs.ridx(i);
+			}
+		      else
+			{
+			  while (kc <= jc)
+			    stmp.xcidx (kc++) = kk;
+			  RT rtmp = rhs.elem (j);
+			  if (rtmp != RT ())
+			    {
+			      stmp.xdata (kk) = rtmp;
+			      stmp.xridx (kk++) = jr;
+			    }
+			  if (ii == jj)
+			    {
+			      i++;
+			      while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+				ic++;
+			      if (i < lhs_nz)
+				ii = ic * lhs_nr + c_lhs.ridx(i);
+			    }
+			  j++;
+			  if (j < len)
+			    {
+			      jj = idx_i.elem (j);
+			      jr = jj % lhs_nr;
+			      jc = (jj - jr) / lhs_nr;
+			    }
+			}
+		    }
+
+		  for (int iidx = kc; iidx < lhs_nc+1; iidx++)
+		    stmp.xcidx(iidx) = kk;
+		  
+
+		  lhs = stmp;
+		}
+	      else if (rhs_nr == 1 && rhs_nc == 1)
+		{
+		  RT scalar = rhs.elem (0, 0);
+		  int new_nnz = lhs_nz;
+
+		  // First count the number of non-zero elements
+		  if (scalar != RT ())
+		    new_nnz += len;
+		  for (int i = 0; i < len; i++)
+		    {
+		      OCTAVE_QUIT;
+		      int ii = idx_i.elem (i);
+		      if (ii < lhs_len && c_lhs.elem(ii) != LT ())
+			new_nnz--;
+		    }
+
+		  Sparse<LT> stmp (lhs_nr, lhs_nc, new_nnz);
+
+		  int i = 0;
+		  int ii = 0;
+		  int ic = 0;
+		  if (i < lhs_nz)
+		    {
+		      while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+			ic++;
+		      ii = ic * lhs_nr + c_lhs.ridx(i);
+		    }
+
+		  int j = 0;
+		  int jj = idx_i.elem (j);
+		  int jr = jj % lhs_nr;
+		  int jc = (jj - jr) / lhs_nr;
+
+		  int kk = 0;
+		  int kc = 0;
+
+		  while (j < len || i < lhs_nz)
+		    {
+		      if (j == len || (i < lhs_nz && ii < jj))
+			{
+			  while (kc <= ic)
+			    stmp.xcidx (kc++) = kk;
+			  stmp.xdata (kk) = c_lhs.data (i);
+			  stmp.xridx (kk++) = c_lhs.ridx (i);
+			  i++;
+			  while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+			    ic++;
+			  if (i < lhs_nz)
+			    ii = ic * lhs_nr + c_lhs.ridx(i);
+			}
+		      else
+			{
+			  while (kc <= jc)
+			    stmp.xcidx (kc++) = kk;
+			  if (scalar != RT ())
+			    {
+			      stmp.xdata (kk) = scalar;
+			      stmp.xridx (kk++) = jr;
+			    }
+			  if (ii == jj)
+			    {
+			      i++;
+			      while (ic < lhs_nc && i >= c_lhs.cidx(ic+1))
+				ic++;
+			      if (i < lhs_nz)
+				ii = ic * lhs_nr + c_lhs.ridx(i);
+			    }
+			  j++;
+			  if (j < len)
+			    {
+			      jj = idx_i.elem (j);
+			      jr = jj % lhs_nr;
+			      jc = (jj - jr) / lhs_nr;
+			    }
+			}
+		    }
+
+		  for (int iidx = kc; iidx < lhs_nc+1; iidx++)
+		    stmp.xcidx(iidx) = kk;
+		  
+		  lhs = stmp;
+		}
+	      else
+		{
+		  (*current_liboctave_error_handler)
+      ("A(I) = X: X must be a scalar or a matrix with the same size as I");
+
+		  retval = 0;
+		}
+	    }
+	  // idx_vector::freeze() printed an error message for us.
+	}
+    }
+  else
+    {
+      (*current_liboctave_error_handler)
+	("invalid number of indices for matrix expression");
+
+      retval = 0;
+    }
+
+  lhs.clear_index ();
+
+  return retval;
+}
+
+template <class T>
+void
+Sparse<T>::print_info (std::ostream& os, const std::string& prefix) const
+{
+  os << prefix << "rep address: " << rep << "\n"
+     << prefix << "rep->nnz:    " << rep->nnz << "\n"
+     << prefix << "rep->nrows:  " << rep->nrows << "\n"
+     << prefix << "rep->ncols:  " << rep->ncols << "\n"
+     << prefix << "rep->data:   " << static_cast<void *> (rep->d) << "\n"
+     << prefix << "rep->ridx:   " << static_cast<void *> (rep->r) << "\n"
+     << prefix << "rep->cidx:   " << static_cast<void *> (rep->c) << "\n"
+     << prefix << "rep->count:  " << rep->count << "\n";
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/Sparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,536 @@
+// Template sparse classes
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_Sparse_h)
+#define octave_Sparse_h 1
+
+#include <cassert>
+#include <cstddef>
+
+#include <iostream>
+
+#include "Array.h"
+#include "Array2.h"
+#include "dim-vector.h"
+#include "lo-utils.h"
+
+class idx_vector;
+
+// Two dimensional sparse class.  Handles the reference counting for
+// all the derived classes.
+
+template <class T>
+class
+Sparse
+{
+protected:
+  //--------------------------------------------------------------------
+  // The real representation of all Sparse arrays.
+  //--------------------------------------------------------------------
+
+  class SparseRep
+  {
+  public:
+
+    T *d;
+    int *r;
+    int *c;
+    int nnz;
+    int nrows;
+    int ncols;
+    int count;
+
+    SparseRep (void) : d (0), r (0), c (new int [1]), nnz (0), nrows (0),
+		       ncols (0), count (1) { c[0] = 0; }
+
+    SparseRep (int n) : d (0), r (0), c (new int [n+1]), nnz (0), nrows (n),
+      ncols (n), count (1)
+      { 
+	for (int i = 0; i < n + 1; i++)
+	  c[i] = 0;
+      }
+
+    SparseRep (int nr, int nc) : d (0), r (0), c (new int [nc+1]), nnz (0), 
+      nrows (nr), ncols (nc), count (1)
+      { 
+	for (int i = 0; i < nc + 1; i++)
+	  c[i] = 0;
+      }
+
+    SparseRep (int nr, int nc, int nz) : d (new T [nz]), 
+      r (new int [nz]), c (new int [nc+1]), nnz (nz), nrows (nr), 
+      ncols (nc), count (1)
+      { 
+	for (int i = 0; i < nc + 1; i++)
+	  c[i] = 0;
+      }
+
+    SparseRep (const SparseRep& a)
+      : d (new T [a.nnz]), r (new int [a.nnz]), c (new int [a.ncols + 1]), 
+      nnz (a.nnz), nrows (a.nrows), ncols (a.ncols), count (1)
+      {
+	for (int i = 0; i < nnz; i++)
+	  {
+	    d[i] = a.d[i];
+	    r[i] = a.r[i];
+	  }
+	for (int i = 0; i < ncols + 1; i++)
+	  c[i] = a.c[i];
+      }
+ 
+    ~SparseRep (void) { delete [] d; delete [] r; delete [] c; }
+
+    int length (void) const { return nnz; }
+
+    int nonzero (void) const { return c [ncols]; }
+
+    T& elem (int _r, int _c);
+
+    T celem (int _r, int _c) const;
+
+    T& data (int i) { return d[i]; }
+
+    T cdata (int i) const { return d[i]; }
+
+    int& ridx (int i) { return r[i]; }
+
+    int cridx (int i) const { return r[i]; }
+
+    int& cidx (int i) { return c[i]; }
+
+    int ccidx (int i) const { return c[i]; }
+
+    void maybe_compress (bool remove_zeros);
+
+    void change_length (int nz);
+
+  private:
+
+    // No assignment!
+
+    SparseRep& operator = (const SparseRep& a);
+  };
+
+  //--------------------------------------------------------------------
+
+  void make_unique (void)
+    {
+      if (rep->count > 1)
+	{
+	  --rep->count;
+	  rep = new SparseRep (*rep);
+	}
+    }
+
+public:
+
+  // !!! WARNING !!! -- these should be protected, not public.  You
+  // should not access these data members directly!
+
+  typename Sparse<T>::SparseRep *rep;
+
+  dim_vector dimensions;
+
+protected:
+  idx_vector *idx;
+  int idx_count;
+
+private:
+
+  typename Sparse<T>::SparseRep *nil_rep (void) const
+    {
+      static typename Sparse<T>::SparseRep *nr
+	= new typename Sparse<T>::SparseRep ();
+
+      nr->count++;
+
+      return nr;
+    }
+
+public:
+
+  Sparse (void)
+    : rep (nil_rep ()), dimensions (dim_vector(0,0)),
+      idx (0), idx_count (0) { }
+
+  explicit Sparse (int n)
+    : rep (new typename Sparse<T>::SparseRep (n)), 
+      dimensions (dim_vector (n, n)), idx (0), idx_count (0) { }
+
+  explicit Sparse (int nr, int nc)
+    : rep (new typename Sparse<T>::SparseRep (nr, nc)), 
+      dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) { }
+
+  explicit Sparse (int nr, int nc, T val);
+
+  Sparse (const dim_vector& dv, int nz)
+    : rep (new typename Sparse<T>::SparseRep (dv(0), dv(1), nz)),
+    dimensions (dv), idx (0), idx_count (0) { }
+
+  Sparse (int nr, int nc, int nz)
+    : rep (new typename Sparse<T>::SparseRep (nr, nc, nz)),
+      dimensions (dim_vector (nr, nc)), idx (0), idx_count (0) { }
+
+  // Type conversion case.
+  template <class U> Sparse (const Sparse<U>& a);
+
+  // No type conversion case.
+  Sparse (const Sparse<T>& a)
+    : rep (a.rep), dimensions (a.dimensions), idx (0), idx_count (0)
+    {
+      rep->count++;
+    }
+
+public:
+
+  Sparse (const dim_vector& dv);
+
+  Sparse (const Sparse<T>& a, const dim_vector& dv);
+
+  Sparse (const Array<T>& a, const Array<int>& r, const Array<int>& c,
+	  int nr, int nc, bool sum_terms);
+
+  Sparse (const Array<T>& a, const Array<double>& r, const Array<double>& c,
+	  int nr, int nc, bool sum_terms);
+
+  // Sparsify a normal matrix
+  Sparse (const Array2<T>& a);
+  Sparse (const Array<T>& a);
+
+  virtual ~Sparse (void);
+
+  Sparse<T>& operator = (const Sparse<T>& a)
+    {
+      if (this != &a)
+	{
+	  if (--rep->count <= 0)
+	    delete rep;
+
+	  rep = a.rep;
+	  rep->count++;
+
+	  dimensions = a.dimensions;
+	}
+
+      idx_count = 0;
+      idx = 0;
+
+      return *this;
+    }
+
+  // Note that capacity and nnz are the amount of storage for non-zero
+  // elements, while nonzero is the actual number of non-zero terms
+  int capacity (void) const { return rep->length (); }
+  int nnz (void) const { return capacity (); }
+  int nonzero (void) const { return rep->nonzero (); }
+
+  // Paranoid number of elements test for case of dims = (-1,-1)
+  int numel (void) const 
+    { 
+      if (dim1() < 0 || dim2() < 0)
+        return 0;
+      else
+        return dimensions.numel (); 
+    }
+
+  int nelem (void) const { return capacity (); }
+  int length (void) const { return numel (); }
+
+  int dim1 (void) const { return dimensions(0); }
+  int dim2 (void) const { return dimensions(1); }
+
+  int rows (void) const { return dim1 (); }
+  int cols (void) const { return dim2 (); }
+  int columns (void) const { return dim2 (); }
+
+  int get_row_index (int k) { return ridx (k); }
+  int get_col_index (int k)
+    {
+      int ret = 0;
+      while (cidx(ret+1) < k)
+        ret++;
+      return ret;
+    }
+  size_t byte_size (void) const { return (cols () + 1) * sizeof (int) +
+      capacity () * (sizeof (T) + sizeof (int)); }
+
+  dim_vector dims (void) const { return dimensions; }
+
+  Sparse<T> squeeze (void) const { return *this; }
+  
+  int compute_index (const Array<int>& ra_idx) const;
+
+  T range_error (const char *fcn, int n) const;
+  T& range_error (const char *fcn, int n);
+
+  T range_error (const char *fcn, int i, int j) const;
+  T& range_error (const char *fcn, int i, int j);
+
+  T range_error (const char *fcn, const Array<int>& ra_idx) const;
+  T& range_error (const char *fcn, const Array<int>& ra_idx);
+
+  // No checking, even for multiple references, ever.
+
+  T& xelem (int n) 
+    { 
+      int i = n % rows (), j = n / rows(); 
+      return xelem (i, j); 
+    }
+
+  T xelem (int n) const 
+    { 
+      int i = n % rows (), j = n / rows(); 
+      return xelem (i, j); 
+    }
+  
+  T& xelem (int i, int j) { return rep->elem (i, j); }
+  T xelem (int i, int j) const { return rep->celem (i, j); }
+
+  T& xelem (const Array<int>& ra_idx)
+    { return xelem (compute_index (ra_idx)); }
+
+  T xelem (const Array<int>& ra_idx) const
+    { return xelem (compute_index (ra_idx)); }
+
+  // XXX FIXME XXX -- would be nice to fix this so that we don't
+  // unnecessarily force a copy, but that is not so easy, and I see no
+  // clean way to do it.
+
+  T& checkelem (int n)
+    {
+      if (n < 0 || n >= numel ())
+	return range_error ("T& Sparse<T>::checkelem", n);
+      else
+	{
+	  make_unique ();
+	  return xelem (n);
+	}
+    }
+
+  T& checkelem (int i, int j)
+    {
+      if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ())
+	return range_error ("T& Sparse<T>::checkelem", i, j);
+      else
+	{
+	  make_unique ();
+	  return xelem (i, j);
+	}
+    }
+
+  T& checkelem (const Array<int>& ra_idx)
+    {
+      int i = compute_index (ra_idx);
+
+      if (i < 0)
+	return range_error ("T& Sparse<T>::checkelem", ra_idx);
+      else
+	return elem (i);
+    }
+
+  T& elem (int n)
+    {
+      make_unique ();
+      return xelem (n);
+    }
+
+  T& elem (int i, int j) 
+    { 
+      make_unique ();
+      return xelem (i, j); 
+    }
+
+  T& elem (const Array<int>& ra_idx)
+    { return Sparse<T>::elem (compute_index (ra_idx)); }
+
+#if defined (BOUNDS_CHECKING)
+  T& operator () (int n) { return checkelem (n); }
+  T& operator () (int i, int j) { return checkelem (i, j); }
+  T& operator () (const Array<int>& ra_idx) { return checkelem (ra_idx); }
+#else
+  T& operator () (int n) { return elem (n); }
+  T& operator () (int i, int j) { return elem (i, j); }
+  T& operator () (const Array<int>& ra_idx) { return elem (ra_idx); }
+#endif
+
+  T checkelem (int n) const
+    {
+      if (n < 0 || n >= numel ())
+	return range_error ("T Sparse<T>::checkelem", n);
+      else
+	return xelem (n);
+    }
+
+  T checkelem (int i, int j) const
+    {
+      if (i < 0 || j < 0 || i >= dim1 () || j >= dim2 ())
+	return range_error ("T Sparse<T>::checkelem", i, j);
+      else
+	return xelem (i, j);
+    }
+
+  T checkelem (const Array<int>& ra_idx) const
+    {
+      int i = compute_index (ra_idx);
+
+      if (i < 0)
+	return range_error ("T Sparse<T>::checkelem", ra_idx);
+      else
+	return Sparse<T>::elem (i);
+    }
+
+  T elem (int n) const { return xelem (n); }
+
+  T elem (int i, int j) const { return xelem (i, j); }
+
+  T elem (const Array<int>& ra_idx) const
+    { return Sparse<T>::elem (compute_index (ra_idx)); }
+
+#if defined (BOUNDS_CHECKING)
+  T operator () (int n) const { return checkelem (n); }
+  T operator () (int i, int j) const { return checkelem (i, j); }
+  T operator () (const Array<int>& ra_idx) const { return checkelem (ra_idx); }
+#else
+  T operator () (int n) const { return elem (n); }
+  T operator () (int i, int j) const { return elem (i, j); }
+  T operator () (const Array<int>& ra_idx) const { return elem (ra_idx); }
+#endif
+
+  Sparse<T> maybe_compress (bool remove_zeros = false) 
+  { rep->maybe_compress (remove_zeros); return (*this); }
+
+  Sparse<T> reshape (const dim_vector& new_dims) const;
+
+  // !!! WARNING !!! -- the following resize_no_fill functions are 
+  // public because template friends don't work properly with versions
+  // of gcc earlier than 3.3.  You should use these functions only in 
+  // classes that are derived from Sparse<T>.
+
+  // protected:
+
+  void resize_no_fill (int r, int c);
+
+  void resize_no_fill (const dim_vector& dv);
+
+public:
+  Sparse<T> permute (const Array<int>& vec, bool inv = false) const;
+
+  Sparse<T> ipermute (const Array<int>& vec) const
+    { return permute (vec, true); }
+
+  void resize (int r, int c) { resize_no_fill (r, c); }
+
+  void resize (const dim_vector& dv) { resize_no_fill (dv); }
+
+  void change_capacity (int nz) { rep->change_length (nz); }
+
+  Sparse<T>& insert (const Sparse<T>& a, int r, int c);
+  Sparse<T>& insert (const Sparse<T>& a, const Array<int>& idx);
+
+  bool is_square (void) const { return (dim1 () == dim2 ()); }
+
+  bool is_empty (void) const { return (rows () < 1 && cols () < 1); }
+
+  Sparse<T> transpose (void) const;
+
+  T* data (void) { make_unique (); return rep->d; }
+  T& data (int i) { make_unique (); return rep->data (i); }
+  T* xdata (void) { return rep->d; }
+  T& xdata (int i) { return rep->data (i); }
+
+  T data (int i) const { return rep->data (i); }
+  T* data (void) const { return rep->d; }
+
+  int* ridx (void) { make_unique (); return rep->r; }
+  int& ridx (int i) { make_unique (); return rep->ridx (i); }
+  int* xridx (void) { return rep->r; }
+  int& xridx (int i) { return rep->ridx (i); }
+
+  int ridx (int i) const { return rep->cridx (i); }
+  int* ridx (void) const { return rep->r; }
+
+  int* cidx (void) { make_unique (); return rep->c; }
+  int& cidx (int i) { make_unique (); return rep->cidx (i); }
+  int* xcidx (void) { return rep->c; }
+  int& xcidx (int i) { return rep->cidx (i); }
+
+  int cidx (int i) const { return rep->ccidx (i); }
+  int* cidx (void) const { return rep->c; }
+
+  int ndims (void) const { return dimensions.length (); }
+
+  void clear_index (void);
+
+  void set_index (const idx_vector& i);
+
+  int index_count (void) const { return idx_count; }
+
+  idx_vector *get_idx (void) const { return idx; }
+
+  void maybe_delete_elements (idx_vector& i);
+
+  void maybe_delete_elements (idx_vector& i, idx_vector& j);
+
+  void maybe_delete_elements (Array<idx_vector>& ra_idx);
+
+  Sparse<T> value (void);
+
+  Sparse<T> index (idx_vector& i, int resize_ok = 0) const;
+
+  Sparse<T> index (idx_vector& i, idx_vector& j, int resize_ok = 0) const;
+
+  Sparse<T> index (Array<idx_vector>& ra_idx, int resize_ok = 0) const;
+
+  void print_info (std::ostream& os, const std::string& prefix) const;
+
+};
+
+// NOTE: these functions should be friends of the Sparse<T> class and
+// Sparse<T>::dimensions should be protected, not public, but we can't
+// do that because of bugs in gcc prior to 3.3.
+
+template <class LT, class RT>
+/* friend */ int
+assign (Sparse<LT>& lhs, const Sparse<RT>& rhs);
+
+template <class LT, class RT>
+/* friend */ int
+assign1 (Sparse<LT>& lhs, const Sparse<RT>& rhs);
+
+#define INSTANTIATE_SPARSE_ASSIGN(LT, RT) \
+  template int assign (Sparse<LT>&, const Sparse<RT>&); \
+  template int assign1 (Sparse<LT>&, const Sparse<RT>&);
+
+#define INSTANTIATE_SPARSE(T) \
+  template class Sparse<T>;
+
+#define INSTANTIATE_SPARSE_AND_ASSIGN(T) \
+  INSTANTIATE_SPARSE (T); \
+  INSTANTIATE_SPARSE_ASSIGN (T, T)
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparseCmplxLU.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,405 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <vector>
+
+#include "lo-error.h"
+
+#include "SparseCmplxLU.h"
+#include "oct-spparms.h"
+
+// Instantiate the base LU class for the types we need.
+
+#include "sparse-base-lu.h"
+#include "sparse-base-lu.cc"
+
+template class sparse_base_lu <SparseComplexMatrix, Complex, SparseMatrix, double>;
+
+// Include the UMFPACK functions
+extern "C" {
+#include "umfpack.h"
+}
+
+SparseComplexLU::SparseComplexLU (const SparseComplexMatrix& a, 
+				  double piv_thres)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  // Setup the control parameters
+  Matrix Control (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_zi_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+  if (piv_thres >= 0.)
+    {
+      piv_thres = (piv_thres > 1. ? 1. : piv_thres);
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres;
+      Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres;
+    }
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+      Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+    }
+
+  // Set whether we are allowed to modify Q or not
+  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  if (!xisnan (tmp))
+    Control (UMFPACK_FIXQ) = tmp;
+
+  // Turn-off UMFPACK scaling for LU 
+  Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+  umfpack_zi_report_control (control);
+
+  const int *Ap = a.cidx ();
+  const int *Ai = a.ridx ();
+  const Complex *Ax = a.data ();
+
+  umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), 
+			    NULL, 1, control);
+
+  void *Symbolic;
+  Matrix Info (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, 
+				     X_CAST (const double *, Ax), NULL, NULL,
+				     &Symbolic, control, info);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	    ("SparseComplexLU::SparseComplexLU symbolic factorization failed");
+
+      umfpack_zi_report_status (control, status);
+      umfpack_zi_report_info (control, info);
+
+      umfpack_zi_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_zi_report_symbolic (Symbolic, control);
+
+      void *Numeric;
+      status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL,
+				   Symbolic, &Numeric, control, info) ;
+      umfpack_zi_free_symbolic (&Symbolic) ;
+
+      cond = Info (UMFPACK_RCOND);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseComplexLU::SparseComplexLU numeric factorization failed");
+
+	  umfpack_zi_report_status (control, status);
+	  umfpack_zi_report_info (control, info);
+
+	  umfpack_zi_free_numeric (&Numeric);
+	}
+      else
+	{
+	  umfpack_zi_report_numeric (Numeric, control);
+
+	  int lnz, unz, ignore1, ignore2, ignore3;
+	  status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					&ignore3, Numeric) ;
+	  
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseComplexLU::SparseComplexLU extracting LU factors failed");
+
+	      umfpack_zi_report_status (control, status);
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      int n_inner = (nr < nc ? nr : nc);
+
+	      if (lnz < 1)
+		Lfact = SparseComplexMatrix (n_inner, nr, 1);
+	      else
+		Lfact = SparseComplexMatrix (n_inner, nr, lnz);
+
+	      int *Ltp = Lfact.cidx ();
+	      int *Ltj = Lfact.ridx ();
+	      Complex *Ltx = Lfact.data ();
+
+	      if (unz < 1)
+		Ufact = SparseComplexMatrix (n_inner, nc, 1);
+	      else
+		Ufact = SparseComplexMatrix (n_inner, nc, unz);
+
+	      int *Up = Ufact.cidx ();
+	      int *Uj = Ufact.ridx ();
+	      Complex *Ux = Ufact.data ();
+	      
+	      P.resize (nr);
+	      int *p = P.fortran_vec ();
+
+	      Q.resize (nc);
+	      int *q = Q.fortran_vec ();
+
+	      int do_recip;
+	      status = umfpack_zi_get_numeric (Ltp, Ltj, X_CAST (double *, Ltx),
+					       NULL, Up, Uj,
+					       X_CAST (double *, Ux), NULL, p, 
+					       q, NULL, NULL, &do_recip,
+					       NULL, Numeric) ;
+
+	      umfpack_zi_free_numeric (&Numeric) ;
+
+	      if (status < 0 || do_recip)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseComplexLU::SparseComplexLU extracting LU factors failed");
+
+		  umfpack_zi_report_status (control, status);
+		}
+	      else
+		{
+		  Lfact = Lfact.transpose ();
+
+		  umfpack_zi_report_matrix (nr, n_inner, Lfact.cidx (), 
+					    Lfact.ridx (), 
+					    X_CAST (double *, Lfact.data()), 
+					    NULL, 1, control);
+
+		  umfpack_zi_report_matrix (n_inner, nc, Ufact.cidx (), 
+					    Ufact.ridx (), 
+					    X_CAST (double *, Ufact.data()), 
+					    NULL, 1, control);
+		  umfpack_zi_report_perm (nr, p, control);
+		  umfpack_zi_report_perm (nc, q, control);
+		}
+
+	      umfpack_zi_report_info (control, info);
+	    }
+	}
+    }
+}
+
+SparseComplexLU::SparseComplexLU (const SparseComplexMatrix& a, 
+				  const ColumnVector& Qinit, 
+				  double piv_thres, bool FixedQ)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  // Setup the control parameters
+  Matrix Control (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_zi_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+  if (piv_thres >= 0.)
+    {
+      piv_thres = (piv_thres > 1. ? 1. : piv_thres);
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres;
+      Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres;
+    }
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+	  Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+    }
+
+  // Set whether we are allowed to modify Q or not
+  if (FixedQ)
+    Control (UMFPACK_FIXQ) = 1.0;
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      if (!xisnan (tmp))
+	Control (UMFPACK_FIXQ) = tmp;
+    }
+
+  // Turn-off UMFPACK scaling for LU 
+  Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+  umfpack_zi_report_control (control);
+
+  const int *Ap = a.cidx ();
+  const int *Ai = a.ridx ();
+  const Complex *Ax = a.data ();
+
+  umfpack_zi_report_matrix (nr, nc, Ap, Ai, X_CAST (const double *, Ax), NULL,
+			    1, control);
+
+  void *Symbolic;
+  Matrix Info (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status;
+
+  // Null loop so that qinit is imediately deallocated when not needed
+  do {
+    OCTAVE_LOCAL_BUFFER (int, qinit, nc);
+
+    for (int i = 0; i < nc; i++)
+      qinit [i] = static_cast<int> (Qinit (i));
+
+    status = umfpack_zi_qsymbolic (nr, nc, Ap, Ai, X_CAST (const double *, Ax),
+				   NULL, qinit, &Symbolic, control, info);
+  } while (0);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	    ("SparseComplexLU::SparseComplexLU symbolic factorization failed");
+
+      umfpack_zi_report_status (control, status);
+      umfpack_zi_report_info (control, info);
+
+      umfpack_zi_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_zi_report_symbolic (Symbolic, control);
+
+      void *Numeric;
+      status = umfpack_zi_numeric (Ap, Ai, X_CAST (const double *, Ax), NULL,
+				   Symbolic, &Numeric, control, info) ;
+      umfpack_zi_free_symbolic (&Symbolic) ;
+
+      cond = Info (UMFPACK_RCOND);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseComplexLU::SparseComplexLU numeric factorization failed");
+
+	  umfpack_zi_report_status (control, status);
+	  umfpack_zi_report_info (control, info);
+
+	  umfpack_zi_free_numeric (&Numeric);
+	}
+      else
+	{
+	  umfpack_zi_report_numeric (Numeric, control);
+
+	  int lnz, unz, ignore1, ignore2, ignore3;
+	  status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					&ignore3, Numeric) ;
+	  
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseComplexLU::SparseComplexLU extracting LU factors failed");
+
+	      umfpack_zi_report_status (control, status);
+	      umfpack_zi_report_info (control, info);
+
+	      umfpack_zi_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      int n_inner = (nr < nc ? nr : nc);
+
+	      if (lnz < 1)
+		Lfact = SparseComplexMatrix (n_inner, nr, 1);
+	      else
+		Lfact = SparseComplexMatrix (n_inner, nr, lnz);
+
+	      int *Ltp = Lfact.cidx ();
+	      int *Ltj = Lfact.ridx ();
+	      Complex *Ltx = Lfact.data ();
+
+	      if (unz < 1)
+		Ufact = SparseComplexMatrix (n_inner, nc, 1);
+	      else
+		Ufact = SparseComplexMatrix (n_inner, nc, unz);
+
+	      int *Up = Ufact.cidx ();
+	      int *Uj = Ufact.ridx ();
+	      Complex *Ux = Ufact.data ();
+	      
+	      P.resize (nr);
+	      int *p = P.fortran_vec ();
+
+	      Q.resize (nc);
+	      int *q = Q.fortran_vec ();
+
+	      int do_recip;
+	      status = umfpack_zi_get_numeric (Ltp, Ltj, X_CAST (double *, Ltx),
+					       NULL, Up, Uj,
+					       X_CAST (double *, Ux), NULL, p, 
+					       q, NULL, NULL, &do_recip,
+					       NULL, Numeric) ;
+
+	      umfpack_zi_free_numeric (&Numeric) ;
+
+	      if (status < 0 || do_recip)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseComplexLU::SparseComplexLU extracting LU factors failed");
+
+		  umfpack_zi_report_status (control, status);
+		}
+	      else
+		{
+		  Lfact = Lfact.transpose ();
+
+		  umfpack_zi_report_matrix (nr, n_inner, Lfact.cidx (), 
+					    Lfact.ridx (), 
+					    X_CAST (double *, Lfact.data()), 
+					    NULL, 1, control);
+
+		  umfpack_zi_report_matrix (n_inner, nc, Ufact.cidx (), 
+					    Ufact.ridx (), 
+					    X_CAST (double *, Ufact.data()), 
+					    NULL, 1, control);
+		  umfpack_zi_report_perm (nr, p, control);
+		  umfpack_zi_report_perm (nc, q, control);
+		}
+
+	      umfpack_zi_report_info (control, info);
+	    }
+	}
+    }
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparseCmplxLU.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,64 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_complex_LU_h)
+#define octave_sparse_complex_LU_h 1
+
+#include "sparse-base-lu.h"
+#include "dSparse.h"
+#include "CSparse.h"
+
+class
+SparseComplexLU 
+  : public sparse_base_lu <SparseComplexMatrix, Complex, SparseMatrix, double>
+{
+public:
+
+  SparseComplexLU (void) 
+    : sparse_base_lu <SparseComplexMatrix, Complex, SparseMatrix, double> () { }
+
+  SparseComplexLU (const SparseComplexMatrix& a, double piv_thres = -1);
+
+  SparseComplexLU (const SparseComplexMatrix& a, const ColumnVector& Qinit,
+		   double piv_thres = -1, bool FixedQ = false);
+
+  SparseComplexLU (const SparseComplexLU& a) 
+    : sparse_base_lu <SparseComplexMatrix, Complex, SparseMatrix, double> (a) { }
+
+  SparseComplexLU& operator = (const SparseComplexLU& a)
+    {
+      if (this != &a)
+	sparse_base_lu <SparseComplexMatrix, Complex, SparseMatrix, double> 
+	  :: operator = (a);
+
+      return *this;
+    }
+
+  ~SparseComplexLU (void) { }
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparseType.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,696 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "SparseType.h"
+#include "dSparse.h"
+#include "CSparse.h"
+#include "oct-spparms.h"
+
+// XXX FIXME XXX There is a large code duplication here
+
+SparseType::SparseType (const SparseType &a) : typ (a.typ), 
+    sp_bandden (a.sp_bandden), bandden (a.bandden), 
+    upper_band (a.upper_band), lower_band (a.lower_band), 
+    dense (a.dense), nperm (a.nperm)
+{ 
+  if (nperm != 0)
+    {
+      row_perm = new int [nperm];
+      col_perm = new int [nperm];
+      for (int i = 0; i < nperm; i++)
+	{
+	  row_perm[i] = a.row_perm[i];
+	  col_perm[i] = a.col_perm[i];
+	}
+    }
+}
+
+SparseType::SparseType (const SparseMatrix &a)
+{
+  int nrows = a.rows ();
+  int ncols = a.cols ();
+  int nnz = a.nnz ();
+
+  nperm = 0;
+
+  if (nrows != ncols)
+    typ = SparseType::Rectangular;
+  else
+    {
+      sp_bandden = Voctave_sparse_controls.get_key ("bandden");
+      bool maybe_hermitian = false;
+      typ = SparseType::Full;
+
+      if (nnz == ncols)
+	{
+	  matrix_type tmp_typ = SparseType::Diagonal;
+	  int i;
+	  // Maybe the matrix is diagonal
+	  for (i = 0; i < ncols; i++)
+	    {
+	      if (a.cidx(i+1) != a.cidx(i) + 1)
+		{
+		  tmp_typ = Full;
+		  break;
+		}
+	      if (a.ridx(i) != i)
+		{
+		  tmp_typ = SparseType::Permuted_Diagonal;
+		  break;
+		}
+	    }
+	  
+	  if (tmp_typ == SparseType::Permuted_Diagonal)
+	    {
+	      bool found [ncols];
+
+	      for (int j = 0; j < i; j++)
+		found [j] = true;
+	      for (int j = i; j < ncols; j++)
+		found [j] = false;
+	      
+	      for (int j = i; j < ncols; j++)
+		{
+		  if ((a.cidx(j+1) != a.cidx(j) + 1) || found [a.ridx(j)])
+		    {
+		      tmp_typ = Full;
+		      break;
+		    }
+		  found [a.ridx(j)] = true;
+		}
+	    }
+	  typ = tmp_typ;
+	}
+
+      if (typ == Full)
+	{
+	  // Search for banded, upper and lower triangular matrices
+	  bool singular = false;
+	  upper_band = 0;
+	  lower_band = 0;
+	  for (int j = 0; j < ncols; j++)
+	    {
+	      bool zero_on_diagonal = true;
+	      for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+		if (a.ridx(i) == j)
+		  {
+		    zero_on_diagonal = false;
+		    break;
+		  }
+
+	      if (zero_on_diagonal)
+		{
+		  singular = true;
+		  break;
+		}
+
+	      if (a.cidx(j+1) - a.cidx(j) > 0)
+		{
+		  int ru = a.ridx(a.cidx(j));
+		  int rl = a.ridx(a.cidx(j+1)-1);
+
+		  if (j - ru > upper_band)
+		    upper_band = j - ru;
+		  
+		  if (rl - j > lower_band)
+		    lower_band = rl - j;
+		}
+	    }
+
+	  if (!singular)
+	    {
+	      bandden = double (nnz) /
+		(double (ncols) * (double (lower_band) +
+				double (upper_band)) -
+		 0.5 * double (upper_band + 1) * double (upper_band) -
+		 0.5 * double (lower_band + 1) * double (lower_band));
+
+	      if (sp_bandden != 1. && bandden > sp_bandden)
+		{
+		  if (upper_band == 1 && lower_band == 1)
+		    typ = SparseType::Tridiagonal;
+		  else
+		    typ = SparseType::Banded;
+
+		  int nnz_in_band = (upper_band + lower_band + 1) * nrows -
+		    (1 + upper_band) * upper_band / 2 -
+		    (1 + lower_band) * lower_band / 2;
+		  if (nnz_in_band == nnz)
+		    dense = true;
+		  else 
+		    dense = false;
+		}
+	      else if (upper_band == 0)
+		typ = SparseType::Lower;
+	      else if (lower_band == 0)
+		typ = SparseType::Upper;
+
+	      if (upper_band == lower_band)
+		maybe_hermitian = true;
+	    }
+
+	  if (typ == Full)
+	    {
+	      // Search for a permuted triangular matrix, and test if
+	      // permutation is singular
+
+	      // XXX FIXME XXX Write this test based on dmperm
+	      
+	    }
+	}
+
+      if (maybe_hermitian && (typ == Full || typ == Tridiagonal || 
+			      typ == Banded))
+	{
+	  // Check for symmetry, with positive real diagonal, which
+	  // has a very good chance of being symmetric positive
+	  // definite..
+	  bool is_herm = true;
+
+	  for (int j = 0; j < ncols; j++)
+	    {
+	      bool diag_positive = false;
+
+	      for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+		{
+		  int ri = a.ridx(i);
+
+		  if (ri == j)
+		    {
+		      if (a.data(i) == std::abs(a.data(i)))
+			diag_positive = true;
+		      else
+			break;
+		    }
+		  else
+		    {
+		      bool found = false;
+
+		      for (int k = a.cidx(ri); k < a.cidx(ri+1); k++)
+			{
+			  if (a.ridx(k) == j)
+			    {
+			      if (a.data(i) == conj (a.data(k)))
+				found = true;
+			      break;
+			    }
+			}
+
+		      if (! found)
+			{
+			  is_herm = false;
+			  break;
+			}
+		    }
+		}
+
+	      if (! diag_positive || ! is_herm)
+		{
+		  is_herm = false;
+		  break;
+		} 
+	    }
+
+	  if (is_herm)
+	    {
+	      if (typ == Full)
+		typ = Hermitian;
+	      else if (typ == Banded)
+		typ = Banded_Hermitian;
+	      else
+		typ = Tridiagonal_Hermitian;
+	    }
+	}
+    }
+}
+
+SparseType::SparseType (const SparseComplexMatrix &a)
+{
+  int nrows = a.rows ();
+  int ncols = a.cols ();
+  int nnz = a.nnz ();
+
+  nperm = 0;
+
+  if (nrows != ncols)
+    typ = SparseType::Rectangular;
+  else
+    {
+      sp_bandden = Voctave_sparse_controls.get_key ("bandden");
+      bool maybe_hermitian = false;
+      typ = SparseType::Full;
+
+      if (nnz == ncols)
+	{
+	  matrix_type tmp_typ = SparseType::Diagonal;
+	  int i;
+	  // Maybe the matrix is diagonal
+	  for (i = 0; i < ncols; i++)
+	    {
+	      if (a.cidx(i+1) != a.cidx(i) + 1)
+		{
+		  tmp_typ = Full;
+		  break;
+		}
+	      if (a.ridx(i) != i)
+		{
+		  tmp_typ = SparseType::Permuted_Diagonal;
+		  break;
+		}
+	    }
+	  
+	  if (tmp_typ == SparseType::Permuted_Diagonal)
+	    {
+	      bool found [ncols];
+
+	      for (int j = 0; j < i; j++)
+		found [j] = true;
+	      for (int j = i; j < ncols; j++)
+		found [j] = false;
+	      
+	      for (int j = i; j < ncols; j++)
+		{
+		  if ((a.cidx(j+1) != a.cidx(j) + 1) || found [a.ridx(j)])
+		    {
+		      tmp_typ = Full;
+		      break;
+		    }
+		  found [a.ridx(j)] = true;
+		}
+	    }
+	  typ = tmp_typ;
+	}
+
+      if (typ == Full)
+	{
+	  // Search for banded, upper and lower triangular matrices
+	  bool singular = false;
+	  upper_band = 0;
+	  lower_band = 0;
+	  for (int j = 0; j < ncols; j++)
+	    {
+	      bool zero_on_diagonal = true;
+	      for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+		if (a.ridx(i) == j)
+		  {
+		    zero_on_diagonal = false;
+		    break;
+		  }
+
+	      if (zero_on_diagonal)
+		{
+		  singular = true;
+		  break;
+		}
+
+	      if (a.cidx(j+1) - a.cidx(j) > 0)
+		{
+		  int ru = a.ridx(a.cidx(j));
+		  int rl = a.ridx(a.cidx(j+1)-1);
+
+		  if (j - ru > upper_band)
+		    upper_band = j - ru;
+		  
+		  if (rl - j > lower_band)
+		    lower_band = rl - j;
+		}
+	    }
+
+	  if (!singular)
+	    {
+	      bandden = double (nnz) /
+		(double (ncols) * (double (lower_band) +
+				double (upper_band)) -
+		 0.5 * double (upper_band + 1) * double (upper_band) -
+		 0.5 * double (lower_band + 1) * double (lower_band));
+
+	      if (sp_bandden != 1. && bandden > sp_bandden)
+		{
+		  if (upper_band == 1 && lower_band == 1)
+		    typ = SparseType::Tridiagonal;
+		  else
+		    typ = SparseType::Banded;
+
+		  int nnz_in_band = (upper_band + lower_band + 1) * nrows -
+		    (1 + upper_band) * upper_band / 2 -
+		    (1 + lower_band) * lower_band / 2;
+		  if (nnz_in_band == nnz)
+		    dense = true;
+		  else 
+		    dense = false;
+		}
+	      else if (upper_band == 0)
+		typ = SparseType::Lower;
+	      else if (lower_band == 0)
+		typ = SparseType::Upper;
+
+	      if (upper_band == lower_band)
+		maybe_hermitian = true;
+	    }
+
+	  if (typ == Full)
+	    {
+	      // Search for a permuted triangular matrix, and test if
+	      // permutation is singular
+
+	      // XXX FIXME XXX Write this test based on dmperm
+	      
+	    }
+	}
+
+      if (maybe_hermitian && (typ == Full || typ == Tridiagonal || 
+			      typ == Banded))
+	{
+	  // Check for symmetry, with positive real diagonal, which
+	  // has a very good chance of being symmetric positive
+	  // definite..
+	  bool is_herm = true;
+
+	  for (int j = 0; j < ncols; j++)
+	    {
+	      bool diag_positive = false;
+
+	      for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+		{
+		  int ri = a.ridx(i);
+
+		  if (ri == j)
+		    {
+		      if (a.data(i) == std::abs(a.data(i)))
+			diag_positive = true;
+		      else
+			break;
+		    }
+		  else
+		    {
+		      bool found = false;
+
+		      for (int k = a.cidx(ri); k < a.cidx(ri+1); k++)
+			{
+			  if (a.ridx(k) == j)
+			    {
+			      if (a.data(i) == a.data(k))
+				found = true;
+			      break;
+			    }
+			}
+
+		      if (! found)
+			{
+			  is_herm = false;
+			  break;
+			}
+		    }
+		}
+
+	      if (! diag_positive || ! is_herm)
+		{
+		  is_herm = false;
+		  break;
+		} 
+	    }
+
+	  if (is_herm)
+	    {
+	      if (typ == Full)
+		typ = Hermitian;
+	      else if (typ == Banded)
+		typ = Banded_Hermitian;
+	      else
+		typ = Tridiagonal_Hermitian;
+	    }
+	}
+    }
+}
+
+SparseType::~SparseType (void) 
+{ 
+  if (nperm != 0)
+    {
+      delete [] row_perm; 
+      delete [] col_perm; 
+    }
+}
+
+SparseType& 
+SparseType::operator = (const SparseType& a)
+{
+  if (this != &a)
+    {
+      typ = a.typ;
+      sp_bandden = a.sp_bandden;
+      bandden = a.bandden;
+      upper_band = a.upper_band;
+      lower_band = a.lower_band;
+      dense = a.dense;
+      nperm = a.nperm;
+
+      if (nperm != 0)
+	{
+	  row_perm = new int [nperm];
+	  col_perm = new int [nperm];
+	  for (int i = 0; i < nperm; i++)
+	    {
+	      row_perm[i] = a.row_perm[i];
+	      col_perm[i] = a.col_perm[i];
+	    }
+    }
+
+    }
+  return *this;
+}
+
+int
+SparseType::type (const SparseMatrix &a)
+{
+  if (typ != SparseType::Unknown && 
+      sp_bandden == Voctave_sparse_controls.get_key ("bandden"))
+    {
+      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+  	(*current_liboctave_warning_handler) 
+  	  ("Using Cached Sparse Matrix Type");
+      
+      return typ;
+    }
+
+  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+    (*current_liboctave_warning_handler) 
+      ("Calculating Sparse Matrix Type");
+
+
+  SparseType tmp_typ (a);
+  typ = tmp_typ.typ;
+  sp_bandden = tmp_typ.sp_bandden;
+  bandden = tmp_typ.bandden;
+  upper_band = tmp_typ.upper_band;
+  lower_band = tmp_typ.lower_band;
+  dense = tmp_typ.dense;
+  nperm = tmp_typ.nperm;
+
+  if (nperm != 0)
+    {
+      row_perm = new int [nperm];
+      col_perm = new int [nperm];
+      for (int i = 0; i < nperm; i++)
+	{
+	  row_perm[i] = tmp_typ.row_perm[i];
+	  col_perm[i] = tmp_typ.col_perm[i];
+	}
+    }
+
+  return typ;
+}
+
+int
+SparseType::type (const SparseComplexMatrix &a)
+{
+  if (typ != SparseType::Unknown && 
+      sp_bandden == Voctave_sparse_controls.get_key ("bandden"))
+    {
+      if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+  	(*current_liboctave_warning_handler) 
+  	  ("Using Cached Sparse Matrix Type");
+      
+      return typ;
+    }
+
+  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+    (*current_liboctave_warning_handler) 
+      ("Calculating Sparse Matrix Type");
+
+
+  SparseType tmp_typ (a);
+  typ = tmp_typ.typ;
+  sp_bandden = tmp_typ.sp_bandden;
+  bandden = tmp_typ.bandden;
+  upper_band = tmp_typ.upper_band;
+  lower_band = tmp_typ.lower_band;
+  dense = tmp_typ.dense;
+  nperm = tmp_typ.nperm;
+
+  if (nperm != 0)
+    {
+      row_perm = new int [nperm];
+      col_perm = new int [nperm];
+      for (int i = 0; i < nperm; i++)
+	{
+	  row_perm[i] = tmp_typ.row_perm[i];
+	  col_perm[i] = tmp_typ.col_perm[i];
+	}
+    }
+
+  return typ;
+}
+
+void
+SparseType::info (void) const
+{
+  if (Voctave_sparse_controls.get_key ("spumoni") != 0.)
+    {
+      if (typ == SparseType::Unknown)
+	(*current_liboctave_warning_handler) 
+	  ("Unknown Sparse Matrix Type");
+      else if (typ == SparseType::Diagonal)
+	(*current_liboctave_warning_handler) 
+	  ("Diagonal Sparse Matrix");
+      else if (typ == SparseType::Permuted_Diagonal)
+	(*current_liboctave_warning_handler) 
+	  ("Permuted Diagonal Sparse Matrix");
+      else if (typ == SparseType::Upper)
+	(*current_liboctave_warning_handler) 
+	  ("Upper Triangular Sparse Matrix");
+      else if (typ == SparseType::Lower)
+	(*current_liboctave_warning_handler) 
+	  ("Lower Triangular Sparse Matrix");
+      else if (typ == SparseType::Permuted_Upper)
+	(*current_liboctave_warning_handler) 
+	  ("Permuted Upper Triangular Sparse Matrix");
+      else if (typ == SparseType::Permuted_Lower)
+	(*current_liboctave_warning_handler) 
+	  ("Permuted Lower Triangular Sparse Matrix");
+      else if (typ == SparseType::Banded)
+	(*current_liboctave_warning_handler) 
+	  ("Banded Sparse Matrix %g-1-%g (Density %g)", lower_band, 
+	   upper_band, bandden);
+      else if (typ == SparseType::Banded_Hermitian)
+	(*current_liboctave_warning_handler) 
+	  ("Banded Hermitian/Symmetric Sparse Matrix %g-1-%g (Density %g)", 
+	   lower_band, upper_band, bandden);
+      else if (typ == SparseType::Hermitian)
+	(*current_liboctave_warning_handler) 
+	  ("Hermitian/Symmetric Sparse Matrix");
+      else if (typ == SparseType::Tridiagonal)
+	(*current_liboctave_warning_handler) 
+	  ("Tridiagonal Sparse Matrix");
+      else if (typ == SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_warning_handler) 
+	  ("Hermitian/Symmetric Tridiagonal Sparse Matrix");
+      else if (typ == SparseType::Rectangular)
+	(*current_liboctave_warning_handler) 
+	  ("Rectangular Sparse Matrix");
+      else if (typ == SparseType::Full)
+	(*current_liboctave_warning_handler) 
+	  ("Full Sparse Matrix");
+    }
+}
+
+void
+SparseType::mark_as_symmetric (void)
+{
+  if (typ == SparseType::Tridiagonal || 
+      typ == SparseType::Tridiagonal_Hermitian)
+    typ = SparseType::Tridiagonal_Hermitian;
+  else if (typ == SparseType::Banded ||
+	   typ == SparseType::Banded_Hermitian)
+    typ = SparseType::Banded_Hermitian;
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian || 
+	   typ == SparseType::Unknown)
+    typ = SparseType::Hermitian;
+  else
+    (*current_liboctave_error_handler) 
+      ("Can not mark current matrix type as symmetric");
+}
+
+void
+SparseType::mark_as_unsymmetric (void)
+{
+  if (typ == SparseType::Tridiagonal || 
+      typ == SparseType::Tridiagonal_Hermitian)
+    typ = SparseType::Tridiagonal;
+  else if (typ == SparseType::Banded ||
+	   typ == SparseType::Banded_Hermitian)
+    typ = SparseType::Banded;
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian || 
+	   typ == SparseType::Unknown)
+    typ = SparseType::Full;
+}
+
+void
+SparseType::mark_as_permuted (const int np, const int *pr, const int *pc)
+{
+  nperm = np;
+  row_perm = new int [nperm];
+  col_perm = new int [nperm];
+  for (int i = 0; i < nperm; i++)
+    {
+      row_perm[i] = pr[i];
+      col_perm[i] = pc[i];
+    }
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    typ = SparseType::Permuted_Diagonal;
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    typ = SparseType::Permuted_Upper;
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    typ = SparseType::Permuted_Lower;
+  else
+    (*current_liboctave_error_handler) 
+      ("Can not mark current matrix type as symmetric");
+}
+
+void
+SparseType::mark_as_unpermuted (void)
+{
+  if (nperm)
+    {
+      nperm = 0;
+      delete [] row_perm;
+      delete [] col_perm;
+    }
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    typ = SparseType::Diagonal;
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    typ = SparseType::Upper;
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    typ = SparseType::Lower;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparseType.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,155 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_SparseType_h)
+#define octave_SparseType_h
+
+class SparseMatrix;
+class SparseComplexMatrix;
+
+class
+SparseType
+{
+public:
+  enum matrix_type {
+    Unknown = 0,
+    Full,
+    Diagonal,
+    Permuted_Diagonal,
+    Upper,
+    Lower,
+    Permuted_Upper,
+    Permuted_Lower,
+    Banded,
+    Hermitian,
+    Banded_Hermitian,
+    Tridiagonal,
+    Tridiagonal_Hermitian,
+    Rectangular
+  };
+
+  SparseType (void) : typ (Unknown), nperm (0) { }
+    
+  SparseType (const SparseType &a);
+
+  SparseType (const SparseMatrix &a);
+
+  SparseType (const SparseComplexMatrix &a);
+
+  ~SparseType (void);
+
+  SparseType& operator = (const SparseType& a);
+
+  int type (void) const { return typ; }
+
+  int type (const SparseMatrix &a);
+
+  int type (const SparseComplexMatrix &a);
+
+  double band_density (void) const { return bandden; }
+
+  int nupper (void) const { return upper_band; }
+
+  int nlower (void) const { return lower_band; }
+
+  bool is_dense (void) const { return dense; }
+
+  bool is_diagonal (void) const 
+    { return (typ == Diagonal || typ == Permuted_Diagonal); }
+  
+  bool is_upper_triangular (void) const 
+    { return (typ == Upper || typ == Permuted_Upper); }
+
+  bool is_lower_triangular (void) const 
+    { return (typ == Lower || typ == Permuted_Lower); }
+
+  bool is_banded (void)
+    { return (typ == Banded || typ == Banded_Hermitian); }
+  
+  bool is_tridiagonal (void) const
+    { return (typ == Tridiagonal || typ == Tridiagonal_Hermitian); }
+  
+  bool is_hermitian (void) const
+    { return (typ == Banded_Hermitian || typ == Tridiagonal_Hermitian ||
+	      typ == Hermitian); }
+
+  bool is_rectangular (void) const { return (typ == Rectangular); }
+
+  bool is_known (void) const { return (typ != Unknown); }
+
+  bool is_unknown (void) const { return (typ == Unknown); }
+
+  void info (void) const;
+
+  int * triangular_row_perm (void) const { return row_perm; }
+
+  int * triangular_col_perm (void) const { return col_perm; }
+
+  void invaldate_type (void) { typ = Unknown; }
+
+  void mark_as_diagonal (void) { typ = Diagonal; }
+
+  void mark_as_upper_triangular (void) { typ = Upper; }
+
+  void mark_as_lower_triangular (void) { typ = Lower; }
+
+  void mark_as_tridiagonal (void) {typ = Tridiagonal; }
+
+  void mark_as_banded (const int ku, const int kl)
+    { typ = Banded; upper_band = ku; lower_band = kl; }
+
+  void mark_as_full (void) { typ = Full; }
+
+  void mark_as_rectangular (void) { typ = Rectangular; }
+
+  void mark_as_dense (void) { dense = true; }
+
+  void mark_as_not_dense (void) { dense = false; }
+
+  void mark_as_symmetric (void);
+
+  void mark_as_unsymmetric (void);
+
+  void mark_as_permuted (const int np, const int *pr, const int *pc);
+
+  void mark_as_unpermuted (void);
+
+private:
+  void type (int new_typ) { typ = static_cast<matrix_type>(new_typ); }
+
+  matrix_type typ;
+  double sp_bandden;
+  double bandden;
+  int upper_band;
+  int lower_band;
+  bool dense;
+  int nperm;
+  int *row_perm;
+  int *col_perm;
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparsedbleLU.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,392 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <vector>
+
+#include "lo-error.h"
+
+#include "SparsedbleLU.h"
+#include "oct-spparms.h"
+
+// Instantiate the base LU class for the types we need.
+
+#include "sparse-base-lu.h"
+#include "sparse-base-lu.cc"
+
+template class sparse_base_lu <SparseMatrix, double, SparseMatrix, double>;
+
+// Include the UMFPACK functions
+extern "C" {
+#include "umfpack.h"
+}
+
+SparseLU::SparseLU (const SparseMatrix& a, double piv_thres)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  // Setup the control parameters
+  Matrix Control (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_di_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+
+  if (piv_thres >= 0.)
+    {
+      piv_thres = (piv_thres > 1. ? 1. : piv_thres);
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres;
+      Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres;
+    }
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+	  Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+    }
+
+  // Set whether we are allowed to modify Q or not
+  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  if (!xisnan (tmp))
+    Control (UMFPACK_FIXQ) = tmp;
+
+  // Turn-off UMFPACK scaling for LU 
+  Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+  umfpack_di_report_control (control);
+
+  const int *Ap = a.cidx ();
+  const int *Ai = a.ridx ();
+  const double *Ax = a.data ();
+
+  umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control);
+
+  void *Symbolic;
+  Matrix Info (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL,
+				     &Symbolic, control, info);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	    ("SparseLU::SparseLU symbolic factorization failed");
+
+      umfpack_di_report_status (control, status);
+      umfpack_di_report_info (control, info);
+
+      umfpack_di_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_di_report_symbolic (Symbolic, control);
+
+      void *Numeric;
+      status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+				   control, info) ;
+      umfpack_di_free_symbolic (&Symbolic) ;
+
+      cond = Info (UMFPACK_RCOND);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseLU::SparseLU numeric factorization failed");
+
+	  umfpack_di_report_status (control, status);
+	  umfpack_di_report_info (control, info);
+
+	  umfpack_di_free_numeric (&Numeric);
+	}
+      else
+	{
+	  umfpack_di_report_numeric (Numeric, control);
+
+	  int lnz, unz, ignore1, ignore2, ignore3;
+	  status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					&ignore3, Numeric) ;
+	  
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseLU::SparseLU extracting LU factors failed");
+
+	      umfpack_di_report_status (control, status);
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      int n_inner = (nr < nc ? nr : nc);
+
+	      if (lnz < 1)
+		Lfact = SparseMatrix (n_inner, nr, 1);
+	      else
+		Lfact = SparseMatrix (n_inner, nr, lnz);
+
+	      int *Ltp = Lfact.cidx ();
+	      int *Ltj = Lfact.ridx ();
+	      double *Ltx = Lfact.data ();
+
+	      if (unz < 1)
+		Ufact = SparseMatrix (n_inner, nc, 1);
+	      else
+		Ufact = SparseMatrix (n_inner, nc, unz);
+
+	      int *Up = Ufact.cidx ();
+	      int *Uj = Ufact.ridx ();
+	      double *Ux = Ufact.data ();
+
+	      P.resize (nr);
+	      int *p = P.fortran_vec ();
+
+	      Q.resize (nc);
+	      int *q = Q.fortran_vec ();
+
+	      int do_recip;
+	      status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Uj,
+					       Ux, p, q, (double *) NULL,
+					       &do_recip, (double *) NULL, 
+					       Numeric) ;
+
+	      umfpack_di_free_numeric (&Numeric) ;
+
+	      if (status < 0 || do_recip)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseLU::SparseLU extracting LU factors failed");
+
+		  umfpack_di_report_status (control, status);
+		}
+	      else
+		{
+		  Lfact = Lfact.transpose ();
+
+		  umfpack_di_report_matrix (nr, n_inner, Lfact.cidx (), 
+					    Lfact.ridx (), Lfact.data (),
+					    1, control);
+		  umfpack_di_report_matrix (n_inner, nc, Ufact.cidx (), 
+					    Ufact.ridx (), Ufact.data (),
+					    1, control);
+		  umfpack_di_report_perm (nr, p, control);
+		  umfpack_di_report_perm (nc, q, control);
+		}
+
+	      umfpack_di_report_info (control, info);
+	    }
+	}
+    }
+}
+
+SparseLU::SparseLU (const SparseMatrix& a, const ColumnVector& Qinit,
+		    double piv_thres, bool FixedQ)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  // Setup the control parameters
+  Matrix Control (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_di_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+  if (piv_thres >= 0.)
+    {
+      piv_thres = (piv_thres > 1. ? 1. : piv_thres);
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = piv_thres;
+      Control (UMFPACK_PIVOT_TOLERANCE) = piv_thres;
+    }
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+	  Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+    }
+
+  // Set whether we are allowed to modify Q or not
+  if (FixedQ)
+    Control (UMFPACK_FIXQ) = 1.0;
+  else
+    {
+      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      if (!xisnan (tmp))
+	Control (UMFPACK_FIXQ) = tmp;
+    }
+
+  // Turn-off UMFPACK scaling for LU 
+  Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+  umfpack_di_report_control (control);
+
+  const int *Ap = a.cidx ();
+  const int *Ai = a.ridx ();
+  const double *Ax = a.data ();
+
+  umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control);
+
+  void *Symbolic;
+  Matrix Info (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status;
+
+  // Null loop so that qinit is imediately deallocated when not needed
+  do {
+    OCTAVE_LOCAL_BUFFER (int, qinit, nc);
+
+    for (int i = 0; i < nc; i++)
+      qinit [i] = static_cast<int> (Qinit (i));
+
+    status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, qinit,
+				   &Symbolic, control, info);
+  } while (0);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	    ("SparseLU::SparseLU symbolic factorization failed");
+
+      umfpack_di_report_status (control, status);
+      umfpack_di_report_info (control, info);
+
+      umfpack_di_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_di_report_symbolic (Symbolic, control);
+
+      void *Numeric;
+      status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+				   control, info) ;
+      umfpack_di_free_symbolic (&Symbolic) ;
+
+      cond = Info (UMFPACK_RCOND);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseLU::SparseLU numeric factorization failed");
+
+	  umfpack_di_report_status (control, status);
+	  umfpack_di_report_info (control, info);
+
+	  umfpack_di_free_numeric (&Numeric);
+	}
+      else
+	{
+	  umfpack_di_report_numeric (Numeric, control);
+
+	  int lnz, unz, ignore1, ignore2, ignore3;
+	  status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					&ignore3, Numeric) ;
+	  
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseLU::SparseLU extracting LU factors failed");
+
+	      umfpack_di_report_status (control, status);
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      int n_inner = (nr < nc ? nr : nc);
+
+	      if (lnz < 1)
+		Lfact = SparseMatrix (n_inner, nr, 1);
+	      else
+		Lfact = SparseMatrix (n_inner, nr, lnz);
+
+	      int *Ltp = Lfact.cidx ();
+	      int *Ltj = Lfact.ridx ();
+	      double *Ltx = Lfact.data ();
+
+	      if (unz < 1)
+		Ufact = SparseMatrix (n_inner, nc, 1);
+	      else
+		Ufact = SparseMatrix (n_inner, nc, unz);
+
+	      int *Up = Ufact.cidx ();
+	      int *Uj = Ufact.ridx ();
+	      double *Ux = Ufact.data ();
+
+	      P.resize (nr);
+	      int *p = P.fortran_vec ();
+
+	      Q.resize (nc);
+	      int *q = Q.fortran_vec ();
+
+	      int do_recip;
+	      status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Uj,
+					       Ux, p, q, (double *) NULL,
+					       &do_recip, (double *) NULL, 
+					       Numeric) ;
+
+	      umfpack_di_free_numeric (&Numeric) ;
+
+	      if (status < 0 || do_recip)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseLU::SparseLU extracting LU factors failed");
+
+		  umfpack_di_report_status (control, status);
+		}
+	      else
+		{
+		  Lfact = Lfact.transpose ();
+		  umfpack_di_report_matrix (nr, n_inner, Lfact.cidx (), 
+					    Lfact.ridx (), Lfact.data (),
+					    1, control);
+		  umfpack_di_report_matrix (n_inner, nc, Ufact.cidx (), 
+					    Ufact.ridx (), Ufact.data (),
+					    1, control);
+		  umfpack_di_report_perm (nr, p, control);
+		  umfpack_di_report_perm (nc, q, control);
+		}
+
+	      umfpack_di_report_info (control, info);
+	    }
+	}
+    }
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/SparsedbleLU.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,62 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_LU_h)
+#define octave_sparse_LU_h 1
+
+#include "sparse-base-lu.h"
+#include "dSparse.h"
+
+class
+SparseLU : public sparse_base_lu <SparseMatrix, double, SparseMatrix, double>
+{
+public:
+
+  SparseLU (void) 
+    : sparse_base_lu <SparseMatrix, double, SparseMatrix, double> () { }
+
+  SparseLU (const SparseMatrix& a, double piv_thres = -1.0);
+
+  SparseLU (const SparseMatrix& a, const ColumnVector& Qinit, 
+	    double piv_thres = -1.0, bool FixedQ = false);
+
+  SparseLU (const SparseLU& a) 
+    : sparse_base_lu <SparseMatrix, double, SparseMatrix, double> (a) { }
+
+  SparseLU& operator = (const SparseLU& a)
+    {
+      if (this != &a)
+	sparse_base_lu <SparseMatrix, double, SparseMatrix, double> 
+	  :: operator = (a);
+
+      return *this;
+    }
+
+  ~SparseLU (void) { }
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK.README	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,47 @@
+This directory contains a modified copy of UMFPACKv4.4 in the
+directory UMFPACK.  The complete changes from the original version may
+be found in the file UMFPACK.patch.
+
+UMFPACK was written by Timothy A. Davis (davis@cise.ufl.edu),
+University of Florida.
+
+UMFPACK includes a modified version of COLAMD V2.0, by Stefan
+I. Larimore and Timothy A. Davis, University of Florida.  The COLAMD
+algorithm was developed in collaboration with John Gilbert, Xerox Palo
+Alto Research Center, and Esmond Ng, Lawrence Berkeley National
+Laboratory.
+
+UMFPACK also includes AMD, by Timothy A. Davis, Patrick R. Amestoy,
+and Iain S. Duff.
+
+UMFPACK Version 2.2.1 (MA38 in the Harwell Subroutine Library) is
+co-authored with Iain S. Duff, Rutherford Appleton Laboratory.
+
+The copyright and license information is:
+
+  UMFPACK Version 4.4 (Jan. 28, 2005),  Copyright (c) 2005 by Timothy A.
+  Davis.  All Rights Reserved.
+
+  Your use or distribution of UMFPACK or any modified version of
+  UMFPACK implies that you agree to this License.
+
+  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+  EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+  Permission is hereby granted to use or copy this program, provided
+  that the Copyright, this License, and the Availability of the original
+  version is retained on all copies.  User documentation of any code that
+  uses UMFPACK or any modified version of UMFPACK code must cite the
+  Copyright, this License, the Availability note, and "Used by permission."
+  Permission to modify the code and to distribute modified code is granted,
+  provided the Copyright, this License, and the Availability note are
+  retained, and a notice that the code was modified is included.  This
+  software was developed with support from the National Science Foundation,
+  and is provided to you free of charge.
+
+John W. Eaton
+jwe@bevo.che.wisc.edu
+University of Wisconsin-Madison
+Department of Chemical & Biological Engineering
+
+Wed Feb 01 22:15:20 2005
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK.files	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,79 @@
+
+# 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/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 and user-callable amd_*.[ch] files (int/long versions only):
+AMD := amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid
+
+# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c,
+# umf_triplet.c, and umf_assemble.c , with int/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/long and real/complex versions:
+UMF := $(UMF_CREATED) $(UMFCH)
+
+# user-callable umfpack_*.[ch] files (int/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/long and real/complex versions:
+UMFPACKW := umfpack_wsolve
+
+USER := $(UMFPACKW) $(UMFPACK)
+
+# user-callable, only one version for int/long, real/complex, *.[ch] files:
+GENERIC := umfpack_timer umfpack_tictoc
+
+UMFPACK_BASE := \
+  $(subst umf_, umf_o_, $(UMFINT)) \
+  $(subst umf_, umf_od_, $(UMF)) \
+  $(subst umfpack_, umfpack_od_, $(USER)) \
+  $(subst umf_, umf_oz_, $(UMF)) \
+  $(subst umfpack_, umfpack_oz_, $(USER)) \
+  $(subst amd_, amd_o_, $(AMD)) \
+  $(subst umfpack_, umfpack_o_, $(GENERIC))
+
+UMFPACK_OBJ := $(addsuffix .o, $(UMFPACK_BASE))
+
+UMFPACK_PICOBJ := $(addprefix pic/, $(UMFPACK_OBJ))
+
+UMFPACK_INCFLAGS := \
+  -I$(top_srcdir)/liboctave/UMFPACK/UMFPACK/Include \
+  -I$(top_srcdir)/liboctave/UMFPACK/UMFPACK/Source \
+  -I$(top_srcdir)/liboctave/UMFPACK/AMD/Include \
+  -I$(top_srcdir)/liboctave/UMFPACK/AMD/Source
+
+$(UMFPACK_OBJ) $(UMFPACK_PICOBJ): INCFLAGS += $(UMFPACK_INCFLAGS)
+
+UMFPACK_EXTRAS := UMFPACK.files UMFPACK.rules UMFPACK.patch UMFPACK.README
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK.patch	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,4825 @@
+--- UMFPACKv4.4.orig/AMD/Makefile	2004-01-29 20:40:44.000000000 +0100
++++ UMFPACK/AMD/Makefile	2005-02-01 22:00:38.917972334 +0100
+@@ -28,11 +28,18 @@
+ 	( cd Demo   ; make cross )
+ 	- cat Doc/License
+ 
++# compile a Octave version
++# (not compiled by "make all")
++octave:
++	( cd OCTAVE ; make )
++	- cat Doc/License
++
+ # remove object files, but keep the compiled programs and library archives
+ clean:
+ 	( cd Source ; make clean )
+ 	( cd Demo   ; make clean )
+ 	( cd MATLAB ; make clean )
++	( cd OCTAVE ; make clean )
+ 	( cd Doc    ; make clean )
+ 
+ # clean, and then remove compiled programs and library archives
+@@ -40,6 +47,7 @@
+ 	( cd Source ; make purge )
+ 	( cd Demo   ; make purge )
+ 	( cd MATLAB ; make purge )
++	( cd OCTAVE ; make purge )
+ 	( cd Doc    ; make purge )
+ 
+ # create PDF documents for the original distribution
+--- UMFPACKv4.4.orig/UMFPACK/Makefile	2004-01-29 20:40:48.000000000 +0100
++++ UMFPACK/UMFPACK/Makefile	2005-02-01 22:00:38.916972398 +0100
+@@ -32,12 +32,19 @@
+ hb:
+ 	( cd Demo   ; make hb )
+ 
++# compile a Octave version
++# (not compiled by "make all")
++octave:
++	( cd OCTAVE ; make )
++	- cat Doc/License
++
+ # remove object files, but keep the compiled programs and library archives
+ clean:
+ 	( cd ../AMD ; make clean )
+ 	( cd Source ; make clean )
+ 	( cd Demo   ; make clean )
+ 	( cd MATLAB ; make clean )
++	( cd OCTAVE ; make clean )
+ 	( cd Doc    ; make clean )
+ 
+ # clean, and then remove compiled programs and library archives
+@@ -46,6 +53,7 @@
+ 	( cd Source ; make purge )
+ 	( cd Demo   ; make purge )
+ 	( cd MATLAB ; make purge )
++	( cd OCTAVE ; make purge )
+ 	( cd Doc    ; make purge )
+ 
+ # create PDF documents for the original distribution
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/Contents.m UMFPACK/UMFPACK/OCTAVE/Contents.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/Contents.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/Contents.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,1 +1,22 @@
++%Contents of the UMFPACK sparse matrix toolbox:
++%
++% umfpack           computes x=A\b, x=A/b, or lu (A) for a sparse matrix A
++% umfpack_make      to compile umfpack for use in MATLAB
++% umfpack_report    prints optional control settings and statistics
++% umfpack_demo      a long demo
++% umfpack_simple    a simple demo
++% umfpack_btf       factorize A using a block triangular form
++% umfpack_solve     x = A\b or x = b/A 
++% lu_normest        estimates norm (L*U-A, 1) without forming L*U-A
++% luflop	    given L and U, computes # of flops required to compute them
++%
++% See also:
++% amd		    symmetric minimum degree ordering
++% colamd            unsymmetric column approx minimum degree ordering
++% symamd            symmetric approx minimum degree ordering, based on colamd
++%
++% UMFPACK Version 4.3 (Jan. 16, 2004),  Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  Type umfpack_details for License.
++
++help Contents
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/GNUmakefile	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/GNUmakefile	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,248 @@
++#-------------------------------------------------------------------------------
++# UMFPACK GNUmakefile for the UMFPACK OCTAVE oct-file (GNU "make" only)
++#-------------------------------------------------------------------------------
++
++.PRECIOUS: %.o
++
++# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++# Davis.  All Rights Reserved.  See ../README for License.
++
++all: umfpack luflop
++
++include ../Make/Make.include
++
++MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source
++
++OCT_SPARSE_INC = -I../../../
++
++
++#-------------------------------------------------------------------------------
++# source files
++#-------------------------------------------------------------------------------
++
++# 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/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 and user-callable amd_*.[ch] files (int/long versions only):
++AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
++	amd_order amd_control amd_info amd_valid
++
++# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c,
++# umf_triplet.c, and umf_assemble.c , with int/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/long and real/complex versions:
++UMF = $(UMF_CREATED) $(UMFCH)
++
++# user-callable umfpack_*.[ch] files (int/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/long and real/complex versions:
++UMFPACKW = umfpack_wsolve
++
++USER = $(UMFPACKW) $(UMFPACK)
++
++# user-callable, only one version for int/long, real/complex, *.[ch] files:
++GENERIC = umfpack_timer umfpack_tictoc
++
++#-------------------------------------------------------------------------------
++# include files:
++#-------------------------------------------------------------------------------
++
++AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h
++
++INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h
++
++INC = ../Include/umfpack.h \
++	$(addprefix ../Source/, $(INC1)) \
++	$(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \
++	$(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \
++	$(addprefix ../Include/, $(addsuffix .h,$(USER))) \
++	$(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \
++	$(AMDH)
++
++#-------------------------------------------------------------------------------
++# Create the umfpack and amd oct-file for OCTAVE (int versions only)
++#-------------------------------------------------------------------------------
++
++OCTI   = $(addsuffix .o, $(subst umf_,umf_o_,$(UMFINT)))
++OCTDI  = $(addsuffix .o, $(subst umf_,umf_od_,$(UMF)) $(subst umfpack_,umfpack_od_,$(USER)))
++OCTZI  = $(addsuffix .o, $(subst umf_,umf_oz_,$(UMF)) $(subst umfpack_,umfpack_oz_,$(USER)) )
++OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD)))
++OCTGN  = $(addsuffix .o, $(subst umfpack_,umfpack_o_,$(GENERIC)))
++
++OCTUMFPACK = $(OCTI) $(OCTDI) $(OCTZI) $(OCTGN)
++
++OCTUMFPACK_LIB = umfpack_octave.o
++
++# Note that mkoctfile has an "-o" option, but it doesn't work in conjunction
++# with the "-c" option, thus the need for $(MV) commands.
++# If it did, then the rules would be much simpler:
++#	$(MKOCT) -DDINT -c $< -o $@
++
++#----------------------------------------
++# integer-only routines (no real/complex):
++#----------------------------------------
++
++amd_o_%.o: ../../AMD/Source/amd_%.c $(AMDH)
++	$(MKOCT) -DDINT -c $<
++	- $(MV) ../../AMD/Source/amd_$*.o $@
++
++
++umf_o_%.o: ../Source/umf_%.c $(INC)
++	$(MKOCT) -DDINT -c $<
++	- $(MV) ../Source/umf_$*.o $@
++
++#----------------------------------------
++# Double precision, int version, for OCTAVE
++#----------------------------------------
++
++umf_od_%.o: ../Source/umf_%.c $(INC)
++	$(MKOCT) -DDINT -c $<
++	- $(MV) ../Source/umf_$*.o $@
++
++umf_od_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
++	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c $<
++	- $(MV) ../Source/umf_$*tsolve.o $@
++
++umf_od_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_od_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DDINT -DDO_MAP -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_od_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DDINT -DDO_VALUES -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_od_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DDINT -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_od_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
++	$(MKOCT) -DDINT -DFIXQ -c $<
++	- $(MV) ../Source/umf_assemble.o $@
++
++umf_od_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
++	$(MKOCT) -DDINT -DDROP -c $<
++	- $(MV) ../Source/umf_store_lu.o $@
++
++umfpack_od_wsolve.o: ../Source/umfpack_solve.c $(INC)
++	$(MKOCT) -DDINT -DWSOLVE -c $<
++	- $(MV) ../Source/umfpack_solve.o $@
++
++umfpack_od_%.o: ../Source/umfpack_%.c $(INC)
++	$(MKOCT) -DDINT -c $<
++	- $(MV) ../Source/umfpack_$*.o $@
++
++#----------------------------------------
++# Complex double precision, int version, for OCTAVE
++#----------------------------------------
++
++umf_oz_%.o: ../Source/umf_%.c $(INC)
++	$(MKOCT) -DZINT -c $<
++	- $(MV) ../Source/umf_$*.o $@
++
++umf_oz_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
++	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c $<
++	- $(MV) ../Source/umf_$*tsolve.o $@
++
++umf_oz_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_oz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DZINT -DDO_MAP -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_oz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DZINT -DDO_VALUES -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_oz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
++	$(MKOCT) -DZINT -c $<
++	- $(MV) ../Source/umf_triplet.o $@
++
++umf_oz_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
++	$(MKOCT) -DZINT -DFIXQ -c $<
++	- $(MV) ../Source/umf_assemble.o $@
++
++umf_oz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
++	$(MKOCT) -DZINT -DDROP -c $<
++	- $(MV) ../Source/umf_store_lu.o $@
++
++umfpack_oz_wsolve.o: ../Source/umfpack_solve.c $(INC)
++	$(MKOCT) -DZINT -DWSOLVE -c $<
++	- $(MV) ../Source/umfpack_solve.o $@
++
++umfpack_oz_%.o: ../Source/umfpack_%.c $(INC)
++	$(MKOCT) -DZINT -c $<
++	- $(MV) ../Source/umfpack_$*.o $@
++
++#----------------------------------------
++# Generic routines for OCTAVE
++#----------------------------------------
++
++umfpack_o_timer.o: ../Source/umfpack_timer.c $(INC)
++	$(MKOCT) -c $<
++	- $(MV) ../Source/umfpack_timer.o $@
++
++umfpack_o_tictoc.o: ../Source/umfpack_tictoc.c $(INC)
++	$(MKOCT) -c $<
++	- $(MV) ../Source/umfpack_tictoc.o $@
++
++#----------------------------------------
++# umfpack oct-files
++#----------------------------------------
++
++umfpack: umfpack.cc $(OCTUMFPACK) $(OCTAMD)
++	$(MKOCT) $(OCT_SPARSE_INC) umfpack.cc $(OCTUMFPACK) $(OCTAMD)  -o umfpack.oct 
++
++luflop: luflop.cc
++	$(MKOCT) $(OCT_SPARSE_INC) luflop.cc -o luflop.oct
++
++#----------------------------------------
++# umfpack library to link with octave
++#----------------------------------------
++
++octave: $(OCTUMFPACK) $(OCTAMD)
++	ld -r $(OCTUMFPACK) $(OCTAMD) -o ../../../$(OCTUMFPACK_LIB)
++
++#-------------------------------------------------------------------------------
++# Remove all but the files in the original distribution
++#-------------------------------------------------------------------------------
++
++purge: clean
++	- $(RM) *.oct *.so
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/luflop.cc UMFPACK/UMFPACK/OCTAVE/luflop.cc
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/luflop.cc	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/luflop.cc	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,223 @@
++/*
++
++Copyright (C) 2004 David Bateman
++
++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; see the file COPYING.  If not, write to the Free
++Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++
++In addition to the terms of the GPL, you are permitted to link
++this program with any Open Source program, as defined by the
++Open Source Initiative (www.opensource.org)
++
++*/
++
++/*
++
++This is the Octave interface to the UMFPACK code, which bore the following
++copyright
++
++  UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++  Davis.  All Rights Reserved.  See ../README for License.
++  email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
++  web: http://www.cise.ufl.edu/research/sparse/umfpack
++
++*/
++
++
++#include <cstdlib>
++#include <string>
++
++#include <octave/config.h>
++#include <octave/ov.h>
++#include <octave/defun-dld.h>
++#include <octave/pager.h>
++#include <octave/ov-re-mat.h>
++
++#include "ov-re-sparse.h"
++#include "ov-cx-sparse.h"
++
++DEFUN_DLD (luflop, args, nargout,
++    "-*- texinfo -*-\n\
++@deftypefn {Loadable Function} {@var{f} =} luflup (@var{l}, @var{u})\n\
++\n\
++Given an LU factorization, compute how many flops took to compute it. This\n\
++is the same as (assuming U has a zero-free diagonal):\n\
++\n\
++@example\n\
++@group\n\
++  Lnz = full (sum (spones (L))) - 1 ;\n\
++  Unz = full (sum (spones (U')))' - 1 ;\n\
++  f = 2*Lnz*Unz + sum (Lnz) ;\n\
++@end group\n\
++@end example\n\
++\n\
++except that no extra workspace is allocated for spones (L) and spones (U).\n\
++L and U must be sparse.\n\
++\n\
++Note: the above expression has a subtle undercount when exact numerical\n\
++cancelation occurs.  Try [L,U,P] = lu (sparse (ones (10))) and then\n\
++luflop (L,U).\n\
++@end deftypefn")
++{
++  int nargin = args.length ();
++  octave_value retval;
++
++  // These are here only so that the C++ destructors don't prematurally
++  // remove the underlying data we are interested in
++  SparseMatrix Lmatrix, Umatrix;
++  SparseComplexMatrix CLmatrix, CUmatrix;
++  int *Lp, *Li, *Up, *Ui;
++  int Lm, Ln, Um, Un;
++
++  if (nargin != 2)
++    {
++      usage ("f = luflop (L, U)");
++      return retval;
++    }
++
++  if (args(0).class_name () == "sparse")
++    {
++      if (args(0).is_complex_type ())
++	{
++	  CLmatrix = 
++	    (((const octave_sparse_complex_matrix&) args(0).get_rep ())
++	     .sparse_complex_matrix_value ());
++	  Lp = CLmatrix.cidx ();
++	  Li = CLmatrix.ridx ();
++	  Lm = CLmatrix.rows ();
++	  Ln = CLmatrix.cols ();
++	}
++      else
++	{
++	  Lmatrix = (((const octave_sparse_matrix&) args(0).get_rep ())
++	     .sparse_matrix_value ());
++	  Lp = Lmatrix.cidx ();
++	  Li = Lmatrix.ridx ();
++	  Lm = Lmatrix.rows ();
++	  Ln = Lmatrix.cols ();
++	}
++    }
++  else
++    {
++      if (args(0).is_complex_type ())
++	{
++	  CLmatrix =  SparseComplexMatrix (args(0).complex_matrix_value ());
++	  Lp = CLmatrix.cidx ();
++	  Li = CLmatrix.ridx ();
++	  Lm = CLmatrix.rows ();
++	  Ln = CLmatrix.cols ();
++	}
++      else
++	{
++	  Lmatrix = SparseMatrix (args(0).matrix_value ());
++	  Lp = Lmatrix.cidx ();
++	  Li = Lmatrix.ridx ();
++	  Lm = Lmatrix.rows ();
++	  Ln = Lmatrix.cols ();
++	}
++    }
++
++
++  if (args(0).class_name () == "sparse")
++    {
++      if (args(1).is_complex_type ())
++	{
++	  CUmatrix = 
++	    (((const octave_sparse_complex_matrix&) args(1).get_rep ())
++	     .sparse_complex_matrix_value ());
++	  Up = CUmatrix.cidx ();
++	  Ui = CUmatrix.ridx ();
++	  Um = CUmatrix.rows ();
++	  Un = CUmatrix.cols ();
++	}
++      else
++	{
++	  Umatrix = 
++	    (((const octave_sparse_matrix&) args(1).get_rep ())
++	     .sparse_matrix_value ());
++	  Up = Umatrix.cidx ();
++	  Ui = Umatrix.ridx ();
++	  Um = Umatrix.rows ();
++	  Un = Umatrix.cols ();
++	}
++    }
++  else
++    {
++      if (args(1).is_complex_type ())
++	{
++	  CUmatrix = SparseComplexMatrix (args(1).complex_matrix_value ());
++	  Up = CUmatrix.cidx ();
++	  Ui = CUmatrix.ridx ();
++	  Um = CUmatrix.rows ();
++	  Un = CUmatrix.cols ();
++	}
++      else
++	{
++	  Umatrix = SparseMatrix (args(1).matrix_value ());
++	  Up = Umatrix.cidx ();
++	  Ui = Umatrix.ridx ();
++	  Um = Umatrix.rows ();
++	  Un = Umatrix.cols ();
++	}
++    }
++
++
++  if (error_state)
++    return retval;
++
++      
++  int n = Lm;
++      
++  if (n != Ln || n != Um || n != Un)
++    error ("luflop: L and U must be square");
++  else
++    {
++	
++      OCTAVE_LOCAL_BUFFER (int, Unz, n);
++
++      // count the nonzeros in each row of U
++      for (int row = 0 ; row < n ; row++)
++	Unz [row] = 0 ;
++
++      for (int col = 0 ; col < n ; col++)
++	{
++	  for (int p = Up [col] ; p < Up [col+1] ; p++)
++	    {
++	      int row = Ui [p] ;
++	      Unz [row]++ ;
++	    }
++	}
++
++      // count the flops
++      double flop_count = 0.0 ;
++      for (int k = 0 ; k < n ; k++)
++	{
++	  /* off-diagonal nonzeros in column k of L: */
++	  int Lnz_k = Lp [k+1] - Lp [k] - 1 ;
++	  int Unz_k = Unz [k] - 1 ;
++	  flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ;
++	}
++
++      // return the result
++      retval = flop_count;
++    }
++
++  return retval;
++}
++
++/*
++;;; Local Variables: ***
++;;; mode: C++ ***
++;;; End: ***
++*/
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/lu_normest.m UMFPACK/UMFPACK/OCTAVE/lu_normest.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/lu_normest.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/lu_normest.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,106 @@
++function rho = lu_normest (A, L, U)
++% LU_NORMEST:  estimate the 1-norm of A-L*U without computing L*U
++%
++% Usage:
++%
++%       rho = lu_normest (A, L, U)
++%
++% which estimates the computation of the 1-norm:
++%
++%       rho = norm (A-L*U, 1) 
++%
++% Authors:  William W. Hager, Math Dept., Univ. of Florida
++%       Timothy A. Davis, CISE Dept., Univ. of Florida
++%       Gainesville, FL, 32611, USA.
++%       based on normest1, contributed on November, 1997
++%
++% This code can be quite easily adapted to estimate the 1-norm of any 
++% matrix E, where E itself is dense or not explicitly represented, but the
++% computation of E (and E') times a vector is easy.  In this case, our matrix
++% of interest is:
++%
++%       E = A-L*U
++%
++% That is, L*U is the LU factorization of A, where A, L and U
++% are sparse.  This code works for dense matrices A and L too,
++% but it would not be needed in that case, since E is easy to compute
++% explicitly.  For sparse A, L, and U, computing E explicitly would be quite
++% expensive, and thus normest (A-L*U) would be prohibitive.
++%
++% For a detailed description, see Davis, T. A. and Hager, W. W.,
++% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and
++% Applications, 1999, vol. 20, no. 3, 606-627.
++
++% The three places that the matrix-vector multiply E*x is used are highlighted.
++% Note that E is never formed explicity.
++
++[m n] = size (A) ;
++
++if (m ~= n)
++    % pad A, L, and U with zeros so that they are all square
++    if (m < n)
++        U = [ U ; (sparse (n-m,n)) ] ;
++        L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ;
++        A = [ A ; (sparse (n-m,n)) ] ;
++    else
++        U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ;
++        L = [ L , (sparse (m,m-n)) ] ;
++        A = [ A , (sparse (m,m-n)) ] ;
++    end
++end
++
++[m n] = size (A) ;
++
++notvisited = ones (m, 1) ;  % nonvisited(j) is zero if j is visited, 1 otherwise
++rho = 0 ;    % the global rho
++
++At = A' ;
++Lt = L' ;
++
++for trial = 1:3 % {
++
++   x = notvisited ./ sum (notvisited) ;
++   rho1 = 0 ;    % the current rho for this trial
++
++   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++   %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++   Ex1 = (A*x) - L*(U*x) ;
++   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++
++   rho2 = norm (Ex1, 1) ;
++
++   while rho2 > rho1 % {
++
++        rho1 = rho2 ;
++        y = 2*(Ex1 >= 0) - 1 ;
++
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        z = (A'*y) - U'*(L'*y) ;
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++
++        [zj, j] = max (abs (z .* notvisited)) ;
++        j = j (1) ;
++        if (abs (z (j)) > z'*x) % {
++            x = zeros (m, 1) ;
++            x (j) = 1 ;
++            notvisited (j) = 0 ;
++        else % } {
++            break ;
++        end % }
++
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++        Ex1 = (A*x) - L*(U*x) ;
++        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
++
++        rho2 = norm (Ex1, 1) ;
++
++    end % }
++
++    rho = max (rho, rho1) ;
++
++end % }
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/Makefile UMFPACK/UMFPACK/OCTAVE/Makefile
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/Makefile	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,517 @@
++#-------------------------------------------------------------------------------
++# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only)
++#-------------------------------------------------------------------------------
++
++# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++# Davis.  All Rights Reserved.  See ../README for License.
++
++# This is a very ugly Makefile, and is only provided for those who do not
++# have GNU make.  Note that it is not used if you have GNU make.  It ignores
++# dependency checking and just compiles everything.  It was created
++# automatically, via make -n using the GNUmakefile.  That way, I don't have
++# maintain two Makefiles.
++
++all: umfpack luflop
++
++include ../Make/Make.include
++
++MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source 
++
++OCT_SPARSE_INC = -I../../../
++OCTUMFPACK_LIB = umfpack_octave.o
++
++umfpack:
++	$(MKOCT) -DDINT -c ../Source/umf_analyze.c
++	$(MV) -f ../Source/umf_analyze.o umf_m_analyze.o
++	$(MKOCT) -DDINT -c ../Source/umf_apply_order.c
++	$(MV) -f ../Source/umf_apply_order.o umf_m_apply_order.o
++	$(MKOCT) -DDINT -c ../Source/umf_colamd.c
++	$(MV) -f ../Source/umf_colamd.o umf_m_colamd.o
++	$(MKOCT) -DDINT -c ../Source/umf_free.c
++	$(MV) -f ../Source/umf_free.o umf_m_free.o
++	$(MKOCT) -DDINT -c ../Source/umf_fsize.c
++	$(MV) -f ../Source/umf_fsize.o umf_m_fsize.o
++	$(MKOCT) -DDINT -c ../Source/umf_is_permutation.c
++	$(MV) -f ../Source/umf_is_permutation.o umf_m_is_permutation.o
++	$(MKOCT) -DDINT -c ../Source/umf_malloc.c
++	$(MV) -f ../Source/umf_malloc.o umf_m_malloc.o
++	$(MKOCT) -DDINT -c ../Source/umf_realloc.c
++	$(MV) -f ../Source/umf_realloc.o umf_m_realloc.o
++	$(MKOCT) -DDINT -c ../Source/umf_report_perm.c
++	$(MV) -f ../Source/umf_report_perm.o umf_m_report_perm.o
++	$(MKOCT) -DDINT -c ../Source/umf_singletons.c
++	$(MV) -f ../Source/umf_singletons.o umf_m_singletons.o
++	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
++	$(MV) -f ../Source/umf_ltsolve.o umf_od_lhsolve.o
++	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
++	$(MV) -f ../Source/umf_utsolve.o umf_od_uhsolve.o
++	$(MKOCT) -DDINT -DDO_MAP -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_nox.o
++	$(MKOCT) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_x.o
++	$(MKOCT) -DDINT -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_nox.o
++	$(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_x.o
++	$(MKOCT) -DDINT -DFIXQ -c ../Source/umf_assemble.c
++	$(MV) -f ../Source/umf_assemble.o umf_od_assemble_fixq.o
++	$(MKOCT) -DDINT -DDROP -c ../Source/umf_store_lu.c
++	$(MV) -f ../Source/umf_store_lu.o umf_od_store_lu_drop.o
++	$(MKOCT) -DDINT -c ../Source/umf_assemble.c
++	$(MV) -f ../Source/umf_assemble.o umf_od_assemble.o
++	$(MKOCT) -DDINT -c ../Source/umf_blas3_update.c
++	$(MV) -f ../Source/umf_blas3_update.o umf_od_blas3_update.o
++	$(MKOCT) -DDINT -c ../Source/umf_build_tuples.c
++	$(MV) -f ../Source/umf_build_tuples.o umf_od_build_tuples.o
++	$(MKOCT) -DDINT -c ../Source/umf_create_element.c
++	$(MV) -f ../Source/umf_create_element.o umf_od_create_element.o
++	$(MKOCT) -DDINT -c ../Source/umf_dump.c
++	$(MV) -f ../Source/umf_dump.o umf_od_dump.o
++	$(MKOCT) -DDINT -c ../Source/umf_extend_front.c
++	$(MV) -f ../Source/umf_extend_front.o umf_od_extend_front.o
++	$(MKOCT) -DDINT -c ../Source/umf_garbage_collection.c
++	$(MV) -f ../Source/umf_garbage_collection.o umf_od_garbage_collection.o
++	$(MKOCT) -DDINT -c ../Source/umf_get_memory.c
++	$(MV) -f ../Source/umf_get_memory.o umf_od_get_memory.o
++	$(MKOCT) -DDINT -c ../Source/umf_init_front.c
++	$(MV) -f ../Source/umf_init_front.o umf_od_init_front.o
++	$(MKOCT) -DDINT -c ../Source/umf_kernel.c
++	$(MV) -f ../Source/umf_kernel.o umf_od_kernel.o
++	$(MKOCT) -DDINT -c ../Source/umf_kernel_init.c
++	$(MV) -f ../Source/umf_kernel_init.o umf_od_kernel_init.o
++	$(MKOCT) -DDINT -c ../Source/umf_kernel_wrapup.c
++	$(MV) -f ../Source/umf_kernel_wrapup.o umf_od_kernel_wrapup.o
++	$(MKOCT) -DDINT -c ../Source/umf_local_search.c
++	$(MV) -f ../Source/umf_local_search.o umf_od_local_search.o
++	$(MKOCT) -DDINT -c ../Source/umf_lsolve.c
++	$(MV) -f ../Source/umf_lsolve.o umf_od_lsolve.o
++	$(MKOCT) -DDINT -c ../Source/umf_ltsolve.c
++	$(MV) -f ../Source/umf_ltsolve.o umf_od_ltsolve.o
++	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_element.c
++	$(MV) -f ../Source/umf_mem_alloc_element.o umf_od_mem_alloc_element.o
++	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_head_block.c
++	$(MV) -f ../Source/umf_mem_alloc_head_block.o umf_od_mem_alloc_head_block.o
++	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_tail_block.c
++	$(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_od_mem_alloc_tail_block.o
++	$(MKOCT) -DDINT -c ../Source/umf_mem_free_tail_block.c
++	$(MV) -f ../Source/umf_mem_free_tail_block.o umf_od_mem_free_tail_block.o
++	$(MKOCT) -DDINT -c ../Source/umf_mem_init_memoryspace.c
++	$(MV) -f ../Source/umf_mem_init_memoryspace.o umf_od_mem_init_memoryspace.o
++	$(MKOCT) -DDINT -c ../Source/umf_report_vector.c
++	$(MV) -f ../Source/umf_report_vector.o umf_od_report_vector.o
++	$(MKOCT) -DDINT -c ../Source/umf_row_search.c
++	$(MV) -f ../Source/umf_row_search.o umf_od_row_search.o
++	$(MKOCT) -DDINT -c ../Source/umf_scale_column.c
++	$(MV) -f ../Source/umf_scale_column.o umf_od_scale_column.o
++	$(MKOCT) -DDINT -c ../Source/umf_set_stats.c
++	$(MV) -f ../Source/umf_set_stats.o umf_od_set_stats.o
++	$(MKOCT) -DDINT -c ../Source/umf_solve.c
++	$(MV) -f ../Source/umf_solve.o umf_od_solve.o
++	$(MKOCT) -DDINT -c ../Source/umf_symbolic_usage.c
++	$(MV) -f ../Source/umf_symbolic_usage.o umf_od_symbolic_usage.o
++	$(MKOCT) -DDINT -c ../Source/umf_transpose.c
++	$(MV) -f ../Source/umf_transpose.o umf_od_transpose.o
++	$(MKOCT) -DDINT -c ../Source/umf_tuple_lengths.c
++	$(MV) -f ../Source/umf_tuple_lengths.o umf_od_tuple_lengths.o
++	$(MKOCT) -DDINT -c ../Source/umf_usolve.c
++	$(MV) -f ../Source/umf_usolve.o umf_od_usolve.o
++	$(MKOCT) -DDINT -c ../Source/umf_utsolve.c
++	$(MV) -f ../Source/umf_utsolve.o umf_od_utsolve.o
++	$(MKOCT) -DDINT -c ../Source/umf_valid_numeric.c
++	$(MV) -f ../Source/umf_valid_numeric.o umf_od_valid_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umf_valid_symbolic.c
++	$(MV) -f ../Source/umf_valid_symbolic.o umf_od_valid_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umf_grow_front.c
++	$(MV) -f ../Source/umf_grow_front.o umf_od_grow_front.o
++	$(MKOCT) -DDINT -c ../Source/umf_start_front.c
++	$(MV) -f ../Source/umf_start_front.o umf_od_start_front.o
++	$(MKOCT) -DDINT -c ../Source/umf_2by2.c
++	$(MV) -f ../Source/umf_2by2.o umf_od_2by2.o
++	$(MKOCT) -DDINT -c ../Source/umf_store_lu.c
++	$(MV) -f ../Source/umf_store_lu.o umf_od_store_lu.o
++	$(MKOCT) -DDINT -c ../Source/umf_scale.c
++	$(MV) -f ../Source/umf_scale.o umf_od_scale.o
++	$(MKOCT) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c
++	$(MV) -f ../Source/umfpack_solve.o umfpack_od_wsolve.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_col_to_triplet.c
++	$(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_od_col_to_triplet.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_defaults.c
++	$(MV) -f ../Source/umfpack_defaults.o umfpack_od_defaults.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_free_numeric.c
++	$(MV) -f ../Source/umfpack_free_numeric.o umfpack_od_free_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_free_symbolic.c
++	$(MV) -f ../Source/umfpack_free_symbolic.o umfpack_od_free_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_get_numeric.c
++	$(MV) -f ../Source/umfpack_get_numeric.o umfpack_od_get_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_get_lunz.c
++	$(MV) -f ../Source/umfpack_get_lunz.o umfpack_od_get_lunz.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_get_symbolic.c
++	$(MV) -f ../Source/umfpack_get_symbolic.o umfpack_od_get_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_get_determinant.c
++	$(MV) -f ../Source/umfpack_get_determinant.o umfpack_od_get_determinant.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_numeric.c
++	$(MV) -f ../Source/umfpack_numeric.o umfpack_od_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_qsymbolic.c
++	$(MV) -f ../Source/umfpack_qsymbolic.o umfpack_od_qsymbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_control.c
++	$(MV) -f ../Source/umfpack_report_control.o umfpack_od_report_control.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_info.c
++	$(MV) -f ../Source/umfpack_report_info.o umfpack_od_report_info.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_matrix.c
++	$(MV) -f ../Source/umfpack_report_matrix.o umfpack_od_report_matrix.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_numeric.c
++	$(MV) -f ../Source/umfpack_report_numeric.o umfpack_od_report_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_perm.c
++	$(MV) -f ../Source/umfpack_report_perm.o umfpack_od_report_perm.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_status.c
++	$(MV) -f ../Source/umfpack_report_status.o umfpack_od_report_status.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_symbolic.c
++	$(MV) -f ../Source/umfpack_report_symbolic.o umfpack_od_report_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_triplet.c
++	$(MV) -f ../Source/umfpack_report_triplet.o umfpack_od_report_triplet.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_report_vector.c
++	$(MV) -f ../Source/umfpack_report_vector.o umfpack_od_report_vector.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_solve.c
++	$(MV) -f ../Source/umfpack_solve.o umfpack_od_solve.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_symbolic.c
++	$(MV) -f ../Source/umfpack_symbolic.o umfpack_od_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_transpose.c
++	$(MV) -f ../Source/umfpack_transpose.o umfpack_od_transpose.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_triplet_to_col.c
++	$(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_od_triplet_to_col.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_scale.c
++	$(MV) -f ../Source/umfpack_scale.o umfpack_od_scale.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_load_numeric.c
++	$(MV) -f ../Source/umfpack_load_numeric.o umfpack_od_load_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_save_numeric.c
++	$(MV) -f ../Source/umfpack_save_numeric.o umfpack_od_save_numeric.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_load_symbolic.c
++	$(MV) -f ../Source/umfpack_load_symbolic.o umfpack_od_load_symbolic.o
++	$(MKOCT) -DDINT -c ../Source/umfpack_save_symbolic.c
++	$(MV) -f ../Source/umfpack_save_symbolic.o umfpack_od_save_symbolic.o
++	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
++	$(MV) -f ../Source/umf_ltsolve.o umf_oz_lhsolve.o
++	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
++	$(MV) -f ../Source/umf_utsolve.o umf_oz_uhsolve.o
++	$(MKOCT) -DZINT -DDO_MAP -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_nox.o
++	$(MKOCT) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_x.o
++	$(MKOCT) -DZINT -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_nox.o
++	$(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
++	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_x.o
++	$(MKOCT) -DZINT -DFIXQ -c ../Source/umf_assemble.c
++	$(MV) -f ../Source/umf_assemble.o umf_oz_assemble_fixq.o
++	$(MKOCT) -DZINT -DDROP -c ../Source/umf_store_lu.c
++	$(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu_drop.o
++	$(MKOCT) -DZINT -c ../Source/umf_assemble.c
++	$(MV) -f ../Source/umf_assemble.o umf_oz_assemble.o
++	$(MKOCT) -DZINT -c ../Source/umf_blas3_update.c
++	$(MV) -f ../Source/umf_blas3_update.o umf_oz_blas3_update.o
++	$(MKOCT) -DZINT -c ../Source/umf_build_tuples.c
++	$(MV) -f ../Source/umf_build_tuples.o umf_oz_build_tuples.o
++	$(MKOCT) -DZINT -c ../Source/umf_create_element.c
++	$(MV) -f ../Source/umf_create_element.o umf_oz_create_element.o
++	$(MKOCT) -DZINT -c ../Source/umf_dump.c
++	$(MV) -f ../Source/umf_dump.o umf_oz_dump.o
++	$(MKOCT) -DZINT -c ../Source/umf_extend_front.c
++	$(MV) -f ../Source/umf_extend_front.o umf_oz_extend_front.o
++	$(MKOCT) -DZINT -c ../Source/umf_garbage_collection.c
++	$(MV) -f ../Source/umf_garbage_collection.o umf_oz_garbage_collection.o
++	$(MKOCT) -DZINT -c ../Source/umf_get_memory.c
++	$(MV) -f ../Source/umf_get_memory.o umf_oz_get_memory.o
++	$(MKOCT) -DZINT -c ../Source/umf_init_front.c
++	$(MV) -f ../Source/umf_init_front.o umf_oz_init_front.o
++	$(MKOCT) -DZINT -c ../Source/umf_kernel.c
++	$(MV) -f ../Source/umf_kernel.o umf_oz_kernel.o
++	$(MKOCT) -DZINT -c ../Source/umf_kernel_init.c
++	$(MV) -f ../Source/umf_kernel_init.o umf_oz_kernel_init.o
++	$(MKOCT) -DZINT -c ../Source/umf_kernel_wrapup.c
++	$(MV) -f ../Source/umf_kernel_wrapup.o umf_oz_kernel_wrapup.o
++	$(MKOCT) -DZINT -c ../Source/umf_local_search.c
++	$(MV) -f ../Source/umf_local_search.o umf_oz_local_search.o
++	$(MKOCT) -DZINT -c ../Source/umf_lsolve.c
++	$(MV) -f ../Source/umf_lsolve.o umf_oz_lsolve.o
++	$(MKOCT) -DZINT -c ../Source/umf_ltsolve.c
++	$(MV) -f ../Source/umf_ltsolve.o umf_oz_ltsolve.o
++	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_element.c
++	$(MV) -f ../Source/umf_mem_alloc_element.o umf_oz_mem_alloc_element.o
++	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_head_block.c
++	$(MV) -f ../Source/umf_mem_alloc_head_block.o umf_oz_mem_alloc_head_block.o
++	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_tail_block.c
++	$(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_oz_mem_alloc_tail_block.o
++	$(MKOCT) -DZINT -c ../Source/umf_mem_free_tail_block.c
++	$(MV) -f ../Source/umf_mem_free_tail_block.o umf_oz_mem_free_tail_block.o
++	$(MKOCT) -DZINT -c ../Source/umf_mem_init_memoryspace.c
++	$(MV) -f ../Source/umf_mem_init_memoryspace.o umf_oz_mem_init_memoryspace.o
++	$(MKOCT) -DZINT -c ../Source/umf_report_vector.c
++	$(MV) -f ../Source/umf_report_vector.o umf_oz_report_vector.o
++	$(MKOCT) -DZINT -c ../Source/umf_row_search.c
++	$(MV) -f ../Source/umf_row_search.o umf_oz_row_search.o
++	$(MKOCT) -DZINT -c ../Source/umf_scale_column.c
++	$(MV) -f ../Source/umf_scale_column.o umf_oz_scale_column.o
++	$(MKOCT) -DZINT -c ../Source/umf_set_stats.c
++	$(MV) -f ../Source/umf_set_stats.o umf_oz_set_stats.o
++	$(MKOCT) -DZINT -c ../Source/umf_solve.c
++	$(MV) -f ../Source/umf_solve.o umf_oz_solve.o
++	$(MKOCT) -DZINT -c ../Source/umf_symbolic_usage.c
++	$(MV) -f ../Source/umf_symbolic_usage.o umf_oz_symbolic_usage.o
++	$(MKOCT) -DZINT -c ../Source/umf_transpose.c
++	$(MV) -f ../Source/umf_transpose.o umf_oz_transpose.o
++	$(MKOCT) -DZINT -c ../Source/umf_tuple_lengths.c
++	$(MV) -f ../Source/umf_tuple_lengths.o umf_oz_tuple_lengths.o
++	$(MKOCT) -DZINT -c ../Source/umf_usolve.c
++	$(MV) -f ../Source/umf_usolve.o umf_oz_usolve.o
++	$(MKOCT) -DZINT -c ../Source/umf_utsolve.c
++	$(MV) -f ../Source/umf_utsolve.o umf_oz_utsolve.o
++	$(MKOCT) -DZINT -c ../Source/umf_valid_numeric.c
++	$(MV) -f ../Source/umf_valid_numeric.o umf_oz_valid_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umf_valid_symbolic.c
++	$(MV) -f ../Source/umf_valid_symbolic.o umf_oz_valid_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umf_grow_front.c
++	$(MV) -f ../Source/umf_grow_front.o umf_oz_grow_front.o
++	$(MKOCT) -DZINT -c ../Source/umf_start_front.c
++	$(MV) -f ../Source/umf_start_front.o umf_oz_start_front.o
++	$(MKOCT) -DZINT -c ../Source/umf_2by2.c
++	$(MV) -f ../Source/umf_2by2.o umf_oz_2by2.o
++	$(MKOCT) -DZINT -c ../Source/umf_store_lu.c
++	$(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu.o
++	$(MKOCT) -DZINT -c ../Source/umf_scale.c
++	$(MV) -f ../Source/umf_scale.o umf_oz_scale.o
++	$(MKOCT) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c
++	$(MV) -f ../Source/umfpack_solve.o umfpack_oz_wsolve.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_col_to_triplet.c
++	$(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_oz_col_to_triplet.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_defaults.c
++	$(MV) -f ../Source/umfpack_defaults.o umfpack_oz_defaults.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_free_numeric.c
++	$(MV) -f ../Source/umfpack_free_numeric.o umfpack_oz_free_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_free_symbolic.c
++	$(MV) -f ../Source/umfpack_free_symbolic.o umfpack_oz_free_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_get_numeric.c
++	$(MV) -f ../Source/umfpack_get_numeric.o umfpack_oz_get_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_get_lunz.c
++	$(MV) -f ../Source/umfpack_get_lunz.o umfpack_oz_get_lunz.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_get_symbolic.c
++	$(MV) -f ../Source/umfpack_get_symbolic.o umfpack_oz_get_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_get_determinant.c
++	$(MV) -f ../Source/umfpack_get_determinant.o umfpack_oz_get_determinant.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_numeric.c
++	$(MV) -f ../Source/umfpack_numeric.o umfpack_oz_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_qsymbolic.c
++	$(MV) -f ../Source/umfpack_qsymbolic.o umfpack_oz_qsymbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_control.c
++	$(MV) -f ../Source/umfpack_report_control.o umfpack_oz_report_control.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_info.c
++	$(MV) -f ../Source/umfpack_report_info.o umfpack_oz_report_info.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_matrix.c
++	$(MV) -f ../Source/umfpack_report_matrix.o umfpack_oz_report_matrix.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_numeric.c
++	$(MV) -f ../Source/umfpack_report_numeric.o umfpack_oz_report_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_perm.c
++	$(MV) -f ../Source/umfpack_report_perm.o umfpack_oz_report_perm.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_status.c
++	$(MV) -f ../Source/umfpack_report_status.o umfpack_oz_report_status.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_symbolic.c
++	$(MV) -f ../Source/umfpack_report_symbolic.o umfpack_oz_report_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_triplet.c
++	$(MV) -f ../Source/umfpack_report_triplet.o umfpack_oz_report_triplet.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_report_vector.c
++	$(MV) -f ../Source/umfpack_report_vector.o umfpack_oz_report_vector.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_solve.c
++	$(MV) -f ../Source/umfpack_solve.o umfpack_oz_solve.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_symbolic.c
++	$(MV) -f ../Source/umfpack_symbolic.o umfpack_oz_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_transpose.c
++	$(MV) -f ../Source/umfpack_transpose.o umfpack_oz_transpose.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_triplet_to_col.c
++	$(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_oz_triplet_to_col.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_scale.c
++	$(MV) -f ../Source/umfpack_scale.o umfpack_oz_scale.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_load_numeric.c
++	$(MV) -f ../Source/umfpack_load_numeric.o umfpack_oz_load_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_save_numeric.c
++	$(MV) -f ../Source/umfpack_save_numeric.o umfpack_oz_save_numeric.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_load_symbolic.c
++	$(MV) -f ../Source/umfpack_load_symbolic.o umfpack_oz_load_symbolic.o
++	$(MKOCT) -DZINT -c ../Source/umfpack_save_symbolic.c
++	$(MV) -f ../Source/umfpack_save_symbolic.o umfpack_oz_save_symbolic.o
++	$(MKOCT) -c ../Source/umfpack_timer.c
++	$(MV) -f ../Source/umfpack_timer.o umfpack_m_timer.o
++	$(MKOCT) -c ../Source/umfpack_tictoc.c
++	$(MV) -f ../Source/umfpack_tictoc.o umfpack_m_tictoc.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_aat.c
++	$(MV) -f ../../AMD/Source/amd_aat.o amd_m_aat.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_1.c
++	$(MV) -f ../../AMD/Source/amd_1.o amd_m_1.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_2.c
++	$(MV) -f ../../AMD/Source/amd_2.o amd_m_2.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_dump.c
++	$(MV) -f ../../AMD/Source/amd_dump.o amd_m_dump.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_postorder.c
++	$(MV) -f ../../AMD/Source/amd_postorder.o amd_m_postorder.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_post_tree.c
++	$(MV) -f ../../AMD/Source/amd_post_tree.o amd_m_post_tree.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_defaults.c
++	$(MV) -f ../../AMD/Source/amd_defaults.o amd_m_defaults.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_order.c
++	$(MV) -f ../../AMD/Source/amd_order.o amd_m_order.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_control.c
++	$(MV) -f ../../AMD/Source/amd_control.o amd_m_control.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_info.c
++	$(MV) -f ../../AMD/Source/amd_info.o amd_m_info.o
++	$(MKOCT) -DDINT -c ../../AMD/Source/amd_valid.c
++	$(MV) -f ../../AMD/Source/amd_valid.o amd_m_valid.o
++	$(MKOCT) -o umfpack.oct $(OCT_SPARSE_INC) umfpack.cc \
++	    umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \
++	    umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \
++	    umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \
++	    umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \
++	    umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \
++	    umf_od_triplet_map_x.o umf_od_assemble_fixq.o \
++	    umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \
++	    umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \
++	    umf_od_extend_front.o umf_od_garbage_collection.o \
++	    umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \
++	    umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \
++	    umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \
++	    umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \
++	    umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \
++	    umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \
++	    umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \
++	    umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \
++	    umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \
++	    umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \
++	    umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \
++	    umfpack_od_col_to_triplet.o umfpack_od_defaults.o \
++	    umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \
++	    umfpack_od_get_numeric.o umfpack_od_get_lunz.o \
++	    umfpack_od_get_symbolic.o umfpack_od_numeric.o \
++	    umfpack_od_qsymbolic.o umfpack_od_report_control.o \
++	    umfpack_od_report_info.o umfpack_od_report_matrix.o \
++	    umfpack_od_report_numeric.o umfpack_od_report_perm.o \
++	    umfpack_od_report_status.o umfpack_od_report_symbolic.o \
++	    umfpack_od_report_triplet.o umfpack_od_report_vector.o \
++	    umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \
++	    umfpack_od_triplet_to_col.o umfpack_od_scale.o \
++	    umfpack_od_load_numeric.o umfpack_od_save_numeric.o \
++	    umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \
++	    umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \
++	    umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \
++	    umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \
++	    umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \
++	    umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \
++	    umf_oz_extend_front.o umf_oz_garbage_collection.o \
++	    umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \
++	    umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \
++	    umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \
++	    umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \
++	    umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \
++	    umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \
++	    umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \
++	    umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \
++	    umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \
++	    umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \
++	    umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \
++	    umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \
++	    umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \
++	    umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \
++	    umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \
++	    umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \
++	    umfpack_oz_report_info.o umfpack_oz_report_matrix.o \
++	    umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \
++	    umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \
++	    umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \
++	    umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \
++	    umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \
++	    umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \
++	    umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \
++	    umfpack_o_timer.o umfpack_o_tictoc.o \
++	    amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \
++	    amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \
++	    amd_o_control.o amd_o_info.o amd_o_valid.o
++
++luflop: luflop.cc
++	$(MKOCT) luflop.cc -I$(OCT_SPARSE_INC) -o luflop.oct
++
++#----------------------------------------
++# umfpack library to link with octave
++#----------------------------------------
++
++octave: umfpack
++	ld -r -o ../../../$(OCTUMFPACK_LIB) \
++	    umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \
++	    umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \
++	    umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \
++	    umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \
++	    umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \
++	    umf_od_triplet_map_x.o umf_od_assemble_fixq.o \
++	    umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \
++	    umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \
++	    umf_od_extend_front.o umf_od_garbage_collection.o \
++	    umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \
++	    umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \
++	    umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \
++	    umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \
++	    umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \
++	    umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \
++	    umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \
++	    umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \
++	    umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \
++	    umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \
++	    umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \
++	    umfpack_od_col_to_triplet.o umfpack_od_defaults.o \
++	    umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \
++	    umfpack_od_get_numeric.o umfpack_od_get_lunz.o \
++	    umfpack_od_get_symbolic.o umfpack_od_numeric.o \
++	    umfpack_od_qsymbolic.o umfpack_od_report_control.o \
++	    umfpack_od_report_info.o umfpack_od_report_matrix.o \
++	    umfpack_od_report_numeric.o umfpack_od_report_perm.o \
++	    umfpack_od_report_status.o umfpack_od_report_symbolic.o \
++	    umfpack_od_report_triplet.o umfpack_od_report_vector.o \
++	    umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \
++	    umfpack_od_triplet_to_col.o umfpack_od_scale.o \
++	    umfpack_od_load_numeric.o umfpack_od_save_numeric.o \
++	    umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \
++	    umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \
++	    umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \
++	    umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \
++	    umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \
++	    umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \
++	    umf_oz_extend_front.o umf_oz_garbage_collection.o \
++	    umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \
++	    umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \
++	    umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \
++	    umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \
++	    umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \
++	    umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \
++	    umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \
++	    umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \
++	    umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \
++	    umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \
++	    umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \
++	    umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \
++	    umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \
++	    umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \
++	    umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \
++	    umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \
++	    umfpack_oz_report_info.o umfpack_oz_report_matrix.o \
++	    umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \
++	    umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \
++	    umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \
++	    umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \
++	    umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \
++	    umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \
++	    umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \
++	    umfpack_o_timer.o umfpack_o_tictoc.o \
++	    amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \
++	    amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \
++	    amd_o_control.o amd_o_info.o amd_o_valid.o
++
++#-------------------------------------------------------------------------------
++# Remove all but the files in the original distribution
++#-------------------------------------------------------------------------------
++
++purge: clean
++	- $(RM) *.oct* *.dll
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_btf.m UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_btf.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,129 @@
++function x = umfpack_btf (A, b, Control)
++% UMFPACK_BTF
++%
++% x = umfpack_btf (A, b, Control)
++%
++% solve Ax=b by first permuting the matrix A to block triangular form via dmperm
++% and then using UMFPACK to factorize each diagonal block.  Adjacent 1-by-1
++% blocks are merged into a single upper triangular block, and solved via
++% MATLAB's \ operator.  The Control parameter is optional (Type umfpack_details
++% and umfpack_report for details on its use).  A must be square.
++%
++% See also:  umfpack, umfpack_factorize, umfpack_details, dmperm
++
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  Type umfpack_details for License.
++
++if (nargin < 2)
++    help umfpack_btf
++    error ('Usage: x = umfpack_btf (A, b, Control)') ;
++end
++
++[m n] = size (A) ;
++if (m ~= n)
++    help umfpack_btf
++    error ('umfpack_btf:  A must be square') ;
++end
++[m1 n1] = size (b) ;
++if (m1 ~= n)
++    help umfpack_btf
++    error ('umfpack_btf:  b has the wrong dimensions') ;
++end
++
++if (nargin < 3)
++    Control = umfpack ;
++end
++
++%-------------------------------------------------------------------------------
++% find the block triangular form
++%-------------------------------------------------------------------------------
++
++[p,q,r] = dmperm (A) ;
++nblocks = length (r) - 1 ;
++
++%-------------------------------------------------------------------------------
++% solve the system
++%-------------------------------------------------------------------------------
++
++if (nblocks == 1 | sprank (A) < n)
++
++    %---------------------------------------------------------------------------
++    % matrix is irreducible or structurally singular
++    %---------------------------------------------------------------------------
++
++    x = umfpack_solve (A, '\\', b, Control) ;
++
++else
++
++    %---------------------------------------------------------------------------
++    % A (p,q) is in block triangular form
++    %---------------------------------------------------------------------------
++
++    b = b (p,:) ;
++    A = A (p,q) ;
++    x = zeros (size (b)) ;
++
++    %---------------------------------------------------------------------------
++    % merge adjacent singletons into a single upper triangular block
++    %---------------------------------------------------------------------------
++
++    [r, nblocks, is_triangular] = merge_singletons (r) ;
++
++    %---------------------------------------------------------------------------
++    % solve the system: x (q) = A\b
++    %---------------------------------------------------------------------------
++
++    for k = nblocks:-1:1
++
++	% get the kth block
++        k1 = r (k) ;
++        k2 = r (k+1) - 1 ;
++
++	% solve the system
++	x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ...
++	    is_triangular (k), Control) ;
++
++        % off-diagonal block back substitution
++        b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ;
++
++    end
++
++    x (q,:) = x ;
++
++end
++
++%-------------------------------------------------------------------------------
++% merge_singletons
++%-------------------------------------------------------------------------------
++
++function [r, nblocks, is_triangular] = merge_singletons (r)
++%
++% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that
++% reflects the merger of adjacent singletons into a single upper triangular
++% block.  is_triangular (k) is 1 if the kth block is upper triangular.  nblocks
++% is the number of new blocks.
++
++nblocks = length (r) - 1 ;
++bsize = r (2:nblocks+1) - r (1:nblocks) ;
++t = [0 (bsize == 1)] ;
++z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ;
++y = [(find (z)) nblocks+1] ;
++r = r (y) ;
++nblocks = length (y) - 1 ;
++is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ;
++
++%-------------------------------------------------------------------------------
++% solve Ax=b, but check for small and/or triangular systems
++%-------------------------------------------------------------------------------
++
++function x = solver (A, b, is_triangular, Control)
++if (is_triangular)
++    % back substitution only
++    x = A \ b ;
++elseif (size (A,1) < 4)
++    % a very small matrix, solve it as a dense linear system
++    x = full (A) \ b ;
++else
++    % solve it as a sparse linear system
++    x = umfpack_solve (A, '\\', b, Control) ;
++end
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack.cc UMFPACK/UMFPACK/OCTAVE/umfpack.cc
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack.cc	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack.cc	2005-02-01 21:58:15.885225363 +0100
+@@ -0,0 +1,1399 @@
++/*
++
++Copyright (C) 2004 David Bateman
++
++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; see the file COPYING.  If not, write to the Free
++Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++
++In addition to the terms of the GPL, you are permitted to link
++this program with any Open Source program, as defined by the
++Open Source Initiative (www.opensource.org)
++
++*/
++
++/*
++
++This is the Octave interface to the UMFPACK code, which bore the following
++copyright
++
++  UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++  Davis.  All Rights Reserved.  See ../README for License.
++  email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
++  web: http://www.cise.ufl.edu/research/sparse/umfpack
++
++*/
++
++#include <cfloat>
++#include <cstdlib>
++#include <string>
++
++#include <octave/config.h>
++#include <octave/ov.h>
++#include <octave/defun-dld.h>
++#include <octave/pager.h>
++#include <octave/ov-re-mat.h>
++
++#include "ov-re-sparse.h"
++#include "ov-cx-sparse.h"
++
++// External UMFPACK functions in C
++extern "C" {
++#include "umfpack.h"
++}
++
++#define MIN(a,b) (((a) < (b)) ? (a) : (b))
++#define MAX(a,b) (((a) > (b)) ? (a) : (b))
++
++// Return an error message
++static 
++void umfpack_error (const char *s, int A_is_complex, int nargout,
++		    octave_value_list retval, NDArray Control, 
++		    NDArray Info, int status, int do_info)
++{
++  if (A_is_complex)
++    {
++      umfpack_zi_report_status (Control.fortran_vec (), status) ;
++      umfpack_zi_report_info (Control.fortran_vec (), Info.fortran_vec ()) ;
++    }
++  else
++    {
++      umfpack_di_report_status (Control.fortran_vec (), status) ;
++      umfpack_di_report_info (Control.fortran_vec (), Info.fortran_vec ()) ;
++    }
++  if (do_info > 0)
++    // return Info
++    retval (do_info) = octave_value (Info);
++
++  error (s);
++}
++
++DEFUN_DLD (umfpack, args, nargout,
++    "-*- texinfo -*-\n\
++@deftypefn {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b})\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b}, @var{Control})\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', @var{b}, @var{Control})\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', b)\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', A) ;\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}) ;\n\
++@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}) ;\n\
++@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic') ;\n\
++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic', @var{Control}) ;\n\
++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic') ;\n\
++@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic', @var{Control});\n\
++@deftypefnx {Loadable Function} {@var{Control} =} umfpack ;\n\
++\n\
++UMFPACK v4.3 is a Octave oct-file for solving sparse linear systems.\n\
++\n\
++@iftex\n\
++@tex\n\
++\\vskip 2ex\n\
++\\hfil\\vbox{\n\
++\\offinterlineskip\n\
++\\tabskip=0pt\n\
++\\halign{\n\
++\\vrule height1.75ex depth1.25ex width 0.6pt #\\tabskip=1em &\n\
++\\hfil #\\hfil &\\vrule # & \n\
++\\hfil #\\hfil &\\vrule # width 0.6pt \\tabskip=0pt\\cr\n\
++\\noalign{\\hrule height 0.6pt}\n\
++&     UMFPACK v4.3                  && OCTAVE approximate equivalent  &\\cr\n\
++\\noalign{\\hrule} \n\
++& x = umfpack (A, '\\', b) ;        &&  x = A \\ b                    &\\cr\n\
++&                                   &&                                &\\cr\n\
++&x = umfpack (b, '/', A) ;          &&  x = b / A                     &\\cr\n\
++&                                   &&                                &\\cr\n\
++&[L,U,P,Q] = umfpack (A) ;          &&  [m,n] = size (A) ;            &\\cr\n\
++&                                   &&  I = speye (n) ;               &\\cr\n\
++&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
++&                                   &&  [L,U,P] = lu (A*Q) ;          &\\cr\n\
++&                                   &&                                &\\cr\n\
++&[L,U,P,Q,R] = umfpack (A) ;        &&  [m,n] = size (A) ;            &\\cr\n\
++&                                   &&  I = speye (n) ;               &\\cr\n\
++&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
++&                                   &&  r = full (sum (abs (A), 2)) ; &\\cr\n\
++&                                   &&  r (find (r == 0)) = 1 ;       &\\cr\n\
++&                                   &&  R = spdiags (r, 0, m, m) ;    &\\cr\n\
++&                                   &&  [L,U,P] = lu ((R\\A)*Q) ;     &\\cr\n\
++&                                   &&                                &\\cr\n\
++&[P,Q,F,C] = umfpack (A, 'symbolic')&&  [m,n] = size (A) ;            &\\cr\n\
++&                                   &&  I = speye (n) ;               &\\cr\n\
++&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
++&                                   &&  [count,h,parent,post] = ...   &\\cr\n\
++&                                   &&  symbfact (A*Q, 'col') ;       &\\cr\n\
++\\noalign{\\hrule height 0.6pt}\n\
++}}\\hfil\n\
++\\vskip 1ex\n\
++@end tex\n\
++@end iftex\n\
++@ifinfo\n\
++@multitable @columnfractions 0.43 .02 .43\n\
++@item UMFPACK v4.3:                       @tab | \n\
++@tab OCTAVE approx. equivalent\n\
++@item -------------------------------     @tab | \n\
++@tab --------------------------------\n\
++@item x = umfpack (A, '\\', b) ;          @tab | \n\
++@tab x = A \\ b\n\
++@item                                     @tab | \n\
++@tab\n\
++@item x = umfpack (b, '/', A) ;           @tab | \n\
++@tab  x = b / A\n\
++@item                                     @tab | \n\
++@tab\n\
++@item [L,U,P,Q] = umfpack (A) ;           @tab | \n\
++@tab  [m,n] = size (A) ;\n\
++@item                                     @tab | \n\
++@tab  I = speye (n) ;\n\
++@item                                     @tab | \n\
++@tab  Q = I (:, colamd (A)) ;\n\
++@item                                     @tab | \n\
++@tab  [L,U,P] = lu (A*Q) ;\n\
++@item                                     @tab | \n\
++@tab\n\
++@item [L,U,P,Q,R] = umfpack (A) ;         @tab | \n\
++@tab  [m,n] = size (A) ;\n\
++@item                                     @tab | \n\
++@tab  I = speye (n) ;\n\
++@item                                     @tab | \n\
++@tab  Q = I (:, colamd (A)) ;\n\
++@item                                     @tab | \n\
++@tab  r = full (sum (abs (A), 2)) ;\n\
++@item                                     @tab | \n\
++@tab  r (find (r == 0)) = 1 ;\n\
++@item                                     @tab | \n\
++@tab  R = spdiags (r, 0, m, m) ;\n\
++@item                                     @tab | \n\
++@tab  [L,U,P] = lu ((R\\A)*Q) ;\n\
++@item                                     @tab | \n\
++@tab\n\
++@item [P,Q,F,C] = umfpack (A, 'symbolic') @tab | \n\
++@tab  [m,n] = size (A) ; \n\
++@item                                     @tab | \n\
++@tab  I = speye (n) ;\n\
++@item                                     @tab | \n\
++@tab  Q = I (:, colamd (A)) ;\n\
++@item                                     @tab | \n\
++@tab  [count,h,parent,post] = ...\n\
++@item                                     @tab | \n\
++@tab  symbfact (A*Q, 'col') ;\n\
++@end multitable\n\
++@end ifinfo\n\
++\n\
++A must be sparse.  It can be complex, singular, and/or rectangular.\n\
++A must be square for '/' or '\\'.  b must be a full real or complex\n\
++vector.  For @code{[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}] =\n\
++umfpack (@var{a})}, the factorization is @code{@var{l} * @var{u} =\n\
++@var{p} * (@var{r} \\ @var{a}) * @var{q}}. If @var{a} has a mostly\n\
++symmetric nonzero pattern, then replace @dfn{colamd} with @dfn{amd}\n\
++in the OCTAVE-equivalent column in the table above.\n\
++\n\
++Factor or solve a sparse linear system, returning either the solution\n\
++@var{x} to @code{@var{A} * @var{x} = @var{b}} or @code{@var{A}' * @var{x}'\n\
++= @var{b}'}, the factorization LU=PAQ, or LU=P(R\\A)Q.  A must be sparse.\n\
++For the solve, A must be square and b must be a dense n-by-1 vector.  For LU\n\
++factorization, A can be rectangular.  In both cases, A and/or b can be real\n\
++or complex.\n\
++\n\
++UMFPACK analyzes the matrix and selects one of three strategies to factorize\n\
++the matrix. It first finds a set of k initial pivot entries of zero\n\
++Markowitz cost. This forms the first k rows and columns of L and U. The\n\
++remaining submatrix S is then analyzed, based on the symmetry of the nonzero\n\
++pattern of the submatrix and the values on the diagaonal.  The strategies\n\
++include:\n\
++\n\
++@table @asis\n\
++@item unsymmetric\n\
++Use a COLAMD pre-ordering, a column elimination tree\n\
++post-ordering, refine the column ordering during factorization,\n\
++and make no effort at selecting pivots on the diagonal.\n\
++@item 2-by-2\n\
++Like the symmetric strategy (see below), except that local\n\
++row permutations are first made to attempt to place large entries\n\
++on the diagonal.\n\
++@item symmetric\n\
++Use an AMD pre-ordering on the matrix @code{@var{s} + @var{s}'}, an\n\
++elimination tree post-ordering, do not refine the column ordering during\n\
++factorization, and attempt to select pivots on the diagonal.\n\
++@end table\n\
++\n\
++Each of the following uses of umfpack (except for 'Control = umfpack') is\n\
++stand-alone.  That is, no call to umfpack is required for any subsequent\n\
++call. In each usage, the Info output argument is optional.\n\
++\n\
++Usage:\n\
++\n\
++[x, Info] = umfpack (A, '\\', b) ;\n\
++[x, Info] = umfpack (A, '\\', b, Control) ;\n\
++[x, Info] = umfpack (A, Qinit, '\\', b, Control) ;\n\
++[x, Info] = umfpack (A, Qinit, '\\', b) ;\n\
++\n\
++     Solves Ax=b (similar to x = A\\b in OCTAVE).\n\
++\n\
++[x, Info] = umfpack (b, '/', A) ;\n\
++[x, Info] = umfpack (b, '/', A, Control) ;\n\
++[x, Info] = umfpack (b, '/', A, Qinit) ;\n\
++[x, Info] = umfpack (b, '/', A, Qinit, Control) ;\n\
++\n\
++     Solves A'x'=b' (similar to x = b/A in OCTAVE).\n\
++\n\
++[L, U, P, Q, R, Info] = umfpack (A) ;\n\
++[L, U, P, Q, R, Info] = umfpack (A, Control) ;\n\
++[L, U, P, Q, R, Info] = umfpack (A, Qinit) ;\n\
++[L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;\n\
++\n\
++     Returns the LU factorization of A.  P and Q are returned as permutation\n\
++     matrices.  R is a diagonal sparse matrix of scale factors for the rows\n\
++     of A, L is lower triangular, and U is upper triangular.  The\n\
++     factorization is L*U = P*(R\\A)*Q.  You can turn off scaling by setting\n\
++     Control (17) to zero (in which case R = speye (m)), or by using the\n\
++     following syntaxes (in which case Control (17) is ignored):\n\
++\n\
++[L, U, P, Q] = umfpack (A) ;\n\
++[L, U, P, Q] = umfpack (A, Control) ;\n\
++[L, U, P, Q] = umfpack (A, Qinit) ;\n\
++[L, U, P, Q] = umfpack (A, Qinit, Control) ;\n\
++\n\
++     Same as above, except that no row scaling is performed.  The Info array\n\
++     is not returned, either.\n\
++\n\
++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;\n\
++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ;\n\
++[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ;\n\
++[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control);\n\
++\n\
++     Performs only the fill-reducing column pre-ordering (including the\n\
++     elimination tree post-ordering) and symbolic factorization.  Q1 is the\n\
++     initial column permutation (either from colamd, amd, or the input\n\
++     ordering Qinit), possibly followed by a column elimination tree post-\n\
++     ordering or a symmetric elimination tree post-ordering, depending on\n\
++     the strategy used.\n\
++\n\
++     For the unsymmetric strategy, P1 is the row ordering induced by Q1\n\
++     (row-merge order). For the 2-by-2 strategy, P1 is the row ordering that\n\
++     places large entries on the diagonal of P1*A*Q1.  For the symmetric\n\
++     strategy, P1 = Q1.\n\
++\n\
++     Fr is a (nfr+1)-by-4 array containing information about each frontal\n\
++     matrix, where nfr <= n is the number of frontal matrices.  Fr (:,1) is\n\
++     the number of pivot columns in each front, and Fr (:,2) is the parent\n\
++     of each front in the supercolumn elimination tree.  Fr (k,2) is zero if\n\
++     k is a root.  The first Fr (1,1) columns of P1*A*Q1 are the pivot\n\
++     columns for the first front, the next Fr (2,1) columns of P1*A*Q1\n\
++     are the pivot columns for the second front, and so on.\n\
++\n\
++     For the unsymmetric strategy, Fr (:,3) is the row index of the first\n\
++     row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for\n\
++     the kth front.  Fr (:,4) is the leftmost descendent of the kth front.\n\
++     Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set\n\
++     of candidate pivot rows for the kth front (some of these will typically\n\
++     have been selected as pivot rows of fronts Fr (k,3) to k-1, before the\n\
++     factorization reaches the kth front.  If front k is a leaf node, then\n\
++     Fr (k,4) is k.\n\
++\n\
++     Ch is a (nchains+1)-by-3 array containing information about each\n\
++     'chain' (unifrontal sequence) of frontal matrices, and where\n\
++      nchains <= nfr is the number of chains. The ith chain consists of\n\
++     frontal matrices. Chain (i,1) to Chain (i+1,1)-1, and the largest\n\
++     front in chain i is Chain (i,2)-by-Chain (i,3).\n\
++\n\
++     This use of umfpack is not required to factor or solve a linear system\n\
++     in OCTAVE.  It analyzes the matrix A and provides information only.\n\
++     The OCTAVE statement @code{treeplot (Fr (:,2)')} plots the column\n\
++     elimination tree.\n\
++\n\
++Control = umfpack ;\n\
++\n\
++      Returns a 20-by-1 vector of default parameter settings for umfpack.\n\
++\n\
++umfpack_report (Control, Info) ;\n\
++\n\
++      Prints the current Control settings, and Info\n\
++\n\
++If present, Qinit is a user-supplied 1-by-n permutation vector.  It is an\n\
++initial fill-reducing column pre-ordering for A; if not present, then colamd\n\
++or amd are used instead.  If present, Control is a user-supplied 20-by-1\n\
++array.   Control and Info are optional; if Control is not present, defaults\n\
++are used.  If a Control entry is NaN, then the default is used for that entry.\n\
++\n\
++UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by\n\
++Timothy A. Davis.  All Rights Reserved.\n\
++\n\
++UMFPACK License:\n\
++\n\
++@example\n\
++Your use or distribution of UMFPACK or any modified version of\n\
++UMFPACK implies that you agree to this License.\n\
++\n\
++THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\
++EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n\
++\n\
++Permission is hereby granted to use or copy this program, provided\n\
++that the Copyright, this License, and the Availability of the original\n\
++version is retained on all copies.  User documentation of any code that\n\
++uses UMFPACK or any modified version of UMFPACK code must cite the\n\
++Copyright, this License, the Availability note, and 'Used by permission.'\n\
++Permission to modify the code and to distribute modified code is granted,\n\
++provided the Copyright, this License, and the Availability note are\n\
++retained, and a notice that the code was modified is included.  This\n\
++software was developed with support from the National Science Foundation,\n\
++and is provided to you free of charge.\n\
++@end example\n\
++\n\
++Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n\
++@end deftypefn\n\
++@seealso{lu_normtest, colamd, amd, umfpack_solve}")
++{
++  octave_value_list retval;
++  int nargin = args.length ();
++  int op = 0;
++  std::string operation;
++  bool do_solve = false;
++  int do_info = 0;
++
++  ColumnVector User_Qinit;
++  SparseComplexMatrix CAmatrix;
++  ComplexMatrix CBmatrix;
++  SparseMatrix Amatrix;
++  Matrix Bmatrix;
++  NDArray User_Control_matrix;
++
++  bool A_is_complex = false;
++  bool B_is_complex = false;
++  bool X_is_complex = false;
++  bool transpose = false;
++  bool have_User_Qinit  = false;
++  bool have_User_Control_matrix = false;
++  bool do_numeric = true;
++  bool no_scale = false;
++
++  // find the operator
++  for (int i = 0 ; i < nargin ; i++)
++    {
++      if (args(i).is_string ())
++	{
++	  op = i;
++	  break;
++	}
++    }
++
++  if (op > 0)
++    {
++      std::string op_type = args (op).string_value ();
++
++      if (op_type == "\\")
++	{
++
++	  // matrix left divide, x = A\b 
++	  
++	  //  [x, Info] = umfpack (A, '\', b) ;
++	  //  [x, Info] = umfpack (A, '\', b, Control) ;
++	  //  [x, Info] = umfpack (A, Qinit, '\', b, Control) ;
++	  //  [x, Info] = umfpack (A, Qinit, '\', b) ;
++
++	  do_solve = true;
++	  operation = "x = A\\b";
++
++	  if (args(0).class_name () != "sparse")
++	    {
++	      error ("umfpack: input matrix A must be sparse");
++	      return retval;
++	    }
++	  
++	  if (args(0).is_complex_type ())
++	    {
++	      CAmatrix = args(0).sparse_complex_matrix_value ();
++	      A_is_complex = true;
++	    }
++	  else
++	    Amatrix = args(0).sparse_matrix_value ();
++
++
++	  if (args(op+1).is_complex_type ())
++	    {
++	      CBmatrix = args(op+1).complex_matrix_value ();
++	      B_is_complex = true;
++	    }
++	  else
++	    Bmatrix = args(op+1).matrix_value ();
++
++	  if (nargout == 2)
++	    do_info = 1;
++
++	  if (op == 2)
++	    {
++	      User_Qinit = args(1).column_vector_value ();
++	      have_User_Qinit = true;
++	    }
++
++	  if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5))
++	    {
++	      User_Control_matrix = args(nargin-1).array_value ();
++	      have_User_Control_matrix = true;
++	    }
++
++	  if (error_state)
++	    {
++	      error ("umfpack: incorrect argument type");
++	      return retval;
++	    }
++
++	  if (nargin < 3 || nargin > 5 || nargout > 2)
++	    {
++	      error ("umfpack: wrong number of arguments");
++	      return retval;
++	    }
++
++	}
++      else if (op_type == "/")
++	{
++	  // matrix right divide, x = b/A
++
++	  // [x, Info] = umfpack (b, '/', A) ;
++	  // [x, Info] = umfpack (b, '/', A, Control) ;
++	  // [x, Info] = umfpack (b, '/', A, Qinit) ;
++	  // [x, Info] = umfpack (b, '/', A, Qinit, Control) ;
++
++	  do_solve = true;
++	  operation = "x = b/A" ;
++
++	  transpose = true;
++
++	  if (args(2).class_name () != "sparse")
++	    {
++	      error ("umfpack: input matrix A must be sparse");
++	      return retval;
++	    }
++
++	  if (args(2).is_complex_type ())
++	    {
++	      CAmatrix = args(2).sparse_complex_matrix_value ();
++	      A_is_complex = true;
++	    }
++	  else
++	    Amatrix = args(2).sparse_matrix_value ();
++
++	  if (args(0).is_complex_type ())
++	    {
++	      CBmatrix = args(0).complex_matrix_value ();
++	      B_is_complex = true;
++	    }
++	  else
++	    Bmatrix = args(0).matrix_value ();
++
++	  if (nargout == 2)
++	    do_info = 1;
++
++	  if (nargin == 5)
++	    {
++	      User_Qinit = args(3).column_vector_value ();
++	      User_Control_matrix = args(4).array_value ();
++	      have_User_Qinit = true;
++	      have_User_Control_matrix = true;
++	    }
++	  else if (nargin == 4)
++	    {
++	      User_Control_matrix = args(3).array_value ();
++
++	      if (User_Control_matrix.rows () == 1)
++		{
++		  User_Qinit = args(3).column_vector_value ();
++		  have_User_Qinit = true;
++		}
++	      else
++		have_User_Control_matrix = true;
++	    }
++	  else if (nargin < 3 || nargin > 5 || nargout > 2)
++	    {
++	      error ("umfpack: wrong number of arguments");
++	      return retval;
++	    }
++
++	  if (error_state)
++	    {
++	      error ("umfpack: incorrect argument type");
++	      return retval;
++	    }
++	}
++      else if (op_type == "symbolic")
++	{
++	  // symbolic factorization only
++
++	  // [P Q Fr Ch Info] = umfpack (A, 'symbolic') ;
++	  // [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ;
++	  // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ;
++	  // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ;
++
++	  operation = "symbolic factorization";
++	  do_numeric = false;
++
++	  if (args(0).class_name () != "sparse")
++	    {
++	      error ("umfpack: input matrix A must be sparse");
++	      return retval;
++	    }
++
++	  if (args(0).is_complex_type ())
++	    {
++	      CAmatrix = args(0).sparse_complex_matrix_value ();
++	      A_is_complex = true;
++	    }
++	  else
++	    Amatrix = args(0).sparse_matrix_value ();
++
++	  if (nargout == 5)
++	    do_info = 4 ;
++	  
++	  if (op == 2)
++	    {
++	      User_Qinit = args(1).column_vector_value ();
++	      have_User_Qinit = true;
++	    }
++	  if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4))
++	    {
++	      User_Control_matrix = args(nargin-1).array_value ();
++	      have_User_Control_matrix = true;
++	    }
++
++	  if (error_state)
++	    {
++	      error ("umfpack: incorrect argument type");
++	      return retval;
++	    }
++
++	  if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4)
++	    {
++	      error ("umfpack: wrong number of arguments") ;
++	      return retval;
++	    }
++	}
++      else
++	{
++	  error ("operator must be '/', '\\', or 'symbolic'") ;
++	  return retval;
++	}
++    }
++  else if (nargin > 0)
++    {
++      // LU factorization
++
++      // with scaling:
++      //   [L, U, P, Q, R, Info] = umfpack (A) ;
++      //   [L, U, P, Q, R, Info] = umfpack (A, Qinit) ;
++      //
++      // scaling determined by Control settings:
++      //   [L, U, P, Q, R, Info] = umfpack (A, Control) ;
++      //   [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;
++      //
++      // with no scaling:
++      //   [L, U, P, Q] = umfpack (A) ;
++      //   [L, U, P, Q] = umfpack (A, Control) ;
++      //   [L, U, P, Q] = umfpack (A, Qinit) ;
++      //   [L, U, P, Q] = umfpack (A, Qinit, Control) ;
++
++      operation = "numeric factorization" ;
++
++      if (args(0).is_complex_type ())
++	{
++	  CAmatrix = args(0).sparse_complex_matrix_value ();
++	  A_is_complex = true;
++	}
++      else
++	Amatrix = args(0).sparse_matrix_value ();
++
++      no_scale = nargout <= 4 ;
++
++      if (nargout == 6)
++	    do_info = 5 ;
++
++      if (nargin == 3)
++	{
++	  User_Qinit = args(1).column_vector_value ();
++	  User_Control_matrix = args(2).array_value ();
++	  have_User_Qinit = true;
++	  have_User_Control_matrix = true;
++	}
++      else if (nargin == 2)
++	{
++	  User_Control_matrix = args(1).array_value ();
++	  
++	  if (User_Control_matrix.rows () == 1)
++	    {
++	      User_Qinit = args(1).column_vector_value ();
++	      have_User_Qinit = true;
++	    }
++	  else
++	    have_User_Control_matrix = true;
++	}
++      else if (nargin > 3 || nargout > 6 || nargout < 4)
++	{
++	  error ("umfpack: wrong number of arguments") ;
++	  return retval;
++	}
++    }
++  else
++    {
++      // return default control settings
++
++      // Control = umfpack ;
++      // umfpack ;
++
++      if (nargout > 1)
++	{
++	  error ("umfpack: wrong number of arguments") ;
++	  return retval;
++	}
++      
++      NDArray user_control (dim_vector (UMFPACK_CONTROL, 1));
++      double *user_control_ptr = user_control.fortran_vec ();
++      umfpack_di_defaults (user_control_ptr);
++      retval(0) = user_control;
++      return retval;
++    }
++
++  // check inputs
++  
++  int n_row = Amatrix.rows ();
++  int n_col = Amatrix.cols ();
++  int nn = MAX (n_row, n_col) ;
++  int n_inner = MIN (n_row, n_col) ;
++  if (do_solve && n_row != n_col)
++    {
++      error ("umfpack: input matrix A must square for '\\' or '/'") ;
++      return retval;
++    }
++  if (n_row == 0 || n_col == 0)
++    {
++      error ("umfpack: input matrix A cannot have zero rows or zero columns") ;
++      return retval;
++    }
++
++  /* The real/complex status of A determines which version to use, */
++  /* (umfpack_di_* or umfpack_zi_*). */
++  const int *Ap;
++  const int *Ai;
++  const double *Ax;
++  const double *Bx;
++  
++  if (A_is_complex)
++    {
++      Ap = CAmatrix.cidx ();
++      Ai = CAmatrix.ridx ();
++      Ax = X_CAST (const double *, CAmatrix.data ());
++    }
++  else
++    {
++      Ap = Amatrix.cidx ();
++      Ai = Amatrix.ridx ();
++      Ax = Amatrix.data ();
++    }
++
++  if (B_is_complex)
++    Bx = X_CAST (const double *, CBmatrix.fortran_vec ());
++  else
++    Bx = Bmatrix.fortran_vec ();
++
++  if (do_solve)
++    {
++      int b_row = Bmatrix.rows ();
++      int b_col = Bmatrix.cols ();
++
++      if (!((transpose && b_row == 1 && b_col == nn) ||  
++	     (!transpose && b_row == nn && b_col == 1)))  
++	{
++	  error ("umfpack: b has the wrong dimensions") ;
++	  return retval;
++	}
++
++      X_is_complex = A_is_complex || B_is_complex ;
++    }
++
++  // set the Control parameters
++  NDArray Control (dim_vector (UMFPACK_CONTROL, 1));
++  double *Control_ptr = Control.fortran_vec ();
++  if (A_is_complex)
++    umfpack_zi_defaults (Control_ptr) ;
++  else
++    umfpack_di_defaults (Control_ptr) ;
++
++  if (have_User_Control_matrix)
++    {
++      int size = MIN (UMFPACK_CONTROL, User_Control_matrix.length ());
++      for (int i = 0 ; i < size ; i++)
++	Control (i) = User_Control_matrix (i) ;
++    }
++  
++  if (no_scale)
++    {
++      // turn off scaling for [L, U, P, Q] = umfpack (A) ;
++      // ignoring the input value of Control (24) for the usage
++      // [L, U, P, Q] = umfpack (A, Control) ;
++      Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE ;
++    }
++
++  int print_level;
++  if (xisnan (Control (UMFPACK_PRL)))
++    print_level = UMFPACK_DEFAULT_PRL ;
++  else
++    print_level = int (Control (UMFPACK_PRL)) ;
++
++  Control (UMFPACK_PRL) = print_level ;
++
++  // check Qinit, if present
++  int *Qinit = NULL;
++  if (have_User_Qinit)
++    {
++      if(User_Qinit.rows () != 1 || User_Qinit.cols () != n_col)
++	{
++	  error ("umfpack: Qinit must be 1-by-n_col") ;
++	  return retval;
++	}
++
++      Qinit = new int [n_col];
++      for (int i = 0; i < n_col; i++)
++	Qinit[i] = static_cast<int> (User_Qinit (i));
++    }
++
++  // report the inputs A and Qinit
++
++  if (print_level >= 2)
++    // print the operation
++    octave_stdout << "\numfpack: " << operation;
++
++  if (A_is_complex)
++    {
++      umfpack_zi_report_control (Control_ptr) ;
++
++      if (print_level >= 3) 
++	octave_stdout << "\nA: " ;
++
++      umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, NULL,
++				1, Control_ptr) ;
++      if (have_User_Qinit)
++	{
++	  if (print_level >= 3) 
++	    octave_stdout << "\nQinit: " ;
++
++	  umfpack_zi_report_perm (n_col, Qinit, Control_ptr) ;
++	}
++    }
++  else
++    {
++      umfpack_di_report_control (Control_ptr) ;
++
++      if (print_level >= 3) 
++	octave_stdout << "\nA: " ;
++
++       umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax,
++				 1, Control_ptr) ;
++       if (have_User_Qinit)
++	 {
++	   if (print_level >= 3) 
++	     octave_stdout << "\nQinit: " ;
++
++	   umfpack_di_report_perm (n_col, Qinit, Control_ptr) ;
++	 }
++    }
++
++#ifndef NO_TRANSPOSE_FORWARD_SLASH
++  // create the array transpose for x = b/A
++  if (transpose)
++    if (A_is_complex)
++      {
++	CAmatrix = CAmatrix.transpose ();
++	Ap = Amatrix.cidx ();
++	Ai = Amatrix.ridx ();
++	Ax = X_CAST (const double *, CAmatrix.data ());
++      }
++    else
++      {
++	Amatrix = Amatrix.transpose ();
++	Ap = Amatrix.cidx ();
++	Ai = Amatrix.ridx ();
++	Ax = Amatrix.data ();
++      }
++#endif
++
++  // perform the symbolic factorization
++  
++  NDArray InfoOut (dim_vector (1, UMFPACK_INFO));
++  double * Info = InfoOut.fortran_vec ();
++  void *Symbolic;
++  int status, status2;
++  if (A_is_complex)
++    status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, NULL,
++				   Qinit, &Symbolic, Control_ptr, 
++				   Info);
++  else
++    status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax,
++				   Qinit, &Symbolic, Control_ptr, 
++				   Info);
++  
++  if (status < 0)
++    {
++      umfpack_error ("symbolic factorization failed", A_is_complex, 
++		     nargout, retval, Control, InfoOut, status, do_info) ;
++      return retval;
++    }
++
++  if (have_User_Qinit)
++    delete [] Qinit;
++
++  // report the Symbolic object
++
++  if (A_is_complex)
++    umfpack_zi_report_symbolic (Symbolic, Control_ptr) ;
++  else
++    umfpack_di_report_symbolic (Symbolic, Control_ptr) ;
++
++  // perform numeric factorization, or just return symbolic factorization
++
++  if (do_numeric)
++    {
++      // perform the numeric factorization
++      void *Numeric;
++
++      if (A_is_complex)
++	status = umfpack_zi_numeric (Ap, Ai, Ax, NULL, Symbolic, &Numeric,
++				     Control_ptr, Info) ;
++      else
++	status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
++				     Control_ptr, Info) ;
++
++      // free the symbolic factorization
++      if (A_is_complex)
++	umfpack_zi_free_symbolic (&Symbolic) ;
++      else
++	umfpack_di_free_symbolic (&Symbolic) ;
++
++      // report the Numeric object
++      if (status < 0)
++	{
++	  umfpack_error ("numeric factorization failed", A_is_complex, 
++			 nargout, retval, Control, InfoOut, status, do_info);
++	  return retval;
++	}
++
++      if (A_is_complex)
++	(void) umfpack_zi_report_numeric (Numeric, Control_ptr) ;
++      else
++	(void) umfpack_di_report_numeric (Numeric, Control_ptr) ;
++
++      // return the solution or the factorization
++
++      if (do_solve)
++	{
++	  int sys;
++	  ComplexNDArray Xcmplx;
++	  NDArray Xreal;
++
++	  // solve Ax=b or A'x'=b', and return just the solution x
++
++#ifndef NO_TRANSPOSE_FORWARD_SLASH
++	  if (transpose)
++	    {
++	      // A.'x.'=b.' gives the same x=b/A as solving A'x'=b'
++	      // since C=A.' was factorized, solve with sys = UMFPACK_A 
++	      // since x and b are vectors, x.' and b.' are implicit 
++	      if (X_is_complex)
++		Xcmplx.resize (dim_vector (1, nn));
++	      else
++		Xreal.resize (dim_vector (1, nn));
++	    }
++	  else
++	    {
++	      if (X_is_complex)
++		Xcmplx.resize (dim_vector (nn, 1));
++	      else
++		Xreal.resize (dim_vector (nn, 1));
++	    }
++
++	  sys = UMFPACK_A ;
++#else
++	  if (transpose)
++	    {
++	      // If A is real, A'x=b is the same as A.'x=b. 
++	      // x and b are vectors, so x and b are the same as x' and b'. 
++	      // If A is complex, then A.'x.'=b.' gives the same solution x 
++	      // as the complex conjugate transpose.  If we used the A'x=b 
++	      // option in umfpack_*_solve, we would have to form b' on 
++	      // input and x' on output (negating the imaginary part). 
++	      // We can save this work by just using the A.'x=b option in 
++	      // umfpack_*_solve.  Then, forming x.' and b.' is implicit, 
++	      // since x and b are just vectors anyway. 
++	      // In both cases, the system to solve is A.'x=b
++	      if (X_is_complex)
++		Xcmplx.resize (dim_vector (1, nn));
++	      else
++		Xreal.resize (dim_vector (1, nn));
++
++	      sys = UMFPACK_Aat ;
++	    }
++	  else
++	    {
++	      if (X_is_complex)
++		Xcmplx.resize (dim_vector (nn, 1));
++	      else
++		Xreal.resize (dim_vector (nn, 1));
++	      sys = UMFPACK_A ;
++	    }
++#endif
++
++	  // print the right-hand-side, B
++	  if (print_level >= 3) 
++	    octave_stdout << "\nright-hand side, b: ";
++
++	  if (B_is_complex)
++	    (void) umfpack_zi_report_vector (nn, Bx, NULL, Control_ptr) ;
++	  else
++	    (void) umfpack_di_report_vector (nn, Bx, Control_ptr) ;
++
++	  // solve the system
++	  double * Xx;
++	  if (X_is_complex)
++	    Xx = X_CAST (double *, Xcmplx.fortran_vec ());
++	  else
++	    Xx = Xreal.fortran_vec ();
++	  status2 = UMFPACK_OK ;
++
++	  if (A_is_complex)
++	    {
++	      if (!B_is_complex)
++		{
++		  OCTAVE_LOCAL_BUFFER (double, Bz, nn);
++		  for (int i = 0; i < nn; i++)
++		    Bz[i] = 0.;
++
++		  status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, 
++					     Bx, Bz, Numeric, Control_ptr, 
++					     Info);
++		}
++	      else
++		status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, 
++					   Bx, NULL, Numeric, Control_ptr, 
++					   Info);
++	    }
++	  else
++	    {
++	      if (B_is_complex)
++		{
++		  // Ax=b when b is complex and A is sparse can be split
++		  // into two systems, A*xr=br and A*xi=bi, where r denotes
++		  // the real part and i the imaginary part of x and b.
++		  OCTAVE_LOCAL_BUFFER (double, Tx, nn);
++		  OCTAVE_LOCAL_BUFFER (double, Tz, nn);
++
++		  status = umfpack_di_solve (sys, Ap, Ai, Ax, Tx, Bx,
++					     Numeric, Control_ptr, Info);
++		  status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Tz, Bx,
++					      Numeric, Control_ptr, Info) ;
++
++		  for (int i = 0; i < nn; i++)
++		    Xcmplx (i) = Complex (Tx[i], Tz[i]);
++		}
++	      else
++		status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx,
++					   Numeric, Control_ptr, Info);
++	    }
++	  
++	  // free the Numeric object
++	  if (A_is_complex)
++	    umfpack_zi_free_numeric (&Numeric) ;
++	  else
++	    umfpack_di_free_numeric (&Numeric) ;
++	  
++	  // check error status
++	  if (status < 0 || status2 < 0)
++	    {
++	      umfpack_error ("solve failed", A_is_complex, nargout, 
++			     retval, Control, InfoOut, status, do_info) ;
++	      return retval;
++	    }
++
++	  // print the solution, X
++	  if (print_level >= 3) 
++	    octave_stdout << "\nsolution, x: ";
++
++	  if (X_is_complex)
++	    (void) umfpack_zi_report_vector (nn, Xx, NULL, Control_ptr);
++	  else
++	    (void) umfpack_di_report_vector (nn, Xx, Control_ptr);
++
++	  // warn about singular or near-singular matrices
++	  // no warning is given if Control (1) is zero
++	  if (Control (UMFPACK_PRL) >= 1)
++	    {
++	      if (status == UMFPACK_WARNING_singular_matrix)
++		{
++		  warning ("matrix is singular");
++		  warning ("Try increasing Control (%d) and Control (%d).",
++			   1+UMFPACK_PIVOT_TOLERANCE, 
++			   1+UMFPACK_SYM_PIVOT_TOLERANCE);
++		  warning ("(Suppress this warning with Control (%d) = 0.)",
++			   1+UMFPACK_PRL);
++		}
++	      else if (InfoOut (UMFPACK_RCOND) < DBL_EPSILON)
++		{
++		  warning ("matrix is nearly singular, rcond = %g",
++			   InfoOut (UMFPACK_RCOND));
++		  warning ("Try increasing Control (%d) and Control (%d).",
++			   1+UMFPACK_PIVOT_TOLERANCE,
++			   1+UMFPACK_SYM_PIVOT_TOLERANCE);
++		  warning ("(Suppress this warning with Control (%d) = 0.)",
++			   1+UMFPACK_PRL);
++		}
++	    }
++
++	  // Setup the return value
++	  if (X_is_complex)
++	    retval (0) = octave_value (Xcmplx);
++	  else
++	    retval (0) = octave_value (Xreal);
++	}
++      else
++	{
++	  // get L, U, P, Q, and r
++	  int lnz, unz, ignore1, ignore2, ignore3;
++
++	  if (A_is_complex)
++	    status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2,
++					  &ignore3, Numeric) ;
++	  else
++	    status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2,
++					  &ignore3, Numeric) ;
++
++	  if (status < 0)
++	    {
++	      if (A_is_complex)
++		umfpack_zi_free_numeric (&Numeric) ;
++	      else
++		umfpack_di_free_numeric (&Numeric) ;
++
++	      umfpack_error ("extracting LU factors failed", A_is_complex, 
++			     nargout, retval, Control, InfoOut, status, 
++			     do_info);
++	      return retval;
++	    }
++
++	  // avoid malloc of zero-sized arrays
++	  lnz = MAX (lnz, 1) ;
++	  unz = MAX (unz, 1) ;
++
++	  // get space for the *** ROW *** form of L
++	  SparseMatrix Lreal;
++	  SparseComplexMatrix Limag;
++	  int *Ltp, *Ltj;
++	  double *Ltx;
++	  if (A_is_complex)
++	    {
++	      Limag = SparseComplexMatrix (n_inner, n_row, lnz);
++	      Ltp = Limag.cidx ();
++	      Ltj = Limag.ridx ();
++	      Ltx = X_CAST (double *, Limag.data ());
++	    }
++	  else
++	    {
++	      Lreal = SparseMatrix (n_inner, n_row, lnz);
++	      Ltp = Lreal.cidx ();
++	      Ltj = Lreal.ridx ();
++	      Ltx = Lreal.data ();
++	    }
++
++	  // create permanent copy of the output matrix U
++	  int *Up, *Ui;
++	  double *Ux;
++	  SparseMatrix Ureal;
++	  SparseComplexMatrix Uimag;
++
++	  if (A_is_complex)
++	    {
++	      Uimag = SparseComplexMatrix (n_inner, n_col, unz);
++	      Up = Uimag.cidx ();
++	      Ui = Uimag.ridx ();
++	      Ux = X_CAST (double *, Uimag.data ());
++	    }
++	  else
++	    {
++	      Ureal = SparseMatrix (n_inner, n_col, unz);
++	      Up = Ureal.cidx ();
++	      Ui = Ureal.ridx ();
++	      Ux = Ureal.data ();
++	    }
++
++	  // temporary space for the integer permutation vectors
++	  OCTAVE_LOCAL_BUFFER (int, P, n_row);
++	  OCTAVE_LOCAL_BUFFER (int, Q, n_col);
++
++	  // get scale factors, if requested 
++	  status2 = UMFPACK_OK ;
++	  SparseMatrix Rsout;
++	  double * Rs;
++	  if (!no_scale)
++	    {
++	      // create a diagonal sparse matrix for the scale factors 
++	      Rsout = SparseMatrix (n_row, n_row, n_row);
++	      for (int i = 0 ; i < n_row ; i++)
++		{
++		  Rsout.cidx (i) = i;
++		  Rsout.ridx (i) = i;
++		}
++	      Rsout.cidx (n_row) = n_row;
++	      Rs = Rsout.data ();
++	    }
++	  else
++	    Rs = (double *) NULL ;
++
++	  // get Lt, U, P, Q, and Rs from the numeric object
++	  int do_recip;
++	  if (A_is_complex)
++	    {
++	      status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, NULL, Up, Ui, 
++					       Ux, NULL, P, Q, 
++					       (double *) NULL, 
++					       (double *) NULL,
++					       &do_recip, Rs, Numeric) ;
++	      umfpack_zi_free_numeric (&Numeric) ;
++	    }
++	  else
++	    {
++	      status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui,
++					       Ux, P, Q, (double *) NULL,
++					       &do_recip, Rs, Numeric) ;
++	      umfpack_di_free_numeric (&Numeric) ;
++	    }
++
++	  if (!no_scale)
++	    retval (4) = octave_vale (Rsout);
++
++	  // for the oct-file, -DNRECIPROCAL must be set,
++	  // so do_recip must be FALSE
++
++	  if (status < 0 || status2 < 0 || do_recip)
++	    {
++	      umfpack_error ("extracting LU factors failed", A_is_complex, 
++			     nargout, retval, Control, InfoOut, status, 
++			     do_info);
++	      return retval;
++	    }
++
++	  if (A_is_complex)
++	    retval (1) = octave_value (Uimag);
++	  else
++	    retval (1) = octave_valye (Ureal);
++	  
++	  // create sparse permutation matrix for P 
++	  SparseMatrix Pout (n_row, n_row, n_row);
++	  for (int k = 0 ; k < n_row ; k++)
++	    {
++	      Pout.cidx (k) = k ;
++	      Pout.ridx (P [k]) = k;
++	      Pout.data (k) = 1;
++	    }
++	  Pout.cidx (n_row) = n_row;
++	  retval (2) = octave_value (Pout);
++
++	  // create sparse permutation matrix for Q 
++	  SparseMatrix Qout (n_col, n_col, n_col);
++	  for (int k = 0 ; k < n_col ; k++)
++	    {
++	      Qout.cidx (k) = k ;
++	      Qout.ridx (k) = Q[k];
++	      Qout.data (k) = 1;
++	    }
++	  Qout.cidx (n_col) = n_col;
++	  retval (3) = octave_value (Qout);
++	  
++	  // permanent copy of L 
++	  if (A_is_complex)
++	    retval (0) = octave_value (Limag.transpose());
++	  else
++	    retval (0) = octave_value (Lreal.transpose());
++
++	  if (status < 0)
++	    {
++	      umfpack_error ("constructing L failed", A_is_complex, 
++			     nargout, retval, Control, InfoOut, status, 
++			     do_info) ;
++	      return octave_value ();
++	    }
++
++	  // print L, U, P, and Q
++	  if (A_is_complex)
++	    {
++	      if (print_level >= 3) 
++		{
++		  octave_stdout << "\nL: ";
++		  int *Lp = Limag.cidx ();
++		  int *Li = Limag.ridx ();
++		  double *Lx = X_CAST (double *, Limag.data ());
++
++		  (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li,
++						   Lx, NULL, 1, Control_ptr) ;
++		}
++
++	      if (print_level >= 3) 
++		octave_stdout << "\nU: ";
++	      (void) umfpack_zi_report_matrix (n_inner, n_col, Up, Ui,
++					       Ux, NULL, 1, Control_ptr) ;
++	      if (print_level >= 3)
++		octave_stdout << "\nP: ";
++	      (void) umfpack_zi_report_perm (n_row, P, Control_ptr);
++	      if (print_level >= 3) 
++		octave_stdout << "\nQ: ";
++	      (void) umfpack_zi_report_perm (n_col, Q, Control_ptr);
++	    }
++	  else
++	    {
++	      if (print_level >= 3) 
++		{
++		  int *Lp = Lreal.cidx ();
++		  int *Li = Lreal.ridx ();
++		  double *Lx = Lreal.data ();
++		  octave_stdout << "\nL: ";
++		  (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li,
++						   Lx, 1, Control_ptr);
++		}
++
++	      if (print_level >= 3) 
++		octave_stdout << "\nU: ";
++	      (void) umfpack_di_report_matrix (n_inner, n_col, Up, Ui,
++					       Ux, 1, Control_ptr);
++	      if (print_level >= 3) 
++		octave_stdout << "\nP: ";
++	      (void) umfpack_di_report_perm (n_row, P, Control_ptr);
++	      if (print_level >= 3) 
++		octave_stdout << "\nQ: ";
++	      (void) umfpack_di_report_perm (n_col, Q, Control_ptr);
++	    }
++	}
++    }
++  else
++    {
++      // return the symbolic factorization
++      int ignore1, ignore2, ignore3;
++      OCTAVE_LOCAL_BUFFER (int, Q, n_col);
++      OCTAVE_LOCAL_BUFFER (int, P, n_row);
++      OCTAVE_LOCAL_BUFFER (int, Front_npivcol, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Front_parent, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Front_1strow, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Front_leftmostdesc, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Chain_start, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Chain_maxrows, nn + 1);
++      OCTAVE_LOCAL_BUFFER (int, Chain_maxcols, nn + 1);
++
++      int nz, nfronts, nchains;
++
++      if (A_is_complex)
++	{
++	  status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3,
++					    &nz, &nfronts, &nchains, P, Q, 
++					    Front_npivcol, Front_parent, 
++					    Front_1strow, 
++					    Front_leftmostdesc,
++					    Chain_start, Chain_maxrows, 
++					    Chain_maxcols, Symbolic) ;
++	  umfpack_zi_free_symbolic (&Symbolic) ;
++	}
++      else
++	{
++	  status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3,
++					    &nz, &nfronts, &nchains, P, Q, 
++					    Front_npivcol, Front_parent, 
++					    Front_1strow, 
++					    Front_leftmostdesc,
++					    Chain_start, Chain_maxrows, 
++					    Chain_maxcols, Symbolic) ;
++	  umfpack_di_free_symbolic (&Symbolic) ;
++	}
++
++      if (status < 0)
++	{
++	  umfpack_error ("extracting symbolic factors failed", 
++			 A_is_complex, nargout, retval, Control, 
++			 InfoOut, status, do_info) ;
++	  return retval;
++	}
++      
++      // create sparse permutation matrix for P
++      SparseMatrix Pout (n_row, n_row, n_row);
++      for (int k = 0 ; k < n_row ; k++)
++	{
++	  Pout.cidx (k) = k;
++	  Pout.ridx (P [k]) = k;
++	  Pout.data (k) = 1;
++	}
++      Pout.cidx (n_row) = n_row;
++      retval (0) = octave_value (Pout);
++
++      // create sparse permutation matrix for Q 
++      SparseMatrix Qout (n_col, n_col, n_col);
++      for (int k = 0 ; k < n_col ; k++)
++	{
++	  Qout.cidx (k) = k;
++	  Qout.ridx (k) = Q[k];
++	  Qout.data (k) = 1;
++	}
++      Qout.cidx (n_col) = n_col;
++      retval (1) = octave_value (Qout);
++      
++      // create Fr 
++      Matrix Frout (nfronts + 1, 4);
++      for (int i = 0 ; i <= nfronts ; i++)
++	{
++	  // convert parent, 1strow, and leftmostdesc to 1-based 
++	  Frout (i, 0) = (double) (Front_npivcol [i]) ;
++	  Frout (i, 1) = (double) (Front_parent [i] + 1) ;
++	  Frout (i, 2) = (double) (Front_1strow [i] + 1) ;
++	  Frout (i, 3) = (double) (Front_leftmostdesc [i] + 1) ;
++	}
++      retval (2) = octave_value (Frout);
++      
++      // create Ch 
++      Matrix Chout (nchains + 1, 3);
++      for (int i = 0 ; i <= nchains ; i++)
++	{
++	  // convert to 1-based 
++	  Chout (i, 0) = (double) (Chain_start [i] + 1) ;
++	  Chout (i, 1) = (double) (Chain_maxrows [i]) ;
++	  Chout (i, 2) = (double) (Chain_maxcols [i]) ;
++	}
++      Chout (0, nchains) = (double) Chain_start [nchains] + 1 ;
++      Chout (1, nchains) = 0.;
++      Chout (2, nchains) = 0.;
++      retval (3) = octave_value (Chout);
++    }
++
++  // report Info
++  if (A_is_complex)
++    umfpack_zi_report_info (Control_ptr, Info);
++  else
++    umfpack_di_report_info (Control_ptr, Info);
++
++  if (do_info > 0)
++    retval (do_info) = InfoOut;
++
++  return retval;
++}
++
++/*
++;;; Local Variables: ***
++;;; mode: C++ ***
++;;; End: ***
++*/
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,191 @@
++function umfpack_demo
++% UMFPACK DEMO
++%
++% A demo of UMFPACK for OCTAVE.
++%
++% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
++% and umfpack_simple.
++
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  Type umfpack_details for License.
++
++%-------------------------------------------------------------------------------
++% get default control parameters
++%-------------------------------------------------------------------------------
++
++control = umfpack ;
++fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ;
++fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ;
++c = input ('5: print all output [default is 1]: ') ;
++if (isempty (c))
++    c = 1 ;
++end
++control (1) = c ;
++
++%-------------------------------------------------------------------------------
++% solve a simple system
++%-------------------------------------------------------------------------------
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ;
++if (control (1) > 1)
++    fprintf ('(except for verbose printing enabled)\n') ;
++end
++
++load west0067 ;
++A = Problem.A ;
++n = size (A, 1) ;
++b = rand (n, 1) ;
++
++fprintf ('Solving Ax=b via UMFPACK:\n') ;
++[xu, info] = umfpack (A, '\\', b, control) ;
++x = xu ;
++
++fprintf ('Solving Ax=b via OCTAVE:\n') ;
++xm = A\b ;
++x = xm ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (xu - xm, Inf)) ;
++
++%-------------------------------------------------------------------------------
++% spy the results
++%-------------------------------------------------------------------------------
++
++figure (1) ;
++clf
++
++subplot (2,3,1)
++title ('The matrix A') ;
++spy (A)
++
++subplot (2,3,2)
++[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;
++title ('Supernodal column elimination tree') ;
++%% Disable for now !!
++%% treeplot (Fr (1:end-1,2)') ;
++
++subplot (2,3,3)
++title ('A, with initial row and column order') ;
++spy (P1 * A * Q1)
++
++subplot (2,3,4)
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ;
++[L, U, P, Q, R] = umfpack (A) ;
++title ('A, with final row/column order') ;
++spy (P*A*Q)
++
++fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ;
++fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
++    norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q,  L, U)) ;
++
++fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ;
++fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ;
++xu = Q * (U \ (L \ (P * (R \ b)))) ;
++x = xu ;
++
++fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ;
++
++subplot (2,3,5)
++title ('UMFPACK LU factors') ;
++spy (spones (L) + spones (U))
++
++subplot (2,3,6)
++fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ;
++try
++    q = colamd (A) ;
++catch
++    fprintf ('\n *** colamd not found, using colmmd instead *** \n') ;
++    q = colmmd (A) ;
++end
++[L, U, P] = lu (A (:,q)) ;
++title ('OCTAVE LU factors') ;
++spy (spones (L) + spones (U))
++
++fprintf ('\nSolution to Ax=b via OCTAVE factorization:\n') ;
++fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ;
++xm = U \ (L \ (P * b)) ;
++xm (q) = xm ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (xu - xm, Inf)) ;
++
++fprintf ('\nOCTAVE LU flop count: %d\n', luflop (L, U)) ;
++
++%-------------------------------------------------------------------------------
++% solve A'x=b
++%-------------------------------------------------------------------------------
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('Solve A''x=b:\n') ;
++
++fprintf ('Solving A''x=b via UMFPACK:\n') ;
++[xu, info] = umfpack (b', '/', A, control) ;
++xu = xu' ;
++
++fprintf ('Solving A''x=b via OCTAVE:\n') ;
++xm = (b'/A)' ;
++x = xm ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (xu - xm, Inf)) ;
++
++%-------------------------------------------------------------------------------
++% factor A' and then solve Ax=b using the factors of A'
++%-------------------------------------------------------------------------------
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ;
++fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n');
++fprintf ('(less work and memory usage).  Solve C''x=b; the solution is the\n') ;
++fprintf ('same as the solution to Ax=b for the original A.\n');
++
++C = A' ;
++
++% factorize C (P,Q) = L*U
++[L, U, P, Q, R, info] = umfpack (C, control) ;
++
++fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ;
++fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
++    norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q,  L, U)) ;
++
++fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ;
++fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ;
++xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
++x = xu ;
++
++fprintf ('Solution to Ax=b via OCTAVE:\n') ;
++xm = A\b ;
++x = xm ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (xu - xm, Inf)) ;
++
++%-------------------------------------------------------------------------------
++% solve Ax=B
++%-------------------------------------------------------------------------------
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ;
++B = sprandn (n, 10, 0.05) ;
++XU = umfpack_solve (A, '\\', B, control) ;
++XM = A\B ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (XU - XM, Inf)) ;
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ;
++XU = umfpack_btf (A, B, control) ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (XU - XM, Inf)) ;
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ;
++XU = umfpack_solve (B', '/', A, control) ;
++XM = B'/A ;
++
++fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
++    norm (XU - XM, Inf)) ;
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m.out UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_demo.m.out	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,72 @@
++>> umfpack_demo
++
++Enter the printing level for UMFPACK's output statistics:
++0: none, 1: errors only, 2: statistics, 4: print some of outputs
++5: print all output [default is 1]: 
++
++--------------------------------------------------------------
++Factor and solve a small system, Ax=b, using default parameters
++Solving Ax=b via UMFPACK:
++Solving Ax=b via MATLAB:
++Difference between UMFPACK and MATLAB solution: 1.24345e-14
++
++--------------------------------------------------------------
++
++Factorizing [L, U, P, Q, R] = umfpack (A)
++
++P * (R\A) * Q - L*U should be zero:
++norm (P*(R\A)*Q - L*U, 1) = 4.2068e-16 (exact) 3.74627e-16 (estimated)
++
++Solution to Ax=b via UMFPACK factorization:
++x = Q * (U \ (L \ (P * (R \ b))))
++
++UMFPACK flop count: 2362
++
++Factorizing [L, U, P] = lu (A (:, q))
++If you are using a version of MATLAB prior to V6.0, then the
++following statement (q = colamd (A)) may fail.  Either download
++colamd from http://www.cise.ufl.edu/research/sparse, upgrade to
++MATLAB V6.0 or later, or replace the statement with
++q = colmmd (A) ;
++
++Solution to Ax=b via MATLAB factorization:
++x = U \ (L \ (P * b)) ; x (q) = x ;
++Difference between UMFPACK and MATLAB solution: 1.37668e-14
++
++MATLAB LU flop count: 3164
++
++--------------------------------------------------------------
++Solve A'x=b:
++Solving A'x=b via UMFPACK:
++Solving A'x=b via MATLAB:
++Difference between UMFPACK and MATLAB solution: 3.10862e-15
++
++--------------------------------------------------------------
++Compute C = A', and compute the LU factorization of C.
++Factorizing A' can sometimes be better than factorizing A itself
++(less work and memory usage).  Solve C'x=b; the solution is the
++same as the solution to Ax=b for the original A.
++
++P * (R\C) * Q - L*U should be zero:
++norm (P*(R\C)*Q - L*U, 1) = 1.31839e-16 (exact) 6.41848e-17 (estimated)
++
++Solution to Ax=b via UMFPACK, using the factors of C:
++x = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
++Solution to Ax=b via MATLAB:
++Difference between UMFPACK and MATLAB solution: 1.77636e-14
++
++--------------------------------------------------------------
++
++Solve AX=B, where B is n-by-10, and sparse
++Difference between UMFPACK and MATLAB solution: 2.88198e-14
++
++--------------------------------------------------------------
++
++Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf
++Difference between UMFPACK and MATLAB solution: 9.79736e-14
++
++--------------------------------------------------------------
++
++Solve A'X=B, where B is n-by-10, and sparse
++Difference between UMFPACK and MATLAB solution: 1.05244e-13
++>> diary off
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_make.m UMFPACK/UMFPACK/OCTAVE/umfpack_make.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_make.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_make.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,356 @@
++function umfpack_make
++% UMFPACK_MAKE
++%
++% Compiles the UMFPACK mexFunction and then runs a simple demo.
++%
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  Type umfpack_details for License.
++%
++% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and
++% umfpack_simple.
++
++help umfpack_make
++
++fprintf ('\n--------------------------------------------------------------\n') ;
++fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ;
++fprintf ('--------------------------------------------------------------\n') ;
++
++try
++    % ispc does not appear in MATLAB 5.3
++    pc = ispc ;
++catch
++    % if ispc fails, assume we aren't on a Windows PC.
++    pc = 0 ;
++end
++
++obj = 'o' ;
++blas_lib = '' ;
++if (pc)
++    obj = 'obj' ;
++end
++
++%-------------------------------------------------------------------------------
++% BLAS option
++%-------------------------------------------------------------------------------
++
++msg = [ ...
++    '\nUsing the BLAS is faster, but might not compile correctly.\n', ...
++    'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ...
++    'zgemv, and/or zger are not defined, then recompile without the\n', ...
++    'BLAS.  You can ignore warnings that these routines are implicitly\n', ...
++    'declared.\n\nPlease select one of the following options: \n', ...
++    '   1:  attempt to compile with the BLAS (default)\n', ...
++    '   2:  do not use the BLAS\n'] ;
++fprintf (msg) ;
++blas = input (': ') ;
++if (isempty (blas))
++    blas = 1 ;
++end
++if (blas == 1)
++    % try to link to MATLAB's built-in BLAS
++    blas = '' ;
++    if (pc)
++        % the default lcc compiler needs this library to access the BLAS
++        blas_lib = ' libmwlapack.lib' ;
++        msg = [ ...
++        '\nCheck to see if you have a file called libmwlapack.lib in the\n', ...
++        '<matlab>\\extern\\lib\\win32\\lcc\\ directory, where <matlab> is ', ...
++        'the\ndirectory where MATLAB is installed.  If a file of that ', ...
++        'name is already\nthere, then you don''t have to do anything.  ', ...
++        'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ...
++        'the umfpack\\lcc_lib\\ directory to the\n', ...
++        '<matlab>\\extern\\lib\\win32\\lcc\\ directory.  Next, type\n\n', ...
++        '    mex -setup\n\n', ...
++        'at the MATLAB prompt, and ask MATLAB to select the lcc compiler.  ',...
++        'You can skip\nall of this if you have already done it, or have ', ...
++        'configured mex to use\na different compiler.  If you are using ', ...
++        'Norton anti-virus software on Windows\n98SE, then you need to ', ...
++        'exit MATLAB, turn off virus checking, and restart MATLAB\n', ...
++        'before you can use the mex command or compile UMFPACK.\n', ...
++        'You may also need to turn off virus checking in other cases.\n', ...
++        '\nHit enter to continue, or type control-C if you do not wish to '] ;
++        fprintf (msg) ;
++        input ('proceed: ') ;
++    end
++    fprintf ('\nUsing the BLAS (recommended).\n') ;
++else
++    % No BLAS
++    fprintf ('\nNot using the BLAS.  UMFPACK will be slow.\n') ;
++    blas = ' -DNBLAS' ;
++end
++
++%-------------------------------------------------------------------------------
++% -DNUTIL option (using utMalloc or mxMalloc)
++%-------------------------------------------------------------------------------
++
++utils = '' ;
++
++if (~pc)
++    msg = [ ...
++    '--------------------------------------------------------------\n', ...
++    '\nUMFPACK uses MATLAB''s memory allocation routines.  The internal', ...
++    '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ...
++    '\nbut they are internal utility routines that are not documented.\n', ...
++    'Thus, they might not always work.  Using mxMalloc, mxFree, and\n', ...
++    'mxRealloc works, but UMFPACK might run out of memory when solving\n', ...
++    'problems that it could otherwise solve.  Try using the default.\n', ...
++    'If you get an error stating that utMalloc, utFree, and/or\n', ...
++    'utRealloc are not defined, then recompile with the mx* routines.\n', ...
++    '\nPlease select one of the following options:\n', ...
++    '    1:  attempt to use the ut* routines (default)\n', ...
++    '    2:  use the standard mx* routines\n'] ;
++    fprintf (msg) ;
++    utils = input (': ') ;
++    if (isempty (utils))
++	utils = 1 ;
++    end
++    if (utils == 2)
++        fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ;
++        utils = ' -DNUTIL' ;
++    else
++        fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ;
++        utils = '' ;
++    end
++end
++
++%-------------------------------------------------------------------------------
++% -DNPOSIX option (for sysconf and times timer routines)
++%-------------------------------------------------------------------------------
++
++posix = '' ;
++
++if (~pc)
++    msg = [ ...
++    '--------------------------------------------------------------\n', ...
++    '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ...
++    'to provide CPU time and wallclock time statistics.  If you do not\n', ...
++    'have a POSIX-compliant operating system, then UMFPACK won''t\n', ...
++    'compile.  If you don''t know which option to pick, try the\n', ...
++    'default.  If you get an error saying that sysconf and/or times\n', ...
++    'are not defined, then recompile with the non-POSIX option.\n', ...
++    '\nPlease select one of the following options:\n', ...
++    '    1:  use POSIX sysconf and times routines (default)\n', ...
++    '    2:  do not use POSIX routines\n'] ;
++    fprintf (msg) ;
++    posix = input (': ') ;
++    if (isempty (posix))
++	posix = 1 ;
++    end
++    if (posix == 2)
++        fprintf ('\nNot using POSIX sysconf and times routines.\n') ;
++        posix = ' -DNPOSIX' ;
++    else
++        fprintf ('\nUsing POSIX sysconf and times routines.\n') ;
++        posix = '' ;
++    end
++end
++
++%-------------------------------------------------------------------------------
++% mex command
++%-------------------------------------------------------------------------------
++
++umfdir = sprintf ('..%sSource%s', filesep, filesep) ;
++amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ;
++incdir = sprintf ( ...
++' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ...
++filesep,filesep,  filesep, filesep, filesep, filesep, filesep, filesep) ;
++
++mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ;
++msg = [ ...
++    '--------------------------------------------------------------\n', ...
++    '\nCompile options:\n%s\nNow compiling.  Please wait.\n'] ;
++fprintf (msg, mx) ;
++
++% The following is adapted from GNUmakefile
++
++%-------------------------------------------------------------------------------
++% source files
++%-------------------------------------------------------------------------------
++
++% non-user-callable umf_*.[ch] files:
++umfch = { 'assemble', 'blas3_update', ...
++        'build_tuples', 'create_element', ...
++        'dump', 'extend_front', 'garbage_collection', ...
++        'get_memory', 'init_front', 'kernel', ...
++        'kernel_init', 'kernel_wrapup', ...
++        'local_search', 'lsolve', 'ltsolve', ...
++        'mem_alloc_element', 'mem_alloc_head_block', ...
++        'mem_alloc_tail_block', 'mem_free_tail_block', ...
++        'mem_init_memoryspace', ...
++        'report_vector', 'row_search', 'scale_column', ...
++        'set_stats', 'solve', 'symbolic_usage', 'transpose', ...
++        'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ...
++        'valid_symbolic', 'grow_front', 'start_front', '2by2', ...
++	'store_lu', 'scale' } ;
++
++% non-user-callable umf_*.[ch] files, int versions only (no real/complex):
++umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ...
++        'is_permutation', 'malloc', 'realloc', 'report_perm', ...
++	'singletons' } ;
++
++% non-user-callable and user-callable amd_*.[ch] files (int versions only):
++amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ...
++        'order', 'control', 'info', 'valid' } ;
++
++% user-callable umfpack_*.[ch] files (real/complex):
++user = { 'col_to_triplet', 'defaults', 'free_numeric', ...
++        'free_symbolic', 'get_numeric', 'get_lunz', ...
++        'get_symbolic', 'numeric', 'qsymbolic', ...
++        'report_control', 'report_info', 'report_matrix', ...
++        'report_numeric', 'report_perm', 'report_status', ...
++        'report_symbolic', 'report_triplet', ...
++        'report_vector', 'solve', 'symbolic', ...
++        'transpose', 'triplet_to_col', 'scale' ...
++	'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ;
++
++% user-callable umfpack_*.[ch], only one version
++generic = { 'timer', 'tictoc' } ;
++
++M = cell (0) ;
++
++%-------------------------------------------------------------------------------
++% Create the umfpack and amd mexFunctions for MATLAB (int versions only)
++%-------------------------------------------------------------------------------
++
++for k = 1:length(umfint)
++    M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
++        mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ;
++end
++
++rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ;
++kinds = { 'md', 'mz' } ;
++
++for what = 1:2 
++
++    rule = rules {what} ;
++    kind = kinds {what} ;
++
++    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
++        'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ;
++
++    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
++        'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ;
++
++    M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ...
++        'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
++
++    M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
++        'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
++
++    M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s',  ...
++        'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ...
++	umfdir) ;
++
++    M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
++        'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
++
++    M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ...
++	'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ;
++
++    M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ...
++	'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ;
++
++    for k = 1:length(umfch)
++        M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
++            rule, umfch {k}, umfch {k}, kind, obj, umfdir) ;
++    end
++
++    M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
++        'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ;
++
++    for k = 1:length(user)
++        M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
++            'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ;
++    end
++end
++
++for k = 1:length(generic)
++    M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
++	'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ;
++end
++
++%----------------------------------------
++% AMD routines (int only)
++%----------------------------------------
++
++for k = 1:length(amd)
++    M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ...
++        mx, amd {k}, amd {k}, 'm', obj, amddir) ;
++end
++
++%----------------------------------------
++% compile the umfpack mexFunction
++%----------------------------------------
++
++C = sprintf ('%s -output umfpack umfpackmex.c', mx) ;
++for i = 1:length (M)
++    C = [C ' ' (M {i})] ;
++end
++C = [C ' ' blas_lib] ;
++cmd (C) ;
++
++%----------------------------------------
++% delete the object files
++%----------------------------------------
++
++for i = 1:length (M)
++    rmfile (M {i}) ;
++end
++
++%----------------------------------------
++% compile the luflop mexFunction
++%----------------------------------------
++
++cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ;
++
++fprintf ('\n\nCompilation has completed.  Now trying the umfpack_simple demo.\n');
++umfpack_simple
++
++%-------------------------------------------------------------------------------
++% rmfile:  delete a file, but only if it exists
++%-------------------------------------------------------------------------------
++
++function rmfile (file)
++if (length (dir (file)) > 0)
++    delete (file) ;
++end
++
++%-------------------------------------------------------------------------------
++% cpfile:  copy the src file to the filename dst, overwriting dst if it exists
++%-------------------------------------------------------------------------------
++
++function cpfile (src, dst)
++rmfile (dst)
++if (length (dir (src)) == 0)
++    help umfpack_make
++    error (sprintf ('File does not exist: %s\n', src)) ;
++end
++copyfile (src, dst) ;
++
++%-------------------------------------------------------------------------------
++% mvfile:  move the src file to the filename dst, overwriting dst if it exists
++%-------------------------------------------------------------------------------
++
++function mvfile (src, dst)
++cpfile (src, dst) ;
++rmfile (src) ;
++
++%-------------------------------------------------------------------------------
++% cmd:  display and execute a command
++%-------------------------------------------------------------------------------
++
++function cmd (s)
++fprintf ('.') ;
++eval (s) ;
++
++%-------------------------------------------------------------------------------
++% make:  execute a "make" command for a source file
++%-------------------------------------------------------------------------------
++
++function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir)
++cmd (sprintf (s, rule, srcdir, file1)) ;
++src = sprintf (src, file1, obj) ;
++dst = sprintf (dst, kind, file2, obj) ;
++mvfile (src, dst) ;
++M {end + 1} = dst ;
++
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_report.m UMFPACK/UMFPACK/OCTAVE/umfpack_report.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_report.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_report.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,346 @@
++function umfpack_report (Control, Info)
++% UMFPACK_REPORT
++%
++%       umfpack_report (Control, Info) ;
++%
++% Prints the current Control settings for umfpack, and the statistical
++% information returned by umfpack in the Info array.  If Control is
++% an empty matrix, then the default control settings are printed.
++%
++% Control is 20-by-1, and Info is 90-by-1.  Not all entries are used.
++%
++% Alternative usages:
++%
++%       umfpack_report ([ ], Info) ;    print the default control parameters
++%                                       and the Info array.
++%       umfpack_report (Control) ;      print the control parameters only.
++%       umfpack_report ;                print the default control parameters
++%                                       and an empty Info array.
++%
++% See also umfpack, umfpack_make, umfpack_details,
++% umfpack_demo, and umfpack_simple.
++
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  See ../README for License.
++
++%-------------------------------------------------------------------------------
++% get inputs, use defaults if input arguments not present
++%-------------------------------------------------------------------------------
++
++% The contents of Control and Info are defined in umfpack.h
++if (nargin < 1)
++    Control = [] ;
++end
++if (nargin < 2)
++    Info = [] ;
++end
++if (isempty (Control))
++    Control = umfpack ;
++end
++if (isempty (Info))
++    Info = [ 0 (-ones (1, 89)) ] ;
++end
++
++%-------------------------------------------------------------------------------
++% control settings
++%-------------------------------------------------------------------------------
++
++fprintf ('\nUMFPACK Version 4.3:  Control settings:\n\n') ;
++fprintf ('    Control (1): print level: %d\n', Control (1)) ;
++fprintf ('    Control (2): dense row parameter:    %g\n', Control (2)) ;
++fprintf ('       "dense" rows have    > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ;
++fprintf ('    Control (3): dense column parameter: %g\n', Control (3)) ;
++fprintf ('       "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ;
++fprintf ('    Control (4): pivot tolerance: %g\n', Control (4)) ;
++fprintf ('    Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ;
++prstrat ('    Control (6): strategy: %g ', Control (6)) ;
++fprintf ('    Control (7): initial allocation ratio: %g\n', Control (7)) ;
++fprintf ('    Control (8): max iterative refinement steps: %d\n', Control (8)) ;
++fprintf ('    Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ;
++fprintf ('    Control (14): Q fixed during numeric factorization: %g ', Control (14)) ;
++if (Control (14) > 0)
++    fprintf ('(yes)\n') ;
++elseif (Control (14) < 0)
++    fprintf ('(no)\n') ;
++else
++    fprintf ('(auto)\n') ;
++end
++fprintf ('    Control (15): AMD dense row/column parameter: %g\n', Control (15)) ;
++fprintf ('       "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ;
++fprintf ('        Only used if the AMD ordering is used.\n') ;
++fprintf ('    Control (16): diagonal pivot tolerance: %g\n', Control (16)) ;
++fprintf ('        Only used if diagonal pivoting is attempted.\n') ;
++
++fprintf ('    Control (17): scaling option: %g ', Control (17)) ;
++if (Control (17) == 0)
++    fprintf ('(none)\n') ;
++elseif (Control (17) == 2)
++    fprintf ('(scale the matrix by\n') ;
++    fprintf ('        dividing each row by max. abs. value in each row)\n') ;
++else
++    fprintf ('(scale the matrix by\n') ;
++    fprintf ('        dividing each row by sum of abs. values in each row)\n') ;
++end
++
++fprintf ('    Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ;
++fprintf ('    Control (19): drop tolerance: %g\n', Control (19)) ;
++fprintf ('    Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ;
++yes_no (Control (20)) ;
++
++% compile-time options:
++
++fprintf ('\n  The following options can only be changed at compile-time:\n') ;
++
++if (Control (9) == 1)
++    fprintf ('    Control (9): compiled to use the BLAS\n') ;
++else
++    fprintf ('    Control (9): compiled without the BLAS\n') ;
++    fprintf ('        (you will not get the best possible performance)\n') ;
++end
++
++if (Control (10) == 1)
++    fprintf ('    Control (10): compiled for MATLAB\n') ;
++elseif (Control (10) == 2)
++    fprintf ('    Control (10): compiled for MATLAB\n') ;
++    fprintf ('        Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ;
++    fprintf ('        utDivideComplex, and utFdlibm_hypot routines.\n') ;
++else
++    fprintf ('    Control (10): not compiled for MATLAB\n') ;
++    fprintf ('        Uses ANSI C malloc, free, realloc, and printf\n') ;
++    fprintf ('        instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ;
++    fprintf ('        Printing will be in terms of 0-based matrix indexing,\n') ;
++    fprintf ('        not 1-based as is expected in MATLAB.  Diary output may\n') ;
++    fprintf ('        not be properly recorded.\n') ;
++end
++
++if (Control (11) == 2)
++    fprintf ('    Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ;
++elseif (Control (11) == 1)
++    fprintf ('    Control (11): uses getrusage to get CPU time.\n') ;
++else
++    fprintf ('    Control (11): uses ANSI C clock to get CPU time.\n') ;
++    fprintf ('        The CPU time may wrap around, type "help cputime".\n') ;
++end
++
++if (Control (12) == 1)
++    fprintf ('    Control (12): compiled with debugging enabled\n') ;
++    fprintf ('        ###########################################\n') ;
++    fprintf ('        ### This will be exceedingly slow! ########\n') ;
++    fprintf ('        ###########################################\n') ;
++    if (Control (10) == 1)
++        fprintf ('        Uses mxAssert.\n') ;
++    elseif (Control (10) == 2)
++        fprintf ('        Uses utAssert.\n') ;
++    else
++        fprintf ('        Uses ANSI C assert instead of mxAssert.\n') ;
++    end
++else
++    fprintf ('    Control (12): compiled for normal operation (no debugging)\n') ;
++end
++
++%-------------------------------------------------------------------------------
++% Info:
++%-------------------------------------------------------------------------------
++
++if (nargin == 1)
++    return
++end
++
++status = Info (1) ;
++fprintf ('\nUMFPACK status:  Info (1): %d, ', status) ;
++
++if (status == 0)
++    fprintf ('OK\n') ;
++elseif (status == 1)
++    fprintf ('WARNING  matrix is singular\n') ;
++elseif (status == -1)
++    fprintf ('ERROR    out of memory\n') ;
++elseif (status == -3)
++    fprintf ('ERROR    numeric LU factorization is invalid\n') ;
++elseif (status == -4)
++    fprintf ('ERROR    symbolic LU factorization is invalid\n') ;
++elseif (status == -5)
++    fprintf ('ERROR    required argument is missing\n') ;
++elseif (status == -6)
++    fprintf ('ERROR    n <= 0\n') ;
++elseif (status <= -7 & status >= -12 | status == -14)
++    fprintf ('ERROR    matrix A is corrupted\n') ;
++elseif (status == -13)
++    fprintf ('ERROR    invalid system\n') ;
++elseif (status == -15)
++    fprintf ('ERROR    invalid permutation\n') ;
++elseif (status == -911)
++    fprintf ('ERROR    internal error!\n') ;
++    fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ;
++else
++    fprintf ('ERROR    unrecognized error.  Info array corrupted\n') ;
++end
++
++fprintf ('    (a -1 means the entry has not been computed):\n') ;
++
++fprintf ('\n  Basic statistics:\n') ;
++fprintf ('    Info (2):  %d, # of rows of A\n', Info (2)) ;
++fprintf ('    Info (17): %d, # of columns of A\n', Info (17)) ;
++fprintf ('    Info (3): %d, nnz (A)\n', Info (3)) ;
++fprintf ('    Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ;
++fprintf ('    Info (5): %d, size of int (in bytes)\n', Info (5)) ;
++fprintf ('    Info (6): %d, size of long (in bytes)\n', Info (6)) ;
++fprintf ('    Info (7): %d, size of pointer (in bytes)\n', Info (7)) ;
++fprintf ('    Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ;
++
++fprintf ('\n  Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ;
++fprintf ('    Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ;
++fprintf ('    Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ;
++fprintf ('    Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ;
++fprintf ('    Info (60): %d ') ;
++if (Info (60) > 0)
++    fprintf ('submatrix S square and diagonal preserved\n') ;
++elseif (Info  (60) == 0)
++    fprintf ('submatrix S not square or diagonal not preserved\n') ;
++else
++    fprintf ('\n') ;
++end
++fprintf ('    Info (9):  %d, # of "dense" rows in S\n', Info (9)) ;
++fprintf ('    Info (10): %d, # of empty rows in S\n', Info (10)) ;
++fprintf ('    Info (11): %d, # of "dense" columns in S\n', Info (11)) ;
++fprintf ('    Info (12): %d, # of empty columns in S\n', Info (12)) ;
++fprintf ('    Info (34): %g, symmetry of pattern of S\n', Info (34)) ;
++fprintf ('    Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ;
++fprintf ('    Info (36): %d, nnz (diag (S))\n', Info (36)) ;
++
++fprintf ('\n  2-by-2 pivoting to place large entries on diagonal:\n') ;
++fprintf ('    Info (52): %d, # of small diagonal entries of S\n', Info (52)) ;
++fprintf ('    Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ;
++fprintf ('    Info (54): %g, symmetry of P2*S\n', Info (54)) ;
++fprintf ('    Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ;
++fprintf ('    Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ;
++
++fprintf ('\n  AMD results, for strict diagonal pivoting:\n') ;
++fprintf ('    Info (37): %d, est. nz in L and U\n', Info (37)) ;
++fprintf ('    Info (38): %g, est. flop count\n', Info (38)) ;
++fprintf ('    Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ;
++fprintf ('    Info (40): %g, est. max. nz in any column of L\n', Info (40)) ;
++
++fprintf ('\n  Final strategy selection, based on the analysis above:\n') ;
++prstrat ('    Info (19): %d, strategy used ', Info (19)) ;
++fprintf ('    Info (20): %d, ordering used ', Info (20)) ;
++if (Info (20) == 0)
++    fprintf ('(COLAMD on A)\n') ;
++elseif (Info (20) == 1)
++    fprintf ('(AMD on A+A'')\n') ;
++elseif (Info (20) == 2)
++    fprintf ('(provided by user)\n') ;
++else
++    fprintf ('(undefined ordering option)\n') ;
++end
++fprintf ('    Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ;
++yes_no (Info (32)) ;
++fprintf ('    Info (33): %d, prefer diagonal pivoting: ', Info (33)) ;
++yes_no (Info (33)) ;
++
++fprintf ('\n  symbolic analysis time and memory usage:\n') ;
++fprintf ('    Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ;
++fprintf ('    Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ;
++fprintf ('    Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ;
++fprintf ('    Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ;
++fprintf ('    Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ;
++
++fprintf ('\n  Estimates computed in the symbolic analysis:\n') ;
++fprintf ('    Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ;
++fprintf ('    Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ;
++fprintf ('    Info (23): %d, est. factorization flop count\n', Info (23)) ;
++fprintf ('    Info (24): %d, est. nnz (L)\n', Info (24)) ;
++fprintf ('    Info (25): %d, est. nnz (U)\n', Info (25)) ;
++fprintf ('    Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ;
++fprintf ('    Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ;
++fprintf ('    Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ;
++fprintf ('    Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ;
++fprintf ('    Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ;
++fprintf ('    Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ;
++
++fprintf ('\n  Computed in the numeric factorization (estimates shown above):\n') ;
++fprintf ('    Info (41): %d, size of LU factors (Units)\n', Info (41)) ;
++fprintf ('    Info (42): %d, total peak memory usage (Units)\n', Info (42)) ;
++fprintf ('    Info (43): %d, factorization flop count\n', Info (43)) ;
++fprintf ('    Info (44): %d, nnz (L)\n', Info (44)) ;
++fprintf ('    Info (45): %d, nnz (U)\n', Info (45)) ;
++fprintf ('    Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ;
++fprintf ('    Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ;
++fprintf ('    Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ;
++fprintf ('    Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ;
++fprintf ('    Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ;
++fprintf ('    Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ;
++
++fprintf ('\n  Computed in the numeric factorization (no estimates computed a priori):\n') ;
++fprintf ('    Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ;
++fprintf ('    Info (62): %d, reallocations during numeric factorization\n', Info (62)) ;
++fprintf ('    Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ;
++fprintf ('    Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ;
++fprintf ('    Info (65): %d, numerical values stored in L and U\n', Info (65)) ;
++fprintf ('    Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ;
++fprintf ('    Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ;
++if (Info (66) > 0.05 & Info (43) > 0)
++fprintf ('    mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ;
++end
++fprintf ('    Info (67): %d, nnz (diag (U))\n', Info (67)) ;
++fprintf ('    Info (68): %g, reciprocal condition number estimate\n', Info (68)) ;
++fprintf ('    Info (69): %g, matrix was ', Info (69)) ;
++if (Info (69) == 0)
++    fprintf ('not scaled\n') ;
++elseif (Info (69) == 2)
++    fprintf ('scaled (row max)\n') ;
++else
++    fprintf ('scaled (row sum)\n') ;
++end
++fprintf ('    Info (70): %g, min. scale factor of rows of A\n', Info (70)) ;
++fprintf ('    Info (71): %g, max. scale factor of rows of A\n', Info (71)) ;
++fprintf ('    Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ;
++fprintf ('    Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ;
++fprintf ('    Info (74): %g, initial allocation parameter used\n', Info (74)) ;
++fprintf ('    Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ;
++fprintf ('    Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ;
++fprintf ('    Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ;
++fprintf ('    Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ;
++fprintf ('    Info (80): %d, # of small entries dropped\n', Info (80)) ;
++
++fprintf ('\n  Computed in the solve step:\n') ;
++fprintf ('    Info (81): %d, iterative refinement steps taken\n', Info (81)) ;
++fprintf ('    Info (82): %d, iterative refinement steps attempted\n', Info (82)) ;
++fprintf ('    Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ;
++fprintf ('    Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ;
++fprintf ('    Info (85): %d, solve flop count\n', Info (85)) ;
++fprintf ('    Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ;
++fprintf ('    Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ;
++
++fprintf ('\n    Info (88:90): unused\n\n') ;
++
++%-------------------------------------------------------------------------------
++
++function prstrat (fmt, strategy)
++fprintf (fmt, strategy) ;
++if (strategy == 1)
++    fprintf ('(unsymmetric)\n') ;
++    fprintf ('        Q = COLAMD (A), Q refined during numerical\n') ;
++    fprintf ('        factorization, and no attempt at diagonal pivoting.\n') ;
++elseif (strategy == 2)
++    fprintf ('(symmetric, with 2-by-2 pivoting)\n') ;
++    fprintf ('        P2 = row permutation to place large values on the diagonal\n') ;
++    fprintf ('        Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ;
++    fprintf ('        and diagonal pivoting attempted.\n') ;
++elseif (strategy == 3)
++    fprintf ('(symmetric)\n') ;
++    fprintf ('        Q = AMD (A+A''), Q not refined during numeric factorization,\n') ;
++    fprintf ('        and diagonal pivoting (P=Q'') attempted.\n') ;
++else
++    strategy = 0 ;
++    fprintf ('(auto)\n') ;
++end
++
++%-------------------------------------------------------------------------------
++
++function yes_no (s)
++if (s == 0)
++    fprintf ('(no)\n') ;
++else
++    fprintf ('(yes)\n') ;
++end
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,61 @@
++% umfpack_simple:  a simple demo of UMFPACK
++%
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.
++% 
++% UMFPACK License:
++% 
++%     Your use or distribution of UMFPACK or any modified version of
++%     UMFPACK implies that you agree to this License.
++% 
++%     THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
++%     EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
++% 
++%     Permission is hereby granted to use or copy this program, provided
++%     that the Copyright, this License, and the Availability of the original
++%     version is retained on all copies.  User documentation of any code that
++%     uses UMFPACK or any modified version of UMFPACK code must cite the
++%     Copyright, this License, the Availability note, and "Used by permission."
++%     Permission to modify the code and to distribute modified code is granted,
++%     provided the Copyright, this License, and the Availability note are
++%     retained, and a notice that the code was modified is included.  This
++%     software was developed with support from the National Science Foundation,
++%     and is provided to you free of charge.
++% 
++% Availability: http://www.cise.ufl.edu/research/sparse/umfpack
++%
++% See also: umfpack, umfpack_details
++
++help umfpack_simple
++i = input ('Hit enter to agree to the above License: ', 's') ;
++if (~isempty (i))
++    error ('terminating') ;
++end
++
++format short
++
++A = [
++ 2  3  0  0  0
++ 3  0  4  0  6
++ 0 -1 -3  2  0
++ 0  0  1  0  0
++ 0  4  2  0  1
++]
++
++A = sparse (A) ;
++
++b = [8 45 -3 3 19]'
++
++fprintf ('Solution to Ax=b via UMFPACK:\n') ;
++fprintf ('x1 = umfpack (A, ''\\'', b)\n') ;
++
++x1 = umfpack (A, '\\', b)
++
++fprintf ('Solution to Ax=b via OCTAVE:\n') ;
++fprintf ('x2 = A\\b\n') ;
++
++x2 = A\b
++
++fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ;
++
++fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ;
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m.out UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_simple.m.out	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,79 @@
++octave:4> umfpack_simple
++umfpack_simple is the file: /home/dbateman/octave/devel/octave-sparse/UMFPACKv4.3/UMFPACK/OCTAVE/umfpack_simple.m
++
++umfpack_simple:  a simple demo of UMFPACK
++
++UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++Davis.  All Rights Reserved.
++
++UMFPACK License:
++
++    Your use or distribution of UMFPACK or any modified version of
++    UMFPACK implies that you agree to this License.
++
++    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
++    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
++
++    Permission is hereby granted to use or copy this program, provided
++    that the Copyright, this License, and the Availability of the original
++    version is retained on all copies.  User documentation of any code that
++    uses UMFPACK or any modified version of UMFPACK code must cite the
++    Copyright, this License, the Availability note, and "Used by permission."
++    Permission to modify the code and to distribute modified code is granted,
++    provided the Copyright, this License, and the Availability note are
++    retained, and a notice that the code was modified is included.  This
++    software was developed with support from the National Science Foundation,
++    and is provided to you free of charge.
++
++Availability: http://www.cise.ufl.edu/research/sparse/umfpack
++
++See also: umfpack, umfpack_details
++
++
++Additional help for built-in functions, operators, and variables
++is available in the on-line version of the manual.  Use the command
++`help -i <topic>' to search the manual index.
++
++Help and information about Octave is also available on the WWW
++at http://www.octave.org and via the help@octave.org
++mailing list.
++Hit enter to agree to the above License: 
++A =
++
++   2   3   0   0   0
++   3   0   4   0   6
++   0  -1  -3   2   0
++   0   0   1   0   0
++   0   4   2   0   1
++
++b =
++
++    8
++   45
++   -3
++    3
++   19
++
++Solution to Ax=b via UMFPACK:
++x1 = umfpack (A, '\', b)
++x1 =
++
++  1.00000
++  2.00000
++  3.00000
++  4.00000
++  5.00000
++
++Solution to Ax=b via OCTAVE:
++x2 = A\b
++x2 =
++
++  1.00000
++  2.00000
++  3.00000
++  4.00000
++  5.00000
++
++norm (x1-x2) should be small: 0
++Type 'umfpack_demo' for a full demo of UMFPACK
++octave:5> diary off
+diff -uNr UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_solve.m UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m
+--- UMFPACKv4.4.orig/UMFPACK/OCTAVE/umfpack_solve.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m	2004-12-30 01:58:46.000000000 +0100
+@@ -0,0 +1,97 @@
++function x = umfpack_solve (arg1, op, arg2, Control)
++% UMFPACK_SOLVE
++%
++% x = umfpack_solve (A, '\', b, Control)
++% x = umfpack_solve (b, '/', A, Control)
++%
++% Computes x = A\b, or b/A, where A is square.  Uses UMFPACK if A is sparse.
++% The Control argument is optional.
++%
++% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
++% and umfpack_simple.
++
++% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
++% Davis.  All Rights Reserved.  Type umfpack_details for License.
++
++%-------------------------------------------------------------------------------
++% check inputs and get default control parameters
++%-------------------------------------------------------------------------------
++
++if (op == '\\')
++    A = arg1 ;
++    b = arg2 ;
++elseif (op == '/')
++    A = arg2 ;
++    b = arg1 ;
++else
++    help umfack_solve
++    error ('umfpack_solve:  unrecognized operator') ;
++end
++
++[m n] = size (A) ;
++if (m ~= n)
++    help umfpack_solve
++    error ('umfpack_solve:  A must be square') ;
++end
++
++[m1 n1] = size (b) ;
++if ((op == '\\' & n ~= m1) | (op == '/' & n1 ~= m))
++    help umfpack_solve
++    error ('umfpack_solve:  b has the wrong dimensions') ;
++end
++
++if (nargin < 4)
++    Control = umfpack ;
++end
++
++%-------------------------------------------------------------------------------
++% solve the system
++%-------------------------------------------------------------------------------
++
++if (op == '\\')
++
++    if (~issparse (A))
++
++	% A is not sparse, so just use MATLAB
++	x = A\b ;
++
++    elseif (n1 == 1 & ~issparse (b))
++
++	% the UMFPACK '\' requires b to be a dense column vector
++	x = umfpack (A, '\\', b, Control) ;
++
++    else
++
++	% factorize with UMFPACK and do the forward/back solves in MATLAB 
++	[L, U, P, Q, R] = umfpack (A, Control) ;
++	keyboard
++	x = Q * (U \ (L \ (P * (R \ b)))) ;
++
++    end
++
++else
++
++    if (~issparse (A))
++
++	% A is not sparse, so just use MATLAB
++	x = b/A ;
++
++    elseif (m1 == 1 & ~issparse (b))
++
++	% the UMFPACK '/' requires b to be a dense column vector
++	x = umfpack (b, '/', A, Control) ;
++
++    else
++
++	% factorize with UMFPACK and do the forward/back solves in MATLAB
++	% this mimics the behavior of x = b/A, except for the row scaling
++	[L, U, P, Q, R] = umfpack (A.', Control) ;
++	x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ;
++
++	% an alternative method:
++	% [L, U, P, Q, r] = umfpack (A, Control) ;
++	% x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ;
++
++    end
++
++end
+diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd.cc UMFPACK/AMD/OCTAVE/amd.cc
+--- UMFPACKv4.4.orig/AMD/OCTAVE/amd.cc	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/AMD/OCTAVE/amd.cc	2005-02-01 21:51:23.944874478 +0100
+@@ -0,0 +1,299 @@
++/*
++
++Copyright (C) 2004 David Bateman
++
++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; see the file COPYING.  If not, write to the Free
++Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++
++In addition to the terms of the GPL, you are permitted to link
++this program with any Open Source program, as defined by the
++Open Source Initiative (www.opensource.org)
++
++*/
++
++/*
++
++This is the Octave interface to the UMFPACK AMD code, which bore the following
++copyright
++
++ AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
++ Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
++ email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
++ web: http://www.cise.ufl.edu/research/sparse/amd
++ --------------------------------------------------------------------------
++
++    Acknowledgements: This work was supported by the National Science
++       Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
++
++*/
++
++#include <cstdlib>
++#include <string>
++
++#include <octave/config.h>
++#include <octave/ov.h>
++#include <octave/defun-dld.h>
++#include <octave/pager.h>
++#include <octave/ov-re-mat.h>
++
++#include "ov-re-sparse.h"
++#include "ov-cx-sparse.h"
++
++// External AMD functions in C
++extern "C" {
++#include "amd.h"
++}
++
++DEFUN_DLD (amd, args, nargout,
++    "-*- texinfo -*-\n\
++@deftypefn {Loadable Function} {@var{p} =} amd (@var{s})\n\
++@deftypefnx {Loadable Function} {@var{Control} =} amd ()\n\
++@deftypefnx {Loadable Function} {[@var{p}, @var{info}] =} amd (@var{s})\n\
++\n\
++AMD Approximate minimum degree permutation. Returns the approximate\n\
++minimum degree permutation vector for the sparse matrix\n\
++@code{@var{c} = @var{S} + @var{S}'}. The Cholesky factorization of\n\
++@code{@var{c} (@var{p}, @var{p})}, or @code{@var{s} (@var{p}, @var{p})},\n\
++tends to be sparser than that of @var{c} or @var{s}.\n\
++@var{s} must be square. If @var{s} is full, @code{amd (@var{S})} is\n\
++equivalent to  @code{amd (sparse (@var{s}))}.\n\
++\n\
++@table @asis\n\
++@item @var{Control} (1)\n\
++If S is n-by-n, then rows/columns with more than\n\
++@code{@dfn{max} (16, (@var{Control} (1)) * @dfn{sqrt} (@var{n}))} entries\n\
++in @code{@var{s} + @var{S}'} are considered @emph{dense}, and ignored during\n\
++ordering.  They are placed last in the output permutation.  The default is\n\
++10.0 if @var{Control} is not present.\n\
++@item @var{Control} (2)\n\
++If nonzero, then aggressive absorption is performed. This is the default if\n\
++@var{Control} is not present.\n\
++@item @var{Control} (3)\n\
++If nonzero, print statistics about the ordering.\n\
++@end table\n\
++\n\
++@table @asis\n\
++@item @var{Info} (1)\n\
++status (0: ok, -1: out of memory, -2: matrix invalid)\n\
++@item @var{Info} (2)\n\
++@code{@var{n} = size (@var{a}, 1)}\n\
++@item @var{Info} (3)\n\
++@code{nnz (A)}\n\
++@item @var{Info} (4)\n\
++The symmetry of the matrix @var{s} (0.0 means purely unsymmetric, 1.0 means\n\
++purely symmetric).  Computed as: @code{@var{b} = tril (@var{s}, -1) +\n\
++triu (@var{s}, 1); @var{symmetry} = nnz (@var{b} & @var{b}')\n\
++/ nnz (@var{b});}\n\
++@item @var{Info} (5)\n\
++@code{nnz (diag (@var{s}))}\n\
++@item @var{Info} (6)\n\
++@dfn{nnz} in @code{@var{s} + @var{s}'}, excluding the diagonal\n\
++(= @code{nnz (@var{b} + @var{b}')})\n\
++@item @var{Info} (7)\n\
++Number of @emph{dense} rows/columns in @code{@var{s} + @var{s}'}\n\
++@item @var{Info} (8)\n\
++The amount of memory used by AMD, in bytes\n\
++@item @var{Info} (9)\n\
++The number of memory compactions performed by AMD\n\
++@end table\n\
++\n\
++The following statistics are slight upper bounds because of the\n\
++approximate degree in AMD. The bounds are looser if @emph{dense}\n\
++rows/columns are ignored during ordering @code{(@var{Info} (7) > 0)}.\n\
++The statistics are for a subsequent factorization of the matrix\n\
++@code{@var{c} (@var{p},@var{p})}.  The LU factorization statistics assume\n \
++no pivoting.\n\
++\n\
++@table @asis\n\
++@item @var{Info} (10)\n\
++The number of nonzeros in L, excluding the diagonal\n\
++@item @var{Info} (11)\n\
++The number of divide operations for LL', LDL', or LU\n\
++@item @var{Info (12)}\n\
++The number of multiply-subtract pairs for LL' or LDL'\n\
++@item @var{Info} (13)\n\
++The number of multiply-subtract pairs for LU\n\
++@item @var{Info} (14)\n\
++The max number of nonzeros in any column of L (incl. diagonal)\n\
++@item @var{Info} (15:20)\n\
++unused, reserved for future use\n\
++@end table\n\
++\n\
++An assembly tree post-ordering is performed, which is typically the same\n\
++as an elimination tree post-ordering.  It is not always identical because\n\
++of the approximate degree update used, and because @emph{dense} rows/columns\n\
++do not take part in the post-order.  It well-suited for a subsequent\n\
++@dfn{chol}, however.  If you require a precise elimination tree\n\
++post-ordering, then do:\n\
++\n\
++@group\n\
++   @var{p} = @dfn{amd} (@var{s});\n\
++   % skip this if S already symmetric\n\
++   @var{c} = spones (@var{s}) + spones (@var{s}');\n\
++   [@var{ignore}, @var{q}] = sparsfun ('symetree', @var{c} (@var{p}, @var{p}));\n\
++   @var{p} = @var{p} (@var{q});\n\
++@end group\n\
++\n\
++AMD Version 1.1 (Jan. 21, 2004), Copyright @copyright{} 2004 by\n\
++Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff.\n\
++\n\
++email: davis@@cise.ufl.edu  (CISE Department, Univ. of Florida).\n\
++\n\
++web: http://www.cise.ufl.edu/research/sparse/amd\n\
++\n\
++Acknowledgements: This work was supported by the National Science\n\
++Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.\n\
++@end deftypefn")
++{
++  int nargin = args.length (); 
++  octave_value_list retval; 
++  int spumoni = 0;
++
++  if (nargin > 2 || nargout > 2)
++    usage ("p = amd (A) or [p, Info] = amd (A, Control)");
++  else if (nargin == 0)
++    {
++      // Get the default control parameter, and return
++      NDArray control (dim_vector (AMD_CONTROL, 1));
++      double *control_ptr = control.fortran_vec ();
++      amd_defaults (control_ptr);
++      if (nargout == 0)
++	amd_control (control_ptr);
++      else
++	retval(0) = control;
++    }
++  else
++    {
++      NDArray control (dim_vector (AMD_CONTROL, 1));
++      double *control_ptr = control.fortran_vec ();
++      amd_defaults (control_ptr);
++
++      if (nargin > 1)
++	{
++	  NDArray control_in = args(1).array_value();
++
++	  if (error_state)
++	    {	  
++	      error ("amd: could not read control vector");
++	      return retval;
++	    }
++
++	  dim_vector dv = control_in.dims ();
++	  if (dv.length() > 2 || (dv(0) != 1 && dv(1) != 1))
++	    {
++	      error ("amd: control vector isn't a vector");
++	      return retval;
++	    }
++	  
++	  int nc = dv.numel ();
++	  control (AMD_DENSE) = (nc > 0 ? control_in (AMD_DENSE) :
++				 AMD_DEFAULT_DENSE);
++	  control (AMD_AGGRESSIVE) = (nc > 1 ? control_in (AMD_AGGRESSIVE) :
++				      AMD_DEFAULT_AGGRESSIVE);
++	  spumoni = (nc > 2 ? (control_in (2) != 0) : 0);
++	}
++
++      if (spumoni > 0)
++	amd_control (control_ptr);
++
++      int *Ap, *Ai;
++      int n, m, nz;
++
++      // These are here only so that the C++ destructors don't prematurally
++      // remove the underlying data we are interested in
++      SparseMatrix sm;
++      SparseComplexMatrix scm;
++      Matrix mm;
++      ComplexMatrix cm;
++
++      if (args(0).class_name () != "sparse" && spumoni > 0)
++	octave_stdout << "    input matrix A is full (sparse copy"
++		      << " of A will be created)" << std::endl;
++
++      if (args(0).is_complex_type ())
++	{
++	  scm = args(0).sparse_complex_matrix_value ();
++	  Ai = scm.ridx ();
++	  Ap = scm.cidx ();
++	  m = scm.rows ();
++	  n = scm.cols ();
++	  nz = scm.nnz ();
++	}
++      else
++	{
++	  sm = args(0).sparse_matrix_value ();
++	  Ai = sm.ridx ();
++	  Ap = sm.cidx ();
++	  m = sm.rows ();
++	  n = sm.cols ();
++	  nz = sm.nnz ();
++	}
++
++      if (spumoni > 0)
++	octave_stdout << "    input matrix A is " << m << "-by-" << n 
++		      << std::endl;
++
++      if (m != n)
++	{
++	  error ("amd: A must be square");
++	  return retval;
++	}
++
++      if (spumoni > 0)
++	octave_stdout << "    input matrix A has " << nz << 
++	  " nonzero entries" << std::endl;
++
++      // allocate workspace for output permutation 
++      Array<int> P(n+1);
++      int *P_ptr = P.fortran_vec ();
++      NDArray info (dim_vector (AMD_INFO, 1));
++      double *info_ptr = info.fortran_vec ();
++      int result;
++
++      // order the matrix
++      result = amd_order (n, Ap, Ai, P_ptr, control_ptr, info_ptr);
++
++      // print results (including return value)
++      if (spumoni > 0)
++	amd_info (info_ptr);
++
++      // check error conditions
++      if (result == AMD_OUT_OF_MEMORY)
++	error ("amd: out of memory");
++      else if (result == AMD_INVALID)
++	error ("amd: input matrix A is corrupted");
++      else
++	{
++	  // copy the outputs to Octave
++
++	  // output permutation, P
++	  NDArray perm (dim_vector (1, n));
++	  for (int i = 0; i < n; i++)
++	    perm (i) = double (P(i) + 1);  // 1-based indexing for Octave
++
++	  retval (0) = perm;
++
++	  // Info
++	  if (nargout > 1)
++	    retval (1) = info;
++	}
++    }
++  return retval;
++}
++
++/*
++;;; Local Variables: ***
++;;; mode: C++ ***
++;;; End: ***
++*/
+diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m UMFPACK/AMD/OCTAVE/amd_demo.m
+--- UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/AMD/OCTAVE/amd_demo.m	2004-12-30 01:58:45.000000000 +0100
+@@ -0,0 +1,61 @@
++function amd_demo
++% AMD DEMO
++%
++% A demo of AMD for OCTAVE.
++%
++% --------------------------------------------------------------------------
++% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
++% Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
++% email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
++% web: http://www.cise.ufl.edu/research/sparse/amd
++% --------------------------------------------------------------------------
++%
++% See also: amd
++
++% Get the Harwell/Boeing can_24 matrix.  This is an example matrix from the
++% MATLAB-accessible UF sparse matrix collection, and can be loaded into
++% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining
++% the UFget function and its supporting routines at
++% http://www.cise.ufl.edu/sparse/mat .
++
++load can_24.mat
++A = Problem.A ;
++n = size (A,1) ;
++
++figure (1)
++clf
++hold off
++subplot (2,1,1) ;
++% remove the "_" from the name before printing it in the plot title
++title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ;
++fprintf ('Matrix name:  %s\n', Problem.name) ;
++fprintf ('Matrix title: %s\n', Problem.title) ;
++spy (A)
++
++% print the details during AMD ordering and SYMBFACT
++control = amd ();
++control (3) = 1;
++
++% order the matrix.  Note that the Info argument is optional.
++fprintf ('\nIf the next step fails, then you have\n') ;
++fprintf ('not yet compiled the AMD mexFunction.\n') ;
++[p, Info] = amd (A, control) ;
++
++% order again, but this time print some statistics
++[p, Info] = amd (A, [10 1 1]) ;
++
++fprintf ('Permutation vector:\n') ;
++fprintf (' %2d', p) ;
++fprintf ('\n\n') ;
++
++subplot (2,1,2) ;
++title ('Permuted matrix') ;
++spy (A (p,p))
++
++% approximations from amd:
++lnz2 = n + Info (10) ;
++fl2 = n + Info (11) + 2 * Info (12) ;
++fprintf ('\nResults from AMD''s approximate analysis:\n') ;
++fprintf ('number of nonzeros in L (including diagonal):      %d\n', lnz2) ;
++fprintf ('floating point operation count for chol (A (p,p)): %d\n\n', fl2) ;
++
+diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m.out UMFPACK/AMD/OCTAVE/amd_demo.m.out
+--- UMFPACKv4.4.orig/AMD/OCTAVE/amd_demo.m.out	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/AMD/OCTAVE/amd_demo.m.out	2004-12-30 01:58:45.000000000 +0100
+@@ -0,1 +1,21 @@
++octave:3> amd_demo
++ans = 1
++Matrix name:  HB/can_24
++Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981.
++
++If the next step fails, then you have
++not yet compiled the AMD mexFunction.
++    input matrix A is 24-by-24
++    input matrix A has 160 nonzero entries
++    input matrix A is 24-by-24
++    input matrix A has 160 nonzero entries
++Permutation vector:
++ 23 21 11 24 13  6 17  9 15  5 16  8  2 10 14 18  1  3  4  7 12 19 22 20
++
++
++Results from AMD's approximate analysis:
++number of nonzeros in L (including diagonal):      121
++floating point operation count for chol (A (p,p)): 671
++
++octave:4> quit
+--- UMFPACKv4.4.orig/AMD/OCTAVE/GNUmakefile	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/AMD/OCTAVE/GNUmakefile	2004-12-30 01:58:45.000000000 +0100
+@@ -0,0 +1,33 @@
++#------------------------------------------------------------------------------
++# GNUmakefile for the AMD MATLAB mexFunction
++#------------------------------------------------------------------------------
++
++all: amd
++
++include ../Make/Make.include
++
++MKOCT = mkoctfile -I../Include
++
++OCT_SPARSE_INC = -I../../../
++
++AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
++	amd_order amd_control amd_info amd_valid
++
++INC = ../Include/amd.h ../Source/amd_internal.h 
++
++OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD)))
++
++amd_o_%.o: ../Source/amd_%.c $(INC)
++	$(MKOCT) -DDINT -c $< -o $@
++	- $(MV) ../Source/amd_$*.o
++
++# Note temporary addition of octave sparse path
++amd: amd.cc $(OCTAMD) $(INC)
++	$(MKOCT) amd.cc $(OCTAMD) $(OCT_SPARSE_INC) -o amd.oct
++
++#------------------------------------------------------------------------------
++# Remove all but the files in the original distribution
++#------------------------------------------------------------------------------
++
++purge: clean
++	- $(RM) amd.oct
+diff -uNr UMFPACKv4.4.orig/AMD/OCTAVE/Makefile UMFPACK/AMD/OCTAVE/Makefile
+--- UMFPACKv4.4.orig/AMD/OCTAVE/Makefile	1970-01-01 01:00:00.000000000 +0100
++++ UMFPACK/AMD/OCTAVE/Makefile	2004-12-30 01:58:45.000000000 +0100
+@@ -0,0 +1,41 @@
++#------------------------------------------------------------------------------
++# compile the AMD mexFunction for MATLAB (original make only)
++#------------------------------------------------------------------------------
++
++# This is a very ugly Makefile, and is only provided for those who do not
++# have GNU make.  Note that it is not used if you have GNU make.  It ignores
++# dependency checking and just compiles everything.  It was created
++# automatically, via make -n using the GNUmakefile.  That way, I don't have
++# maintain two Makefiles.
++
++all: amd
++
++include ../Make/Make.include
++
++MKOCT = mkoctfile -I../Include
++
++OCT_SPARSE_INC = ../../../
++
++amd:
++	$(MKOCT) -DDINT -o amd_o_aat.o -c ../Source/amd_aat.c
++	$(MKOCT) -DDINT -o amd_o_1.o -c ../Source/amd_1.c
++	$(MKOCT) -DDINT -o amd_o_2.o -c ../Source/amd_2.c
++	$(MKOCT) -DDINT -o amd_o_dump.o -c ../Source/amd_dump.c
++	$(MKOCT) -DDINT -o amd_o_postorder.o -c ../Source/amd_postorder.c
++	$(MKOCT) -DDINT -o amd_o_post_tree.o -c ../Source/amd_post_tree.c
++	$(MKOCT) -DDINT -o amd_o_defaults.o -c ../Source/amd_defaults.c
++	$(MKOCT) -DDINT -o amd_o_order.o -c ../Source/amd_order.c
++	$(MKOCT) -DDINT -o amd_o_control.o -c ../Source/amd_control.c
++	$(MKOCT) -DDINT -o amd_o_info.o -c ../Source/amd_info.c
++	$(MKOCT) -DDINT -o amd_o_valid.o -c ../Source/amd_valid.c
++	$(MKOCT) -output amd.oct amd_mex.c amd_o_aat.o \
++	    amd_o_1.o amd_o_2.o amd_o_dump.o amd_o_postorder.o \
++	    amd_o_post_tree.o amd_o_defaults.o amd_o_order.o amd_o_control.o \
++	    amd_o_info.o amd_o_valid.o $(OCT_SPARSE_INC) -o amd.oct
++
++#------------------------------------------------------------------------------
++# Remove all but the files in the original distribution
++#------------------------------------------------------------------------------
++
++purge: clean
++	- $(RM) amd.oct
+--- UMFPACKv4.4.orig/UMFPACK/Source/umf_solve.c	2005-01-17 17:21:29.000000000 +0100
++++ UMFPACK/UMFPACK/Source/umf_solve.c	2005-02-02 00:01:22.904346651 +0100
+@@ -79,7 +79,8 @@
+     double *Z2, *Y, *B2, *Rs ;
+     Int *Rperm, *Cperm, i, n, p, step, j, nz, status, p2, do_scale ;
+ #ifdef COMPLEX
+-    Int split ;
++    Int AXsplit ;
++    Int Bsplit ;
+ #endif
+ #ifndef NRECIPROCAL
+     Int do_recip = Numeric->do_recip ;
+@@ -141,7 +142,7 @@
+ 	    return (UMFPACK_ERROR_argument_missing) ;
+ 	}
+ 	/* A, B, and X in split format if Az, Bz, and Xz present */
+-	split = SPLIT (Az) && SPLIT (Bz) && SPLIT (Xz) ;
++	AXsplit = SPLIT (Az) || SPLIT(Xz);
+ 	Z = (Entry *) (SolveWork + 4*n) ;	/* Entry Z [0..n-1] */
+ 	S = (Entry *) (SolveWork + 6*n) ;	/* Entry S [0..n-1] */
+ 	Y = (double *) (SolveWork + 8*n) ;	/* double Y [0..n-1] */
+@@ -150,10 +151,12 @@
+     }
+     else
+     {
+-	/* A is ignored, only  look at X and B for split/packed cases */
+-	split = SPLIT (Bz) && SPLIT (Xz) ;
++      /* A is ignored, only  look at X for split/packed cases */
++      AXsplit = SPLIT(Xz);
+     }
+-    if (split)
++    Bsplit = SPLIT (Bz);
++
++    if (AXsplit)
+     {
+ 	X = (Entry *) (SolveWork + 2*n) ;	/* Entry X [0..n-1] */
+     }
+@@ -209,7 +212,7 @@
+ 	    for (p = 0 ; p < p2 ; p++)
+ 	    {
+ 		/* Y [Ai [p]] += ABS (Ax [p]) ; */
+-	        ASSIGN (aij, Ax, Az, p, split) ;
++	        ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 		ABS (d, aij) ;
+ 		Y [Ai [p]] += d ;
+ 	    }
+@@ -219,7 +222,7 @@
+ 	    for (i = 0 ; i < n ; i++)
+ 	    {
+ 		/* B2 [i] = ABS (B [i]) ; */
+-		ASSIGN (bi, Bx, Bz, i, split) ;
++		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+ 		ABS (B2 [i], bi) ;
+ 	    }
+ 
+@@ -276,7 +279,7 @@
+ 			/* multiply by the scale factors */
+ 			for (i = 0 ; i < n ; i++)
+ 			{
+-			    ASSIGN (X [i], Bx, Bz, i, split) ;
++			    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 			    SCALE (X [i], Rs [i]) ;
+ 			}
+ 		    }
+@@ -286,7 +289,7 @@
+ 			/* divide by the scale factors */
+ 			for (i = 0 ; i < n ; i++)
+ 			{
+-			    ASSIGN (X [i], Bx, Bz, i, split) ;
++			    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 			    SCALE_DIV (X [i], Rs [i]) ;
+ 			}
+ 		    }
+@@ -302,7 +305,7 @@
+ 		    for (i = 0 ; i < n ; i++)
+ 		    {
+ 			/* W [i] = B [Rperm [i]] ; */
+-			ASSIGN (W [i], Bx, Bz, Rperm [i], split) ;
++			ASSIGN (W [i], Bx, Bz, Rperm [i], Bsplit) ;
+ 		    }
+ 		}
+ 	    }
+@@ -311,7 +314,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* Z [i] = B [i] ; */
+-		    ASSIGN (Z [i], Bx, Bz, i, split) ;
++		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+ 		}
+ 		flops += MULTSUB_FLOPS * nz ;
+ 		for (i = 0 ; i < n ; i++)
+@@ -321,7 +324,7 @@
+ 		    for (p = Ap [i] ; p < p2 ; p++)
+ 		    {
+ 			/* Z [Ai [p]] -= Ax [p] * xi ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			MULT_SUB (Z [Ai [p]], aij, xi) ;
+ 		    }
+ 		}
+@@ -390,7 +393,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* W [i] = B [i] ; */
+-		    ASSIGN (W [i], Bx, Bz, i, split) ;
++		    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+ 		    Z2 [i] = 0. ;
+ 		}
+ 		flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ;
+@@ -403,7 +406,7 @@
+ 			i = Ai [p] ;
+ 
+ 			/* axx = Ax [p] * xj ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			MULT (axx, aij, xj) ;
+ 
+ 			/* W [i] -= axx ; */
+@@ -493,7 +496,7 @@
+ 			    /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */
+ 			    /* note that abs (aij) is the same as
+ 			     * abs (conj (aij)) */
+-			    ASSIGN (aij, Ax, Az, p, split) ;
++			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			    ABS (d, aij) ;
+ 			    yi += (d * Rs [Ai [p]]) ;
+ 			}
+@@ -513,7 +516,7 @@
+ 			    /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */
+ 			    /* note that abs (aij) is the same as
+ 			     * abs (conj (aij)) */
+-			    ASSIGN (aij, Ax, Az, p, split) ;
++			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			    ABS (d, aij) ;
+ 			    yi += (d / Rs [Ai [p]]) ;
+ 			}
+@@ -534,7 +537,7 @@
+ 			/* yi += ABS (Ax [p]) ; */
+ 			/* note that abs (aij) is the same as
+ 			 * abs (conj (aij)) */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			ABS (d, aij) ;
+ 			yi += d ;
+ 		    }
+@@ -546,7 +549,7 @@
+ 	    for (i = 0 ; i < n ; i++)
+ 	    {
+ 		/* B2 [i] = ABS (B [i]) ; */
+-		ASSIGN (bi, Bx, Bz, i, split) ;
++		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+ 		ABS (B2 [i], bi) ;
+ 	    }
+ 
+@@ -568,7 +571,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* W [i] = B [Cperm [i]] ; */
+-		    ASSIGN (W [i], Bx, Bz, Cperm [i], split) ;
++		    ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ;
+ 		}
+ 	    }
+ 	    else
+@@ -577,7 +580,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* Z [i] = B [i] ; */
+-		    ASSIGN (Z [i], Bx, Bz, i, split) ;
++		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+ 		}
+ 		flops += MULTSUB_FLOPS * nz ;
+ 		for (i = 0 ; i < n ; i++)
+@@ -587,7 +590,7 @@
+ 		    for (p = Ap [i] ; p < p2 ; p++)
+ 		    {
+ 			/* zi -= conjugate (Ax [p]) * X [Ai [p]] ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, Bsplit) ;
+ 			MULT_SUB_CONJ (zi, X [Ai [p]], aij) ;
+ 		    }
+ 		    Z [i] = zi ;
+@@ -696,13 +699,13 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* wi = B [i] ; */
+-		    ASSIGN (wi, Bx, Bz, i, split) ;
++		    ASSIGN (wi, Bx, Bz, i, Bsplit) ;
+ 		    z2i = 0. ;
+ 		    p2 = Ap [i+1] ;
+ 		    for (p = Ap [i] ; p < p2 ; p++)
+ 		    {
+ 			/* axx = conjugate (Ax [p]) * X [Ai [p]] ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			MULT_CONJ (axx, X [Ai [p]], aij) ;
+ 
+ 			/* wi -= axx ; */
+@@ -766,7 +769,7 @@
+ 			    /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */
+ 			    /* note that A.' is the array transpose,
+ 			     * so no conjugate */
+-			    ASSIGN (aij, Ax, Az, p, split) ;
++			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			    ABS (d, aij) ;
+ 			    yi += (d * Rs [Ai [p]]) ;
+ 			}
+@@ -786,7 +789,7 @@
+ 			    /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */
+ 			    /* note that A.' is the array transpose,
+ 			     * so no conjugate */
+-			    ASSIGN (aij, Ax, Az, p, split) ;
++			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			    ABS (d, aij) ;
+ 			    yi += (d / Rs [Ai [p]]) ;
+ 			}
+@@ -807,7 +810,7 @@
+ 			/* yi += ABS (Ax [p]) */
+ 			/* note that A.' is the array transpose,
+ 			 * so no conjugate */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			ABS (d, aij) ;
+ 			yi += d ;
+ 		    }
+@@ -819,7 +822,7 @@
+ 	    for (i = 0 ; i < n ; i++)
+ 	    {
+ 		/* B2 [i] = ABS (B [i]) ; */
+-		ASSIGN (bi, Bx, Bz, i, split) ;
++		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+ 		ABS (B2 [i], bi) ;
+ 	    }
+ 
+@@ -841,7 +844,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* W [i] = B [Cperm [i]] ; */
+-		    ASSIGN (W [i], Bx, Bz, Cperm [i], split) ;
++		    ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ;
+ 		}
+ 	    }
+ 	    else
+@@ -850,7 +853,7 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* Z [i] = B [i] ; */
+-		    ASSIGN (Z [i], Bx, Bz, i, split) ;
++		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+ 		}
+ 		flops += MULTSUB_FLOPS * nz ;
+ 		for (i = 0 ; i < n ; i++)
+@@ -860,7 +863,7 @@
+ 		    for (p = Ap [i] ; p < p2 ; p++)
+ 		    {
+ 			/* zi -= Ax [p] * X [Ai [p]] ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			MULT_SUB (zi, aij, X [Ai [p]]) ;
+ 		    }
+ 		    Z [i] = zi ;
+@@ -969,13 +972,13 @@
+ 		for (i = 0 ; i < n ; i++)
+ 		{
+ 		    /* wi = B [i] ; */
+-		    ASSIGN (wi, Bx, Bz, i, split) ;
++		    ASSIGN (wi, Bx, Bz, i, Bsplit) ;
+ 		    z2i = 0. ;
+ 		    p2 = Ap [i+1] ;
+ 		    for (p = Ap [i] ; p < p2 ; p++)
+ 		    {
+ 			/* axx = Ax [p] * X [Ai [p]] ; */
+-			ASSIGN (aij, Ax, Az, p, split) ;
++			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+ 			MULT (axx, aij, X [Ai [p]]) ;
+ 
+ 			/* wi -= axx ; */
+@@ -1011,7 +1014,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [Rperm [i]] ; */
+-	    ASSIGN (X [i], Bx, Bz, Rperm [i], split) ;
++	    ASSIGN (X [i], Bx, Bz, Rperm [i], Bsplit) ;
+ 	}
+ 	flops = UMF_lsolve (Numeric, X, Pattern) ;
+ 	status = UMFPACK_OK ;
+@@ -1027,7 +1030,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	    ASSIGN (X [i], Bx, Bz, i, split) ;
++	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_lsolve (Numeric, X, Pattern) ;
+ 	status = UMFPACK_OK ;
+@@ -1043,7 +1046,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* W [i] = B [i] ; */
+-	    ASSIGN (W [i], Bx, Bz, i, split) ;
++	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_lhsolve (Numeric, W, Pattern) ;
+ 	for (i = 0 ; i < n ; i++)
+@@ -1063,7 +1066,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* W [i] = B [i] ; */
+-	    ASSIGN (W [i], Bx, Bz, i, split) ;
++	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_ltsolve (Numeric, W, Pattern) ;
+ 	for (i = 0 ; i < n ; i++)
+@@ -1083,7 +1086,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	    ASSIGN (X [i], Bx, Bz, i, split) ;
++	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_lhsolve (Numeric, X, Pattern) ;
+ 	status = UMFPACK_OK ;
+@@ -1099,7 +1102,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	    ASSIGN (X [i], Bx, Bz, i, split) ;
++	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_ltsolve (Numeric, X, Pattern) ;
+ 	status = UMFPACK_OK ;
+@@ -1115,7 +1118,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* W [i] = B [i] ; */
+-	    ASSIGN (W [i], Bx, Bz, i, split) ;
++	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_usolve (Numeric, W, Pattern) ;
+ 	for (i = 0 ; i < n ; i++)
+@@ -1134,7 +1137,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	    ASSIGN (X [i], Bx, Bz, i, split) ;
++	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_usolve (Numeric, X, Pattern) ;
+ 
+@@ -1149,7 +1152,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [Cperm [i]] ; */
+-	    ASSIGN (X [i], Bx, Bz, Cperm [i], split) ;
++	    ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ;
+ 	}
+ 	flops = UMF_uhsolve (Numeric, X, Pattern) ;
+ 
+@@ -1164,7 +1167,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [Cperm [i]] ; */
+-	    ASSIGN (X [i], Bx, Bz, Cperm [i], split) ;
++	    ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ;
+ 	}
+ 	flops = UMF_utsolve (Numeric, X, Pattern) ;
+ 
+@@ -1179,7 +1182,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	  ASSIGN (X [i], Bx, Bz, i, split) ;
++	  ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_uhsolve (Numeric, X, Pattern) ;
+ 
+@@ -1194,7 +1197,7 @@
+ 	for (i = 0 ; i < n ; i++)
+ 	{
+ 	    /* X [i] = B [i] ; */
+-	    ASSIGN (X [i], Bx, Bz, i, split) ;
++	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+ 	}
+ 	flops = UMF_utsolve (Numeric, X, Pattern) ;
+ 
+@@ -1206,7 +1209,7 @@
+ 
+ #ifdef COMPLEX
+     /* copy the solution back, from Entry X [ ] to double Xx [ ] and Xz [ ] */
+-    if (split)
++    if (AXsplit)
+     {
+ 	for (i = 0 ; i < n ; i++)
+ 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK.rules	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,183 @@
+
+#----------------------------------------
+# integer-only routines (no real/complex):
+#----------------------------------------
+
+amd_o_%.o: $(srcdir)/UMFPACK/AMD/Source/amd_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@
+
+
+umf_o_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@
+
+#----------------------------------------
+# Double precision, int version, for OCTAVE
+#----------------------------------------
+
+umf_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@
+
+umf_od_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DCONJUGATE_SOLVE $< -o $@
+
+umf_od_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_MAP -DDO_VALUES $< -o $@
+
+umf_od_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_MAP $< -o $@
+
+umf_od_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDO_VALUES $< -o $@
+
+umf_od_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@
+
+umf_od_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DFIXQ $< -o $@
+
+umf_od_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DDROP $< -o $@
+
+umfpack_od_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT -DWSOLVE $< -o $@
+
+umfpack_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DDINT $< -o $@
+
+#----------------------------------------
+# Complex double precision, int version, for OCTAVE
+#----------------------------------------
+
+umf_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@
+
+umf_oz_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DCONJUGATE_SOLVE $< -o $@
+
+umf_oz_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_MAP -DDO_VALUES $< -o $@
+
+umf_oz_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_MAP $< -o $@
+
+umf_oz_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDO_VALUES $< -o $@
+
+umf_oz_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@
+
+umf_oz_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DFIXQ $< -o $@
+
+umf_oz_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DDROP $< -o $@
+
+umfpack_oz_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT -DWSOLVE $< -o $@
+
+umfpack_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -DZINT $< -o $@
+
+#----------------------------------------
+# Generic routines for OCTAVE
+#----------------------------------------
+
+umfpack_o_timer.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_timer.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< -o $@
+
+umfpack_o_tictoc.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_tictoc.c
+	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< -o $@
+
+########################################################################
+# PIC rules
+########################################################################
+
+#----------------------------------------
+# integer-only routines (no real/complex):
+#----------------------------------------
+
+pic/amd_o_%.o: $(srcdir)/UMFPACK/AMD/Source/amd_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@
+
+
+pic/umf_o_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@
+
+#----------------------------------------
+# Double precision, int version, for OCTAVE
+#----------------------------------------
+
+pic/umf_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@
+
+pic/umf_od_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DCONJUGATE_SOLVE $< -o $@
+
+pic/umf_od_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_MAP -DDO_VALUES $< -o $@
+
+pic/umf_od_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_MAP $< -o $@
+
+pic/umf_od_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDO_VALUES $< -o $@
+
+pic/umf_od_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@
+
+pic/umf_od_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DFIXQ $< -o $@
+
+pic/umf_od_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DDROP $< -o $@
+
+pic/umfpack_od_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT -DWSOLVE $< -o $@
+
+pic/umfpack_od_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DDINT $< -o $@
+
+#----------------------------------------
+# Complex double precision, int version, for OCTAVE
+#----------------------------------------
+
+pic/umf_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@
+
+pic/umf_oz_%hsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_%tsolve.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DCONJUGATE_SOLVE $< -o $@
+
+pic/umf_oz_triplet_map_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_MAP -DDO_VALUES $< -o $@
+
+pic/umf_oz_triplet_map_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_MAP $< -o $@
+
+pic/umf_oz_triplet_nomap_x.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDO_VALUES $< -o $@
+
+pic/umf_oz_triplet_nomap_nox.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_triplet.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@
+
+pic/umf_oz_assemble_fixq.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_assemble.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DFIXQ $< -o $@
+
+pic/umf_oz_store_lu_drop.o: $(srcdir)/UMFPACK/UMFPACK/Source/umf_store_lu.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DDROP $< -o $@
+
+pic/umfpack_oz_wsolve.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_solve.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT -DWSOLVE $< -o $@
+
+pic/umfpack_oz_%.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_%.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) -DZINT $< -o $@
+
+#----------------------------------------
+# Generic routines for OCTAVE
+#----------------------------------------
+
+pic/umfpack_o_timer.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_timer.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) $< -o $@
+
+pic/umfpack_o_tictoc.o: $(srcdir)/UMFPACK/UMFPACK/Source/umfpack_tictoc.c
+	$(CC) -c $(CPPFLAGS) $(CPICFLAG) $(ALL_CFLAGS) $< -o $@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,79 @@
+#------------------------------------------------------------------------------
+# compile the AMD demo (for both GNU make or original make)
+#-----------------------------------------------------------------------------
+
+all: amd_simple amd_demo amd_demo2
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include
+
+INC = ../Include/amd.h
+
+../Lib/libamd.a:
+	( cd ../Source ; make )
+
+../Lib/libamdf77.a:
+	( cd ../Source ; make fortran )
+
+#------------------------------------------------------------------------------
+# Create the demo program, run it, and compare the output
+#------------------------------------------------------------------------------
+
+dist:
+
+amd_demo: amd_demo.c ../Lib/libamd.a $(INC)
+	$(C) -DDINT -o amd_demo amd_demo.c ../Lib/libamd.a $(LIB)
+	./amd_demo > my_amd_demo.out
+	- diff amd_demo.out my_amd_demo.out
+
+amd_demo2: amd_demo2.c ../Lib/libamd.a $(INC)
+	$(C) -DDINT -o amd_demo2 amd_demo2.c ../Lib/libamd.a $(LIB)
+	./amd_demo2 > my_amd_demo2.out
+	- diff amd_demo2.out my_amd_demo2.out
+
+amd_simple: amd_simple.c ../Lib/libamd.a $(INC)
+	$(C) -DDINT -o amd_simple amd_simple.c ../Lib/libamd.a $(LIB)
+	./amd_simple > my_amd_simple.out
+	- diff amd_simple.out my_amd_simple.out
+
+#------------------------------------------------------------------------------
+# compile the Fortran demo
+#------------------------------------------------------------------------------
+
+fortran: amd_f77demo amd_f77simple
+
+cross: amd_f77cross
+
+amd_f77demo: amd_f77demo.f ../Lib/libamdf77.a
+	$(F77) $(F77FLAGS) -o amd_f77demo amd_f77demo.f ../Lib/libamdf77.a \
+	    $(F77LIB)
+	./amd_f77demo > my_amd_f77demo.out
+	- diff amd_f77demo.out my_amd_f77demo.out
+
+amd_f77simple: amd_f77simple.f ../Lib/libamdf77.a
+	$(F77) $(F77FLAGS) -o amd_f77simple amd_f77simple.f \
+	    ../Lib/libamdf77.a $(F77LIB)
+	./amd_f77simple > my_amd_f77simple.out
+	- diff amd_f77simple.out my_amd_f77simple.out
+
+amd_f77wrapper.o: amd_f77wrapper.c
+	$(C) -DDINT -c amd_f77wrapper.c
+
+amd_f77cross:  amd_f77cross.f amd_f77wrapper.o ../Lib/libamd.a
+	$(F77) $(F77FLAGS) -o amd_f77cross amd_f77cross.f amd_f77wrapper.o \
+	    ../Lib/libamd.a $(F77LIB)
+	./amd_f77cross > my_amd_f77cross.out
+	- diff amd_f77cross.out my_amd_f77cross.out
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) amd_demo my_amd_demo.out
+	- $(RM) amd_demo2 my_amd_demo2.out
+	- $(RM) amd_simple my_amd_simple.out
+	- $(RM) amd_f77demo my_amd_f77demo.out
+	- $(RM) amd_f77simple my_amd_f77simple.out
+	- $(RM) amd_f77cross my_amd_f77cross.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,169 @@
+/* ========================================================================= */
+/* === AMD demo main program =============================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* A simple C main program that illustrates the use of the ANSI C interface
+ * to AMD.
+ */
+
+#include "amd.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (int argc, char **argv)
+{
+    /* The symmetric can_24 Harwell/Boeing matrix, including upper and lower
+     * triangular parts, and the diagonal entries.  Note that this matrix is
+     * 0-based, with row and column indices in the range 0 to n-1. */
+    int n = 24, nz,
+    Ap [ ] = { 0, 9, 15, 21, 27, 33, 39, 48, 57, 61, 70, 76, 82, 88, 94, 100,
+	106, 110, 119, 128, 137, 143, 152, 156, 160 },
+    Ai [ ] = {
+	/* column  0: */    0, 5, 6, 12, 13, 17, 18, 19, 21,
+	/* column  1: */    1, 8, 9, 13, 14, 17,
+	/* column  2: */    2, 6, 11, 20, 21, 22,
+	/* column  3: */    3, 7, 10, 15, 18, 19,
+	/* column  4: */    4, 7, 9, 14, 15, 16,
+	/* column  5: */    0, 5, 6, 12, 13, 17,
+	/* column  6: */    0, 2, 5, 6, 11, 12, 19, 21, 23,
+	/* column  7: */    3, 4, 7, 9, 14, 15, 16, 17, 18,
+	/* column  8: */    1, 8, 9, 14,
+	/* column  9: */    1, 4, 7, 8, 9, 13, 14, 17, 18,
+	/* column 10: */    3, 10, 18, 19, 20, 21,
+	/* column 11: */    2, 6, 11, 12, 21, 23,
+	/* column 12: */    0, 5, 6, 11, 12, 23,
+	/* column 13: */    0, 1, 5, 9, 13, 17,
+	/* column 14: */    1, 4, 7, 8, 9, 14,
+	/* column 15: */    3, 4, 7, 15, 16, 18,
+	/* column 16: */    4, 7, 15, 16,
+	/* column 17: */    0, 1, 5, 7, 9, 13, 17, 18, 19,
+	/* column 18: */    0, 3, 7, 9, 10, 15, 17, 18, 19,
+	/* column 19: */    0, 3, 6, 10, 17, 18, 19, 20, 21,
+	/* column 20: */    2, 10, 19, 20, 21, 22,
+	/* column 21: */    0, 2, 6, 10, 11, 19, 20, 21, 22,
+	/* column 22: */    2, 20, 21, 22,
+	/* column 23: */    6, 11, 12, 23 } ;
+
+    int P [24], Pinv [24], i, j, k, jnew, p, inew, result ;
+    double Control [AMD_CONTROL], Info [AMD_INFO] ;
+    char A [24][24] ;
+
+    printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ;
+
+    /* get the default parameters, and print them */
+    amd_defaults (Control) ;
+    amd_control  (Control) ;
+
+    /* print the input matrix */
+    nz = Ap [n] ;
+    printf ("\nInput matrix:  %d-by-%d, with %d entries.\n"
+	   "   Note that for a symmetric matrix such as this one, only the\n"
+	   "   strictly lower or upper triangular parts would need to be\n"
+	   "   passed to AMD, since AMD computes the ordering of A+A'.  The\n"
+	   "   diagonal entries are also not needed, since AMD ignores them.\n"
+	   , n, n, nz) ;
+    for (j = 0 ; j < n ; j++)
+    {
+	printf ("\nColumn: %d, number of entries: %d, with row indices in"
+		" Ai [%d ... %d]:\n    row indices:",
+		j, Ap [j+1] - Ap [j], Ap [j], Ap [j+1]-1) ;
+	for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	{
+	    i = Ai [p] ;
+	    printf (" %d", i) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* print a character plot of the input matrix.  This is only reasonable
+     * because the matrix is small. */
+    printf ("\nPlot of input matrix pattern:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	for (i = 0 ; i < n ; i++) A [i][j] = '.' ;
+	for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	{
+	    i = Ai [p] ;
+	    A [i][j] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf ("\n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* order the matrix */
+    result = amd_order (n, Ap, Ai, P, Control, Info) ;
+    printf ("return value from amd_order: %d (should be %d)\n",
+	result, AMD_OK) ;
+
+    /* print the statistics */
+    amd_info (Info) ;
+
+    if (result != AMD_OK)
+    {
+	printf ("AMD failed\n") ;
+	exit (1) ;
+    }
+
+    /* print the permutation vector, P, and compute the inverse permutation */
+    printf ("Permutation vector:\n") ;
+    for (k = 0 ; k < n ; k++)
+    {
+	/* row/column j is the kth row/column in the permuted matrix */
+	j = P [k] ;
+	Pinv [j] = k ;
+	printf (" %2d", j) ;
+    }
+    printf ("\n\n") ;
+
+    printf ("Inverse permutation vector:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	k = Pinv [j] ;
+	printf (" %2d", k) ;
+    }
+    printf ("\n\n") ;
+
+    /* print a character plot of the permuted matrix. */
+    printf ("\nPlot of permuted matrix pattern:\n") ;
+    for (jnew = 0 ; jnew < n ; jnew++)
+    {
+	j = P [jnew] ;
+	for (inew = 0 ; inew < n ; inew++) A [inew][jnew] = '.' ;
+	for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	{
+	    inew = Pinv [Ai [p]] ;
+	    A [inew][jnew] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf ("\n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf ("\n") ;
+    }
+
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,177 @@
+AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+
+Input matrix:  24-by-24, with 160 entries.
+   Note that for a symmetric matrix such as this one, only the
+   strictly lower or upper triangular parts would need to be
+   passed to AMD, since AMD computes the ordering of A+A'.  The
+   diagonal entries are also not needed, since AMD ignores them.
+
+Column: 0, number of entries: 9, with row indices in Ai [0 ... 8]:
+    row indices: 0 5 6 12 13 17 18 19 21
+
+Column: 1, number of entries: 6, with row indices in Ai [9 ... 14]:
+    row indices: 1 8 9 13 14 17
+
+Column: 2, number of entries: 6, with row indices in Ai [15 ... 20]:
+    row indices: 2 6 11 20 21 22
+
+Column: 3, number of entries: 6, with row indices in Ai [21 ... 26]:
+    row indices: 3 7 10 15 18 19
+
+Column: 4, number of entries: 6, with row indices in Ai [27 ... 32]:
+    row indices: 4 7 9 14 15 16
+
+Column: 5, number of entries: 6, with row indices in Ai [33 ... 38]:
+    row indices: 0 5 6 12 13 17
+
+Column: 6, number of entries: 9, with row indices in Ai [39 ... 47]:
+    row indices: 0 2 5 6 11 12 19 21 23
+
+Column: 7, number of entries: 9, with row indices in Ai [48 ... 56]:
+    row indices: 3 4 7 9 14 15 16 17 18
+
+Column: 8, number of entries: 4, with row indices in Ai [57 ... 60]:
+    row indices: 1 8 9 14
+
+Column: 9, number of entries: 9, with row indices in Ai [61 ... 69]:
+    row indices: 1 4 7 8 9 13 14 17 18
+
+Column: 10, number of entries: 6, with row indices in Ai [70 ... 75]:
+    row indices: 3 10 18 19 20 21
+
+Column: 11, number of entries: 6, with row indices in Ai [76 ... 81]:
+    row indices: 2 6 11 12 21 23
+
+Column: 12, number of entries: 6, with row indices in Ai [82 ... 87]:
+    row indices: 0 5 6 11 12 23
+
+Column: 13, number of entries: 6, with row indices in Ai [88 ... 93]:
+    row indices: 0 1 5 9 13 17
+
+Column: 14, number of entries: 6, with row indices in Ai [94 ... 99]:
+    row indices: 1 4 7 8 9 14
+
+Column: 15, number of entries: 6, with row indices in Ai [100 ... 105]:
+    row indices: 3 4 7 15 16 18
+
+Column: 16, number of entries: 4, with row indices in Ai [106 ... 109]:
+    row indices: 4 7 15 16
+
+Column: 17, number of entries: 9, with row indices in Ai [110 ... 118]:
+    row indices: 0 1 5 7 9 13 17 18 19
+
+Column: 18, number of entries: 9, with row indices in Ai [119 ... 127]:
+    row indices: 0 3 7 9 10 15 17 18 19
+
+Column: 19, number of entries: 9, with row indices in Ai [128 ... 136]:
+    row indices: 0 3 6 10 17 18 19 20 21
+
+Column: 20, number of entries: 6, with row indices in Ai [137 ... 142]:
+    row indices: 2 10 19 20 21 22
+
+Column: 21, number of entries: 9, with row indices in Ai [143 ... 151]:
+    row indices: 0 2 6 10 11 19 20 21 22
+
+Column: 22, number of entries: 4, with row indices in Ai [152 ... 155]:
+    row indices: 2 20 21 22
+
+Column: 23, number of entries: 4, with row indices in Ai [156 ... 159]:
+    row indices: 6 11 12 23
+
+Plot of input matrix pattern:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+ 0:  X . . . . X X . . . . . X X . . . X X X . X . .
+ 1:  . X . . . . . . X X . . . X X . . X . . . . . .
+ 2:  . . X . . . X . . . . X . . . . . . . . X X X .
+ 3:  . . . X . . . X . . X . . . . X . . X X . . . .
+ 4:  . . . . X . . X . X . . . . X X X . . . . . . .
+ 5:  X . . . . X X . . . . . X X . . . X . . . . . .
+ 6:  X . X . . X X . . . . X X . . . . . . X . X . X
+ 7:  . . . X X . . X . X . . . . X X X X X . . . . .
+ 8:  . X . . . . . . X X . . . . X . . . . . . . . .
+ 9:  . X . . X . . X X X . . . X X . . X X . . . . .
+10:  . . . X . . . . . . X . . . . . . . X X X X . .
+11:  . . X . . . X . . . . X X . . . . . . . . X . X
+12:  X . . . . X X . . . . X X . . . . . . . . . . X
+13:  X X . . . X . . . X . . . X . . . X . . . . . .
+14:  . X . . X . . X X X . . . . X . . . . . . . . .
+15:  . . . X X . . X . . . . . . . X X . X . . . . .
+16:  . . . . X . . X . . . . . . . X X . . . . . . .
+17:  X X . . . X . X . X . . . X . . . X X X . . . .
+18:  X . . X . . . X . X X . . . . X . X X X . . . .
+19:  X . . X . . X . . . X . . . . . . X X X X X . .
+20:  . . X . . . . . . . X . . . . . . . . X X X X .
+21:  X . X . . . X . . . X X . . . . . . . X X X X .
+22:  . . X . . . . . . . . . . . . . . . . . X X X .
+23:  . . . . . . X . . . . X X . . . . . . . . . . X
+return value from amd_order: 0 (should be 0)
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  24
+    nz, number of nonzeros in A:                        160
+    symmetry of A:                                      1.0000
+    number of nonzeros on diagonal:                     24
+    nonzeros in pattern of A+A' (excl. diagonal):       136
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              1516
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 97
+    nonzeros in L (including diagonal):                 121
+    # divide operations for LDL' or LU:                 97
+    # multiply-subtract operations for LDL':            275
+    # multiply-subtract operations for LU:              453
+    max nz. in any column of L (incl. diagonal):        8
+
+    chol flop count for real A, sqrt counted as 1 flop: 671
+    LDL' flop count for real A:                         647
+    LDL' flop count for complex A:                      3073
+    LU flop count for real A (with no pivoting):        1003
+    LU flop count for complex A (with no pivoting):     4497
+
+Permutation vector:
+ 22 20 10 23 12  5 16  8 14  4 15  7  1  9 13 17  0  2  3  6 11 18 21 19
+
+Inverse permutation vector:
+ 16 12 17 18  9  5 19 11  7 13  2 20  4 14  8 10  6 15 21 23  1 22  0  3
+
+
+Plot of permuted matrix pattern:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+ 0:  X X . . . . . . . . . . . . . . . X . . . . X .
+ 1:  X X X . . . . . . . . . . . . . . X . . . . X X
+ 2:  . X X . . . . . . . . . . . . . . . X . . X X X
+ 3:  . . . X X . . . . . . . . . . . . . . X X . . .
+ 4:  . . . X X X . . . . . . . . . . X . . X X . . .
+ 5:  . . . . X X . . . . . . . . X X X . . X . . . .
+ 6:  . . . . . . X . . X X X . . . . . . . . . . . .
+ 7:  . . . . . . . X X . . . X X . . . . . . . . . .
+ 8:  . . . . . . . X X X . X X X . . . . . . . . . .
+ 9:  . . . . . . X . X X X X . X . . . . . . . . . .
+10:  . . . . . . X . . X X X . . . . . . X . . X . .
+11:  . . . . . . X . X X X X . X . X . . X . . X . .
+12:  . . . . . . . X X . . . X X X X . . . . . . . .
+13:  . . . . . . . X X X . X X X X X . . . . . X . .
+14:  . . . . . X . . . . . . X X X X X . . . . . . .
+15:  . . . . . X . . . . . X X X X X X . . . . X . X
+16:  . . . . X X . . . . . . . . X X X . . X . X X X
+17:  X X . . . . . . . . . . . . . . . X . X X . X .
+18:  . . X . . . . . . . X X . . . . . . X . . X . X
+19:  . . . X X X . . . . . . . . . . X X . X X . X X
+20:  . . . X X . . . . . . . . . . . . X . X X . X .
+21:  . . X . . . . . . . X X . X . X X . X . . X . X
+22:  X X X . . . . . . . . . . . . . X X . X X . X X
+23:  . X X . . . . . . . . . . . . X X . X X . X X X
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_demo2.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,261 @@
+/* ========================================================================= */
+/* === AMD demo main program (jumbled matrix version) ====================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* A simple C main program that illustrates the use of the ANSI C interface
+ * to AMD.
+ *
+ * Identical to amd_demo.c, except that it operates on an input matrix that has
+ * unsorted columns and duplicate entries.
+ */
+
+#include "amd.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (int argc, char **argv)
+{
+    /* The symmetric can_24 Harwell/Boeing matrix (jumbled, and not symmetric).
+     * Since AMD operates on A+A', only A(i,j) or A(j,i) need to be specified,
+     * or both.  The diagonal entries are optional (some are missing).
+     * There are many duplicate entries, which must be removed. */
+    int n = 24, nz,
+    Ap [ ] = { 0, 9, 14, 20, 28, 33, 37, 44, 53, 58, 63, 63, 66, 69, 72, 75,
+	      78, 82, 86, 91, 97, 101, 112, 112, 116 },
+    Ai [ ] = {
+	/* column  0: */    0, 17, 18, 21, 5, 12, 5, 0, 13,
+	/* column  1: */    14, 1, 8, 13, 17,
+	/* column  2: */    2, 20, 11, 6, 11, 22,
+	/* column  3: */    3, 3, 10, 7, 18, 18, 15, 19,
+	/* column  4: */    7, 9, 15, 14, 16,
+	/* column  5: */    5, 13, 6, 17,
+	/* column  6: */    5, 0, 11, 6, 12, 6, 23,
+	/* column  7: */    3, 4, 9, 7, 14, 16, 15, 17, 18,
+	/* column  8: */    1, 9, 14, 14, 14,
+	/* column  9: */    7, 13, 8, 1, 17,
+	/* column 10: */
+	/* column 11: */    2, 12, 23,
+	/* column 12: */    5, 11, 12,
+	/* column 13: */    0, 13, 17,
+	/* column 14: */    1, 9, 14,
+	/* column 15: */    3, 15, 16,
+	/* column 16: */    16, 4, 4, 15,
+	/* column 17: */    13, 17, 19, 17,
+	/* column 18: */    15, 17, 19, 9, 10,
+	/* column 19: */    17, 19, 20, 0, 6, 10,
+	/* column 20: */    22, 10, 20, 21,
+	/* column 21: */    6, 2, 10, 19, 20, 11, 21, 22, 22, 22, 22,
+	/* column 22: */
+	/* column 23: */    12, 11, 12, 23 } ;
+
+    int Rp [25], Ri [116] ;
+    int P [24], Pinv [24], i, j, k, jnew, p, inew, result ;
+    double Control [AMD_CONTROL], Info [AMD_INFO] ;
+    char A [24][24] ;
+
+    printf ("AMD demo, with a jumbled version of the 24-by-24\n") ;
+    printf ("Harwell/Boeing matrix, can_24:\n") ;
+
+    /* get the default parameters, and print them */
+    amd_defaults (Control) ;
+    amd_control  (Control) ;
+
+    /* print the input matrix */
+    nz = Ap [n] ;
+    printf ("\nJumbled input matrix:  %d-by-%d, with %d entries.\n"
+	   "   Note that for a symmetric matrix such as this one, only the\n"
+	   "   strictly lower or upper triangular parts would need to be\n"
+	   "   passed to AMD, since AMD computes the ordering of A+A'.  The\n"
+	   "   diagonal entries are also not needed, since AMD ignores them.\n"
+	   "   This version of the matrix has jumbled columns and duplicate\n"
+	   "   row indices, and must be fixed by amd_preprocess prior to\n"
+	   "   ordering it with amd_order.\n" , n, n, nz) ;
+    for (j = 0 ; j < n ; j++)
+    {
+	printf ("\nColumn: %d, number of entries: %d, with row indices in"
+		" Ai [%d ... %d]:\n    row indices:",
+		j, Ap [j+1] - Ap [j], Ap [j], Ap [j+1]-1) ;
+	for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	{
+	    i = Ai [p] ;
+	    printf (" %d", i) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* print a character plot of the input matrix.  This is only reasonable
+     * because the matrix is small. */
+    printf ("\nPlot of (jumbled) input matrix pattern:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	for (i = 0 ; i < n ; i++) A [i][j] = '.' ;
+	for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	{
+	    i = Ai [p] ;
+	    A [i][j] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf ("\n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* sort, remove duplicates, and transpose A to get R */
+    result = amd_preprocess (n, Ap, Ai, Rp, Ri) ;
+    printf ("return value from amd_preprocess: %d (should be %d)\n",
+	result, AMD_OK) ;
+
+    if (result != AMD_OK)
+    {
+	printf ("AMD failed\n") ;
+	exit (1) ;
+    }
+
+    /* print the sorted/transposed matrix R */
+    printf ("\nThe column-oriented form of the sorted/transposed matrix R:\n");
+    for (j = 0 ; j < n ; j++)
+    {
+	printf ("\nColumn: %d, number of entries: %d, with row indices in"
+		" Ri [%d ... %d]:\n    row indices:",
+		j, Rp [j+1] - Rp [j], Rp [j], Rp [j+1]-1) ;
+	for (p = Rp [j] ; p < Rp [j+1] ; p++)
+	{
+	    i = Ri [p] ;
+	    printf (" %d", i) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* print a character plot of the matrix R. */
+    printf ("\nPlot of the sorted/transposed matrix R:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	for (i = 0 ; i < n ; i++) A [i][j] = '.' ;
+	for (p = Rp [j] ; p < Rp [j+1] ; p++)
+	{
+	    i = Ri [p] ;
+	    A [i][j] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf (" \n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf (" \n") ;
+    }
+
+    /* print a character plot of the matrix R+R'. */
+    printf ("\nPlot of symmetric matrix to be ordered by amd_order:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	for (i = 0 ; i < n ; i++) A [i][j] = '.' ;
+    }
+    for (j = 0 ; j < n ; j++)
+    {
+	A [j][j] = 'X' ;
+	for (p = Rp [j] ; p < Rp [j+1] ; p++)
+	{
+	    i = Ri [p] ;
+	    A [i][j] = 'X' ;
+	    A [j][i] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf ("\n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf ("\n") ;
+    }
+
+    /* order the matrix */
+    result = amd_order (n, Rp, Ri, P, Control, Info) ;
+    printf ("return value from amd_order: %d (should be %d)\n",
+	result, AMD_OK) ;
+
+    /* print the statistics */
+    amd_info (Info) ;
+
+    if (result != AMD_OK)
+    {
+	printf ("AMD failed\n") ;
+	exit (1) ;
+    }
+
+    /* print the permutation vector, P, and compute the inverse permutation */
+    printf ("Permutation vector:\n") ;
+    for (k = 0 ; k < n ; k++)
+    {
+	/* row/column j is the kth row/column in the permuted matrix */
+	j = P [k] ;
+	Pinv [j] = k ;
+	printf (" %2d", j) ;
+    }
+    printf ("\n\n") ;
+
+    printf ("Inverse permutation vector:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	k = Pinv [j] ;
+	printf (" %2d", k) ;
+    }
+    printf ("\n\n") ;
+
+    /* print a character plot of the permuted matrix. */
+    printf ("\nPlot of (symmetrized) permuted matrix pattern:\n") ;
+    for (j = 0 ; j < n ; j++)
+    {
+	for (i = 0 ; i < n ; i++) A [i][j] = '.' ;
+    }
+    for (jnew = 0 ; jnew < n ; jnew++)
+    {
+	j = P [jnew] ;
+	A [jnew][jnew] = 'X' ;
+	for (p = Rp [j] ; p < Rp [j+1] ; p++)
+	{
+	    inew = Pinv [Ri [p]] ;
+	    A [inew][jnew] = 'X' ;
+	    A [jnew][inew] = 'X' ;
+	}
+    }
+    printf ("    ") ;
+    for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ;
+    printf ("\n") ;
+    for (i = 0 ; i < n ; i++)
+    {
+	printf ("%2d: ", i) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    printf (" %c", A [i][j]) ;
+	}
+	printf ("\n") ;
+    }
+
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_demo2.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,310 @@
+AMD demo, with a jumbled version of the 24-by-24
+Harwell/Boeing matrix, can_24:
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+
+Jumbled input matrix:  24-by-24, with 116 entries.
+   Note that for a symmetric matrix such as this one, only the
+   strictly lower or upper triangular parts would need to be
+   passed to AMD, since AMD computes the ordering of A+A'.  The
+   diagonal entries are also not needed, since AMD ignores them.
+   This version of the matrix has jumbled columns and duplicate
+   row indices, and must be fixed by amd_preprocess prior to
+   ordering it with amd_order.
+
+Column: 0, number of entries: 9, with row indices in Ai [0 ... 8]:
+    row indices: 0 17 18 21 5 12 5 0 13
+
+Column: 1, number of entries: 5, with row indices in Ai [9 ... 13]:
+    row indices: 14 1 8 13 17
+
+Column: 2, number of entries: 6, with row indices in Ai [14 ... 19]:
+    row indices: 2 20 11 6 11 22
+
+Column: 3, number of entries: 8, with row indices in Ai [20 ... 27]:
+    row indices: 3 3 10 7 18 18 15 19
+
+Column: 4, number of entries: 5, with row indices in Ai [28 ... 32]:
+    row indices: 7 9 15 14 16
+
+Column: 5, number of entries: 4, with row indices in Ai [33 ... 36]:
+    row indices: 5 13 6 17
+
+Column: 6, number of entries: 7, with row indices in Ai [37 ... 43]:
+    row indices: 5 0 11 6 12 6 23
+
+Column: 7, number of entries: 9, with row indices in Ai [44 ... 52]:
+    row indices: 3 4 9 7 14 16 15 17 18
+
+Column: 8, number of entries: 5, with row indices in Ai [53 ... 57]:
+    row indices: 1 9 14 14 14
+
+Column: 9, number of entries: 5, with row indices in Ai [58 ... 62]:
+    row indices: 7 13 8 1 17
+
+Column: 10, number of entries: 0, with row indices in Ai [63 ... 62]:
+    row indices:
+
+Column: 11, number of entries: 3, with row indices in Ai [63 ... 65]:
+    row indices: 2 12 23
+
+Column: 12, number of entries: 3, with row indices in Ai [66 ... 68]:
+    row indices: 5 11 12
+
+Column: 13, number of entries: 3, with row indices in Ai [69 ... 71]:
+    row indices: 0 13 17
+
+Column: 14, number of entries: 3, with row indices in Ai [72 ... 74]:
+    row indices: 1 9 14
+
+Column: 15, number of entries: 3, with row indices in Ai [75 ... 77]:
+    row indices: 3 15 16
+
+Column: 16, number of entries: 4, with row indices in Ai [78 ... 81]:
+    row indices: 16 4 4 15
+
+Column: 17, number of entries: 4, with row indices in Ai [82 ... 85]:
+    row indices: 13 17 19 17
+
+Column: 18, number of entries: 5, with row indices in Ai [86 ... 90]:
+    row indices: 15 17 19 9 10
+
+Column: 19, number of entries: 6, with row indices in Ai [91 ... 96]:
+    row indices: 17 19 20 0 6 10
+
+Column: 20, number of entries: 4, with row indices in Ai [97 ... 100]:
+    row indices: 22 10 20 21
+
+Column: 21, number of entries: 11, with row indices in Ai [101 ... 111]:
+    row indices: 6 2 10 19 20 11 21 22 22 22 22
+
+Column: 22, number of entries: 0, with row indices in Ai [112 ... 111]:
+    row indices:
+
+Column: 23, number of entries: 4, with row indices in Ai [112 ... 115]:
+    row indices: 12 11 12 23
+
+Plot of (jumbled) input matrix pattern:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+ 0:  X . . . . . X . . . . . . X . . . . . X . . . .
+ 1:  . X . . . . . . X X . . . . X . . . . . . . . .
+ 2:  . . X . . . . . . . . X . . . . . . . . . X . .
+ 3:  . . . X . . . X . . . . . . . X . . . . . . . .
+ 4:  . . . . . . . X . . . . . . . . X . . . . . . .
+ 5:  X . . . . X X . . . . . X . . . . . . . . . . .
+ 6:  . . X . . X X . . . . . . . . . . . . X . X . .
+ 7:  . . . X X . . X . X . . . . . . . . . . . . . .
+ 8:  . X . . . . . . . X . . . . . . . . . . . . . .
+ 9:  . . . . X . . X X . . . . . X . . . X . . . . .
+10:  . . . X . . . . . . . . . . . . . . X X X X . .
+11:  . . X . . . X . . . . . X . . . . . . . . X . X
+12:  X . . . . . X . . . . X X . . . . . . . . . . X
+13:  X X . . . X . . . X . . . X . . . X . . . . . .
+14:  . X . . X . . X X . . . . . X . . . . . . . . .
+15:  . . . X X . . X . . . . . . . X X . X . . . . .
+16:  . . . . X . . X . . . . . . . X X . . . . . . .
+17:  X X . . . X . X . X . . . X . . . X X X . . . .
+18:  X . . X . . . X . . . . . . . . . . . . . . . .
+19:  . . . X . . . . . . . . . . . . . X X X . X . .
+20:  . . X . . . . . . . . . . . . . . . . X X X . .
+21:  X . . . . . . . . . . . . . . . . . . . X X . .
+22:  . . X . . . . . . . . . . . . . . . . . X X . .
+23:  . . . . . . X . . . . X . . . . . . . . . . . X
+return value from amd_preprocess: 0 (should be 0)
+
+The column-oriented form of the sorted/transposed matrix R:
+
+Column: 0, number of entries: 4, with row indices in Ri [0 ... 3]:
+    row indices: 0 6 13 19
+
+Column: 1, number of entries: 4, with row indices in Ri [4 ... 7]:
+    row indices: 1 8 9 14
+
+Column: 2, number of entries: 3, with row indices in Ri [8 ... 10]:
+    row indices: 2 11 21
+
+Column: 3, number of entries: 3, with row indices in Ri [11 ... 13]:
+    row indices: 3 7 15
+
+Column: 4, number of entries: 2, with row indices in Ri [14 ... 15]:
+    row indices: 7 16
+
+Column: 5, number of entries: 4, with row indices in Ri [16 ... 19]:
+    row indices: 0 5 6 12
+
+Column: 6, number of entries: 5, with row indices in Ri [20 ... 24]:
+    row indices: 2 5 6 19 21
+
+Column: 7, number of entries: 4, with row indices in Ri [25 ... 28]:
+    row indices: 3 4 7 9
+
+Column: 8, number of entries: 2, with row indices in Ri [29 ... 30]:
+    row indices: 1 9
+
+Column: 9, number of entries: 5, with row indices in Ri [31 ... 35]:
+    row indices: 4 7 8 14 18
+
+Column: 10, number of entries: 5, with row indices in Ri [36 ... 40]:
+    row indices: 3 18 19 20 21
+
+Column: 11, number of entries: 5, with row indices in Ri [41 ... 45]:
+    row indices: 2 6 12 21 23
+
+Column: 12, number of entries: 5, with row indices in Ri [46 ... 50]:
+    row indices: 0 6 11 12 23
+
+Column: 13, number of entries: 6, with row indices in Ri [51 ... 56]:
+    row indices: 0 1 5 9 13 17
+
+Column: 14, number of entries: 5, with row indices in Ri [57 ... 61]:
+    row indices: 1 4 7 8 14
+
+Column: 15, number of entries: 6, with row indices in Ri [62 ... 67]:
+    row indices: 3 4 7 15 16 18
+
+Column: 16, number of entries: 4, with row indices in Ri [68 ... 71]:
+    row indices: 4 7 15 16
+
+Column: 17, number of entries: 9, with row indices in Ri [72 ... 80]:
+    row indices: 0 1 5 7 9 13 17 18 19
+
+Column: 18, number of entries: 3, with row indices in Ri [81 ... 83]:
+    row indices: 0 3 7
+
+Column: 19, number of entries: 5, with row indices in Ri [84 ... 88]:
+    row indices: 3 17 18 19 21
+
+Column: 20, number of entries: 4, with row indices in Ri [89 ... 92]:
+    row indices: 2 19 20 21
+
+Column: 21, number of entries: 3, with row indices in Ri [93 ... 95]:
+    row indices: 0 20 21
+
+Column: 22, number of entries: 3, with row indices in Ri [96 ... 98]:
+    row indices: 2 20 21
+
+Column: 23, number of entries: 3, with row indices in Ri [99 ... 101]:
+    row indices: 6 11 23
+
+Plot of the sorted/transposed matrix R:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 
+ 0:  X . . . . X . . . . . . X X . . . X X . . X . . 
+ 1:  . X . . . . . . X . . . . X X . . X . . . . . . 
+ 2:  . . X . . . X . . . . X . . . . . . . . X . X . 
+ 3:  . . . X . . . X . . X . . . . X . . X X . . . . 
+ 4:  . . . . . . . X . X . . . . X X X . . . . . . . 
+ 5:  . . . . . X X . . . . . . X . . . X . . . . . . 
+ 6:  X . . . . X X . . . . X X . . . . . . . . . . X 
+ 7:  . . . X X . . X . X . . . . X X X X X . . . . . 
+ 8:  . X . . . . . . . X . . . . X . . . . . . . . . 
+ 9:  . X . . . . . X X . . . . X . . . X . . . . . . 
+10:  . . . . . . . . . . . . . . . . . . . . . . . . 
+11:  . . X . . . . . . . . . X . . . . . . . . . . X 
+12:  . . . . . X . . . . . X X . . . . . . . . . . . 
+13:  X . . . . . . . . . . . . X . . . X . . . . . . 
+14:  . X . . . . . . . X . . . . X . . . . . . . . . 
+15:  . . . X . . . . . . . . . . . X X . . . . . . . 
+16:  . . . . X . . . . . . . . . . X X . . . . . . . 
+17:  . . . . . . . . . . . . . X . . . X . X . . . . 
+18:  . . . . . . . . . X X . . . . X . X . X . . . . 
+19:  X . . . . . X . . . X . . . . . . X . X X . . . 
+20:  . . . . . . . . . . X . . . . . . . . . X X X . 
+21:  . . X . . . X . . . X X . . . . . . . X X X X . 
+22:  . . . . . . . . . . . . . . . . . . . . . . . . 
+23:  . . . . . . . . . . . X X . . . . . . . . . . X 
+
+Plot of symmetric matrix to be ordered by amd_order:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+ 0:  X . . . . X X . . . . . X X . . . X X X . X . .
+ 1:  . X . . . . . . X X . . . X X . . X . . . . . .
+ 2:  . . X . . . X . . . . X . . . . . . . . X X X .
+ 3:  . . . X . . . X . . X . . . . X . . X X . . . .
+ 4:  . . . . X . . X . X . . . . X X X . . . . . . .
+ 5:  X . . . . X X . . . . . X X . . . X . . . . . .
+ 6:  X . X . . X X . . . . X X . . . . . . X . X . X
+ 7:  . . . X X . . X . X . . . . X X X X X . . . . .
+ 8:  . X . . . . . . X X . . . . X . . . . . . . . .
+ 9:  . X . . X . . X X X . . . X X . . X X . . . . .
+10:  . . . X . . . . . . X . . . . . . . X X X X . .
+11:  . . X . . . X . . . . X X . . . . . . . . X . X
+12:  X . . . . X X . . . . X X . . . . . . . . . . X
+13:  X X . . . X . . . X . . . X . . . X . . . . . .
+14:  . X . . X . . X X X . . . . X . . . . . . . . .
+15:  . . . X X . . X . . . . . . . X X . X . . . . .
+16:  . . . . X . . X . . . . . . . X X . . . . . . .
+17:  X X . . . X . X . X . . . X . . . X X X . . . .
+18:  X . . X . . . X . X X . . . . X . X X X . . . .
+19:  X . . X . . X . . . X . . . . . . X X X X X . .
+20:  . . X . . . . . . . X . . . . . . . . X X X X .
+21:  X . X . . . X . . . X X . . . . . . . X X X X .
+22:  . . X . . . . . . . . . . . . . . . . . X X X .
+23:  . . . . . . X . . . . X X . . . . . . . . . . X
+return value from amd_order: 0 (should be 0)
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  24
+    nz, number of nonzeros in A:                        102
+    symmetry of A:                                      0.4000
+    number of nonzeros on diagonal:                     17
+    nonzeros in pattern of A+A' (excl. diagonal):       136
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              1516
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 97
+    nonzeros in L (including diagonal):                 121
+    # divide operations for LDL' or LU:                 97
+    # multiply-subtract operations for LDL':            275
+    # multiply-subtract operations for LU:              453
+    max nz. in any column of L (incl. diagonal):        8
+
+    chol flop count for real A, sqrt counted as 1 flop: 671
+    LDL' flop count for real A:                         647
+    LDL' flop count for complex A:                      3073
+    LU flop count for real A (with no pivoting):        1003
+    LU flop count for complex A (with no pivoting):     4497
+
+Permutation vector:
+ 22 20 10 23 12  5 16  8 14  4 15  7  1  9 13 17  0  2  3  6 11 18 21 19
+
+Inverse permutation vector:
+ 16 12 17 18  9  5 19 11  7 13  2 20  4 14  8 10  6 15 21 23  1 22  0  3
+
+
+Plot of (symmetrized) permuted matrix pattern:
+     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+ 0:  X X . . . . . . . . . . . . . . . X . . . . X .
+ 1:  X X X . . . . . . . . . . . . . . X . . . . X X
+ 2:  . X X . . . . . . . . . . . . . . . X . . X X X
+ 3:  . . . X X . . . . . . . . . . . . . . X X . . .
+ 4:  . . . X X X . . . . . . . . . . X . . X X . . .
+ 5:  . . . . X X . . . . . . . . X X X . . X . . . .
+ 6:  . . . . . . X . . X X X . . . . . . . . . . . .
+ 7:  . . . . . . . X X . . . X X . . . . . . . . . .
+ 8:  . . . . . . . X X X . X X X . . . . . . . . . .
+ 9:  . . . . . . X . X X X X . X . . . . . . . . . .
+10:  . . . . . . X . . X X X . . . . . . X . . X . .
+11:  . . . . . . X . X X X X . X . X . . X . . X . .
+12:  . . . . . . . X X . . . X X X X . . . . . . . .
+13:  . . . . . . . X X X . X X X X X . . . . . X . .
+14:  . . . . . X . . . . . . X X X X X . . . . . . .
+15:  . . . . . X . . . . . X X X X X X . . . . X . X
+16:  . . . . X X . . . . . . . . X X X . . X . X X X
+17:  X X . . . . . . . . . . . . . . . X . X X . X .
+18:  . . X . . . . . . . X X . . . . . . X . . X . X
+19:  . . . X X X . . . . . . . . . . X X . X X . X X
+20:  . . . X X . . . . . . . . . . . . X . X X . X .
+21:  . . X . . . . . . . X X . X . X X . X . . X . X
+22:  X X X . . . . . . . . . . . . . X X . X X . X X
+23:  . X X . . . . . . . . . . . . X X . X X . X X X
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77cross.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,51 @@
+C ======================================================================
+C === AMD_cross ========================================================
+C ======================================================================
+
+C ----------------------------------------------------------------------
+C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A.
+C Davis, Patrick R. Amestoy, and Iain S. Duff.  See ../README for
+C License.  email: davis@cise.ufl.edu    CISE Department, Univ. of
+C Florida.  web: http://www.cise.ufl.edu/research/sparse/amd
+C ----------------------------------------------------------------------
+
+C This program provides an example of how to call the C version of AMD
+C from a Fortran program.  It is HIGHLY non-portable.
+
+C The amd_order routine returns PERM (1) < 0 if an error occurs.
+C (-1: out of memory, -2: invalid matrix)
+
+C Note that the input matrix is 0-based.  From Fortran, column j of the
+C matrix is in AI (AP (I)+1 ... AP (I+1)).  The row indices in this
+C set are in the range 0 to N-1.  To demonstrate this translation,
+C the input matrix is printed in 1-based form.  This program uses
+C the same 5-by-5 test matrix as amd_simple.c.
+
+        INTEGER N, NZ, K, P
+        PARAMETER (N = 5, NZ = 14)
+        INTEGER AP (N+1), AI (NZ), PERM (N)
+        DATA AP / 0,   2,       6,       10,  12, 14 /
+        DATA AI / 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4    /
+        DOUBLE PRECISION CONTROL (5), INFO (20)
+
+C       print the input matrix
+        PRINT 10, N, N, NZ
+10      FORMAT ('Input matrix:', I2, '-by-', I2, ' with',I3,' entries')
+        DO 40 J = 1, N
+            PRINT 20, J, AP (J+1) - AP (J), AP (J)+1, AP (J+1)
+20          FORMAT ( /, 'Column: ', I2, ' number of entries: ', I2,
+     $          ' with row indices in AI (', I3, ' ... ', I3, ')')
+            PRINT 30, ((AI (P) + 1), P = AP (J) + 1, AP (J+1))
+30          FORMAT ('    row indices: ', 24I3)
+40      CONTINUE
+
+        CALL AMDDEFAULTS (CONTROL)
+        CALL AMDORDER (N, AP, AI, PERM, CONTROL, INFO)
+        CALL AMDINFO (INFO)
+
+        DO 60 K = 1, N
+            PRINT 50, K, PERM (K) + 1
+50          FORMAT ('PERM (',I2,') = ', I2)
+60      CONTINUE
+        END
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77cross.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,51 @@
+Input matrix: 5-by- 5 with 14 entries
+
+Column:  1 number of entries:  2 with row indices in AI (  1 ...   2)
+    row indices:   1  2
+
+Column:  2 number of entries:  4 with row indices in AI (  3 ...   6)
+    row indices:   1  2  3  5
+
+Column:  3 number of entries:  4 with row indices in AI (  7 ...  10)
+    row indices:   2  3  4  5
+
+Column:  4 number of entries:  2 with row indices in AI ( 11 ...  12)
+    row indices:   3  4
+
+Column:  5 number of entries:  2 with row indices in AI ( 13 ...  14)
+    row indices:   2  5
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  5
+    nz, number of nonzeros in A:                        14
+    symmetry of A:                                      0.8889
+    number of nonzeros on diagonal:                     5
+    nonzeros in pattern of A+A' (excl. diagonal):       10
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              228
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 5
+    nonzeros in L (including diagonal):                 10
+    # divide operations for LDL' or LU:                 5
+    # multiply-subtract operations for LDL':            6
+    # multiply-subtract operations for LU:              7
+    max nz. in any column of L (incl. diagonal):        3
+
+    chol flop count for real A, sqrt counted as 1 flop: 22
+    LDL' flop count for real A:                         17
+    LDL' flop count for complex A:                      93
+    LU flop count for real A (with no pivoting):        19
+    LU flop count for complex A (with no pivoting):     101
+
+PERM ( 1) =  1
+PERM ( 2) =  4
+PERM ( 3) =  3
+PERM ( 4) =  5
+PERM ( 5) =  2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77demo.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,161 @@
+C ======================================================================
+C === Fortran AMD demo main program ====================================
+C ======================================================================
+
+C ----------------------------------------------------------------------
+C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A.
+C Davis, Patrick R. Amestoy, and Iain S. Duff.  See ../README for
+C License.  email: davis@cise.ufl.edu    CISE Department, Univ. of
+C Florida.  web: http://www.cise.ufl.edu/research/sparse/amd
+C ----------------------------------------------------------------------
+
+C A simple Fortran 77 main program that illustrates the use of the
+C Fortran version of AMD (both the AMD and AMDBAR routines).  Note
+C that aggressive absorption has no effect on this particular matrix.
+
+C       AP and AI contain the symmetric can_24 Harwell/Boeing matrix,
+C       including upper and lower triangular parts, but excluding the
+C       diagonal entries.  Note that this matrix is 1-based, with row
+C       and column indices in the range 1 to N.
+
+        INTEGER N, NZ, IWLEN, PFREE, I, J, K, JNEW, P, INEW,
+     $      METHOD, NCMPA
+        PARAMETER (N = 24, NZ = 136, IWLEN = 200)
+        INTEGER PE (N), DEGREE (N), NV (N), NEXT (N), PERM (N), W (N),
+     $      HEAD (N), PINV (N), LEN (N), AP (N+1), AI (NZ), IW (IWLEN)
+        CHARACTER A (24,24)
+
+        DATA AP
+     $      / 1, 9, 14, 19, 24, 29, 34, 42, 50, 53, 61, 66, 71,
+     $       76, 81, 86, 91, 94, 102, 110, 118, 123, 131, 134, 137 /
+        DATA AI /
+     $      6, 7, 13, 14, 18, 19, 20, 22,
+     $      9, 10, 14, 15, 18,
+     $      7, 12, 21, 22, 23,
+     $      8, 11, 16, 19, 20,
+     $      8, 10, 15, 16, 17,
+     $      1, 7, 13, 14, 18,
+     $      1, 3, 6, 12, 13, 20, 22, 24,
+     $      4, 5, 10, 15, 16, 17, 18, 19,
+     $      2, 10, 15,
+     $      2, 5, 8, 9, 14, 15, 18, 19,
+     $      4, 19, 20, 21, 22,
+     $      3, 7, 13, 22, 24,
+     $      1, 6, 7, 12, 24,
+     $      1, 2, 6, 10, 18,
+     $      2, 5, 8, 9, 10,
+     $      4, 5, 8, 17, 19,
+     $      5, 8, 16,
+     $      1, 2, 6, 8, 10, 14, 19, 20,
+     $      1, 4, 8, 10, 11, 16, 18, 20,
+     $      1, 4, 7, 11, 18, 19, 21, 22,
+     $      3, 11, 20, 22, 23,
+     $      1, 3, 7, 11, 12, 20, 21, 23,
+     $      3, 21, 22,
+     $      7, 12, 13 /
+
+C       print the input matrix
+        PRINT 11, N, N, NZ
+11      FORMAT ('AMD Fortran 77 demo, with the 24-by-24',
+     $      ' Harwell/Boeing matrix, can_24:'
+     $      /, 'Input matrix: ', I2, '-by-', I2,' with ',I3,' entries',
+     $      /, 'Note that the Fortran version of AMD requires that'
+     $      /, 'no diagonal entries be present.')
+        DO 20 J = 1, N
+            PRINT 21, J, AP (J+1) - AP (J), AP (J), AP (J+1)-1
+21          FORMAT ( /, 'Column: ', I2, ' number of entries: ', I2,
+     $          ' with row indices in AI (', I3, ' ... ', I3, ')')
+            PRINT 10, ((AI (P)), P = AP (J), AP (J+1) - 1)
+10          FORMAT ('    row indices: ', 24I3)
+20      CONTINUE
+
+C       print a character plot of the input matrix.  This is only
+C       reasonable because the matrix is small.
+        PRINT 31
+31      FORMAT ('Plot of input matrix pattern:')
+        DO 50 J = 1,N
+            DO 30 I = 1,N
+                A (I, J) = '.'
+30          CONTINUE
+C           add the diagonal entry to the plot
+            A (J, J) = 'X'
+            DO 40 P = AP (J), AP (J+1) - 1
+                I = AI (P)
+                A (I, J) = 'X'
+40          CONTINUE
+50      CONTINUE
+        PRINT 60, ((MOD (J, 10)), J = 1,N)
+60      FORMAT ('     ', 24I2)
+        DO 80 I = 1,N
+            PRINT 70, I, (A (I, J), J = 1,N)
+70          FORMAT (' ', I2, ': ', 24A2)
+80      CONTINUE
+
+        DO 190 METHOD = 1,2
+
+C           load the matrix into AMD's workspace
+            DO 90 J = 1,N
+                PE (J) = AP (J)
+                LEN (J) = AP (J+1) - AP (J)
+90          CONTINUE
+            DO 100 P = 1,NZ
+                IW (P) = AI (P)
+100         CONTINUE
+            PFREE = NZ + 1
+
+C           order the matrix using AMD or AMDBAR
+            IF (METHOD .EQ. 1) THEN
+                PRINT 101 
+101             FORMAT (/, '------------------------------------------',
+     $                  /, 'ordering the matrix with AMD',
+     $                  /, '------------------------------------------')
+                CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $              PERM, HEAD, PINV, DEGREE, NCMPA, W)
+            ELSE
+                PRINT 102 
+102             FORMAT (/, '------------------------------------------',
+     $                  /, 'ordering the matrix with AMDBAR',
+     $                  /, '------------------------------------------')
+                CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $              PERM, HEAD, PINV, DEGREE, NCMPA, W)
+            ENDIF
+
+C           print the permutation vector, PERM, and its inverse, PINV.
+C           row/column J = PERM (K) is the Kth row/column in the
+C           permuted matrix.
+            PRINT 110, (PERM (K), K = 1,N)
+110         FORMAT (/, 'Permutation vector: ', /, 24I3)
+            PRINT 120, (PINV (J), J = 1,N)
+120         FORMAT (/, 'Inverse permutation vector: ', /, 24I3)
+
+C           print a character plot of the permuted matrix.
+            PRINT 121
+121         FORMAT ('Plot of permuted matrix pattern:')
+            DO 150 JNEW = 1,N
+                J = PERM (JNEW)
+                DO 130 INEW = 1,N
+                    A (INEW, JNEW) = '.'
+130             CONTINUE
+C               add the diagonal entry to the plot
+                A (JNEW, JNEW) = 'X'
+                DO 140 P = AP (J), AP (J+1) - 1
+                    INEW = PINV (AI (P))
+                    A (INEW, JNEW) = 'X'
+140             CONTINUE
+150         CONTINUE
+            PRINT 60, ((MOD (J, 10)), J = 1,N)
+            DO 160 I = 1,N
+                PRINT 70, I, (A (I, J), J = 1,N)
+160         CONTINUE
+
+C           print the permuted matrix, PERM*A*PERM'
+            DO 180 JNEW = 1,N
+                J = PERM (JNEW)
+                PRINT 171, JNEW, J, AP (J+1) - AP (J)
+171             FORMAT (/, 'New column: ', I2, ' old column: ', I2,
+     $              ' number of entries: ', I2)
+                PRINT 170, (PINV (AI (P)), P = AP (J), AP (J+1) - 1)
+170             FORMAT ('    new row indices: ', 24I3)
+180         CONTINUE
+190     CONTINUE
+        END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,318 @@
+AMD Fortran 77 demo, with the 24-by-24 Harwell/Boeing matrix, can_24:
+Input matrix: 24-by-24 with 136 entries
+Note that the Fortran version of AMD requires that
+no diagonal entries be present.
+
+Column:  1 number of entries:  8 with row indices in AI (  1 ...   8)
+    row indices:   6  7 13 14 18 19 20 22
+
+Column:  2 number of entries:  5 with row indices in AI (  9 ...  13)
+    row indices:   9 10 14 15 18
+
+Column:  3 number of entries:  5 with row indices in AI ( 14 ...  18)
+    row indices:   7 12 21 22 23
+
+Column:  4 number of entries:  5 with row indices in AI ( 19 ...  23)
+    row indices:   8 11 16 19 20
+
+Column:  5 number of entries:  5 with row indices in AI ( 24 ...  28)
+    row indices:   8 10 15 16 17
+
+Column:  6 number of entries:  5 with row indices in AI ( 29 ...  33)
+    row indices:   1  7 13 14 18
+
+Column:  7 number of entries:  8 with row indices in AI ( 34 ...  41)
+    row indices:   1  3  6 12 13 20 22 24
+
+Column:  8 number of entries:  8 with row indices in AI ( 42 ...  49)
+    row indices:   4  5 10 15 16 17 18 19
+
+Column:  9 number of entries:  3 with row indices in AI ( 50 ...  52)
+    row indices:   2 10 15
+
+Column: 10 number of entries:  8 with row indices in AI ( 53 ...  60)
+    row indices:   2  5  8  9 14 15 18 19
+
+Column: 11 number of entries:  5 with row indices in AI ( 61 ...  65)
+    row indices:   4 19 20 21 22
+
+Column: 12 number of entries:  5 with row indices in AI ( 66 ...  70)
+    row indices:   3  7 13 22 24
+
+Column: 13 number of entries:  5 with row indices in AI ( 71 ...  75)
+    row indices:   1  6  7 12 24
+
+Column: 14 number of entries:  5 with row indices in AI ( 76 ...  80)
+    row indices:   1  2  6 10 18
+
+Column: 15 number of entries:  5 with row indices in AI ( 81 ...  85)
+    row indices:   2  5  8  9 10
+
+Column: 16 number of entries:  5 with row indices in AI ( 86 ...  90)
+    row indices:   4  5  8 17 19
+
+Column: 17 number of entries:  3 with row indices in AI ( 91 ...  93)
+    row indices:   5  8 16
+
+Column: 18 number of entries:  8 with row indices in AI ( 94 ... 101)
+    row indices:   1  2  6  8 10 14 19 20
+
+Column: 19 number of entries:  8 with row indices in AI (102 ... 109)
+    row indices:   1  4  8 10 11 16 18 20
+
+Column: 20 number of entries:  8 with row indices in AI (110 ... 117)
+    row indices:   1  4  7 11 18 19 21 22
+
+Column: 21 number of entries:  5 with row indices in AI (118 ... 122)
+    row indices:   3 11 20 22 23
+
+Column: 22 number of entries:  8 with row indices in AI (123 ... 130)
+    row indices:   1  3  7 11 12 20 21 23
+
+Column: 23 number of entries:  3 with row indices in AI (131 ... 133)
+    row indices:   3 21 22
+
+Column: 24 number of entries:  3 with row indices in AI (134 ... 136)
+    row indices:   7 12 13
+Plot of input matrix pattern:
+      1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+  1:  X . . . . X X . . . . . X X . . . X X X . X . .
+  2:  . X . . . . . . X X . . . X X . . X . . . . . .
+  3:  . . X . . . X . . . . X . . . . . . . . X X X .
+  4:  . . . X . . . X . . X . . . . X . . X X . . . .
+  5:  . . . . X . . X . X . . . . X X X . . . . . . .
+  6:  X . . . . X X . . . . . X X . . . X . . . . . .
+  7:  X . X . . X X . . . . X X . . . . . . X . X . X
+  8:  . . . X X . . X . X . . . . X X X X X . . . . .
+  9:  . X . . . . . . X X . . . . X . . . . . . . . .
+ 10:  . X . . X . . X X X . . . X X . . X X . . . . .
+ 11:  . . . X . . . . . . X . . . . . . . X X X X . .
+ 12:  . . X . . . X . . . . X X . . . . . . . . X . X
+ 13:  X . . . . X X . . . . X X . . . . . . . . . . X
+ 14:  X X . . . X . . . X . . . X . . . X . . . . . .
+ 15:  . X . . X . . X X X . . . . X . . . . . . . . .
+ 16:  . . . X X . . X . . . . . . . X X . X . . . . .
+ 17:  . . . . X . . X . . . . . . . X X . . . . . . .
+ 18:  X X . . . X . X . X . . . X . . . X X X . . . .
+ 19:  X . . X . . . X . X X . . . . X . X X X . . . .
+ 20:  X . . X . . X . . . X . . . . . . X X X X X . .
+ 21:  . . X . . . . . . . X . . . . . . . . X X X X .
+ 22:  X . X . . . X . . . X X . . . . . . . X X X X .
+ 23:  . . X . . . . . . . . . . . . . . . . . X X X .
+ 24:  . . . . . . X . . . . X X . . . . . . . . . . X
+
+------------------------------------------
+ordering the matrix with AMD
+------------------------------------------
+
+Permutation vector: 
+ 24 23 17  9 15  5 21 13  6 11 16  8  2 10 14 18  1  3  4 19  7 12 22 20
+
+Inverse permutation vector: 
+ 17 13 18 19  6  9 21 12  4 14 10 22  8 15  5 11  3 16 20 24  7 23  2  1
+Plot of permuted matrix pattern:
+      1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+  1:  X . . . . . . X . . . . . . . . . . . . X X . .
+  2:  . X . . . . X . . . . . . . . . . X . . . . X .
+  3:  . . X . . X . . . . X X . . . . . . . . . . . .
+  4:  . . . X X . . . . . . . X X . . . . . . . . . .
+  5:  . . . X X X . . . . . X X X . . . . . . . . . .
+  6:  . . X . X X . . . . X X . X . . . . . . . . . .
+  7:  . X . . . . X . . X . . . . . . . X . . . . X X
+  8:  X . . . . . . X X . . . . . . . X . . . X X . .
+  9:  . . . . . . . X X . . . . . X X X . . . X . . .
+ 10:  . . . . . . X . . X . . . . . . . . X X . . X X
+ 11:  . . X . . X . . . . X X . . . . . . X X . . . .
+ 12:  . . X . X X . . . . X X . X . X . . X X . . . .
+ 13:  . . . X X . . . . . . . X X X X . . . . . . . .
+ 14:  . . . X X X . . . . . X X X X X . . . X . . . .
+ 15:  . . . . . . . . X . . . X X X X X . . . . . . .
+ 16:  . . . . . . . . X . . X X X X X X . . X . . . X
+ 17:  . . . . . . . X X . . . . . X X X . . X X . X X
+ 18:  . X . . . . X . . . . . . . . . . X . . X X X .
+ 19:  . . . . . . . . . X X X . . . . . . X X . . . X
+ 20:  . . . . . . . . . X X X . X . X X . X X . . . X
+ 21:  X . . . . . . X X . . . . . . . X X . . X X X X
+ 22:  X . . . . . . X . . . . . . . . . X . . X X X .
+ 23:  . X . . . . X . . X . . . . . . X X . . X X X X
+ 24:  . . . . . . X . . X . . . . . X X . X X X . X X
+
+New column:  1 old column: 24 number of entries:  3
+    new row indices:  21 22  8
+
+New column:  2 old column: 23 number of entries:  3
+    new row indices:  18  7 23
+
+New column:  3 old column: 17 number of entries:  3
+    new row indices:   6 12 11
+
+New column:  4 old column:  9 number of entries:  3
+    new row indices:  13 14  5
+
+New column:  5 old column: 15 number of entries:  5
+    new row indices:  13  6 12  4 14
+
+New column:  6 old column:  5 number of entries:  5
+    new row indices:  12 14  5 11  3
+
+New column:  7 old column: 21 number of entries:  5
+    new row indices:  18 10 24 23  2
+
+New column:  8 old column: 13 number of entries:  5
+    new row indices:  17  9 21 22  1
+
+New column:  9 old column:  6 number of entries:  5
+    new row indices:  17 21  8 15 16
+
+New column: 10 old column: 11 number of entries:  5
+    new row indices:  19 20 24  7 23
+
+New column: 11 old column: 16 number of entries:  5
+    new row indices:  19  6 12  3 20
+
+New column: 12 old column:  8 number of entries:  8
+    new row indices:  19  6 14  5 11  3 16 20
+
+New column: 13 old column:  2 number of entries:  5
+    new row indices:   4 14 15  5 16
+
+New column: 14 old column: 10 number of entries:  8
+    new row indices:  13  6 12  4 15  5 16 20
+
+New column: 15 old column: 14 number of entries:  5
+    new row indices:  17 13  9 14 16
+
+New column: 16 old column: 18 number of entries:  8
+    new row indices:  17 13  9 12 14 15 20 24
+
+New column: 17 old column:  1 number of entries:  8
+    new row indices:   9 21  8 15 16 20 24 23
+
+New column: 18 old column:  3 number of entries:  5
+    new row indices:  21 22  7 23  2
+
+New column: 19 old column:  4 number of entries:  5
+    new row indices:  12 10 11 20 24
+
+New column: 20 old column: 19 number of entries:  8
+    new row indices:  17 19 12 14 10 11 16 24
+
+New column: 21 old column:  7 number of entries:  8
+    new row indices:  17 18  9 22  8 24 23  1
+
+New column: 22 old column: 12 number of entries:  5
+    new row indices:  18 21  8 23  1
+
+New column: 23 old column: 22 number of entries:  8
+    new row indices:  17 18 21 10 22 24  7  2
+
+New column: 24 old column: 20 number of entries:  8
+    new row indices:  17 19 21 10 16 20  7 23
+
+------------------------------------------
+ordering the matrix with AMDBAR
+------------------------------------------
+
+Permutation vector: 
+ 24 23 17  9 15  5 21 13  6 11 16  8  2 10 14 18  1  3  4 19  7 12 22 20
+
+Inverse permutation vector: 
+ 17 13 18 19  6  9 21 12  4 14 10 22  8 15  5 11  3 16 20 24  7 23  2  1
+Plot of permuted matrix pattern:
+      1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
+  1:  X . . . . . . X . . . . . . . . . . . . X X . .
+  2:  . X . . . . X . . . . . . . . . . X . . . . X .
+  3:  . . X . . X . . . . X X . . . . . . . . . . . .
+  4:  . . . X X . . . . . . . X X . . . . . . . . . .
+  5:  . . . X X X . . . . . X X X . . . . . . . . . .
+  6:  . . X . X X . . . . X X . X . . . . . . . . . .
+  7:  . X . . . . X . . X . . . . . . . X . . . . X X
+  8:  X . . . . . . X X . . . . . . . X . . . X X . .
+  9:  . . . . . . . X X . . . . . X X X . . . X . . .
+ 10:  . . . . . . X . . X . . . . . . . . X X . . X X
+ 11:  . . X . . X . . . . X X . . . . . . X X . . . .
+ 12:  . . X . X X . . . . X X . X . X . . X X . . . .
+ 13:  . . . X X . . . . . . . X X X X . . . . . . . .
+ 14:  . . . X X X . . . . . X X X X X . . . X . . . .
+ 15:  . . . . . . . . X . . . X X X X X . . . . . . .
+ 16:  . . . . . . . . X . . X X X X X X . . X . . . X
+ 17:  . . . . . . . X X . . . . . X X X . . X X . X X
+ 18:  . X . . . . X . . . . . . . . . . X . . X X X .
+ 19:  . . . . . . . . . X X X . . . . . . X X . . . X
+ 20:  . . . . . . . . . X X X . X . X X . X X . . . X
+ 21:  X . . . . . . X X . . . . . . . X X . . X X X X
+ 22:  X . . . . . . X . . . . . . . . . X . . X X X .
+ 23:  . X . . . . X . . X . . . . . . X X . . X X X X
+ 24:  . . . . . . X . . X . . . . . X X . X X X . X X
+
+New column:  1 old column: 24 number of entries:  3
+    new row indices:  21 22  8
+
+New column:  2 old column: 23 number of entries:  3
+    new row indices:  18  7 23
+
+New column:  3 old column: 17 number of entries:  3
+    new row indices:   6 12 11
+
+New column:  4 old column:  9 number of entries:  3
+    new row indices:  13 14  5
+
+New column:  5 old column: 15 number of entries:  5
+    new row indices:  13  6 12  4 14
+
+New column:  6 old column:  5 number of entries:  5
+    new row indices:  12 14  5 11  3
+
+New column:  7 old column: 21 number of entries:  5
+    new row indices:  18 10 24 23  2
+
+New column:  8 old column: 13 number of entries:  5
+    new row indices:  17  9 21 22  1
+
+New column:  9 old column:  6 number of entries:  5
+    new row indices:  17 21  8 15 16
+
+New column: 10 old column: 11 number of entries:  5
+    new row indices:  19 20 24  7 23
+
+New column: 11 old column: 16 number of entries:  5
+    new row indices:  19  6 12  3 20
+
+New column: 12 old column:  8 number of entries:  8
+    new row indices:  19  6 14  5 11  3 16 20
+
+New column: 13 old column:  2 number of entries:  5
+    new row indices:   4 14 15  5 16
+
+New column: 14 old column: 10 number of entries:  8
+    new row indices:  13  6 12  4 15  5 16 20
+
+New column: 15 old column: 14 number of entries:  5
+    new row indices:  17 13  9 14 16
+
+New column: 16 old column: 18 number of entries:  8
+    new row indices:  17 13  9 12 14 15 20 24
+
+New column: 17 old column:  1 number of entries:  8
+    new row indices:   9 21  8 15 16 20 24 23
+
+New column: 18 old column:  3 number of entries:  5
+    new row indices:  21 22  7 23  2
+
+New column: 19 old column:  4 number of entries:  5
+    new row indices:  12 10 11 20 24
+
+New column: 20 old column: 19 number of entries:  8
+    new row indices:  17 19 12 14 10 11 16 24
+
+New column: 21 old column:  7 number of entries:  8
+    new row indices:  17 18  9 22  8 24 23  1
+
+New column: 22 old column: 12 number of entries:  5
+    new row indices:  18 21  8 23  1
+
+New column: 23 old column: 22 number of entries:  8
+    new row indices:  17 18 21 10 22 24  7  2
+
+New column: 24 old column: 20 number of entries:  8
+    new row indices:  17 19 21 10 16 20  7 23
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77simple.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,38 @@
+C ----------------------------------------------------------------------
+C AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A.
+C Davis, Patrick R. Amestoy, and Iain S. Duff.  See ../README for
+C License.  email: davis@cise.ufl.edu    CISE Department, Univ. of
+C Florida.  web: http://www.cise.ufl.edu/research/sparse/amd
+C ----------------------------------------------------------------------
+
+C This program provides an example of how to call the Fortran version
+C of AMD.  It uses the same matrix as the amd_simple.c demo (in C).
+C Note that the diagonal entries are not present, and the matrix is
+C symmetric.
+
+        INTEGER N, NZ, J, K, P, IWLEN, PFREE, NCMPA
+        PARAMETER (N = 5, NZ = 10, IWLEN = 17)
+        INTEGER AP (N+1), AI (NZ), LAST (N), PE (N), LEN (N), ELEN (N),
+     $      IW (IWLEN), DEGREE (N), NV (N), NEXT (N), HEAD (N), W (N)
+        DATA AP / 1, 2,     5,     8,  9,  11/
+        DATA AI / 2, 1,3,5, 2,4,5, 3,  2,3   /
+
+C       load the matrix into the AMD workspace
+        DO 10 J = 1,N
+            PE (J) = AP (J)
+            LEN (J) = AP (J+1) - AP (J)
+10      CONTINUE
+        DO 20 P = 1,NZ
+            IW (P) = AI (P)
+20      CONTINUE
+        PFREE = NZ + 1
+
+C       order the matrix (destroys the copy of A in IW, PE, and LEN)
+        CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, LAST, HEAD,
+     $      ELEN, DEGREE, NCMPA, W)
+
+        DO 60 K = 1, N
+            PRINT 50, K, LAST (K)
+50          FORMAT ('P (',I2,') = ', I2)
+60      CONTINUE
+        END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77simple.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,5 @@
+P ( 1) =  4
+P ( 2) =  1
+P ( 3) =  3
+P ( 4) =  5
+P ( 5) =  2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_f77wrapper.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,108 @@
+/* ========================================================================= */
+/* === amd_f77wrapper ====================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Fortran interface for the C-callable AMD library (int version only).  This
+ * is HIGHLY non-portable.  You will need to modify this depending on how your
+ * Fortran and C compilers behave.  Two examples are provided.
+ *
+ * To avoid using I/O, and to avoid the extra porting step of a Fortran
+ * function, the status code is returned as the first entry in P (P [0] in C
+ * and P (1) in Fortran) if an error occurs.  The error codes are negative
+ * (-1: out of memory, -2: invalid matrix).
+ *
+ * For some C and Fortran compilers, the Fortran compiler appends a single "_"
+ * after each routine name.  C doesn't do this, so the translation is made
+ * here.  Some Fortran compilers don't append an underscore (xlf on IBM AIX,
+ * for * example).
+ *
+ * Tested with the following compilers:
+ * Solaris with cc and f77 from Sun WorkShop 6 update 1.
+ * SGI Irix with MIPSpro cc and f77 compilers version 7.4
+ * Linux with GNU gcc or Intel's icc, and GNU g77 Intel's ifc Fortran compiler.
+ *	(any combination).  Note that with g77, a call to amd_order in Fortran
+ *	gets translated to a call to amd_order__, with two underscores ("_").
+ *	Thus, the Fortran names do not include an underscore.
+ */
+
+#include "amd.h"
+#include <stdio.h>
+
+/* ------------------------------------------------------------------------- */
+/* Linux, Solaris, SGI */
+/* ------------------------------------------------------------------------- */
+
+void amdorder_ (int *n, const int *Ap, const int *Ai, int *P,
+    double *Control, double *Info)
+{
+    int result = amd_order (*n, Ap, Ai, P, Control, Info) ;
+    if (result != AMD_OK && P) P [0] = result ;
+}
+
+void amddefaults_ (double *Control)
+{
+    amd_defaults (Control) ;
+}
+
+void amdcontrol_ (double *Control)
+{
+    fflush (stdout) ;
+    amd_control (Control) ;
+    fflush (stdout) ;
+}
+
+void amdinfo_ (double *Info)
+{
+    fflush (stdout) ;
+    amd_info (Info) ;
+    fflush (stdout) ;
+}
+
+void amdpreproc_ (int *n, const int *Ap, const int *Ai, int *Rp, int *Ri)
+{
+    int result = amd_preprocess (*n, Ap, Ai, Rp, Ri) ;
+    if (result != AMD_OK && Rp) Rp [0] = result ;
+}
+
+/* ------------------------------------------------------------------------- */
+/* IBM AIX.  Probably Windows, Compaq Alpha, and HP Unix as well. */
+/* ------------------------------------------------------------------------- */
+
+void amdorder (int *n, const int *Ap, const int *Ai, int *P,
+    double *Control, double *Info)
+{
+    int result = amd_order (*n, Ap, Ai, P, Control, Info) ;
+    if (result != AMD_OK && P) P [0] = result ;
+}
+
+void amddefaults (double *Control)
+{
+    amd_defaults (Control) ;
+}
+
+void amdcontrol (double *Control)
+{
+    fflush (stdout) ;
+    amd_control (Control) ;
+    fflush (stdout) ;
+}
+
+void amdinfo (double *Info)
+{
+    fflush (stdout) ;
+    amd_info (Info) ;
+    fflush (stdout) ;
+}
+
+void amdpreproc (int *n, const int *Ap, const int *Ai, int *Rp, int *Ri)
+{
+    int result = amd_preprocess (*n, Ap, Ai, Rp, Ri) ;
+    if (result != AMD_OK && Rp) Rp [0] = result ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_simple.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,23 @@
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include "amd.h"
+
+int n = 5 ;
+int Ap [ ] = { 0,   2,       6,       10,  12, 14} ;
+int Ai [ ] = { 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4   } ;
+int P [5] ;
+
+int main (void)
+{
+    int k ;
+    (void) amd_order (n, Ap, Ai, P, (double *) NULL, (double *) NULL) ;
+    for (k = 0 ; k < n ; k++) printf ("P [%d] = %d\n", k, P [k]) ;
+    return (0) ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Demo/amd_simple.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,5 @@
+P [0] = 0
+P [1] = 3
+P [2] = 2
+P [3] = 4
+P [4] = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.bib	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,86 @@
+@string{SIREV       = "{SIAM} Review"}
+@string{SIMAX       = "{SIAM} J. Matrix Anal. Applic."}
+@string{SIAMJSC     = "{SIAM} J. Sci. Comput."}
+@string{TOMS        = "{ACM} Trans. Math. Softw."}
+
+@article{schu:01,
+	author    = {J. Schulze},
+	title     = {Towards a tighter coupling of bottom-up and top-down sparse matrix ordering methods},
+	journal   = {BIT},
+	volume    = {41},
+	number    = {4},
+	pages     = "800--841",
+	year      = {2001}
+	}
+
+@article{GeorgeLiu89,
+	author={George, A. and Liu, J. W. H.},
+	year={1989},
+	title={The Evolution of the Minimum Degree Ordering Algorithm},
+	journal=SIREV,
+	volume={31},
+	number={1},
+	pages={1--19}}
+
+@article{AmestoyDavisDuff96,
+	author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.},
+	title={An approximate minimum degree ordering algorithm},
+	journal=SIMAX,
+	year={1996}
+	,volume={17}
+	,number={4}
+	,pages={886-905}
+	}
+
+@misc{hsl:2002,
+ author = {HSL},
+  title = "{HSL} 2002: {A} collection of {F}ortran codes for large
+           scale scientific computation",
+  note = {{\tt www.cse.clrc.ac.uk/nag/hsl}},
+  year = 2002}
+
+
+@article{RothbergEisenstat98,
+	author={Rothberg, E. and Eisenstat, S. C.},
+	title={Node selection strategies for bottom-up sparse matrix orderings},
+	journal=SIMAX,
+	year={1998}
+	,volume={19}
+	,number={3}
+	,pages={682-695}
+	}
+
+@article{KarypisKumar98e,
+	author={Karypis, G. and Kumar, V.},
+	title={A fast and high quality multilevel scheme for partitioning irregular graphs},
+	journal=SIAMJSC,
+	year={1998}
+	,volume={20}
+	,pages={359-392}
+	}
+
+@article{Chaco,
+	author={B. Hendrickson and E. Rothberg},
+	title={Improving the runtime and quality of nested dissection ordering},
+	journal=SIAMJSC,
+	year={1999}
+	,volume={20}
+	,pages={468--489}
+	}
+
+@article{PellegriniRomanAmestoy00,
+	author={Pellegrini, F. and Roman, J. and Amestoy, P.},
+	title={Hybridizing nested dissection and halo approximate minimum degree for efficient sparse matrix ordering},
+	journal={Concurrency: Practice and Experience},
+	year={2000}
+	,volume={12}
+	,pages={68-84}
+	}
+
+@article{DavisGilbertLarimoreNg00pending,
+	author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.},
+	title={A column approximate minimum degree ordering algorithm},
+	journal=TOMS,
+	year={(to appear)}
+	}
+
Binary file liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Doc/AMD_UserGuide.tex	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1138 @@
+\documentclass[11pt]{article}
+
+\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
+\newcommand{\tr}{^{\sf T}}          % transpose
+
+\topmargin 0in
+\textheight 9in
+\oddsidemargin 0pt
+\evensidemargin 0pt
+\textwidth 6.5in
+
+%------------------------------------------------------------------------------
+\begin{document}
+%------------------------------------------------------------------------------
+
+\title{AMD Version 1.1 User Guide}
+\author{Patrick R. Amestoy\thanks{ENSEEIHT-IRIT,
+2 rue Camichel 31017 Toulouse, France.
+email: amestoy@enseeiht.fr.  http://www.enseeiht.fr/$\sim$amestoy.}
+\and Timothy A. Davis\thanks{
+Dept.~of Computer and Information Science and Engineering,
+Univ.~of Florida, Gainesville, FL, USA.
+email: davis@cise.ufl.edu.
+http://www.cise.ufl.edu/$\sim$davis.
+This work was supported by the National
+Science Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
+Portions of the work were done while on sabbatical at Stanford University
+and Lawrence Berkeley National Laboratory (with funding from Stanford
+University and the SciDAC program).
+}
+\and Iain S. Duff\thanks{Rutherford Appleton Laboratory, Chilton, Didcot, 
+Oxon OX11 0QX, England. email: i.s.duff@rl.ac.uk.  
+http://www.numerical.rl.ac.uk/people/isd/isd.html.
+This work was supported by the EPSRC under grant GR/R46441.
+}}
+
+\date{January 29, 2004}
+\maketitle
+
+%------------------------------------------------------------------------------
+\begin{abstract}
+AMD is a set of routines that implements the approximate minimum degree ordering
+algorithm to permute sparse matrices prior to
+numerical factorization.
+There are versions written in both C and Fortran 77.
+A MATLAB interface is included.
+\end{abstract}
+%------------------------------------------------------------------------------
+
+Technical report TR-04-002, CISE Department, University of Florida,
+Gainesville, FL, 2004.
+
+AMD Version 1.1 (Jan. 21, 2004), Copyright\copyright 2004 by Timothy A.
+Davis, Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
+
+{\bf AMD License:}
+    Your use or distribution of AMD or any modified version of
+    AMD implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses AMD or any modified version of AMD code must cite the
+    Copyright, this License, the Availability note, and ``Used by permission.''
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+{\bf Availability:}
+    http://www.cise.ufl.edu/research/sparse/amd
+
+{\bf Acknowledgments:}
+
+    This work was supported by the National Science Foundation, under
+    grants ASC-9111263 and DMS-9223088 and CCR-0203270.
+    The conversion to C, the addition of the elimination tree
+    post-ordering, and the handling of dense rows and columns
+    were done while Davis was on sabbatical at
+    Stanford University and Lawrence Berkeley National Laboratory.
+
+%------------------------------------------------------------------------------
+\newpage
+\section{Overview}
+%------------------------------------------------------------------------------
+
+AMD is a set of routines for preordering a sparse matrix prior to
+numerical factorization.  It uses an approximate minimum degree ordering
+algorithm \cite{AmestoyDavisDuff96} to find a permutation matrix $\m{P}$
+so that the Cholesky factorization $\m{PAP}\tr=\m{LL}\tr$ has fewer
+(often much fewer) nonzero entries than the Cholesky factorization of $\m{A}$.
+The algorithm is typically much faster than other ordering methods
+and  minimum degree ordering
+algorithms that compute an exact degree \cite{GeorgeLiu89}.
+Some methods, such as approximate deficiency
+\cite{RothbergEisenstat98} and graph-partitioning based methods
+\cite{Chaco,KarypisKumar98e,PellegriniRomanAmestoy00,schu:01}
+can produce better orderings, depending on the matrix.
+
+The algorithm starts with an undirected graph representation of a
+symmetric sparse matrix $\m{A}$.  Node $i$ in the graph corresponds to row
+and column $i$ of the matrix, and there is an edge $(i,j)$ in the graph if
+$a_{ij}$ is nonzero.
+The degree of a node is initialized to the number of off-diagonal nonzeros
+in row $i$, which is the size of the set of nodes
+adjacent to $i$ in the graph.
+
+The selection of a pivot $a_{ii}$ from the diagonal of $\m{A}$ and the first
+step of Gaussian elimination corresponds to one step of graph elimination.
+Numerical fill-in causes new nonzero entries in the matrix
+(fill-in refers to
+nonzeros in $\m{L}$ that are not in $\m{A}$).
+Node $i$ is eliminated and edges are added to its neighbors
+so that they form a clique (or {\em element}).  To reduce fill-in,
+node $i$ is selected as the node of least degree in the graph.
+This process repeats until the graph is eliminated.
+
+The clique is represented implicitly.  Rather than listing all the
+new edges in the graph, a single list of nodes is kept which represents
+the clique.  This list corresponds to the nonzero pattern of the first
+column of $\m{L}$.  As the elimination proceeds, some of these cliques
+become subsets of subsequent cliques, and are removed.   This graph
+can be stored in place, that is
+using the same amount of memory as the original graph.
+
+The most costly part of the minimum degree algorithm is the recomputation
+of the degrees of nodes adjacent to the current pivot element.
+Rather than keep track of the exact degree, the approximate minimum degree
+algorithm finds an upper bound on the degree that is easier to compute.
+For nodes of least degree, this bound tends to be tight.  Using the
+approximate degree instead of the exact degree leads to a substantial savings
+in run time, particularly for very irregularly structured matrices.
+It has no effect on the quality of the ordering.
+
+In the C version of AMD, the elimination phase is followed by an
+elimination tree post-ordering.  This has no effect on fill-in, but
+reorganizes the ordering so that the subsequent numerical factorization is
+more efficient.  It also includes a pre-processing phase in which nodes of
+very high degree are removed (without causing fill-in), and placed last in the
+permutation $\m{P}$.  This reduces the run time substantially if the matrix
+has a few rows with many nonzero entries, and has little effect on the quality
+of the ordering.
+The C version operates on the
+symmetric nonzero pattern of $\m{A}+\m{A}\tr$, so it can be given
+an unsymmetric matrix, or either the lower or upper triangular part of
+a symmetric matrix.
+
+The two Fortran versions of AMD are essentially identical to two versions of
+the AMD algorithm discussed in an earlier paper \cite{AmestoyDavisDuff96}
+(approximate minimum external degree, both with and without aggressive
+absorption).
+For a discussion of the long history of the minimum degree algorithm,
+see \cite{GeorgeLiu89}.
+
+%------------------------------------------------------------------------------
+\section{Availability}
+%------------------------------------------------------------------------------
+
+In addition to appearing as a Collected Algorithm of the ACM,
+AMD Version 1.1 is available at http://www.cise.ufl.edu/research/sparse.
+The Fortran version is available as the routine {\tt MC47} in HSL
+(formerly the Harwell Subroutine Library) \cite{hsl:2002}.
+
+%------------------------------------------------------------------------------
+\section{Using AMD in MATLAB}
+%------------------------------------------------------------------------------
+
+To use AMD in MATLAB, you must first compile the AMD mexFunction.
+Just type {\tt make} in the Unix system shell, while in the {\tt AMD}
+directory.  You can also type {\tt amd\_make} in MATLAB, while in the
+{\tt AMD/MATLAB} directory.  Place the {\tt AMD/MATLAB} directory in your
+MATLAB path.  This can be done on any system with MATLAB, including Windows.
+See Section~\ref{Install} for more details on how to install AMD.
+
+The MATLAB statement {\tt p=amd(A)} finds a permutation vector {\tt p} such
+that the Cholesky factorization {\tt chol(A(p,p))} is typically sparser than
+{\tt chol(A)}.
+If {\tt A} is unsymmetric, {\tt amd(A)} is identical to {\tt amd(A+A')}
+(ignoring numerical cancellation).
+If {\tt A} is not symmetric positive definite,
+but has substantial diagonal entries and a mostly symmetric nonzero pattern,
+then this ordering is also suitable for LU factorization.  A partial pivoting
+threshold may be required to prevent pivots from being selected off the
+diagonal, such as the statement {\tt [L,U,P] = lu (A (p,p), 0.1)}.
+Type {\tt help lu} for more details.
+The statement {\tt [L,U,P,Q] = lu (A (p,p))} in MATLAB 6.5 is
+not suitable, however, because it uses UMFPACK Version 4.0 and thus
+does not attempt to select pivots from the diagonal.  UMFPACK Version 4.1
+uses several strategies, including a symmetric pivoting strategy, and
+will give you better results if you want to factorize an unsymmetric matrix
+of this type.  Refer to the UMFPACK User Guide for more details, at
+http://www.cise.ufl.edu/research/sparse/umfpack.
+
+The AMD mexFunction is much faster than the built-in MATLAB symmetric minimum
+degree ordering methods, SYMAMD and SYMMMD.  Its ordering quality is
+comparable to SYMAMD, and better than SYMMMD
+\cite{DavisGilbertLarimoreNg00pending}.
+
+An optional input argument can be used to modify the control parameters for
+AMD (aggressive absorption, dense row/column handling, and printing of
+statistics).  An optional output
+argument provides statistics on the ordering, including an analysis of the
+fill-in and the floating-point operation count for a subsequent factorization.
+For more details (once AMD is installed),
+type {\tt help amd} in the MATLAB command window.
+
+%------------------------------------------------------------------------------
+\section{Using AMD in a C program}
+\label{Cversion}
+%------------------------------------------------------------------------------
+
+The C-callable AMD library consists of five user-callable routines and one
+include file.  There are two versions of each of the routines, with
+{\tt int} and {\tt long} integers.
+The routines with prefix
+{\tt amd\_l\_} use {\tt long} integer arguments; the others use
+{\tt int} integer arguments.  If you compile AMD in the standard
+ILP32 mode (32-bit {\tt int}'s, {\tt long}'s, and pointers) then the versions
+are essentially identical.  You will be able to solve problems using up to 2GB
+of memory.  If you compile AMD in the standard LP64 mode, the size of an
+{\tt int} remains 32-bits, but the size of a {\tt long} and a pointer both get
+promoted to 64-bits.
+
+The following routines are fully described in Section~\ref{Primary}:
+
+\begin{itemize}
+\item {\tt amd\_order}
+({\tt long} version: {\tt amd\_l\_order})
+    {\footnotesize
+    \begin{verbatim}
+    #include "amd.h"
+    int n, Ap [n+1], Ai [nz], P [n] ;
+    double Control [AMD_CONTROL], Info [AMD_INFO] ;
+    int result = amd_order (n, Ap, Ai, P, Control, Info) ;
+    \end{verbatim}
+    }
+    Computes the approximate minimum degree ordering of an $n$-by-$n$ matrix
+    $\m{A}$.  Returns a permutation vector {\tt P} of size {\tt n}, where
+    {\tt P[k] = i} if row and column {\tt i} are the {\tt k}th row and
+    column in the permuted matrix.
+    This routine allocates its own memory of size $1.2e+9n$ integers,
+    where $e$ is the number of nonzeros in $\m{A}+\m{A}\tr$.
+    It computes statistics about the matrix $\m{A}$, such as the symmetry of
+    its nonzero pattern, the number of nonzeros in $\m{L}$,
+    and the number of floating-point operations required for Cholesky and LU
+    factorizations (which are returned in the {\tt Info} array).
+    The user's input matrix is not modified.
+    It returns {\tt AMD\_OK} if successful, {\tt AMD\_INVALID} if
+    the matrix is invalid, or {\tt AMD\_OUT\_OF\_MEMORY} if out of memory.
+
+\item {\tt amd\_defaults}
+({\tt long} version: {\tt amd\_l\_defaults})
+    {\footnotesize
+    \begin{verbatim}
+    #include "amd.h"
+    double Control [AMD_CONTROL] ;
+    amd_defaults (Control) ;
+    \end{verbatim}
+    }
+    Sets the default control parameters in the {\tt Control} array.  These can
+    then be modified as desired before passing the array to the other AMD
+    routines.
+
+\item {\tt amd\_control}
+({\tt long} version: {\tt amd\_l\_control})
+    {\footnotesize
+    \begin{verbatim}
+    #include "amd.h"
+    double Control [AMD_CONTROL] ;
+    amd_control (Control) ;
+    \end{verbatim}
+    }
+    Prints a description of the control parameters, and their values.
+
+\item {\tt amd\_info}
+({\tt long} version: {\tt amd\_l\_info})
+    {\footnotesize
+    \begin{verbatim}
+    #include "amd.h"
+    double Info [AMD_INFO] ;
+    amd_info (Info) ;
+    \end{verbatim}
+    }
+    Prints a description of the statistics computed by AMD, and their values.
+
+\item {\tt amd\_preprocess}
+({\tt long} version: {\tt amd\_l\_info})
+    {\footnotesize
+    \begin{verbatim}
+    #include "amd.h"
+    int n, Ap [n+1], Ai [nz], Rp [n+1], Ri [nz] ;
+    int result = amd_preprocess (n, Ap, Ai, Rp, Ri) ;
+    \end{verbatim}
+    }
+    Removes duplicate entries and sorts each column of its input $\m{A}$,
+    and returns the nonzero pattern of the transpose, $\m{R}=\m{A}\tr$.
+    It returns the transpose because this is the simplest way to sort
+    a matrix and remove duplicate entries.  Either $\m{A}$ or $\m{A}\tr$
+    can be passed to {\tt amd\_order} with little effect on the
+    ordering (except for minor tie-breaking changes).
+
+\end{itemize}
+
+The nonzero pattern of the matrix $\m{A}$ is represented in compressed column
+form.
+For an $n$-by-$n$ matrix $\m{A}$ with {\tt nz} nonzero entries, the
+representation consists of two arrays: {\tt Ap} of size {\tt n+1} and {\tt Ai}
+of size {\tt nz}.  The row indices of entries in column {\tt j} are stored in
+    {\tt Ai[Ap[j]} $\ldots$ {\tt Ap[j+1]-1]}.
+For {\tt amd\_order},
+no duplicate row indices may be present, and the row indices in any given
+column must be sorted in ascending order.
+The matrix is 0-based, and thus
+row indices must be in the range {\tt 0} to {\tt n-1}.
+The first entry {\tt Ap[0]} must be zero.
+The total number of entries in the matrix is thus {\tt nz = Ap[n]}.
+
+The matrix must be square, but it does not need to be symmetric.
+The {\tt amd\_order} routine constructs the nonzero pattern of
+$\m{B} = \m{A}+\m{A}\tr$ (without forming $\m{A}\tr$ explicitly),
+and then orders the matrix $\m{B}$.  Thus, either the
+lower triangular part of $\m{A}$, the upper triangular part,
+or any combination may be passed.  The transpose $\m{A}\tr$ may also be
+passed to {\tt amd\_order}.
+The diagonal entries may be present, but are ignored.
+
+The input to {\tt amd\_order} must have sorted columns because it uses
+an in-place algorithm to construct $\m{A}+\m{A}\tr$ without first constructing
+$\m{A}\tr$.  This saves memory, but places an additional restriction on
+the input.  If the input matrix has columns with unsorted and/or duplicate
+row indices, it is not valid as input to {\tt amd\_order}.  To handle this
+case, the {\tt amd\_preprocess} routine is provided.  It sorts, transposes,
+and removes duplicate entries from its input matrix, returning its result
+as another compressed-column matrix $\m{R}$ which can then be passed to
+{\tt amd\_order}.
+
+%------------------------------------------------------------------------------
+\subsection{Control parameters}
+\label{control_param}
+%------------------------------------------------------------------------------
+
+Control parameters are set an optional {\tt Control} array.
+It is optional in the sense that if
+a {\tt NULL} pointer is passed for the {\tt Control} input argument,
+then default control parameters are used.
+%
+\begin{itemize}
+\item {\tt Control[AMD\_DENSE]} (or {\tt Control(1)} in MATLAB):
+controls the threshold for ``dense''
+rows/columns.  A dense row/column in $\m{A}+\m{A}\tr$
+can cause AMD to spend significant time
+in ordering the matrix.  If {\tt Control[AMD\_DENSE]} $\ge 0$,
+rows/columns with
+more than {\tt Control[AMD\_DENSE]} $\sqrt{n}$ entries are ignored during
+the ordering, and placed last in the output order.  The default
+value of {\tt Control[AMD\_DENSE]} is 10.  If negative, no rows/columns
+are treated as ``dense.''  Rows/columns with 16 or fewer off-diagonal
+entries are never considered ``dense.''
+%
+\item {\tt Control[AMD\_AGGRESSIVE]} (or {\tt Control(2)} in MATLAB):
+controls whether or not to use
+aggressive absorption, in which a prior element is absorbed into the current
+element if it is a subset of the current element, even if it is not
+adjacent to the current pivot element (refer to \cite{AmestoyDavisDuff96}
+for more details).  The default value is nonzero,
+which means that aggressive absorption will be performed.  This nearly always
+leads to a better ordering (because the approximate degrees are more
+accurate) and a lower execution time.  There are cases where it can
+lead to a slightly worse ordering, however.  To turn it off, set
+{\tt Control[AMD\_AGGRESSIVE]} to 0.
+%
+\end{itemize}
+
+Statistics are returned in the {\tt Info} array
+(if {\tt Info} is {\tt NULL}, then no statistics are returned).
+Refer to {\tt amd.h} file, for more details
+(14 different statistics are returned, so the list is not included here).
+
+%------------------------------------------------------------------------------
+\subsection{Sample C program}
+%------------------------------------------------------------------------------
+
+The following program, {\tt amd\_demo.c}, illustrates the basic use of AMD.
+See Section~\ref{Synopsis} for a short description
+of each calling sequence.
+
+{\footnotesize
+\begin{verbatim}
+#include <stdio.h>
+#include "amd.h"
+
+int n = 5 ;
+int Ap [ ] = { 0,   2,       6,       10,  12, 14} ;
+int Ai [ ] = { 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4   } ;
+int P [5] ;
+
+int main (void)
+{
+    int k ;
+    (void) amd_order (n, Ap, Ai, P, (double *) NULL, (double *) NULL) ;
+    for (k = 0 ; k < n ; k++) printf ("P [%d] = %d\n", k, P [k]) ;
+    return (0) ;
+}
+\end{verbatim}
+}
+
+The {\tt Ap} and {\tt Ai} arrays represent the binary matrix
+\[
+\m{A} = \left[
+\begin{array}{rrrrr}
+ 1 &  1 &  0 &  0 &  0 \\
+ 1 &  1 &  1 &  0 &  1 \\
+ 0 &  1 &  1 &  1 &  0 \\
+ 0 &  0 &  1 &  1 &  0 \\
+ 0 &  1 &  1 &  0 &  1 \\
+\end{array}
+\right].
+\]
+The diagonal entries are ignored.
+%
+AMD constructs the pattern of $\m{A}+\m{A}\tr$,
+and returns a permutation vector of $(0, 3, 1, 4, 2)$.
+%
+Since the matrix is unsymmetric but with a mostly symmetric nonzero
+pattern, this would be a suitable permutation for an LU factorization of a
+matrix with this nonzero pattern and whose diagonal entries are not too small.
+The program uses default control settings and does not return any statistics
+about the ordering, factorization, or solution ({\tt Control} and {\tt Info}
+are both {\tt (double *) NULL}).  It also ignores the status value returned by
+{\tt amd\_order}.
+
+More example programs are included with the AMD package.
+The {\tt amd\_demo.c} program provides a more detailed demo of AMD.
+Another example is the AMD mexFunction, {\tt amd\_mex.c}.
+
+%------------------------------------------------------------------------------
+\subsection{A note about zero-sized arrays}
+%------------------------------------------------------------------------------
+
+AMD uses several user-provided arrays of size {\tt n} or {\tt nz}.
+Either {\tt n} or {\tt nz} can be zero.
+If you attempt to {\tt malloc} an array of size zero,
+however, {\tt malloc} will return a null pointer which AMD will report
+as invalid.  If you {\tt malloc} an array of
+size {\tt n} or {\tt nz} to pass to AMD, make sure that you handle the
+{\tt n} = 0 and {\tt nz = 0} cases correctly.
+
+%------------------------------------------------------------------------------
+\section{Synopsis of C-callable routines}
+\label{Synopsis}
+%------------------------------------------------------------------------------
+
+The matrix $\m{A}$ is {\tt n}-by-{\tt n} with {\tt nz} entries.
+
+{\footnotesize
+\begin{verbatim}
+#include "amd.h"
+int n, status, Ap [n+1], Ai [nz], P [n], Rp [n+1], Ri [nz] ;
+double Control [AMD_CONTROL], Info [AMD_INFO] ;
+amd_defaults (Control) ;
+status = amd_order (n, Ap, Ai, P, Control, Info) ;
+amd_control (Control) ;
+amd_info (Info) ;
+amd_preprocess (n, Ap, Ai, Rp, Ri) ;
+\end{verbatim}
+}
+
+The {\tt amd\_l\_*} routines are identical, except that all {\tt int}
+arguments become {\tt long}:
+
+{\footnotesize
+\begin{verbatim}
+#include "amd.h"
+long n, status, Ap [n+1], Ai [nz], P [n], Rp [n+1], Ri [nz] ;
+double Control [AMD_CONTROL], Info [AMD_INFO] ;
+amd_l_defaults (Control) ;
+status = amd_l_order (n, Ap, Ai, P, Control, Info) ;
+amd_l_control (Control) ;
+amd_l_info (Info) ;
+amd_l_preprocess (n, Ap, Ai, Rp, Ri) ;
+\end{verbatim}
+}
+
+%------------------------------------------------------------------------------
+\section{Using AMD in a Fortran program}
+%------------------------------------------------------------------------------
+
+Two Fortran versions of AMD are provided.  The {\tt AMD} routine computes the
+approximate minimum degree ordering, using aggressive absorption.  The
+{\tt AMDBAR} routine is identical, except that it does not perform aggressive
+absorption.  The {\tt AMD} routine is essentially identical to the HSL
+routine {\tt MC47B/BD}.
+Note that earlier versions of the Fortran
+{\tt AMD} and {\tt AMDBAR} routines included an {\tt IOVFLO} argument,
+which is no longer present.
+
+In contrast to the C version, the Fortran routines require a symmetric
+nonzero pattern, with no diagonal entries present although the {\tt MC47A/AD}
+wrapper in HSL allows duplicates, ignores out-of-range entries, and only
+uses entries from the upper triangular part of the matrix.  Although we
+have an experimental Fortran code for treating ``dense'' rows, the Fortran
+codes in this release do not treat
+``dense'' rows and columns of $\m{A}$ differently, and thus their run time
+can be high if there are a few dense rows and columns in the matrix.
+They do not perform a post-ordering of the elimination tree,
+compute statistics on the ordering, or check the validity of their input
+arguments. These facilities are provided by {\tt MC47A/AD} and other
+subroutines from HSL.
+Only one {\tt integer}
+version of each Fortran routine is provided.  
+Both Fortran routines overwrite the user's input
+matrix, in contrast to the C version.  
+%
+The C version does not return the elimination or assembly tree.
+The Fortran version returns an assembly tree;
+refer to the User Guide for details.
+The following is the syntax of the {\tt AMD} Fortran routine.
+The {\tt AMDBAR} routine is identical except for the routine name.
+
+{\footnotesize
+\begin{verbatim}
+        INTEGER N, IWLEN, PFREE, NCMPA, IW (IWLEN), PE (N), DEGREE (N), NV (N),
+     $          NEXT (N), LAST (N), HEAD (N), ELEN (N), W (N), LEN (N)
+        CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
+        CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
+\end{verbatim}
+}
+
+The input matrix is provided to {\tt AMD} and {\tt AMDBAR}
+in three arrays, {\tt PE}, of size {\tt N},
+{\tt LEN}, of size {\tt N}, and {\tt IW}, of size {\tt IWLEN}.  The size of
+{\tt IW} must be at least {\tt NZ+N}.  The recommended size is
+{\tt 1.2*NZ + N}.
+On input, the indices of nonzero entries in row {\tt I} are stored in {\tt IW}.
+{\tt PE(I)} is the index in {\tt IW} of the start of row {\tt I}.
+{\tt LEN(I)} is the number of entries in row {\tt I}.
+The matrix is 1-based, with row and column indices in the range 1 to {\tt N}.
+Row {\tt I} is contained in
+{\tt IW (PE(I)} $\ldots \:$ {\tt PE(I) + LEN(I) - 1)}.
+The diagonal entries must not be present.  The indices within each row must
+not contain any duplicates, but they need not be sorted.  The rows
+themselves need not be in any particular order, and there may be empty space
+between the rows.  If {\tt LEN(I)} is zero, then there are no off-diagonal
+entries in row {\tt I}, and {\tt PE(I)} is ignored.  The integer
+{\tt PFREE} defines what part of {\tt IW} contains the user's input matrix,
+which is held in {\tt IW(1}~$\ldots~\:${\tt PFREE-1)}.
+The contents of {\tt IW} and {\tt LEN} are undefined on output,
+and {\tt PE} is modified to contain information about the ordering.
+
+As the algorithm proceeds, it modifies the {\tt IW} array, placing the
+pattern of the partially eliminated matrix in
+{\tt IW(PFREE} $\ldots \:${\tt IWLEN)}.
+If this space is exhausted, the space is compressed.
+The number of compressions performed on the {\tt IW} array is
+returned in the scalar {\tt NCMPA}.  The value of {\tt PFREE} on output is the
+length of {\tt IW} required for no compressions to be needed.
+
+The output permutation is returned in the array {\tt LAST}, of size {\tt N}.
+If {\tt I=LAST(K)}, then {\tt I} is the {\tt K}th row in the permuted
+matrix.  The inverse permutation is returned in the array {\tt ELEN}, where
+{\tt K=ELEN(I)} if {\tt I} is the {\tt K}th row in the permuted matrix.
+On output, the {\tt PE} and {\tt NV} arrays hold the assembly tree,
+a supernodal elimination tree that represents the relationship between
+columns of the Cholesky factor $\m{L}$.
+If {\tt NV(I)} $> 0$, then {\tt I} is a node in the assembly
+tree, and the parent of {\tt I} is {\tt -PE(I)}.  If {\tt I} is a root of
+the tree, then {\tt PE(I)} is zero.  The value of {\tt NV(I)} is the
+number of entries in the corresponding column of $\m{L}$, including the
+diagonal.
+If {\tt NV(I)} is zero, then {\tt I} is a non-principal node that is
+not in the assembly tree.  Node {\tt -PE(I)} is the parent of node {\tt I}
+in a subtree, the root of which is a node in the assembly tree.  All nodes
+in one subtree belong to the same supernode in the assembly tree.
+The other size {\tt N} arrays
+({\tt DEGREE}, {\tt HEAD}, {\tt NEXT}, and {\tt W}) are used as workspace,
+and are not defined on input or output.
+
+If you want to use a simpler user-interface and compute the elimination
+tree post-ordering, you should be able to call the C routines {\tt amd\_order}
+or {\tt amd\_l\_order} from a Fortran program.   Just be sure to take into
+account the 0-based indexing in the {\tt P}, {\tt Ap}, and {\tt Ai} arguments
+to {\tt amd\_order} and {\tt amd\_l\_order}.  A sample interface is provided
+in the files {\tt AMD/Demo/amd\_f77cross.f} and
+{\tt AMD/Demo/amd\_f77wrapper.c}.  To compile the {\tt amd\_f77cross} program,
+type {\tt make cross} in the {\tt AMD/Demo} directory.  The
+Fortran-to-C calling conventions are highly non-portable, so this example
+is not guaranteed to work with your compiler C and Fortran compilers.
+The output of {\tt amd\_f77cross} is in {\tt amd\_f77cross.out}.
+
+%------------------------------------------------------------------------------
+\section{Sample Fortran main program}
+%------------------------------------------------------------------------------
+
+The following program illustrates the basic usage of the Fortran version of AMD.
+The {\tt AP} and {\tt AI} arrays represent the binary matrix
+\[
+\m{A} = \left[
+\begin{array}{rrrrr}
+ 1 &  1 &  0 &  0 &  0 \\
+ 1 &  1 &  1 &  0 &  1 \\
+ 0 &  1 &  1 &  1 &  1 \\
+ 0 &  0 &  1 &  1 &  0 \\
+ 0 &  1 &  1 &  0 &  1 \\
+\end{array}
+\right]
+\]
+in a conventional 1-based column-oriented form,
+except that the diagonal entries are not present.
+The matrix has the same as nonzero pattern of $\m{A}+\m{A}\tr$ in the C
+program, in Section~\ref{Cversion}.
+The output permutation is $(4, 1, 3, 5, 2)$.
+It differs from the permutation returned by the C routine {\tt amd\_order}
+because a post-order of the elimination tree has not yet been performed.
+
+{\footnotesize
+\begin{verbatim}
+        INTEGER N, NZ, J, K, P, IWLEN, PFREE, NCMPA
+        PARAMETER (N = 5, NZ = 10, IWLEN = 17)
+        INTEGER AP (N+1), AI (NZ), LAST (N), PE (N), LEN (N), ELEN (N),
+     $      IW (IWLEN), DEGREE (N), NV (N), NEXT (N), HEAD (N), W (N)
+        DATA AP / 1, 2,     5,     8,  9,  11/
+        DATA AI / 2, 1,3,5, 2,4,5, 3,  2,3   /
+C       load the matrix into the AMD workspace
+        DO 10 J = 1,N
+            PE (J) = AP (J)
+            LEN (J) = AP (J+1) - AP (J)
+10      CONTINUE
+        DO 20 P = 1,NZ
+            IW (P) = AI (P)
+20      CONTINUE
+        PFREE = NZ + 1
+C       order the matrix (destroys the copy of A in IW, PE, and LEN)
+        CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, LAST, HEAD,
+     $      ELEN, DEGREE, NCMPA, W)
+        DO 60 K = 1, N
+            PRINT 50, K, LAST (K)
+50          FORMAT ('P (',I2,') = ', I2)
+60      CONTINUE
+        END
+\end{verbatim}
+}
+
+The {\tt Demo} directory contains an example of how the C version
+may be called from a Fortran program, but this is highly non-portable.
+For this reason, it is placed in the {\tt Demo} directory, not in the
+primary {\tt Source} directory.
+
+%------------------------------------------------------------------------------
+\section{Installation}
+\label{Install}
+%------------------------------------------------------------------------------
+
+The following discussion assumes you have the {\tt make} program, either in
+Unix, or in Windows with Cygwin.
+
+System-dependent configurations are in the {\tt AMD/Make}
+directory.  You can edit the {\tt Make.include}
+file in that directory to customize the compilation.  The default
+settings will work on most systems.
+Sample configuration files are provided
+for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha.
+
+To compile and install the C-callable AMD library,
+go to the {\tt AMD} directory and type {\tt make}.
+The library will be placed in {\tt AMD/Lib/libamd.a}.
+Two demo programs of the AMD ordering routine will be compiled and tested in
+the {\tt AMD/Demo} directory.
+The outputs of these demo programs will then be compared with output
+files in the distribution.  The AMD mexFunction for
+use in MATLAB will also be compiled.  If you do not have MATLAB
+type {\tt make lib} instead.
+
+To compile and install the Fortran-callable AMD library,
+go to the {\tt AMD} directory and type {\tt make fortran}.
+The library will be placed in {\tt AMD/Lib/libamdf77.a}.
+A demo program will be compiled and tested in the {\tt AMD/Demo} directory.
+The output will be compared with an output file in the distribution.
+
+Typing {\tt make clean} will remove all but the final compiled libraries
+and demo programs.  Typing {\tt make purge} removes all files not in the
+original distribution.
+If you compile AMD and then later change the {\tt Make.include}
+file or your system-specific configuration file such as {\tt Make.linux},
+then you should type {\tt make purge} and then {\tt make} to recompile.
+
+Here are the various parameters that you can control in your
+{\tt Make.include} file:
+
+\begin{itemize}
+\item {\tt CC = } your C compiler, such as {\tt cc}.
+\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed.
+\item {\tt CFLAGS = } optimization flags, such as {\tt -O}.
+\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}.
+\item {\tt RM =} the command to delete a file.
+\item {\tt MV =} the command to rename a file.
+\item {\tt MEX =} the command to compile a MATLAB mexFunction.
+\item {\tt F77 =} the command to compile a Fortran program (optional).
+\item {\tt F77FLAGS =} the Fortran compiler flags (optional).
+\item {\tt F77LIB =} the Fortran libraries (optional).
+\end{itemize}
+
+The {\tt Make.include} includes some definitions regarding the BLAS.
+This is so that AMD and UMFPACK (which requires AMD) can share
+the same configuration files.  If you wish to use AMD only, then
+you can ignore any references to the BLAS (the -DNBLAS compile flag).
+
+When you compile your program that uses the C-callable AMD library,
+you need to add the {\tt AMD/Lib/libamd.a} library
+and you need to tell your compiler to look in the
+{\tt AMD/Include} directory for include
+files.   To compile a Fortran program that calls the Fortran AMD library,
+you need to add the {\tt AMD/Lib/libamdf77.a} library.
+See {\tt AMD/Demo/Makefile} for an example.
+
+If all you want to use is the AMD mexFunction in MATLAB, you can skip
+the use of the {\tt make} command entirely.  Simply type
+{\tt amd\_make} in MATLAB while in the {\tt AMD/MATLAB} directory.
+This works on any system with MATLAB, including Windows.
+
+If you are including AMD as a subset of a larger library and do not want
+to link the C standard I/O library, or if you simply do not need to use
+them, you can safely remove the {\tt amd\_control.c} and {\tt amd\_info.c}
+files.  Similarly, if you use default parameters (or define your
+own {\tt Control} array), then you can exclude the {\tt amd\_defaults.c}
+file.  The {\tt amd\_preprocess.c} file is optional as well, if you
+can ensure that the input matrix to {\tt amd\_order} is always sorted
+and has no duplicate entries.
+Each of these files contains the user-callable routines of the same
+name.  None of these auxiliary routines are directly called by
+{\tt amd\_order}.
+The {\tt amd\_dump.c} file contains debugging routines
+that are neither used nor compiled unless debugging is enabled.
+The {\tt amd\_internal.h} file must be edited to enable debugging;
+refer to the instructions in that file.  Thus, it too can be excluded
+if compiled into a larger production program or library.
+The bare minimum files required to use just {\tt amd\_order} are
+{\tt amd.h} in the {\tt Include} directory,
+and
+{\tt amd\_1.c},
+{\tt amd\_2.c},
+{\tt amd\_aat.c},
+{\tt and\_order.c},
+{\tt amd\_postorder.c},
+{\tt amd\_post\_tree.c},
+{\tt amd\_valid.c},
+and
+{\tt amd\_internal.h},
+in the {\tt Source} directory.
+
+%------------------------------------------------------------------------------
+\newpage
+\section{The AMD routines}
+\label{Primary}
+%------------------------------------------------------------------------------
+
+The file {\tt AMD/Include/amd.h} listed below
+describes each user-callable routine in the C version of AMD,
+and gives details on their use.
+
+{\footnotesize
+\begin{verbatim}
+/* ========================================================================= */
+/* === AMD:  approximate minimum degree ordering =========================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky
+ * factorization of P*A*P' has fewer nonzeros and takes less work than the
+ * Cholesky factorization of A.  If A is not symmetric, then it performs its
+ * ordering on the matrix A+A'.  Two sets of user-callable routines are
+ * provided, one for "int" integers and the other for "long" integers.
+ *
+ * The method is based on the approximate minimum degree algorithm, discussed
+ * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm",
+ * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp.
+ * 886-905, 1996.  This package can perform both the AMD ordering (with
+ * aggressive absorption), and the AMDBAR ordering (without aggressive
+ * absorption) discussed in the above paper.  This package differs from the
+ * Fortran codes discussed in the paper:
+ *
+ *      (1) it can ignore "dense" rows and columns, leading to faster run times
+ *      (2) it computes the ordering of A+A' if A is not symmetric
+ *      (3) it is followed by a depth-first post-ordering of the assembly tree
+ *          (or supernodal elimination tree)
+ *
+ * For historical reasons, the Fortran versions, amd.f and amdbar.f, have
+ * been left (nearly) unchanged.  They compute the identical ordering as
+ * described in the above paper.
+ */
+
+#ifndef AMD_H
+#define AMD_H
+
+int amd_order (             /* returns 0 if OK, negative value if error */
+    int n,                  /* A is n-by-n.  n must be >= 0. */
+    const int Ap [ ],       /* column pointers for A, of size n+1 */
+    const int Ai [ ],       /* row indices of A, of size nz = Ap [n] */
+    int P [ ],              /* output permutation, of size n */
+    double Control [ ],     /* input Control settings, of size AMD_CONTROL */
+    double Info [ ]         /* output Info statistics, of size AMD_INFO */
+) ;
+
+long amd_l_order (          /* see above for description of arguments */
+    long n,
+    const long Ap [ ],
+    const long Ai [ ],
+    long P [ ],
+    double Control [ ],
+    double Info [ ]
+) ;
+
+/* Input arguments (not modified):
+ *
+ *      n: the matrix A is n-by-n.
+ *      Ap: an int/long array of size n+1, containing the column pointers of A.
+ *      Ai: an int/long array of size nz, containing the row indices of A,
+ *          where nz = Ap [n].
+ *      Control:  a double array of size AMD_CONTROL, containing control
+ *          parameters.  Defaults are used if Control is NULL.
+ *
+ * Output arguments (not defined on input):
+ *
+ *      P: an int/long array of size n, containing the output permutation. If
+ *          row i is the kth pivot row, then P [k] = i.  In MATLAB notation,
+ *          the reordered matrix is A (P,P).
+ *      Info: a double array of size AMD_INFO, containing statistical
+ *          information.  Ignored if Info is NULL.
+ *
+ * On input, the matrix A is stored in column-oriented form.  The row indices
+ * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1].
+ * The row indices must appear in ascending order in each column, and there
+ * must not be any duplicate entries.  Row indices must be in the range 0 to
+ * n-1.  Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros
+ * in A.  The array Ap is of size n+1, and the array Ai is of size nz = Ap [n].
+ * The matrix does not need to be symmetric, and the diagonal does not need to
+ * be present (if diagonal entries are present, they are ignored except for
+ * the output statistic Info [AMD_NZDIAG]).  The arrays Ai and Ap are not
+ * modified.  This form of the Ap and Ai arrays to represent the nonzero
+ * pattern of the matrix A is the same as that used internally by MATLAB.
+ * If you wish to use a more flexible input structure, please see the
+ * umfpack_*_triplet_to_col routines in the UMFPACK package, at
+ * http://www.cise.ufl.edu/research/sparse/umfpack, or use the amd_preprocess
+ * routine discussed below.
+ *
+ * Restrictions:  n >= 0.  Ap [0] = 0.  Ap [j] <= Ap [j+1] for all j in the
+ *      range 0 to n-1.  nz = Ap [n] >= 0.  For all j in the range 0 to n-1,
+ *      and for all p in the range Ap [j] to Ap [j+1]-2, Ai [p] < Ai [p+1] must
+ *      hold.  Ai [0..nz-1] must be in the range 0 to n-1.  To avoid integer
+ *      overflow, (2.4*nz + 8*n) < INT_MAX / sizeof (int) for must hold for the
+ *      "int" version. (2.4*nz + 8*n) < LONG_MAX / sizeof (long) must hold
+ *      for the "long" version.  Finally, Ai, Ap, and P must not be NULL.  If
+ *      any of these restrictions are not met, AMD returns AMD_INVALID.
+ *
+ * AMD returns:
+ *
+ *      AMD_OK if the matrix is valid and sufficient memory can be allocated to
+ *          perform the ordering.
+ *
+ *      AMD_OUT_OF_MEMORY if not enough memory can be allocated.
+ *
+ *      AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is
+ *          NULL.
+ *
+ * The AMD routine first forms the pattern of the matrix A+A', and then
+ * computes a fill-reducing ordering, P.  If P [k] = i, then row/column i of
+ * the original is the kth pivotal row.  In MATLAB notation, the permuted
+ * matrix is A (P,P), except that 0-based indexing is used instead of the
+ * 1-based indexing in MATLAB.
+ *
+ * The Control array is used to set various parameters for AMD.  If a NULL
+ * pointer is passed, default values are used.  The Control array is not
+ * modified.
+ *
+ *      Control [AMD_DENSE]:  controls the threshold for "dense" rows/columns.
+ *          A dense row/column in A+A' can cause AMD to spend a lot of time in
+ *          ordering the matrix.  If Control [AMD_DENSE] >= 0, rows/columns
+ *          with more than Control [AMD_DENSE] * sqrt (n) entries are ignored
+ *          during the ordering, and placed last in the output order.  The
+ *          default value of Control [AMD_DENSE] is 10.  If negative, no
+ *          rows/columns are treated as "dense".  Rows/columns with 16 or
+ *          fewer off-diagonal entries are never considered "dense".
+ *
+ *      Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive
+ *          absorption, in which a prior element is absorbed into the current
+ *          element if is a subset of the current element, even if it is not
+ *          adjacent to the current pivot element (refer to Amestoy, Davis,
+ *          & Duff, 1996, for more details).  The default value is nonzero,
+ *          which means to perform aggressive absorption.  This nearly always
+ *          leads to a better ordering (because the approximate degrees are
+ *          more accurate) and a lower execution time.  There are cases where
+ *          it can lead to a slightly worse ordering, however.  To turn it off,
+ *          set Control [AMD_AGGRESSIVE] to 0.
+ *
+ *      Control [2..4] are not used in the current version, but may be used in
+ *          future versions.
+ *
+ * The Info array provides statistics about the ordering on output.  If it is
+ * not present, the statistics are not returned.  This is not an error
+ * condition.
+ * 
+ *      Info [AMD_STATUS]:  the return value of AMD, either AMD_OK,
+ *          AMD_OUT_OF_MEMORY, or AMD_INVALID.
+ *
+ *      Info [AMD_N]: n, the size of the input matrix
+ *
+ *      Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n]
+ *
+ *      Info [AMD_SYMMETRY]:  the symmetry of the matrix A.  It is the number
+ *          of "matched" off-diagonal entries divided by the total number of
+ *          off-diagonal entries.  An entry A(i,j) is matched if A(j,i) is also
+ *          an entry, for any pair (i,j) for which i != j.  In MATLAB notation,
+ *              S = spones (A) ;
+ *              B = tril (S, -1) + triu (S, 1) ;
+ *              symmetry = nnz (B & B') / nnz (B) ;
+ *
+ *      Info [AMD_NZDIAG]: the number of entries on the diagonal of A.
+ *
+ *      Info [AMD_NZ_A_PLUS_AT]:  the number of nonzeros in A+A', excluding the
+ *          diagonal.  If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1)
+ *          with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n
+ *          (the smallest possible value).  If A is perfectly unsymmetric
+ *          (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for
+ *          example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz
+ *          (the largest possible value).
+ *
+ *      Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were
+ *          removed from A prior to ordering.  These are placed last in the
+ *          output order P.
+ *
+ *      Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes.  In the
+ *          current version, this is 1.2 * Info  [AMD_NZ_A_PLUS_AT] + 9*n
+ *          times the size of an integer.  This is at most 2.4nz + 9n.  This
+ *          excludes the size of the input arguments Ai, Ap, and P, which have
+ *          a total size of nz + 2*n + 1 integers.
+ *
+ *      Info [AMD_NCMPA]: the number of garbage collections performed.
+ *
+ *      Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal).
+ *          This is a slight upper bound because mass elimination is combined
+ *          with the approximate degree update.  It is a rough upper bound if
+ *          there are many "dense" rows/columns.  The rest of the statistics,
+ *          below, are also slight or rough upper bounds, for the same reasons.
+ *          The post-ordering of the assembly tree might also not exactly
+ *          correspond to a true elimination tree postordering.
+ *
+ *      Info [AMD_NDIV]: the number of divide operations for a subsequent LDL'
+ *          or LU factorization of the permuted matrix A (P,P).
+ *
+ *      Info [AMD_NMULTSUBS_LDL]:  the number of multiply-subtract pairs for a
+ *          subsequent LDL' factorization of A (P,P).
+ *
+ *      Info [AMD_NMULTSUBS_LU]:  the number of multiply-subtract pairs for a
+ *          subsequent LU factorization of A (P,P), assuming that no numerical
+ *          pivoting is required.
+ *
+ *      Info [AMD_DMAX]:  the maximum number of nonzeros in any column of L,
+ *          including the diagonal.
+ *
+ *      Info [14..19] are not used in the current version, but may be used in
+ *          future versions.
+ */    
+
+/* ------------------------------------------------------------------------- */
+/* AMD preprocess */
+/* ------------------------------------------------------------------------- */
+
+/* amd_preprocess: sorts, removes duplicate entries, and transposes the
+ * nonzero pattern of a column-form matrix A, to obtain the matrix R.
+ *
+ * Alternatively, you can consider this routine as constructing a row-form
+ * matrix from a column-form matrix.  Duplicate entries are allowed in A (and
+ * removed in R). The columns of R are sorted.  Checks its input A for errors.
+ *
+ * On input, A can have unsorted columns, and can have duplicate entries.
+ * Ap [0] must still be zero, and Ap must be monotonically nondecreasing.
+ * Row indices must be in the range 0 to n-1.
+ *
+ * On output, if this routine returns AMD_OK, then the matrix R is a valid
+ * input matrix for AMD_order.  It has sorted columns, with no duplicate
+ * entries in each column.  Since AMD_order operates on the matrix A+A', it
+ * can just as easily use A or A', so the transpose has no significant effect
+ * (except for minor tie-breaking, which can lead to a minor effect in the
+ * quality of the ordering).  As an example, compare the output of amd_demo.c
+ * and amd_demo2.c.
+ *
+ * This routine transposes A to get R because that's the simplest way to
+ * sort and remove duplicate entries from a matrix.
+ *
+ * Allocates 2*n integer work arrays, and free's them when done.
+ *
+ * If you wish to call amd_order, but do not know if your matrix has unsorted
+ * columns or duplicate entries, then you can use the following code, which is
+ * fairly efficient.  amd_order will not allocate any internal matrix until
+ * it checks that the input matrix is valid, so the method below is memory-
+ * efficient as well.  This code snippet assumes that Rp and Ri are already
+ * allocated, and are the same size as Ap and Ai respectively.
+
+    result = amd_order (n, p, Ap, Ai, Control, Info) ;
+    if (result == AMD_INVALID)
+    {
+        if (amd_preprocess (n, Ap, Ai, Rp, Ri) == AMD_OK)
+        {
+            result = amd_order (n, p, Rp, Ri, Control, Info) ;
+        }
+    }
+
+ * amd_preprocess will still return AMD_INVALID if any row index in Ai is out
+ * of range or if the Ap array is invalid.  These errors are not corrected by
+ * amd_preprocess since they represent a more serious error that should be
+ * flagged with the AMD_INVALID error code.
+ */ 
+
+int amd_preprocess
+(
+    int n,
+    const int Ap [ ],
+    const int Ai [ ],
+    int Rp [ ],
+    int Ri [ ]
+) ;
+
+long amd_l_preprocess
+(
+    long n,
+    const long Ap [ ],
+    const long Ai [ ],
+    long Rp [ ],
+    long Ri [ ]
+) ;
+
+/* Input arguments (not modified):
+ *
+ *      n: the matrix A is n-by-n.
+ *      Ap: an int/long array of size n+1, containing the column pointers of A.
+ *      Ai: an int/long array of size nz, containing the row indices of A,
+ *          where nz = Ap [n].
+ *      The nonzero pattern of column j of A is in Ai [Ap [j] ... Ap [j+1]-1].
+ *      Ap [0] must be zero, and Ap [j] <= Ap [j+1] must hold for all j in the
+ *      range 0 to n-1.  Row indices in Ai must be in the range 0 to n-1.
+ *      The row indices in any one column need not be sorted, and duplicates
+ *      may exist.
+ *
+ * Output arguments (not defined on input):
+ *
+ *      Rp: an int/long array of size n+1, containing the column pointers of R.
+ *      Ri: an int/long array of size rnz, containing the row indices of R,
+ *          where rnz = Rp [n].  Note that Rp [n] will be less than Ap [n] if
+ *          duplicates appear in A.  In general, Rp [n] <= Ap [n].
+ *      The data structure for R is the same as A, except that each column of
+ *      R contains sorted row indices, and no duplicates appear in any column.
+ *
+ * amd_preprocess returns:
+ *
+ *      AMD_OK if the matrix A is valid and sufficient memory can be allocated
+ *          to perform the preprocessing.
+ *
+ *      AMD_OUT_OF_MEMORY if not enough memory can be allocated.
+ *
+ *      AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if Rp or
+ *          Ri are NULL.
+ */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Control and Info arrays */
+/* ------------------------------------------------------------------------- */
+
+/* amd_defaults:  sets the default control settings */
+void amd_defaults   (double Control [ ]) ;
+void amd_l_defaults (double Control [ ]) ;
+
+/* amd_control: prints the control settings */
+void amd_control    (double Control [ ]) ;
+void amd_l_control  (double Control [ ]) ;
+
+/* amd_info: prints the statistics */
+void amd_info       (double Info [ ]) ;
+void amd_l_info     (double Info [ ]) ;
+
+#define AMD_CONTROL 5       /* size of Control array */
+#define AMD_INFO 20         /* size of Info array */
+
+/* contents of Control */
+#define AMD_DENSE 0         /* "dense" if degree > Control [0] * sqrt (n) */
+#define AMD_AGGRESSIVE 1    /* do aggressive absorption if Control [1] != 0 */
+
+/* default Control settings */
+#define AMD_DEFAULT_DENSE 10.0      /* default "dense" degree 10*sqrt(n) */
+#define AMD_DEFAULT_AGGRESSIVE 1    /* do aggressive absorption by default */
+
+/* contents of Info */
+#define AMD_STATUS 0        /* return value of amd_order and amd_l_order */
+#define AMD_N 1             /* A is n-by-n */
+#define AMD_NZ 2            /* number of nonzeros in A */ 
+#define AMD_SYMMETRY 3      /* symmetry of pattern (1 is sym., 0 is unsym.) */
+#define AMD_NZDIAG 4        /* # of entries on diagonal */
+#define AMD_NZ_A_PLUS_AT 5  /* nz in A+A' */
+#define AMD_NDENSE 6        /* number of "dense" rows/columns in A */
+#define AMD_MEMORY 7        /* amount of memory used by AMD */
+#define AMD_NCMPA 8         /* number of garbage collections in AMD */
+#define AMD_LNZ 9           /* approx. nz in L, excluding the diagonal */
+#define AMD_NDIV 10         /* number of fl. point divides for LU and LDL' */
+#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */
+#define AMD_NMULTSUBS_LU 12  /* number of fl. point (*,-) pairs for LU */
+#define AMD_DMAX 13          /* max nz. in any column of L, incl. diagonal */
+
+/* ------------------------------------------------------------------------- */
+/* return values of AMD */
+/* ------------------------------------------------------------------------- */
+
+#define AMD_OK 0                /* success */
+#define AMD_OUT_OF_MEMORY -1    /* malloc failed */
+#define AMD_INVALID -2          /* input arguments are not valid */
+
+#endif
+\end{verbatim}
+}
+
+%------------------------------------------------------------------------------
+\newpage
+% References
+%------------------------------------------------------------------------------
+
+\bibliographystyle{plain}
+\bibliography{AMD_UserGuide}
+
+\end{document}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Doc/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,37 @@
+Jan. 21, 2004: AMD Version 1.1
+
+    * No bugs found or fixed - new features added, only
+    * amd_preprocess added, to allow for more general input of the matrix A.
+    * ME=0 added to amd*.f, unused DEXT variable removed from amdbar.f,
+	to avoid spurious compiler warnings (this was not a bug).
+    * amd_demo2.c and amd_demo2.out added, to test/demo amd_preprocess.
+    * option to allow compile-time redefinition of malloc, free, printf added
+    * amd_demo.c shortened slightly (removed printing of PAP')
+    * User Guide modified (more details added)
+    * linewidth reduced from 80 to 79 columns
+
+Oct. 7, 2003:  AMD version 1.0.1.
+
+    * MATLAB mexFunction modified, to remove call to mexCallMATLAB function.
+      This function can take a long time to call, particularly if you are
+      ordering many small matrices.
+
+May 6, 2003:  AMD Version 1.0 released.
+
+    * converted to C (compare amd.f and amdbar.f with amd_2.c)
+    * dense rows/column removed prior to ordering
+    * elimination tree post-ordering added
+    * demos, user guide written
+    * statistics added (nz in L, flop count, symmetry of A)
+    * computes the pattern of A+A' if A is unsymmetric
+    * user's input matrix no longer overwritten
+    * degree lists initialized differently
+    * IOVFLO argument removed from Fortran versions (amd.f and amdbar.f)
+    * parameters added (dense row/column detection, aggressive absorption)
+    * MATLAB mexFunction added
+
+Jan, 1996:
+
+    * amdbar.f posted at http://www.netlib.org (with a restricted License)
+    * amd.f appears as MC47B/BD in the Harwell Subroutine Library
+	(without the IOVFLO argument)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Doc/License	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,25 @@
+AMD Version 1.1 (Jan. 21, 2004),  Copyright (c) 2004 by Timothy A.
+Davis, Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
+
+AMD License:
+
+    Your use or distribution of AMD or any modified version of
+    AMD implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses AMD or any modified version of AMD code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability:
+
+    http://www.cise.ufl.edu/research/sparse/amd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Doc/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,28 @@
+#------------------------------------------------------------------------------
+# AMD Makefile for compiling on Unix systems (for GNU or original make)
+#------------------------------------------------------------------------------
+
+all: dist
+
+include ../Make/Make.include
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) *.aux *.bbl *.blg *.log *.toc
+
+#------------------------------------------------------------------------------
+# Create the User Guide and Quick Start Guide
+#------------------------------------------------------------------------------
+
+AMD_UserGuide.pdf: AMD_UserGuide.tex AMD_UserGuide.bib
+	pdflatex AMD_UserGuide
+	bibtex AMD_UserGuide
+	pdflatex AMD_UserGuide
+	pdflatex AMD_UserGuide
+
+dist:  AMD_UserGuide.pdf
+	- $(RM) *.aux *.bbl *.blg *.log *.toc
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Include/amd.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,359 @@
+/* ========================================================================= */
+/* === AMD:  approximate minimum degree ordering =========================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky
+ * factorization of P*A*P' has fewer nonzeros and takes less work than the
+ * Cholesky factorization of A.  If A is not symmetric, then it performs its
+ * ordering on the matrix A+A'.  Two sets of user-callable routines are
+ * provided, one for "int" integers and the other for "long" integers.
+ *
+ * The method is based on the approximate minimum degree algorithm, discussed
+ * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm",
+ * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp.
+ * 886-905, 1996.  This package can perform both the AMD ordering (with
+ * aggressive absorption), and the AMDBAR ordering (without aggressive
+ * absorption) discussed in the above paper.  This package differs from the
+ * Fortran codes discussed in the paper:
+ *
+ *	(1) it can ignore "dense" rows and columns, leading to faster run times
+ *	(2) it computes the ordering of A+A' if A is not symmetric
+ *	(3) it is followed by a depth-first post-ordering of the assembly tree
+ *	    (or supernodal elimination tree)
+ *
+ * For historical reasons, the Fortran versions, amd.f and amdbar.f, have
+ * been left (nearly) unchanged.  They compute the identical ordering as
+ * described in the above paper.
+ */
+
+#ifndef AMD_H
+#define AMD_H
+
+int amd_order (		    /* returns 0 if OK, negative value if error */
+    int n,		    /* A is n-by-n.  n must be >= 0. */
+    const int Ap [ ],	    /* column pointers for A, of size n+1 */
+    const int Ai [ ],	    /* row indices of A, of size nz = Ap [n] */
+    int P [ ],		    /* output permutation, of size n */
+    double Control [ ],	    /* input Control settings, of size AMD_CONTROL */
+    double Info [ ]	    /* output Info statistics, of size AMD_INFO */
+) ;
+
+long amd_l_order (	    /* see above for description of arguments */
+    long n,
+    const long Ap [ ],
+    const long Ai [ ],
+    long P [ ],
+    double Control [ ],
+    double Info [ ]
+) ;
+
+/* Input arguments (not modified):
+ *
+ *	n: the matrix A is n-by-n.
+ *	Ap: an int/long array of size n+1, containing the column pointers of A.
+ *	Ai: an int/long array of size nz, containing the row indices of A,
+ *	    where nz = Ap [n].
+ *	Control:  a double array of size AMD_CONTROL, containing control
+ *	    parameters.  Defaults are used if Control is NULL.
+ *
+ * Output arguments (not defined on input):
+ *
+ *	P: an int/long array of size n, containing the output permutation. If
+ *	    row i is the kth pivot row, then P [k] = i.  In MATLAB notation,
+ *	    the reordered matrix is A (P,P).
+ *	Info: a double array of size AMD_INFO, containing statistical
+ *	    information.  Ignored if Info is NULL.
+ *
+ * On input, the matrix A is stored in column-oriented form.  The row indices
+ * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1].
+ * The row indices must appear in ascending order in each column, and there
+ * must not be any duplicate entries.  Row indices must be in the range 0 to
+ * n-1.  Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros
+ * in A.  The array Ap is of size n+1, and the array Ai is of size nz = Ap [n].
+ * The matrix does not need to be symmetric, and the diagonal does not need to
+ * be present (if diagonal entries are present, they are ignored except for
+ * the output statistic Info [AMD_NZDIAG]).  The arrays Ai and Ap are not
+ * modified.  This form of the Ap and Ai arrays to represent the nonzero
+ * pattern of the matrix A is the same as that used internally by MATLAB.
+ * If you wish to use a more flexible input structure, please see the
+ * umfpack_*_triplet_to_col routines in the UMFPACK package, at
+ * http://www.cise.ufl.edu/research/sparse/umfpack, or use the amd_preprocess
+ * routine discussed below.
+ *
+ * Restrictions:  n >= 0.  Ap [0] = 0.  Ap [j] <= Ap [j+1] for all j in the
+ *	range 0 to n-1.  nz = Ap [n] >= 0.  For all j in the range 0 to n-1,
+ *	and for all p in the range Ap [j] to Ap [j+1]-2, Ai [p] < Ai [p+1] must
+ *	hold.  Ai [0..nz-1] must be in the range 0 to n-1.  To avoid integer
+ *	overflow, (2.4*nz + 8*n) < INT_MAX / sizeof (int) for must hold for the
+ *	"int" version. (2.4*nz + 8*n) < LONG_MAX / sizeof (long) must hold
+ *	for the "long" version.  Finally, Ai, Ap, and P must not be NULL.  If
+ *	any of these restrictions are not met, AMD returns AMD_INVALID.
+ *
+ * AMD returns:
+ *
+ *	AMD_OK if the matrix is valid and sufficient memory can be allocated to
+ *	    perform the ordering.
+ *
+ *	AMD_OUT_OF_MEMORY if not enough memory can be allocated.
+ *
+ *	AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is
+ *	    NULL.
+ *
+ * The AMD routine first forms the pattern of the matrix A+A', and then
+ * computes a fill-reducing ordering, P.  If P [k] = i, then row/column i of
+ * the original is the kth pivotal row.  In MATLAB notation, the permuted
+ * matrix is A (P,P), except that 0-based indexing is used instead of the
+ * 1-based indexing in MATLAB.
+ *
+ * The Control array is used to set various parameters for AMD.  If a NULL
+ * pointer is passed, default values are used.  The Control array is not
+ * modified.
+ *
+ *	Control [AMD_DENSE]:  controls the threshold for "dense" rows/columns.
+ *	    A dense row/column in A+A' can cause AMD to spend a lot of time in
+ *	    ordering the matrix.  If Control [AMD_DENSE] >= 0, rows/columns
+ *	    with more than Control [AMD_DENSE] * sqrt (n) entries are ignored
+ *	    during the ordering, and placed last in the output order.  The
+ *	    default value of Control [AMD_DENSE] is 10.  If negative, no
+ *	    rows/columns are treated as "dense".  Rows/columns with 16 or
+ *	    fewer off-diagonal entries are never considered "dense".
+ *
+ *	Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive
+ *	    absorption, in which a prior element is absorbed into the current
+ *	    element if is a subset of the current element, even if it is not
+ *	    adjacent to the current pivot element (refer to Amestoy, Davis,
+ *	    & Duff, 1996, for more details).  The default value is nonzero,
+ *	    which means to perform aggressive absorption.  This nearly always
+ *	    leads to a better ordering (because the approximate degrees are
+ *	    more accurate) and a lower execution time.  There are cases where
+ *	    it can lead to a slightly worse ordering, however.  To turn it off,
+ *	    set Control [AMD_AGGRESSIVE] to 0.
+ *
+ *	Control [2..4] are not used in the current version, but may be used in
+ *	    future versions.
+ *
+ * The Info array provides statistics about the ordering on output.  If it is
+ * not present, the statistics are not returned.  This is not an error
+ * condition.
+ * 
+ *	Info [AMD_STATUS]:  the return value of AMD, either AMD_OK,
+ *	    AMD_OUT_OF_MEMORY, or AMD_INVALID.
+ *
+ *	Info [AMD_N]: n, the size of the input matrix
+ *
+ *	Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n]
+ *
+ *	Info [AMD_SYMMETRY]:  the symmetry of the matrix A.  It is the number
+ *	    of "matched" off-diagonal entries divided by the total number of
+ *	    off-diagonal entries.  An entry A(i,j) is matched if A(j,i) is also
+ *	    an entry, for any pair (i,j) for which i != j.  In MATLAB notation,
+ *		S = spones (A) ;
+ *		B = tril (S, -1) + triu (S, 1) ;
+ *		symmetry = nnz (B & B') / nnz (B) ;
+ *
+ *	Info [AMD_NZDIAG]: the number of entries on the diagonal of A.
+ *
+ *	Info [AMD_NZ_A_PLUS_AT]:  the number of nonzeros in A+A', excluding the
+ *	    diagonal.  If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1)
+ *	    with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n
+ *	    (the smallest possible value).  If A is perfectly unsymmetric
+ *	    (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for
+ *	    example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz
+ *	    (the largest possible value).
+ *
+ *	Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were
+ *	    removed from A prior to ordering.  These are placed last in the
+ *	    output order P.
+ *
+ *	Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes.  In the
+ *	    current version, this is 1.2 * Info  [AMD_NZ_A_PLUS_AT] + 9*n
+ *	    times the size of an integer.  This is at most 2.4nz + 9n.  This
+ *	    excludes the size of the input arguments Ai, Ap, and P, which have
+ *	    a total size of nz + 2*n + 1 integers.
+ *
+ *	Info [AMD_NCMPA]: the number of garbage collections performed.
+ *
+ *	Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal).
+ *	    This is a slight upper bound because mass elimination is combined
+ *	    with the approximate degree update.  It is a rough upper bound if
+ *	    there are many "dense" rows/columns.  The rest of the statistics,
+ *	    below, are also slight or rough upper bounds, for the same reasons.
+ *	    The post-ordering of the assembly tree might also not exactly
+ *	    correspond to a true elimination tree postordering.
+ *
+ *	Info [AMD_NDIV]: the number of divide operations for a subsequent LDL'
+ *	    or LU factorization of the permuted matrix A (P,P).
+ *
+ *	Info [AMD_NMULTSUBS_LDL]:  the number of multiply-subtract pairs for a
+ *	    subsequent LDL' factorization of A (P,P).
+ *
+ *	Info [AMD_NMULTSUBS_LU]:  the number of multiply-subtract pairs for a
+ *	    subsequent LU factorization of A (P,P), assuming that no numerical
+ *	    pivoting is required.
+ *
+ *	Info [AMD_DMAX]:  the maximum number of nonzeros in any column of L,
+ *	    including the diagonal.
+ *
+ *	Info [14..19] are not used in the current version, but may be used in
+ *	    future versions.
+ */    
+
+/* ------------------------------------------------------------------------- */
+/* AMD preprocess */
+/* ------------------------------------------------------------------------- */
+
+/* amd_preprocess: sorts, removes duplicate entries, and transposes the
+ * nonzero pattern of a column-form matrix A, to obtain the matrix R.
+ *
+ * Alternatively, you can consider this routine as constructing a row-form
+ * matrix from a column-form matrix.  Duplicate entries are allowed in A (and
+ * removed in R). The columns of R are sorted.  Checks its input A for errors.
+ *
+ * On input, A can have unsorted columns, and can have duplicate entries.
+ * Ap [0] must still be zero, and Ap must be monotonically nondecreasing.
+ * Row indices must be in the range 0 to n-1.
+ *
+ * On output, if this routine returns AMD_OK, then the matrix R is a valid
+ * input matrix for AMD_order.  It has sorted columns, with no duplicate
+ * entries in each column.  Since AMD_order operates on the matrix A+A', it
+ * can just as easily use A or A', so the transpose has no significant effect
+ * (except for minor tie-breaking, which can lead to a minor effect in the
+ * quality of the ordering).  As an example, compare the output of amd_demo.c
+ * and amd_demo2.c.
+ *
+ * This routine transposes A to get R because that's the simplest way to
+ * sort and remove duplicate entries from a matrix.
+ *
+ * Allocates 2*n integer work arrays, and free's them when done.
+ *
+ * If you wish to call amd_order, but do not know if your matrix has unsorted
+ * columns or duplicate entries, then you can use the following code, which is
+ * fairly efficient.  amd_order will not allocate any internal matrix until
+ * it checks that the input matrix is valid, so the method below is memory-
+ * efficient as well.  This code snippet assumes that Rp and Ri are already
+ * allocated, and are the same size as Ap and Ai respectively.
+
+    result = amd_order (n, p, Ap, Ai, Control, Info) ;
+    if (result == AMD_INVALID)
+    {
+	if (amd_preprocess (n, Ap, Ai, Rp, Ri) == AMD_OK)
+	{
+	    result = amd_order (n, p, Rp, Ri, Control, Info) ;
+	}
+    }
+
+ * amd_preprocess will still return AMD_INVALID if any row index in Ai is out
+ * of range or if the Ap array is invalid.  These errors are not corrected by
+ * amd_preprocess since they represent a more serious error that should be
+ * flagged with the AMD_INVALID error code.
+ */ 
+
+int amd_preprocess
+(
+    int n,
+    const int Ap [ ],
+    const int Ai [ ],
+    int Rp [ ],
+    int Ri [ ]
+) ;
+
+long amd_l_preprocess
+(
+    long n,
+    const long Ap [ ],
+    const long Ai [ ],
+    long Rp [ ],
+    long Ri [ ]
+) ;
+
+/* Input arguments (not modified):
+ *
+ *	n: the matrix A is n-by-n.
+ *	Ap: an int/long array of size n+1, containing the column pointers of A.
+ *	Ai: an int/long array of size nz, containing the row indices of A,
+ *	    where nz = Ap [n].
+ *	The nonzero pattern of column j of A is in Ai [Ap [j] ... Ap [j+1]-1].
+ *	Ap [0] must be zero, and Ap [j] <= Ap [j+1] must hold for all j in the
+ *	range 0 to n-1.  Row indices in Ai must be in the range 0 to n-1.
+ *	The row indices in any one column need not be sorted, and duplicates
+ *	may exist.
+ *
+ * Output arguments (not defined on input):
+ *
+ *	Rp: an int/long array of size n+1, containing the column pointers of R.
+ *	Ri: an int/long array of size rnz, containing the row indices of R,
+ *	    where rnz = Rp [n].  Note that Rp [n] will be less than Ap [n] if
+ *	    duplicates appear in A.  In general, Rp [n] <= Ap [n].
+ *      The data structure for R is the same as A, except that each column of
+ *      R contains sorted row indices, and no duplicates appear in any column.
+ *
+ * amd_preprocess returns:
+ *
+ *	AMD_OK if the matrix A is valid and sufficient memory can be allocated
+ *	    to perform the preprocessing.
+ *
+ *	AMD_OUT_OF_MEMORY if not enough memory can be allocated.
+ *
+ *	AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if Rp or
+ *	    Ri are NULL.
+ */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Control and Info arrays */
+/* ------------------------------------------------------------------------- */
+
+/* amd_defaults:  sets the default control settings */
+void amd_defaults   (double Control [ ]) ;
+void amd_l_defaults (double Control [ ]) ;
+
+/* amd_control: prints the control settings */
+void amd_control    (double Control [ ]) ;
+void amd_l_control  (double Control [ ]) ;
+
+/* amd_info: prints the statistics */
+void amd_info       (double Info [ ]) ;
+void amd_l_info     (double Info [ ]) ;
+
+#define AMD_CONTROL 5	    /* size of Control array */
+#define AMD_INFO 20	    /* size of Info array */
+
+/* contents of Control */
+#define AMD_DENSE 0	    /* "dense" if degree > Control [0] * sqrt (n) */
+#define AMD_AGGRESSIVE 1    /* do aggressive absorption if Control [1] != 0 */
+
+/* default Control settings */
+#define AMD_DEFAULT_DENSE 10.0	    /* default "dense" degree 10*sqrt(n) */
+#define AMD_DEFAULT_AGGRESSIVE 1    /* do aggressive absorption by default */
+
+/* contents of Info */
+#define AMD_STATUS 0	    /* return value of amd_order and amd_l_order */
+#define AMD_N 1		    /* A is n-by-n */
+#define AMD_NZ 2	    /* number of nonzeros in A */ 
+#define AMD_SYMMETRY 3	    /* symmetry of pattern (1 is sym., 0 is unsym.) */
+#define AMD_NZDIAG 4	    /* # of entries on diagonal */
+#define AMD_NZ_A_PLUS_AT 5  /* nz in A+A' */
+#define AMD_NDENSE 6	    /* number of "dense" rows/columns in A */
+#define AMD_MEMORY 7	    /* amount of memory used by AMD */
+#define AMD_NCMPA 8	    /* number of garbage collections in AMD */
+#define AMD_LNZ 9	    /* approx. nz in L, excluding the diagonal */
+#define AMD_NDIV 10	    /* number of fl. point divides for LU and LDL' */
+#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */
+#define AMD_NMULTSUBS_LU 12  /* number of fl. point (*,-) pairs for LU */
+#define AMD_DMAX 13	     /* max nz. in any column of L, incl. diagonal */
+
+/* ------------------------------------------------------------------------- */
+/* return values of AMD */
+/* ------------------------------------------------------------------------- */
+
+#define AMD_OK 0		/* success */
+#define AMD_OUT_OF_MEMORY -1	/* malloc failed */
+#define AMD_INVALID -2		/* input arguments are not valid */
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Lib/libamd.def	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+LIBRARY libamd.dll
+EXPORTS
+amd_order
+amd_defaults
+amd_control
+amd_info
+amd_preprocess
+amd_l_order
+amd_l_defaults
+amd_l_control
+amd_l_info
+amd_l_preprocess
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/Contents.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,13 @@
+%Contents of the AMD sparse matrix ordering package:
+%
+% amd		    p = amd (A), the approximate minimum degree ordering of A
+% amd_demo	    a demo of amd, using the can_24 matrix
+% amd_make	    to comple amd for use in MATLAB
+% can_24.mat	    a sample sparse matrix from the Harwell/Boeing collection
+%
+% See also:  amd, colamd, symamd, colmmd, symmmd, umfpack
+%
+% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+% Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
+
+help Contents
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,30 @@
+#------------------------------------------------------------------------------
+# GNUmakefile for the AMD MATLAB mexFunction
+#------------------------------------------------------------------------------
+
+all: amd
+
+include ../Make/Make.include
+
+MX = $(MEX) -I../Include
+
+AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid
+
+INC = ../Include/amd.h ../Source/amd_internal.h
+
+MEXAMD = $(addsuffix .o, $(subst amd_,amd_m_,$(AMD)))
+
+amd_m_%.o: ../Source/amd_%.c $(INC)
+	$(MX) -DDINT -c $<
+	- $(MV) amd_$*.o $@
+
+amd: amd_mex.c $(MEXAMD) $(INC)
+	$(MX) -output amd amd_mex.c $(MEXAMD)
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) amd.mex* amd.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,50 @@
+#------------------------------------------------------------------------------
+# compile the AMD mexFunction for MATLAB (original make only)
+#------------------------------------------------------------------------------
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: amd
+
+include ../Make/Make.include
+
+MX = $(MEX) -I../Include
+
+amd:
+	$(MX) -DDINT -c ../Source/amd_aat.c
+	$(MV) amd_aat.o amd_m_aat.o
+	$(MX) -DDINT -c ../Source/amd_1.c
+	$(MV) amd_1.o amd_m_1.o
+	$(MX) -DDINT -c ../Source/amd_2.c
+	$(MV) amd_2.o amd_m_2.o
+	$(MX) -DDINT -c ../Source/amd_dump.c
+	$(MV) amd_dump.o amd_m_dump.o
+	$(MX) -DDINT -c ../Source/amd_postorder.c
+	$(MV) amd_postorder.o amd_m_postorder.o
+	$(MX) -DDINT -c ../Source/amd_post_tree.c
+	$(MV) amd_post_tree.o amd_m_post_tree.o
+	$(MX) -DDINT -c ../Source/amd_defaults.c
+	$(MV) amd_defaults.o amd_m_defaults.o
+	$(MX) -DDINT -c ../Source/amd_order.c
+	$(MV) amd_order.o amd_m_order.o
+	$(MX) -DDINT -c ../Source/amd_control.c
+	$(MV) amd_control.o amd_m_control.o
+	$(MX) -DDINT -c ../Source/amd_info.c
+	$(MV) amd_info.o amd_m_info.o
+	$(MX) -DDINT -c ../Source/amd_valid.c
+	$(MV) amd_valid.o amd_m_valid.o
+	$(MX) -output amd amd_mex.c amd_m_aat.o \
+	    amd_m_1.o amd_m_2.o amd_m_dump.o amd_m_postorder.o \
+	    amd_m_post_tree.o amd_m_defaults.o amd_m_order.o amd_m_control.o \
+	    amd_m_info.o amd_m_valid.o
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) amd.mex* amd.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/amd.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,74 @@
+function [p, Info] = amd (A, Control)
+%AMD Approximate minimum degree permutation.
+%    P = AMD (S) returns the approximate minimum degree permutation vector for
+%    the sparse matrix C = S+S'.  The Cholesky factorization of C (P,P), or
+%    S (P,P), tends to be sparser than that of C or S.  AMD tends to be faster
+%    than SYMMMD and SYMAMD, and tends to return better orderings than SYMMMD.
+%    S must be square. If S is full, amd (S) is equivalent to amd (sparse (S)).
+%
+%    Usage:  P = amd (S) ;                   % finds the ordering
+%            [P, Info] = amd (S, Control) ;  % optional parameters & statistics
+%            Control = amd ;                 % returns default parameters
+%            amd ;                           % prints default parameters.
+%
+%       Control (1); If S is n-by-n, then rows/columns with more than
+%           max (16, (Control (1))* sqrt(n)) entries in S+S' are considered
+%           "dense", and ignored during ordering.  They are placed last in the
+%           output permutation.  The default is 10.0 if Control is not present.
+%       Control (2): If nonzero, then aggressive absorption is performed.
+%           This is the default if Control is not present.
+%       Control (3): If nonzero, print statistics about the ordering.
+%
+%       Info (1): status (0: ok, -1: out of memory, -2: matrix invalid)
+%       Info (2): n = size (A,1)
+%       Info (3): nnz (A)
+%       Info (4): the symmetry of the matrix S (0.0 means purely unsymmetric,
+%           1.0 means purely symmetric).  Computed as:
+%           B = tril (S, -1) + triu (S, 1) ; symmetry = nnz (B & B') / nnz (B);
+%       Info (5): nnz (diag (S))
+%       Info (6): nnz in S+S', excluding the diagonal (= nnz (B+B'))
+%       Info (7): number "dense" rows/columns in S+S'
+%       Info (8): the amount of memory used by AMD, in bytes
+%       Info (9): the number of memory compactions performed by AMD
+%
+%    The following statistics are slight upper bounds because of the
+%    approximate degree in AMD.  The bounds are looser if "dense" rows/columns
+%    are ignored during ordering (Info (7) > 0).  The statistics are for a
+%    subsequent factorization of the matrix C (P,P).  The LU factorization
+%    statistics assume no pivoting.
+%
+%       Info (10): the number of nonzeros in L, excluding the diagonal
+%       Info (11): the number of divide operations for LL', LDL', or LU
+%       Info (12): the number of multiply-subtract pairs for LL' or LDL'
+%       Info (13): the number of multiply-subtract pairs for LU
+%       Info (14): the max # of nonzeros in any column of L (incl. diagonal)
+%       Info (15:20): unused, reserved for future use
+%
+%    An assembly tree post-ordering is performed, which is typically the same
+%    as an elimination tree post-ordering.  It is not always identical because
+%    of the approximate degree update used, and because "dense" rows/columns
+%    do not take part in the post-order.  It well-suited for a subsequent
+%    "chol", however.  If you require a precise elimination tree post-ordering,
+%    then do:
+%
+%       P = amd (S) ;
+%       C = spones (S) + spones (S') ;  % skip this if S already symmetric
+%       [ignore, Q] = sparsfun ('symetree', C (P,P)) ;
+%       P = P (Q) ;
+%
+% --------------------------------------------------------------------------
+% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+% Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+% email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+% web: http://www.cise.ufl.edu/research/sparse/amd
+% --------------------------------------------------------------------------
+%
+%    Acknowledgements: This work was supported by the National Science
+%       Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
+%
+%    See also COLMMD, COLAMD, COLPERM, SYMAMD, SYMMMD, SYMRCM.
+
+more on
+help amd
+more off
+error ('amd mexFunction not found!  Type "amd_make" in MATLAB to compile amd');
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/amd_demo.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,96 @@
+function amd_demo
+% AMD DEMO
+%
+% A demo of AMD for MATLAB.
+%
+% --------------------------------------------------------------------------
+% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+% Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+% email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+% web: http://www.cise.ufl.edu/research/sparse/amd
+% --------------------------------------------------------------------------
+%
+% See also: amd, amd_make
+
+% This orders the same matrix as the ANSI C demo, amd_demo.c.  It includes an
+% additional analysis of the matrix via MATLAB's symbfact routine.
+
+% First, print the help information for AMD
+help amd
+
+% Get the Harwell/Boeing can_24 matrix.  This is an example matrix from the
+% MATLAB-accessible UF sparse matrix collection, and can be loaded into
+% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining
+% the UFget function and its supporting routines at
+% http://www.cise.ufl.edu/sparse/mat .
+
+load can_24
+A = Problem.A ;
+n = size (A,1) ;
+
+figure (1)
+clf
+hold off
+subplot (2,2,1) ;
+spy (A)
+% remove the "_" from the name before printing it in the plot title
+title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ;
+fprintf ('Matrix name:  %s\n', Problem.name) ;
+fprintf ('Matrix title: %s\n', Problem.title) ;
+
+% print the details during AMD ordering and SYMBFACT
+spparms ('spumoni', 1) ;
+
+% order the matrix.  Note that the Info argument is optional.
+fprintf ('\nIf the next step fails, then you have\n') ;
+fprintf ('not yet compiled the AMD mexFunction.\n') ;
+[p, Info] = amd (A) ;
+
+% order again, but this time print some statistics
+[p, Info] = amd (A, [10 1 1]) ;
+
+fprintf ('Permutation vector:\n') ;
+fprintf (' %2d', p) ;
+fprintf ('\n\n') ;
+
+subplot (2,2,2) ;
+spy (A (p,p))
+title ('Permuted matrix') ;
+
+% The amd_demo.c program stops here.
+
+fprintf ('Analyze A(p,p) with MATLAB''s symbfact routine:\n') ;
+[cn, height, parent, post, R] = symbfact (A (p,p)) ;
+
+subplot (2,2,3) ;
+spy (R') ; 
+title ('Cholesky factor, L') ;
+
+subplot (2,2,4) ;
+treeplot (parent) ;
+title ('elimination tree') ;
+
+% results from symbfact
+lnz = sum (cn) ;                % number of nonzeros in L, incl. diagonal
+cn = cn - 1 ;                   % get the count of off-diagonal entries
+fl = n + sum (cn.^2 + 2*cn) ;   % flop count for chol (A (p,p)
+fprintf ('number of nonzeros in L (including diagonal):      %d\n', lnz) ;
+fprintf ('floating point operation count for chol (A (p,p)): %d\n', fl) ;
+
+% approximations from amd:
+lnz2 = n + Info (10) ;
+fl2 = n + Info (11) + 2 * Info (12) ;
+fprintf ('\nResults from AMD''s approximate analysis:\n') ;
+fprintf ('number of nonzeros in L (including diagonal):      %d\n', lnz2) ;
+fprintf ('floating point operation count for chol (A (p,p)): %d\n\n', fl2) ;
+
+if (lnz2 ~= lnz | fl ~= fl2)
+    fprintf ('Note that the nonzero and flop counts from AMD are slight\n') ;
+    fprintf ('upper bounds.  This is due to the approximate minimum degree\n');
+    fprintf ('method used, in conjunction with "mass elimination".\n') ;
+    fprintf ('See the discussion about mass elimination in amd.h and\n') ;
+    fprintf ('amd_2.c for more details.\n') ;
+end
+
+% turn off diagnostic output in MATLAB's sparse matrix routines
+spparms ('spumoni', 0) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/amd_demo.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,136 @@
+>> amd_demo
+
+ AMD Approximate minimum degree permutation.
+     P = AMD (S) returns the approximate minimum degree permutation vector for
+     the sparse matrix C = S+S'.  The Cholesky factorization of C (P,P), or
+     S (P,P), tends to be sparser than that of C or S.  AMD tends to be faster
+     than SYMMMD and SYMAMD, and tends to return better orderings than SYMMMD.
+     S must be square. If S is full, amd (S) is equivalent to amd (sparse (S)).
+ 
+     Usage:  P = amd (S) ;                   % finds the ordering
+             [P, Info] = amd (S, Control) ;  % optional parameters & statistics
+             Control = amd ;                 % returns default parameters
+             amd ;                           % prints default parameters.
+ 
+        Control (1); If S is n-by-n, then rows/columns with more than
+            max (16, (Control (1))* sqrt(n)) entries in S+S' are considered
+            "dense", and ignored during ordering.  They are placed last in the
+            output permutation.  The default is 10.0 if Control is not present.
+        Control (2): If nonzero, then aggressive absorption is performed.
+            This is the default if Control is not present.
+        Control (3): If nonzero, print statistics about the ordering.
+ 
+        Info (1): status (0: ok, -1: out of memory, -2: matrix invalid)
+        Info (2): n = size (A,1)
+        Info (3): nnz (A)
+        Info (4): the symmetry of the matrix S (0.0 means purely unsymmetric,
+            1.0 means purely symmetric).  Computed as:
+            B = tril (S, -1) + triu (S, 1) ; symmetry = nnz (B & B') / nnz (B);
+        Info (5): nnz (diag (S))
+        Info (6): nnz in S+S', excluding the diagonal (= nnz (B+B'))
+        Info (7): number "dense" rows/columns in S+S'
+        Info (8): the amount of memory used by AMD, in bytes
+        Info (9): the number of memory compactions performed by AMD
+ 
+     The following statistics are slight upper bounds because of the
+     approximate degree in AMD.  The bounds are looser if "dense" rows/columns
+     are ignored during ordering (Info (7) > 0).  The statistics are for a
+     subsequent factorization of the matrix C (P,P).  The LU factorization
+     statistics assume no pivoting.
+ 
+        Info (10): the number of nonzeros in L, excluding the diagonal
+        Info (11): the number of divide operations for LL', LDL', or LU
+        Info (12): the number of multiply-subtract pairs for LL' or LDL'
+        Info (13): the number of multiply-subtract pairs for LU
+        Info (14): the max # of nonzeros in any column of L (incl. diagonal)
+        Info (15:20): unused, reserved for future use
+ 
+     An assembly tree post-ordering is performed, which is typically the same
+     as an elimination tree post-ordering.  It is not always identical because
+     of the approximate degree update used, and because "dense" rows/columns
+     do not take part in the post-order.  It well-suited for a subsequent
+     "chol", however.  If you require a precise elimination tree post-ordering,
+     then do:
+ 
+        P = amd (S) ;
+        C = spones (S) + spones (S') ;  % skip this if S already symmetric
+        [ignore, Q] = sparsfun ('symetree', C (P,P)) ;
+        P = P (Q) ;
+ 
+  --------------------------------------------------------------------------
+  AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+  Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+  email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+  web: http://www.cise.ufl.edu/research/sparse/amd
+  --------------------------------------------------------------------------
+ 
+     Acknowledgements: This work was supported by the National Science
+        Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
+ 
+     See also COLMMD, COLAMD, COLPERM, SYMAMD, SYMMMD, SYMRCM.
+
+Matrix name:  HB/can_24
+Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981.                  
+
+If the next step fails, then you have
+not yet compiled the AMD mexFunction.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+    input matrix A is 24-by-24
+    input matrix A has 160 nonzero entries
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  24
+    nz, number of nonzeros in A:                        160
+    symmetry of A:                                      1.0000
+    number of nonzeros on diagonal:                     24
+    nonzeros in pattern of A+A' (excl. diagonal):       136
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              1516
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 97
+    nonzeros in L (including diagonal):                 121
+    # divide operations for LDL' or LU:                 97
+    # multiply-subtract operations for LDL':            275
+    # multiply-subtract operations for LU:              453
+    max nz. in any column of L (incl. diagonal):        8
+
+    chol flop count for real A, sqrt counted as 1 flop: 671
+    LDL' flop count for real A:                         647
+    LDL' flop count for complex A:                      3073
+    LU flop count for real A (with no pivoting):        1003
+    LU flop count for complex A (with no pivoting):     4497
+
+Permutation vector:
+ 23 21 11 24 13  6 17  9 15  5 16  8  2 10 14 18  1  3  4  7 12 19 22 20
+
+Analyze A(p,p) with MATLAB's symbfact routine:
+predicted nonzeros:    120
+predicted flops:       656
+predicted height:      16
+predicted front size:  7
+number of nonzeros in L (including diagonal):      120
+floating point operation count for chol (A (p,p)): 656
+
+Results from AMD's approximate analysis:
+number of nonzeros in L (including diagonal):      121
+floating point operation count for chol (A (p,p)): 671
+
+Note that the nonzero and flop counts from AMD are slight
+upper bounds.  This is due to the approximate minimum degree
+method used, in conjunction with "mass elimination".
+See the discussion about mass elimination in amd.h and
+amd_2.c for more details.
+>> diary off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/amd_make.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,32 @@
+function amd_make
+% AMD_MAKE:  compiles the AMD mexFunction for MATLAB
+%
+% --------------------------------------------------------------------------
+% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+% Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+% email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+% web: http://www.cise.ufl.edu/research/sparse/amd
+% --------------------------------------------------------------------------
+%
+% See also: amd, amd_demo
+
+help amd_make
+fprintf ('Compiling the AMD mexFunction:\n') ;
+cmd = sprintf ('mex -inline -O -output amd -I..%sInclude amd_mex.c', filesep) ;
+files = {'amd_order', 'amd_dump', 'amd_postorder', 'amd_post_tree', ...
+    'amd_aat', 'amd_2', 'amd_1', 'amd_defaults', 'amd_control', 'amd_info', ...
+    'amd_valid' } ;
+for i = 1 : length (files)
+    cmd = sprintf ('%s ..%sSource%s%s.c', cmd, filesep, filesep, files {i}) ;
+end
+fprintf ('%s\n', cmd) ;
+try
+    eval (cmd) ;
+catch
+    fprintf ('Compilation not successful.\n') ;
+end
+
+input ('\nHit enter to run the AMD demo\n') ;
+more on
+amd_demo
+more off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/MATLAB/amd_mex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,189 @@
+/* ========================================================================= */
+/* === AMD mexFunction ===================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/*
+ * Usage:
+ *	p = amd (A)
+ *	p = amd (A, Control)
+ *	[p, Info] = amd (A)
+ *	[p, Info] = amd (A, Control)
+ *	Control = amd ;	    % return the default Control settings for AMD
+ *	amd ;		    % print the default Control settings for AMD
+ *
+ * Given a square matrix A, compute a permutation P suitable for a Cholesky
+ * factorization of the matrix B (P,P), where B = spones (A) + spones (A').
+ * The method used is the approximate minimum degree ordering method.  See
+ * amd.m and amd.h for more information.
+ */
+
+#include "amd.h"
+#include "mex.h"
+#include "matrix.h"
+
+void mexFunction
+(
+    int	nlhs,
+    mxArray *plhs[],
+    int	nrhs,
+    const mxArray *prhs[]
+)
+{
+    int i, m, n, *Ap, *Ai, *P, nc, result, spumoni, full ;
+    double *Pout, *InfoOut, Control [AMD_CONTROL], Info [AMD_INFO], *ControlIn;
+    mxArray *A, *string, *parameter ;
+
+    /* --------------------------------------------------------------------- */
+    /* get control parameters */
+    /* --------------------------------------------------------------------- */
+
+    spumoni = 0 ;
+    if (nrhs == 0)
+    {
+	/* get the default control parameters, and return */
+	plhs [0] = mxCreateDoubleMatrix (AMD_CONTROL, 1, mxREAL) ;
+	amd_defaults (mxGetPr (plhs [0])) ;
+	if (nlhs == 0)
+	{
+	    amd_control (mxGetPr (plhs [0])) ;
+	}
+	return ;
+    }
+
+    amd_defaults (Control) ;
+    if (nrhs > 1)
+    {
+	ControlIn = mxGetPr (prhs [1]) ;
+	nc = mxGetM (prhs [1]) * mxGetN (prhs [1]) ;
+	Control [AMD_DENSE]
+	    = (nc > 0) ? ControlIn [AMD_DENSE] : AMD_DEFAULT_DENSE ;
+	Control [AMD_AGGRESSIVE]
+	    = (nc > 1) ? ControlIn [AMD_AGGRESSIVE] : AMD_DEFAULT_AGGRESSIVE ;
+	spumoni = (nc > 2) ? (ControlIn [2] != 0) : 0 ;
+    }
+
+    if (spumoni > 0)
+    {
+	amd_control (Control) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* get inputs */
+    /* --------------------------------------------------------------------- */
+
+    if (nlhs > 2 || nrhs > 2)
+    {
+	mexErrMsgTxt ("Usage: p = amd (A)\nor [p, Info] = amd (A, Control)") ;
+    }
+
+    A = (mxArray *) prhs [0] ;
+    n = mxGetN (A) ;
+    m = mxGetM (A) ;
+    if (spumoni > 0)
+    {
+	mexPrintf ("    input matrix A is %d-by-%d\n", m, n) ;
+    }
+    if (mxGetNumberOfDimensions (A) != 2)
+    {
+	mexErrMsgTxt ("amd: A must be 2-dimensional") ;
+    }
+    if (m != n)
+    {
+    	mexErrMsgTxt ("amd: A must be square") ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* allocate workspace for output permutation */
+    /* --------------------------------------------------------------------- */
+
+    P = mxMalloc ((n+1) * sizeof (int)) ;
+
+    /* --------------------------------------------------------------------- */
+    /* if A is full, convert to a sparse matrix */
+    /* --------------------------------------------------------------------- */
+
+    full = !mxIsSparse (A) ;
+    if (full)
+    {
+	if (spumoni > 0)
+	{
+	    mexPrintf (
+	    "    input matrix A is full (sparse copy of A will be created)\n");
+	}
+	mexCallMATLAB (1, &A, 1, (mxArray **) prhs, "sparse") ;
+    }
+    Ap = mxGetJc (A) ;
+    Ai = mxGetIr (A) ;
+    if (spumoni > 0)
+    {
+	mexPrintf ("    input matrix A has %d nonzero entries\n", Ap [n]) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* order the matrix */
+    /* --------------------------------------------------------------------- */
+
+    result = amd_order (n, Ap, Ai, P, Control, Info) ;
+
+    /* --------------------------------------------------------------------- */
+    /* if A is full, free the sparse copy of A */
+    /* --------------------------------------------------------------------- */
+
+    if (full)
+    {
+	mxDestroyArray (A) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* print results (including return value) */
+    /* --------------------------------------------------------------------- */
+
+    if (spumoni > 0)
+    {
+	amd_info (Info) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* check error conditions */
+    /* --------------------------------------------------------------------- */
+
+    if (result == AMD_OUT_OF_MEMORY)
+    {
+	mexErrMsgTxt ("amd: out of memory") ;
+    }
+    else if (result == AMD_INVALID)
+    {
+	mexErrMsgTxt ("amd: input matrix A is corrupted") ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* copy the outputs to MATLAB */
+    /* --------------------------------------------------------------------- */
+
+    /* output permutation, P */
+    plhs [0] = mxCreateDoubleMatrix (1, n, mxREAL) ;
+    Pout = mxGetPr (plhs [0])  ;
+    for (i = 0 ; i < n ; i++)
+    {
+	Pout [i] = P [i] + 1 ;	    /* change to 1-based indexing for MATLAB */
+    }
+    mxFree (P) ;
+
+    /* Info */
+    if (nlhs > 1)
+    {
+	plhs [1] = mxCreateDoubleMatrix (AMD_INFO, 1, mxREAL) ;
+	InfoOut = mxGetPr (plhs [1]) ;
+	for (i = 0 ; i < AMD_INFO ; i++)
+	{
+	    InfoOut [i] = Info [i] ;
+	}
+    }
+}
Binary file liboctave/UMFPACK/AMD/MATLAB/can_24.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.alpha	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+# Compaq Alpha configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# 64-bit mode only
+CFLAGS = -O2 -std1 -DLP64
+
+#------------------------------------------------------------------------------
+# BLAS options (UMFPACK only):
+#------------------------------------------------------------------------------
+
+# 1: with the vendor-supplied BLAS
+CONFIG =
+LIB = -ldxml -lm
+
+# 2: with the vendor-supplied BLAS, including BLAS with 64-bit long integers
+# CONFIG = -DLONGBLAS
+# LIB = -ldxml -lm
+
+# 2: with no BLAS (this will be slow)
+# CONFIG = -DNBLAS
+# LIB = -lm
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.include	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,72 @@
+#------------------------------------------------------------------------------
+# Include file for GNU make or original make (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# You can edit these definitions, or select and and edit a specfic
+# Make.(architecture) file, below.  This same file is used for configuring
+# both AMD and UMFPACK.  AMD is a stand-alone package.  UMFPACK requires AMD,
+# and for simplicity of configuring both packages, UMFPACK and AMD share this
+# configuration file (and all files in the AMD/Make directory).  To configure
+# AMD, or both AMD and UMFPACK, you only need to edit this one file (and
+# optionaly, one of the ../Make/Make.<arch> files below).
+
+# NOTE: -DNBLAS and other BLAS configurations are ignored by AMD, since AMD
+# does not use the BLAS. This flag is here because this file, and the
+# ../Make/Make.* files, are shared by UMFPACK (which requires AMD).  If you
+# use AMD but not UMFPACK, then you can ignore any BLAS-related configuration
+# settings.
+
+CFLAGS = -O
+RANLIB = ranlib
+LIB = -lm
+RM = rm -f
+MV = mv -f
+F77 = f77
+F77FLAGS = -O
+F77LIB =
+AR = ar
+
+#------------------------------------------------------------------------------
+# for the AMD and UMFPACK mexFunctions (-DNBLAS and -DNUTIL for UMFPACK only)
+#------------------------------------------------------------------------------
+
+# MATLAB 6.0 or later (default)
+MEX = mex -inline -O
+
+# MATLAB 6.0 or later (no divide-by-zero)
+# MEX = mex -inline -O -DNO_DIVIDE_BY_ZERO
+
+# MATLAB 5 (no BLAS, do not try to use utMalloc, utFree, and utRealloc)
+# MEX = mex -inline -O -DNBLAS -DNUTIL
+
+#------------------------------------------------------------------------------
+# for UMFPACK only (BLAS configuration):
+#------------------------------------------------------------------------------
+
+# The default is to NOT use the BLAS.  UMFPACK will be slow, but this is more
+# portable.  Try this option first, then use your architecture-specific
+# configuration, below, to add the BLAS library.  AMD ignores the -DNBLAS flag.
+
+CONFIG = -DNBLAS
+
+#------------------------------------------------------------------------------
+# Archicture-specific configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# Select your architecture by un-commenting the appropriate line. The include
+# file can redefine any of the above definitions, or other definitions.  Use
+# CC = ... to redefine the name of your C compiler, for example.  Without
+# any specific changes, this Makefile should work on nearly all systems.
+
+# include ../Make/Make.linux
+# include ../Make/Make.sgi
+# include ../Make/Make.solaris
+# include ../Make/Make.alpha
+# include ../Make/Make.rs6000
+
+#------------------------------------------------------------------------------
+# remove object files and profile output
+#------------------------------------------------------------------------------
+
+clean:
+	- $(RM) *.o *.obj *.ln *.bb *.bbg *.da *.c.tcov *.c.gcov gmon.out *.bak
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.linux	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,52 @@
+#------------------------------------------------------------------------------
+# Linux configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# You may also need to add -lunwind -lcprts to the LIB= string,
+# if you use the Intel compiler and the Fortran BLAS.
+
+# Using GNU gcc and f77 compilers:
+  CC = gcc
+  CFLAGS = -O3 -fPIC
+
+# Using Intel's icc and ifc compilers:
+# F77 = ifc
+# CC = icc
+# CFLAGS = -ansi -O3 -ip -tpp7 -xW -vec_report0
+# CFLAGS = -pg -g
+
+# Using gcc compiler with picky tests
+# CC = gcc
+# CFLAGS = -ansi -pedantic -W -Wall -Wno-parentheses -Wshadow -Wcast-align -Winline -Wstrict-prototypes -Wno-unknown-pragmas -O3 -fPIC
+
+# for gcc and gcov:
+# CC = gcc
+# CFLAGS = -pg -ftest-coverage -fprofile-arcs
+
+# Running splint
+# CC = - splint
+# CFLAGS = -weak -fixedformalarray -badflag -fileextensions +relaxtypes +posixlib -unrecog
+
+#------------------------------------------------------------------------------
+# BLAS options (for UMFPACK only)
+#------------------------------------------------------------------------------
+
+# 1: with no BLAS (this will be slow)
+# CONFIG = -DNBLAS
+# LIB = -lm
+
+# 2: with the ATLAS C-BLAS (http://www.netlib.org/atlas).
+# CONFIG = -DCBLAS -I../ATLAS/include
+# LIB = -lcblas -latlas -lm
+
+# 3: with Fortran interface to the ATLAS BLAS
+# CONFIG =
+# LIB = -lf77blas -latlas -lfrtbegin -lg2c -lm
+
+# 4: with Fortran interface to the BLAS, and Goto's BLAS
+  CONFIG =
+  LIB = -lgoto -lxerbla -lfrtbegin -lg2c -lm
+
+# 5: with Fortran interface to the BLAS, and Goto's BLAS, and no divide-by-zero
+# CONFIG = -DNO_DIVIDE_BY_ZERO
+# LIB = -lgoto -lxerbla -lfrtbegin -lg2c -lm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.rs6000	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,24 @@
+#------------------------------------------------------------------------------
+# IBM RS 6000 configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# 32-bit mode:
+CFLAGS   = -O4 -qipa -qmaxmem=16384 -qproto
+F77FLAGS = -O4 -qipa -qmaxmem=16384
+
+# 64-bit mode:
+# CFLAGS   = -O4 -qipa -qmaxmem=16384 -q64 -DLP64 -qproto
+# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64 -DLP64
+# AR = ar -X64
+
+#------------------------------------------------------------------------------
+# BLAS options (for UMFPACK only):
+#------------------------------------------------------------------------------
+
+# 1: with the vendor-supplied BLAS.  This is the default.
+CONFIG =
+LIB = -lessl -lm
+
+# 2: with no BLAS (this will be slow)
+# CONFIG = -DNBLAS
+# LIB = -lm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.sgi	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,38 @@
+#------------------------------------------------------------------------------
+# SGI IRIX configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# Default: 32-bit mode
+# CFLAGS =
+
+# 64-bit mode (32 bit int's and 64-bit long's):
+# CFLAGS = -DLP64 -64
+# F77FLAGS = -64
+
+# SGI doesn't have ranlib
+RANLIB = echo
+
+#------------------------------------------------------------------------------
+# BLAS options (for UMFPACK only):
+#------------------------------------------------------------------------------
+
+# 1: Default: with 32-bit int's and long's, and the 32-bit SCSL BLAS
+CONFIG =
+LIB = -lscs -lm
+
+# 2,3: with no BLAS (32 bit or 64 bit mode)
+# CONFIG = -DNBLAS
+# LIB = -lm
+
+# 4: 64 bit mode, with 64-bit SCSL BLAS.
+# CONFIG =
+# LIB = -lscs_i8 -lm
+
+# 5: 32 bit mode, with the Fortran interface to the vendor-supplied BLAS
+# CONFIG = -DNSCSL
+# LIB = -lblas -lm
+
+# 6: 32 bit mode, with the C-BLAS interface to the vendor-supplied BLAS
+# CONFIG = -DCBLAS
+# LIB = -lblas -lm
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Make/Make.solaris	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,34 @@
+#------------------------------------------------------------------------------
+# Sun Solaris configuration (for both AMD and UMFPACK)
+#------------------------------------------------------------------------------
+
+# 32-bit mode:
+CC = cc
+CFLAGS = -Xc -xO5 -KPIC -dalign -native
+F77FLAGS =   -xO5 -KPIC -dalign -native
+
+# 64-bit mode:
+# CC = cc
+# CFLAGS = -Xc -xO5 -KPIC -dalign -native -DLP64 -xtarget=ultra -xarch=v9
+# F77FLAGS =   -xO5 -KPIC -dalign -native -DLP64 -xtarget=ultra -xarch=v9
+
+#------------------------------------------------------------------------------
+# BLAS options (for UMFPACK only):
+#------------------------------------------------------------------------------
+
+# 1: Default: with the Sun Performance BLAS in 32-bit mode
+CONFIG =
+LIB = -lsunperf -lfai -lfsu -lfui -lsunperf -lm -lF77 -lm -lM77 -lsunmath
+
+# 2,3: with no BLAS (32-bit or 64-bit mode)
+# CONFIG = -DNBLAS
+# LIB = -lm
+
+# 4: the Sun Performance BLAS in 64-bit mode
+# CONFIG =
+# LIB = -lsunperf -lfai -lfsu -lfui -lsunperf -lm
+
+# 5: with the C-BLAS (http://www.netlib.org/atlas) in the ../ATLAS directory.
+# CONFIG = -DCBLAS -I../ATLAS/include
+# LIB = -L../ATLAS/lib/SunOS_SunUS1/ -lcblas -latlas -lm
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,60 @@
+#------------------------------------------------------------------------------
+# AMD Makefile (for GNU Make or original make)
+#------------------------------------------------------------------------------
+
+# Compile everything, including the C-callable routine and the mexFunctions.
+# Do not compile the FORTRAN versions.
+all:
+	( cd Source ; make )
+	( cd Demo   ; make )
+	( cd MATLAB ; make )
+	- cat Doc/License
+
+# compile just the C-callable libraries and demo programs (not mexFunctions)
+lib:
+	( cd Source ; make )
+	( cd Demo   ; make )
+	- cat Doc/License
+
+# compile the FORTRAN libraries and demo programs (not compiled by "make all")
+fortran:
+	( cd Source ; make fortran )
+	( cd Demo   ; make fortran )
+	- cat Doc/License
+
+# compile a FORTRAN demo program that calls the C version of AMD
+# (not compiled by "make all")
+cross:
+	( cd Demo   ; make cross )
+	- cat Doc/License
+
+# compile a Octave version
+# (not compiled by "make all")
+octave:
+	( cd OCTAVE ; make )
+	- cat Doc/License
+
+# remove object files, but keep the compiled programs and library archives
+clean:
+	( cd Source ; make clean )
+	( cd Demo   ; make clean )
+	( cd MATLAB ; make clean )
+	( cd OCTAVE ; make clean )
+	( cd Doc    ; make clean )
+
+# clean, and then remove compiled programs and library archives
+purge:
+	( cd Source ; make purge )
+	( cd Demo   ; make purge )
+	( cd MATLAB ; make purge )
+	( cd OCTAVE ; make purge )
+	( cd Doc    ; make purge )
+
+# create PDF documents for the original distribution
+doc:
+	( cd Doc    ; make )
+
+# get ready for distribution
+dist: purge
+	( cd Demo   ; make dist )
+	( cd Doc    ; make )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/OCTAVE/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,33 @@
+#------------------------------------------------------------------------------
+# GNUmakefile for the AMD MATLAB mexFunction
+#------------------------------------------------------------------------------
+
+all: amd
+
+include ../Make/Make.include
+
+MKOCT = mkoctfile -I../Include
+
+OCT_SPARSE_INC = -I../../../
+
+AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid
+
+INC = ../Include/amd.h ../Source/amd_internal.h 
+
+OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD)))
+
+amd_o_%.o: ../Source/amd_%.c $(INC)
+	$(MKOCT) -DDINT -c $< -o $@
+	- $(MV) ../Source/amd_$*.o
+
+# Note temporary addition of octave sparse path
+amd: amd.cc $(OCTAMD) $(INC)
+	$(MKOCT) amd.cc $(OCTAMD) $(OCT_SPARSE_INC) -o amd.oct
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) amd.oct
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/OCTAVE/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+# compile the AMD mexFunction for MATLAB (original make only)
+#------------------------------------------------------------------------------
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: amd
+
+include ../Make/Make.include
+
+MKOCT = mkoctfile -I../Include
+
+OCT_SPARSE_INC = ../../../
+
+amd:
+	$(MKOCT) -DDINT -o amd_o_aat.o -c ../Source/amd_aat.c
+	$(MKOCT) -DDINT -o amd_o_1.o -c ../Source/amd_1.c
+	$(MKOCT) -DDINT -o amd_o_2.o -c ../Source/amd_2.c
+	$(MKOCT) -DDINT -o amd_o_dump.o -c ../Source/amd_dump.c
+	$(MKOCT) -DDINT -o amd_o_postorder.o -c ../Source/amd_postorder.c
+	$(MKOCT) -DDINT -o amd_o_post_tree.o -c ../Source/amd_post_tree.c
+	$(MKOCT) -DDINT -o amd_o_defaults.o -c ../Source/amd_defaults.c
+	$(MKOCT) -DDINT -o amd_o_order.o -c ../Source/amd_order.c
+	$(MKOCT) -DDINT -o amd_o_control.o -c ../Source/amd_control.c
+	$(MKOCT) -DDINT -o amd_o_info.o -c ../Source/amd_info.c
+	$(MKOCT) -DDINT -o amd_o_valid.o -c ../Source/amd_valid.c
+	$(MKOCT) -output amd.oct amd_mex.c amd_o_aat.o \
+	    amd_o_1.o amd_o_2.o amd_o_dump.o amd_o_postorder.o \
+	    amd_o_post_tree.o amd_o_defaults.o amd_o_order.o amd_o_control.o \
+	    amd_o_info.o amd_o_valid.o $(OCT_SPARSE_INC) -o amd.oct
+
+#------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) amd.oct
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/OCTAVE/amd.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,299 @@
+/*
+
+Copyright (C) 2004 David Bateman
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/*
+
+This is the Octave interface to the UMFPACK AMD code, which bore the following
+copyright
+
+ AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+ Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+ email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+ web: http://www.cise.ufl.edu/research/sparse/amd
+ --------------------------------------------------------------------------
+
+    Acknowledgements: This work was supported by the National Science
+       Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
+
+*/
+
+#include <cstdlib>
+#include <string>
+
+#include <octave/config.h>
+#include <octave/ov.h>
+#include <octave/defun-dld.h>
+#include <octave/pager.h>
+#include <octave/ov-re-mat.h>
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// External AMD functions in C
+extern "C" {
+#include "amd.h"
+}
+
+DEFUN_DLD (amd, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{p} =} amd (@var{s})\n\
+@deftypefnx {Loadable Function} {@var{Control} =} amd ()\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{info}] =} amd (@var{s})\n\
+\n\
+AMD Approximate minimum degree permutation. Returns the approximate\n\
+minimum degree permutation vector for the sparse matrix\n\
+@code{@var{c} = @var{S} + @var{S}'}. The Cholesky factorization of\n\
+@code{@var{c} (@var{p}, @var{p})}, or @code{@var{s} (@var{p}, @var{p})},\n\
+tends to be sparser than that of @var{c} or @var{s}.\n\
+@var{s} must be square. If @var{s} is full, @code{amd (@var{S})} is\n\
+equivalent to  @code{amd (sparse (@var{s}))}.\n\
+\n\
+@table @asis\n\
+@item @var{Control} (1)\n\
+If S is n-by-n, then rows/columns with more than\n\
+@code{@dfn{max} (16, (@var{Control} (1)) * @dfn{sqrt} (@var{n}))} entries\n\
+in @code{@var{s} + @var{S}'} are considered @emph{dense}, and ignored during\n\
+ordering.  They are placed last in the output permutation.  The default is\n\
+10.0 if @var{Control} is not present.\n\
+@item @var{Control} (2)\n\
+If nonzero, then aggressive absorption is performed. This is the default if\n\
+@var{Control} is not present.\n\
+@item @var{Control} (3)\n\
+If nonzero, print statistics about the ordering.\n\
+@end table\n\
+\n\
+@table @asis\n\
+@item @var{Info} (1)\n\
+status (0: ok, -1: out of memory, -2: matrix invalid)\n\
+@item @var{Info} (2)\n\
+@code{@var{n} = size (@var{a}, 1)}\n\
+@item @var{Info} (3)\n\
+@code{nnz (A)}\n\
+@item @var{Info} (4)\n\
+The symmetry of the matrix @var{s} (0.0 means purely unsymmetric, 1.0 means\n\
+purely symmetric).  Computed as: @code{@var{b} = tril (@var{s}, -1) +\n\
+triu (@var{s}, 1); @var{symmetry} = nnz (@var{b} & @var{b}')\n\
+/ nnz (@var{b});}\n\
+@item @var{Info} (5)\n\
+@code{nnz (diag (@var{s}))}\n\
+@item @var{Info} (6)\n\
+@dfn{nnz} in @code{@var{s} + @var{s}'}, excluding the diagonal\n\
+(= @code{nnz (@var{b} + @var{b}')})\n\
+@item @var{Info} (7)\n\
+Number of @emph{dense} rows/columns in @code{@var{s} + @var{s}'}\n\
+@item @var{Info} (8)\n\
+The amount of memory used by AMD, in bytes\n\
+@item @var{Info} (9)\n\
+The number of memory compactions performed by AMD\n\
+@end table\n\
+\n\
+The following statistics are slight upper bounds because of the\n\
+approximate degree in AMD. The bounds are looser if @emph{dense}\n\
+rows/columns are ignored during ordering @code{(@var{Info} (7) > 0)}.\n\
+The statistics are for a subsequent factorization of the matrix\n\
+@code{@var{c} (@var{p},@var{p})}.  The LU factorization statistics assume\n \
+no pivoting.\n\
+\n\
+@table @asis\n\
+@item @var{Info} (10)\n\
+The number of nonzeros in L, excluding the diagonal\n\
+@item @var{Info} (11)\n\
+The number of divide operations for LL', LDL', or LU\n\
+@item @var{Info (12)}\n\
+The number of multiply-subtract pairs for LL' or LDL'\n\
+@item @var{Info} (13)\n\
+The number of multiply-subtract pairs for LU\n\
+@item @var{Info} (14)\n\
+The max number of nonzeros in any column of L (incl. diagonal)\n\
+@item @var{Info} (15:20)\n\
+unused, reserved for future use\n\
+@end table\n\
+\n\
+An assembly tree post-ordering is performed, which is typically the same\n\
+as an elimination tree post-ordering.  It is not always identical because\n\
+of the approximate degree update used, and because @emph{dense} rows/columns\n\
+do not take part in the post-order.  It well-suited for a subsequent\n\
+@dfn{chol}, however.  If you require a precise elimination tree\n\
+post-ordering, then do:\n\
+\n\
+@group\n\
+   @var{p} = @dfn{amd} (@var{s});\n\
+   % skip this if S already symmetric\n\
+   @var{c} = spones (@var{s}) + spones (@var{s}');\n\
+   [@var{ignore}, @var{q}] = sparsfun ('symetree', @var{c} (@var{p}, @var{p}));\n\
+   @var{p} = @var{p} (@var{q});\n\
+@end group\n\
+\n\
+AMD Version 1.1 (Jan. 21, 2004), Copyright @copyright{} 2004 by\n\
+Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff.\n\
+\n\
+email: davis@@cise.ufl.edu  (CISE Department, Univ. of Florida).\n\
+\n\
+web: http://www.cise.ufl.edu/research/sparse/amd\n\
+\n\
+Acknowledgements: This work was supported by the National Science\n\
+Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.\n\
+@end deftypefn")
+{
+  int nargin = args.length (); 
+  octave_value_list retval; 
+  int spumoni = 0;
+
+  if (nargin > 2 || nargout > 2)
+    usage ("p = amd (A) or [p, Info] = amd (A, Control)");
+  else if (nargin == 0)
+    {
+      // Get the default control parameter, and return
+      NDArray control (dim_vector (AMD_CONTROL, 1));
+      double *control_ptr = control.fortran_vec ();
+      amd_defaults (control_ptr);
+      if (nargout == 0)
+	amd_control (control_ptr);
+      else
+	retval(0) = control;
+    }
+  else
+    {
+      NDArray control (dim_vector (AMD_CONTROL, 1));
+      double *control_ptr = control.fortran_vec ();
+      amd_defaults (control_ptr);
+
+      if (nargin > 1)
+	{
+	  NDArray control_in = args(1).array_value();
+
+	  if (error_state)
+	    {	  
+	      error ("amd: could not read control vector");
+	      return retval;
+	    }
+
+	  dim_vector dv = control_in.dims ();
+	  if (dv.length() > 2 || (dv(0) != 1 && dv(1) != 1))
+	    {
+	      error ("amd: control vector isn't a vector");
+	      return retval;
+	    }
+	  
+	  int nc = dv.numel ();
+	  control (AMD_DENSE) = (nc > 0 ? control_in (AMD_DENSE) :
+				 AMD_DEFAULT_DENSE);
+	  control (AMD_AGGRESSIVE) = (nc > 1 ? control_in (AMD_AGGRESSIVE) :
+				      AMD_DEFAULT_AGGRESSIVE);
+	  spumoni = (nc > 2 ? (control_in (2) != 0) : 0);
+	}
+
+      if (spumoni > 0)
+	amd_control (control_ptr);
+
+      int *Ap, *Ai;
+      int n, m, nz;
+
+      // These are here only so that the C++ destructors don't prematurally
+      // remove the underlying data we are interested in
+      SparseMatrix sm;
+      SparseComplexMatrix scm;
+      Matrix mm;
+      ComplexMatrix cm;
+
+      if (args(0).class_name () != "sparse" && spumoni > 0)
+	octave_stdout << "    input matrix A is full (sparse copy"
+		      << " of A will be created)" << std::endl;
+
+      if (args(0).is_complex_type ())
+	{
+	  scm = args(0).sparse_complex_matrix_value ();
+	  Ai = scm.ridx ();
+	  Ap = scm.cidx ();
+	  m = scm.rows ();
+	  n = scm.cols ();
+	  nz = scm.nnz ();
+	}
+      else
+	{
+	  sm = args(0).sparse_matrix_value ();
+	  Ai = sm.ridx ();
+	  Ap = sm.cidx ();
+	  m = sm.rows ();
+	  n = sm.cols ();
+	  nz = sm.nnz ();
+	}
+
+      if (spumoni > 0)
+	octave_stdout << "    input matrix A is " << m << "-by-" << n 
+		      << std::endl;
+
+      if (m != n)
+	{
+	  error ("amd: A must be square");
+	  return retval;
+	}
+
+      if (spumoni > 0)
+	octave_stdout << "    input matrix A has " << nz << 
+	  " nonzero entries" << std::endl;
+
+      // allocate workspace for output permutation 
+      Array<int> P(n+1);
+      int *P_ptr = P.fortran_vec ();
+      NDArray info (dim_vector (AMD_INFO, 1));
+      double *info_ptr = info.fortran_vec ();
+      int result;
+
+      // order the matrix
+      result = amd_order (n, Ap, Ai, P_ptr, control_ptr, info_ptr);
+
+      // print results (including return value)
+      if (spumoni > 0)
+	amd_info (info_ptr);
+
+      // check error conditions
+      if (result == AMD_OUT_OF_MEMORY)
+	error ("amd: out of memory");
+      else if (result == AMD_INVALID)
+	error ("amd: input matrix A is corrupted");
+      else
+	{
+	  // copy the outputs to Octave
+
+	  // output permutation, P
+	  NDArray perm (dim_vector (1, n));
+	  for (int i = 0; i < n; i++)
+	    perm (i) = double (P(i) + 1);  // 1-based indexing for Octave
+
+	  retval (0) = perm;
+
+	  // Info
+	  if (nargout > 1)
+	    retval (1) = info;
+	}
+    }
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,61 @@
+function amd_demo
+% AMD DEMO
+%
+% A demo of AMD for OCTAVE.
+%
+% --------------------------------------------------------------------------
+% AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,
+% Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.
+% email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+% web: http://www.cise.ufl.edu/research/sparse/amd
+% --------------------------------------------------------------------------
+%
+% See also: amd
+
+% Get the Harwell/Boeing can_24 matrix.  This is an example matrix from the
+% MATLAB-accessible UF sparse matrix collection, and can be loaded into
+% MATLAB with the statment "Problem = UFget ('HB/can_24')", after obtaining
+% the UFget function and its supporting routines at
+% http://www.cise.ufl.edu/sparse/mat .
+
+load can_24.mat
+A = Problem.A ;
+n = size (A,1) ;
+
+figure (1)
+clf
+hold off
+subplot (2,1,1) ;
+% remove the "_" from the name before printing it in the plot title
+title (sprintf ('%s', strrep (Problem.name, '_', '-'))) ;
+fprintf ('Matrix name:  %s\n', Problem.name) ;
+fprintf ('Matrix title: %s\n', Problem.title) ;
+spy (A)
+
+% print the details during AMD ordering and SYMBFACT
+control = amd ();
+control (3) = 1;
+
+% order the matrix.  Note that the Info argument is optional.
+fprintf ('\nIf the next step fails, then you have\n') ;
+fprintf ('not yet compiled the AMD mexFunction.\n') ;
+[p, Info] = amd (A, control) ;
+
+% order again, but this time print some statistics
+[p, Info] = amd (A, [10 1 1]) ;
+
+fprintf ('Permutation vector:\n') ;
+fprintf (' %2d', p) ;
+fprintf ('\n\n') ;
+
+subplot (2,1,2) ;
+title ('Permuted matrix') ;
+spy (A (p,p))
+
+% approximations from amd:
+lnz2 = n + Info (10) ;
+fl2 = n + Info (11) + 2 * Info (12) ;
+fprintf ('\nResults from AMD''s approximate analysis:\n') ;
+fprintf ('number of nonzeros in L (including diagonal):      %d\n', lnz2) ;
+fprintf ('floating point operation count for chol (A (p,p)): %d\n\n', fl2) ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/OCTAVE/amd_demo.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,20 @@
+octave:3> amd_demo
+ans = 1
+Matrix name:  HB/can_24
+Matrix title: 1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981.
+
+If the next step fails, then you have
+not yet compiled the AMD mexFunction.
+    input matrix A is 24-by-24
+    input matrix A has 160 nonzero entries
+    input matrix A is 24-by-24
+    input matrix A has 160 nonzero entries
+Permutation vector:
+ 23 21 11 24 13  6 17  9 15  5 16  8  2 10 14 18  1  3  4  7 12 19 22 20
+
+
+Results from AMD's approximate analysis:
+number of nonzeros in L (including diagonal):      121
+floating point operation count for chol (A (p,p)): 671
+
+octave:4> quit
Binary file liboctave/UMFPACK/AMD/OCTAVE/can_24.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/README.txt	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,202 @@
+AMD version 1.1:  a set of routines for permuting sparse matrices prior to
+    factorization.  Includes a version in C, a version in Fortran, and a MATLAB
+    mexFunction.
+
+Quick start (Unix, or Windows with Cygwin):
+
+    To compile, test, and install AMD, you may wish to first configure the
+    installation by editting the AMD/Make/Make.include file.  Next, cd to this
+    directory (AMD) and type "make" (or "make lib" if you do not have MATLAB).
+    To compile and run a demo program for the Fortran version, type
+    "make fortran".  When done, type "make clean" to remove unused *.o files
+    (keeps the compiled libraries and demo programs).  See the User Guide
+    (Doc/AMD_UserGuide.pdf), or AMD/Make/Make.include, for more details.
+
+Quick start (for MATLAB users);
+
+    To compile, test, and install the AMD mexFunction, cd to the
+    AMD/MATLAB directory and type amd_make at the MATLAB prompt.
+    This works on any system supported by MATLAB.
+
+-------------------------------------------------------------------------------
+
+AMD Version 1.1 (Jan. 21, 2004),  Copyright (c) 2004 by Timothy A.
+Davis, Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
+
+AMD License:
+
+    Your use or distribution of AMD or any modified version of
+    AMD implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses AMD or any modified version of AMD code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability:
+
+    http://www.cise.ufl.edu/research/sparse/amd
+
+-------------------------------------------------------------------------------
+
+This is the AMD Version 1.1 README file.  It is a terse overview of AMD.
+Refer to the User Guide (Doc/AMD_UserGuide.pdf) for how to install and use AMD.
+
+Description:
+
+    AMD is a set of routines for pre-ordering sparse matrices prior to Cholesky
+    or LU factorization, using the approximate minimum degree ordering
+    algorithm.  Written in ANSI/ISO C with a MATLAB interface, and in
+    Fortran 77.
+
+Authors:
+
+    Timothy A. Davis (davis@cise.ufl.edu), University of Florida.
+    Patrick R. Amestory, ENSEEIHT, Toulouse, France.
+    Iain S. Duff, Rutherford Appleton Laboratory, UK.
+
+Acknowledgements:
+
+    This work was supported by the National Science Foundation, under
+    grants DMS-9504974, DMS-9803599, and CCR-0203270.
+
+    Portions of this work were done while on sabbatical at Stanford University
+    and Lawrence Berkeley National Laboratory (with funding from the SciDAC
+    program).  I would like to thank Gene Golub, Esmond Ng, and Horst Simon
+    for making this sabbatical possible.
+
+-------------------------------------------------------------------------------
+Files and directories in the AMD v1.0 distribution:
+-------------------------------------------------------------------------------
+
+    ---------------------------------------------------------------------------
+    Subdirectories of the AMD directory:
+    ---------------------------------------------------------------------------
+
+    Doc		documentation
+    Make	for compiling AMD
+    Source	primary source code
+    Include	include file for use in your code that calls AMD
+    Demo	demo programs.  also serves as test of the AMD installation.
+    MATLAB	AMD mexFunction for MATLAB, and supporting m-files
+    Lib		where the compiled C-callable and Fortran-callable
+		AMD libraries placed.
+
+    ---------------------------------------------------------------------------
+    Files in the AMD directory:
+    ---------------------------------------------------------------------------
+
+    Makefile	top-level Makefile for GNU make or original make.
+		Windows users would require Cygwin to use "make"
+
+    README	this file
+
+    ---------------------------------------------------------------------------
+    Doc directory: documentation
+    ---------------------------------------------------------------------------
+
+    ChangeLog			change log
+    License			the AMD License
+    Makefile			for creating the documentation
+    AMD_UserGuide.bib		AMD User Guide (references)
+    AMD_UserGuide.tex		AMD User Guide (LaTeX)
+    AMD_UserGuide.pdf		AmD User Guide (PDF)
+
+    ---------------------------------------------------------------------------
+    Make directory: for compiling AMD (Lib/libamd.a and Lib/libamdf77.a)
+    ---------------------------------------------------------------------------
+
+    Make.include		overall configurations.  Can use one of: 
+    Make.alpha			Makefile additions for Compaq Alpha
+    Make.linux			Makefile additions for Linux
+    Make.rs6000			Makefile additions for RS 6000
+    Make.sgi			Makefile additions for SGI
+    Make.solaris		Makefile additions for Solaris
+
+    ---------------------------------------------------------------------------
+    Source directory:
+    ---------------------------------------------------------------------------
+
+    GNUmakefile			a nice Makefile, for GNU make
+    Makefile			an ugly Unix Makefile (for older make's)
+
+    amd_order.c			user-callable, primary AMD ordering routine
+    amd_control.c		user-callable, prints the control parameters
+    amd_defaults.c		user-callable, sets default control parameters
+    amd_info.c			user-callable, prints the statistics from AMD
+
+    amd_1.c			non-user-callable, construct A+A'
+    amd_2.c			non-user-callable, primary ordering kernel
+				(a C version of amd.f and amdbar.f, with
+				post-ordering added)
+    amd_aat.c			non-user-callable, computes nnz (A+A')
+    amd_dump.c			non-user-callable, debugging routines
+    amd_internal.h		non-user-callable, include file for AMD
+    amd_mex.c			non-user-callable, MATLAB mexFunction
+    amd_postorder.c		non-user-callable, postorder
+    amd_post_tree.c		non-user-callable, postorder just one tree
+    amd_valid.c			non-user-callable, verifies a matrix
+
+    amd.f			user-callable Fortran 77 version
+    amdbar.f			user-callable Fortran 77 version
+
+    ---------------------------------------------------------------------------
+    Include directory:
+    ---------------------------------------------------------------------------
+
+    amd.h			include file for C programs that use AMD
+
+    ---------------------------------------------------------------------------
+    Demo directory:
+    ---------------------------------------------------------------------------
+
+    Makefile			for GNU make or original make
+
+    amd_demo.c			C demo program for AMD
+    amd_demo.out		output of amd_demo.c
+
+    amd_simple.c		simple C demo program for AMD
+    amd_simple.out		output of amd_simple.c
+
+    amd_f77demo.f		Fortran 77 demo program for AMD
+    amd_f77demo.out		output of amd_f77demo.f
+
+    amd_f77simple.c		simple Fortran 77 demo program for AMD
+    amd_f77simple.out		output of amd_f77simple.f
+
+    amd_f77cross.f		Fortran 77 demo, calls the C version of AMD
+    amd_f77cross.out		output of amd_f77cross.f
+    amd_f77wrapper.c		Fortran-callable wrapper for C version of AMD
+
+    ---------------------------------------------------------------------------
+    MATLAB directory:
+    ---------------------------------------------------------------------------
+
+    GNUmakefile			a nice Makefile, for GNU make
+    Makefile			an ugly Unix Makefile (for older make's)
+
+    Contents.m			for "help amd" listing of toolbox contents
+
+    amd.m			MATLAB help file for AMD
+    amd_make.m			MATLAB m-file for compiling AMD mexFunction
+
+    amd_mex.c			AMD mexFunction for MATLAB
+
+    amd_demo.m			MATLAB demo for AMD
+    amd_demo.m.out		diary output of amd_demo.m
+    can_24.mat			input file for AMD demo
+
+    ---------------------------------------------------------------------------
+    Lib directory:  libamd.a and libamdf77.a libraries placed here
+    ---------------------------------------------------------------------------
+
+    libamd.def			AMD definitions for Windows
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,68 @@
+#-------------------------------------------------------------------------------
+# AMD Makefile for compiling on Unix systems (for GNU make only)
+#-------------------------------------------------------------------------------
+
+all: ../Lib/libamd.a
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include
+
+#-------------------------------------------------------------------------------
+# source files
+#-------------------------------------------------------------------------------
+
+AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid amd_preprocess
+
+INC = ../Include/amd.h amd_internal.h
+
+#-------------------------------------------------------------------------------
+# object files for each version
+#-------------------------------------------------------------------------------
+
+AMDI = $(addsuffix .o, $(subst amd_,amd_i_,$(AMD)))
+AMDL = $(addsuffix .o, $(subst amd_,amd_l_,$(AMD)))
+
+#-------------------------------------------------------------------------------
+# compile each int and long routine (with no real/complex version)
+#-------------------------------------------------------------------------------
+
+amd_i_%.o: amd_%.c $(INC)
+	$(C) -DDINT -c $< -o $@
+
+amd_l_%.o: amd_%.c $(INC)
+	$(C) -DDLONG -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# Create the libamd.a library (C versions only)
+#-------------------------------------------------------------------------------
+
+../Lib/libamd.a: $(AMDI) $(AMDL)
+	$(AR) cr ../Lib/libamd.a $^
+	- $(RANLIB) ../Lib/libamd.a
+
+#-------------------------------------------------------------------------------
+# compile the Fortran versions and the libamdf77.a library
+#-------------------------------------------------------------------------------
+
+fortran: ../Lib/libamdf77.a
+
+AMDF77 = amd.o amdbar.o
+
+amd.o: amd.f
+	$(F77) $(F77FLAGS) -c amd.f -o amd.o
+
+amdbar.o: amdbar.f
+	$(F77) $(F77FLAGS) -c amdbar.f -o amdbar.o
+
+../Lib/libamdf77.a: $(AMDF77)
+	$(AR) cr ../Lib/libamdf77.a $^
+	- $(RANLIB) ../Lib/libamdf77.a
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) ../Lib/libamd.a ../Lib/libamdf77.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,65 @@
+#-------------------------------------------------------------------------------
+# AMD Makefile for compiling on Unix systems (for original Make ONLY)
+#-------------------------------------------------------------------------------
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: everything
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include
+
+everything:
+	$(C) -DDINT -c amd_aat.c -o amd_i_aat.o
+	$(C) -DDINT -c amd_1.c -o amd_i_1.o
+	$(C) -DDINT -c amd_2.c -o amd_i_2.o
+	$(C) -DDINT -c amd_dump.c -o amd_i_dump.o
+	$(C) -DDINT -c amd_postorder.c -o amd_i_postorder.o
+	$(C) -DDINT -c amd_post_tree.c -o amd_i_post_tree.o
+	$(C) -DDINT -c amd_defaults.c -o amd_i_defaults.o
+	$(C) -DDINT -c amd_order.c -o amd_i_order.o
+	$(C) -DDINT -c amd_control.c -o amd_i_control.o
+	$(C) -DDINT -c amd_info.c -o amd_i_info.o
+	$(C) -DDINT -c amd_valid.c -o amd_i_valid.o
+	$(C) -DDINT -c amd_preprocess.c -o amd_i_preprocess.o
+	$(C) -DDLONG -c amd_aat.c -o amd_l_aat.o
+	$(C) -DDLONG -c amd_1.c -o amd_l_1.o
+	$(C) -DDLONG -c amd_2.c -o amd_l_2.o
+	$(C) -DDLONG -c amd_dump.c -o amd_l_dump.o
+	$(C) -DDLONG -c amd_postorder.c -o amd_l_postorder.o
+	$(C) -DDLONG -c amd_post_tree.c -o amd_l_post_tree.o
+	$(C) -DDLONG -c amd_defaults.c -o amd_l_defaults.o
+	$(C) -DDLONG -c amd_order.c -o amd_l_order.o
+	$(C) -DDLONG -c amd_control.c -o amd_l_control.o
+	$(C) -DDLONG -c amd_info.c -o amd_l_info.o
+	$(C) -DDLONG -c amd_valid.c -o amd_l_valid.o
+	$(C) -DDLONG -c amd_preprocess.c -o amd_l_preprocess.o
+	$(AR) cr ../Lib/libamd.a amd_i_aat.o amd_i_1.o amd_i_2.o amd_i_dump.o \
+	    amd_i_postorder.o amd_i_post_tree.o amd_i_defaults.o amd_i_order.o \
+	    amd_i_control.o amd_i_info.o amd_i_valid.o amd_l_aat.o amd_l_1.o \
+	    amd_l_2.o amd_l_dump.o amd_l_postorder.o amd_l_post_tree.o \
+	    amd_l_defaults.o amd_l_order.o amd_l_control.o amd_l_info.o \
+	    amd_l_valid.o amd_i_preprocess.o amd_l_preprocess.o
+	- $(RANLIB) ../Lib/libamd.a
+
+#-------------------------------------------------------------------------------
+# compile the Fortran versions and the libamdf77.a library
+#-------------------------------------------------------------------------------
+
+fortran:
+	$(F77) $(F77FLAGS) -c amd.f -o amd.o
+	$(F77) $(F77FLAGS) -c amdbar.f -o amdbar.o
+	$(AR) cr ../Lib/libamdf77.a amd.o amdbar.o
+	- $(RANLIB) ../Lib/libamdf77.a
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) ../Lib/libamd.a ../Lib/libamdf77.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1214 @@
+C-----------------------------------------------------------------------
+C AMD:  approximate minimum degree, with aggressive absorption
+C-----------------------------------------------------------------------
+
+        SUBROUTINE AMD
+     $          (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
+
+        INTEGER N, IWLEN, PFREE, NCMPA, IW (IWLEN), PE (N),
+     $          DEGREE (N), NV (N), NEXT (N), LAST (N), HEAD (N),
+     $          ELEN (N), W (N), LEN (N)
+
+C Given a representation of the nonzero pattern of a symmetric matrix,
+C       A, (excluding the diagonal) perform an approximate minimum
+C       (UMFPACK/MA38-style) degree ordering to compute a pivot order
+C       such that the introduction of nonzeros (fill-in) in the Cholesky
+C       factors A = LL^T are kept low.  At each step, the pivot
+C       selected is the one with the minimum UMFPACK/MA38-style
+C       upper-bound on the external degree.
+C
+C       Aggresive absorption is used to tighten the bound on the degree.
+
+C **********************************************************************
+C ***** CAUTION:  ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT.  ******
+C **********************************************************************
+
+C       References:
+C
+C       [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern
+C           multifrontal method for sparse LU factorization", SIAM J.
+C           Matrix Analysis and Applications, vol. 18, no. 1, pp.
+C           140-158.  Discusses UMFPACK / MA38, which first introduced
+C           the approximate minimum degree used by this routine.
+C
+C       [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An
+C           approximate degree ordering algorithm," SIAM J. Matrix
+C           Analysis and Applications, vol. 17, no. 4, pp. 886-905,
+C           1996.  Discusses AMD, AMDBAR, and MC47B.
+C
+C       [3] Alan George and Joseph Liu, "The evolution of the minimum
+C           degree ordering algorithm," SIAM Review, vol. 31, no. 1,
+C           pp. 1-19, 1989.  We list below the features mentioned in
+C           that paper that this code includes:
+C
+C       mass elimination:
+C               Yes.  MA27 relied on supervariable detection for mass
+C               elimination.
+C       indistinguishable nodes:
+C               Yes (we call these "supervariables").  This was also in
+C               the MA27 code - although we modified the method of
+C               detecting them (the previous hash was the true degree,
+C               which we no longer keep track of).  A supervariable is
+C               a set of rows with identical nonzero pattern.  All
+C               variables in a supervariable are eliminated together.
+C               Each supervariable has as its numerical name that of
+C               one of its variables (its principal variable).
+C       quotient graph representation:
+C               Yes.  We use the term "element" for the cliques formed
+C               during elimination.  This was also in the MA27 code.
+C               The algorithm can operate in place, but it will work
+C               more efficiently if given some "elbow room."
+C       element absorption:
+C               Yes.  This was also in the MA27 code.
+C       external degree:
+C               Yes.  The MA27 code was based on the true degree.
+C       incomplete degree update and multiple elimination:
+C               No.  This was not in MA27, either.  Our method of
+C               degree update within MC47B/BD is element-based, not
+C               variable-based.  It is thus not well-suited for use
+C               with incomplete degree update or multiple elimination.
+
+C-----------------------------------------------------------------------
+C Authors, and Copyright (C) 1995 by:
+C       Timothy A. Davis, Patrick Amestoy, Iain S. Duff, & John K. Reid.
+C
+C Acknowledgements:
+C       This work (and the UMFPACK package) was supported by the
+C       National Science Foundation (ASC-9111263 and DMS-9223088).
+C       The UMFPACK/MA38 approximate degree update algorithm, the
+C       unsymmetric analog which forms the basis of MC47B/BD, was
+C       developed while Tim Davis was supported by CERFACS (Toulouse,
+C       France) in a post-doctoral position.
+C
+C Date:  September, 1995
+C-----------------------------------------------------------------------
+
+C-----------------------------------------------------------------------
+C INPUT ARGUMENTS (unaltered):
+C-----------------------------------------------------------------------
+
+C n:    The matrix order.
+C
+C       Restriction:  1 .le. n .lt. (iovflo/2)-2, where iovflo is
+C       the largest positive integer that your computer can represent.
+
+C iwlen:        The length of iw (1..iwlen).  On input, the matrix is
+C       stored in iw (1..pfree-1).  However, iw (1..iwlen) should be
+C       slightly larger than what is required to hold the matrix, at
+C       least iwlen .ge. pfree + n is recommended.  Otherwise,
+C       excessive compressions will take place.
+C       *** We do not recommend running this algorithm with ***
+C       ***      iwlen .lt. pfree + n.                      ***
+C       *** Better performance will be obtained if          ***
+C       ***      iwlen .ge. pfree + n                       ***
+C       *** or better yet                                   ***
+C       ***      iwlen .gt. 1.2 * pfree                     ***
+C       *** (where pfree is its value on input).            ***
+C       The algorithm will not run at all if iwlen .lt. pfree-1.
+C
+C       Restriction: iwlen .ge. pfree-1
+
+C-----------------------------------------------------------------------
+C INPUT/OUPUT ARGUMENTS:
+C-----------------------------------------------------------------------
+
+C pe:   On input, pe (i) is the index in iw of the start of row i, or
+C       zero if row i has no off-diagonal non-zeros.
+C
+C       During execution, it is used for both supervariables and
+C       elements:
+C
+C       * Principal supervariable i:  index into iw of the
+C               description of supervariable i.  A supervariable
+C               represents one or more rows of the matrix
+C               with identical nonzero pattern.
+C       * Non-principal supervariable i:  if i has been absorbed
+C               into another supervariable j, then pe (i) = -j.
+C               That is, j has the same pattern as i.
+C               Note that j might later be absorbed into another
+C               supervariable j2, in which case pe (i) is still -j,
+C               and pe (j) = -j2.
+C       * Unabsorbed element e:  the index into iw of the description
+C               of element e, if e has not yet been absorbed by a
+C               subsequent element.  Element e is created when
+C               the supervariable of the same name is selected as
+C               the pivot.
+C       * Absorbed element e:  if element e is absorbed into element
+C               e2, then pe (e) = -e2.  This occurs when the pattern of
+C               e (that is, Le) is found to be a subset of the pattern
+C               of e2 (that is, Le2).  If element e is "null" (it has
+C               no nonzeros outside its pivot block), then pe (e) = 0.
+C
+C       On output, pe holds the assembly tree/forest, which implicitly
+C       represents a pivot order with identical fill-in as the actual
+C       order (via a depth-first search of the tree).
+C
+C       On output:
+C       If nv (i) .gt. 0, then i represents a node in the assembly tree,
+C       and the parent of i is -pe (i), or zero if i is a root.
+C       If nv (i) = 0, then (i,-pe (i)) represents an edge in a
+C       subtree, the root of which is a node in the assembly tree.
+
+C pfree:        On input the tail end of the array, iw (pfree..iwlen),
+C       is empty, and the matrix is stored in iw (1..pfree-1).
+C       During execution, additional data is placed in iw, and pfree
+C       is modified so that iw (pfree..iwlen) is always the unused part
+C       of iw.  On output, pfree is set equal to the size of iw that
+C       would have been needed for no compressions to occur.  If
+C       ncmpa is zero, then pfree (on output) is less than or equal to
+C       iwlen, and the space iw (pfree+1 ... iwlen) was not used.
+C       Otherwise, pfree (on output) is greater than iwlen, and all the
+C       memory in iw was used.
+
+C-----------------------------------------------------------------------
+C INPUT/MODIFIED (undefined on output):
+C-----------------------------------------------------------------------
+
+C len:  On input, len (i) holds the number of entries in row i of the
+C       matrix, excluding the diagonal.  The contents of len (1..n)
+C       are undefined on output.
+
+C iw:   On input, iw (1..pfree-1) holds the description of each row i
+C       in the matrix.  The matrix must be symmetric, and both upper
+C       and lower triangular parts must be present.  The diagonal must
+C       not be present.  Row i is held as follows:
+C
+C               len (i):  the length of the row i data structure
+C               iw (pe (i) ... pe (i) + len (i) - 1):
+C                       the list of column indices for nonzeros
+C                       in row i (simple supervariables), excluding
+C                       the diagonal.  All supervariables start with
+C                       one row/column each (supervariable i is just
+C                       row i).
+C               if len (i) is zero on input, then pe (i) is ignored
+C               on input.
+C
+C               Note that the rows need not be in any particular order,
+C               and there may be empty space between the rows.
+C
+C       During execution, the supervariable i experiences fill-in.
+C       This is represented by placing in i a list of the elements
+C       that cause fill-in in supervariable i:
+C
+C               len (i):  the length of supervariable i
+C               iw (pe (i) ... pe (i) + elen (i) - 1):
+C                       the list of elements that contain i.  This list
+C                       is kept short by removing absorbed elements.
+C               iw (pe (i) + elen (i) ... pe (i) + len (i) - 1):
+C                       the list of supervariables in i.  This list
+C                       is kept short by removing nonprincipal
+C                       variables, and any entry j that is also
+C                       contained in at least one of the elements
+C                       (j in Le) in the list for i (e in row i).
+C
+C       When supervariable i is selected as pivot, we create an
+C       element e of the same name (e=i):
+C
+C               len (e):  the length of element e
+C               iw (pe (e) ... pe (e) + len (e) - 1):
+C                       the list of supervariables in element e.
+C
+C       An element represents the fill-in that occurs when supervariable
+C       i is selected as pivot (which represents the selection of row i
+C       and all non-principal variables whose principal variable is i).
+C       We use the term Le to denote the set of all supervariables
+C       in element e.  Absorbed supervariables and elements are pruned
+C       from these lists when computationally convenient.
+C
+C       CAUTION:  THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION.
+C       The contents of iw are undefined on output.
+
+C-----------------------------------------------------------------------
+C OUTPUT (need not be set on input):
+C-----------------------------------------------------------------------
+
+C nv:   During execution, abs (nv (i)) is equal to the number of rows
+C       that are represented by the principal supervariable i.  If i is
+C       a nonprincipal variable, then nv (i) = 0.  Initially,
+C       nv (i) = 1 for all i.  nv (i) .lt. 0 signifies that i is a
+C       principal variable in the pattern Lme of the current pivot
+C       element me.  On output, nv (e) holds the true degree of element
+C       e at the time it was created (including the diagonal part).
+
+C ncmpa:        The number of times iw was compressed.  If this is
+C       excessive, then the execution took longer than what could have
+C       been.  To reduce ncmpa, try increasing iwlen to be 10% or 20%
+C       larger than the value of pfree on input (or at least
+C       iwlen .ge. pfree + n).  The fastest performance will be
+C       obtained when ncmpa is returned as zero.  If iwlen is set to
+C       the value returned by pfree on *output*, then no compressions
+C       will occur.
+
+C elen: See the description of iw above.  At the start of execution,
+C       elen (i) is set to zero.  During execution, elen (i) is the
+C       number of elements in the list for supervariable i.  When e
+C       becomes an element, elen (e) = -nel is set, where nel is the
+C       current step of factorization.  elen (i) = 0 is done when i
+C       becomes nonprincipal.
+C
+C       For variables, elen (i) .ge. 0 holds until just before the
+C       permutation vectors are computed.  For elements,
+C       elen (e) .lt. 0 holds.
+C
+C       On output elen (1..n) holds the inverse permutation (the same
+C       as the 'INVP' argument in Sparspak).  That is, if k = elen (i),
+C       then row i is the kth pivot row.  Row i of A appears as the
+C       (elen(i))-th row in the permuted matrix, PAP^T.
+
+C last: In a degree list, last (i) is the supervariable preceding i,
+C       or zero if i is the head of the list.  In a hash bucket,
+C       last (i) is the hash key for i.  last (head (hash)) is also
+C       used as the head of a hash bucket if head (hash) contains a
+C       degree list (see head, below).
+C
+C       On output, last (1..n) holds the permutation (the same as the
+C       'PERM' argument in Sparspak).  That is, if i = last (k), then
+C       row i is the kth pivot row.  Row last (k) of A is the k-th row
+C       in the permuted matrix, PAP^T.
+
+C-----------------------------------------------------------------------
+C LOCAL (not input or output - used only during execution):
+C-----------------------------------------------------------------------
+
+C degree:       If i is a supervariable, then degree (i) holds the
+C       current approximation of the external degree of row i (an upper
+C       bound).  The external degree is the number of nonzeros in row i,
+C       minus abs (nv (i)) (the diagonal part).  The bound is equal to
+C       the external degree if elen (i) is less than or equal to two.
+C
+C       We also use the term "external degree" for elements e to refer
+C       to |Le \ Lme|.  If e is an element, then degree (e) holds |Le|,
+C       which is the degree of the off-diagonal part of the element e
+C       (not including the diagonal part).
+
+C head: head is used for degree lists.  head (deg) is the first
+C       supervariable in a degree list (all supervariables i in a
+C       degree list deg have the same approximate degree, namely,
+C       deg = degree (i)).  If the list deg is empty then
+C       head (deg) = 0.
+C
+C       During supervariable detection head (hash) also serves as a
+C       pointer to a hash bucket.
+C       If head (hash) .gt. 0, there is a degree list of degree hash.
+C               The hash bucket head pointer is last (head (hash)).
+C       If head (hash) = 0, then the degree list and hash bucket are
+C               both empty.
+C       If head (hash) .lt. 0, then the degree list is empty, and
+C               -head (hash) is the head of the hash bucket.
+C       After supervariable detection is complete, all hash buckets
+C       are empty, and the (last (head (hash)) = 0) condition is
+C       restored for the non-empty degree lists.
+
+C next: next (i) is the supervariable following i in a link list, or
+C       zero if i is the last in the list.  Used for two kinds of
+C       lists:  degree lists and hash buckets (a supervariable can be
+C       in only one kind of list at a time).
+
+C w:    The flag array w determines the status of elements and
+C       variables, and the external degree of elements.
+C
+C       for elements:
+C          if w (e) = 0, then the element e is absorbed
+C          if w (e) .ge. wflg, then w (e) - wflg is the size of
+C               the set |Le \ Lme|, in terms of nonzeros (the
+C               sum of abs (nv (i)) for each principal variable i that
+C               is both in the pattern of element e and NOT in the
+C               pattern of the current pivot element, me).
+C          if wflg .gt. w (e) .gt. 0, then e is not absorbed and has
+C               not yet been seen in the scan of the element lists in
+C               the computation of |Le\Lme| in loop 150 below.
+C
+C       for variables:
+C          during supervariable detection, if w (j) .ne. wflg then j is
+C          not in the pattern of variable i
+C
+C       The w array is initialized by setting w (i) = 1 for all i,
+C       and by setting wflg = 2.  It is reinitialized if wflg becomes
+C       too large (to ensure that wflg+n does not cause integer
+C       overflow).
+
+C-----------------------------------------------------------------------
+C LOCAL INTEGERS:
+C-----------------------------------------------------------------------
+
+        INTEGER DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, HASH, HMOD, I,
+     $          ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3,
+     $          LENJ, LN, MAXMEM, ME, MEM, MINDEG, NEL, NEWMEM,
+     $          NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X
+
+C deg:          the degree of a variable or element
+C degme:        size, |Lme|, of the current element, me (= degree (me))
+C dext:         external degree, |Le \ Lme|, of some element e
+C dmax:         largest |Le| seen so far
+C e:            an element
+C elenme:       the length, elen (me), of element list of pivotal var.
+C eln:          the length, elen (...), of an element list
+C hash:         the computed value of the hash function
+C hmod:         the hash function is computed modulo hmod = max (1,n-1)
+C i:            a supervariable
+C ilast:        the entry in a link list preceding i
+C inext:        the entry in a link list following i
+C j:            a supervariable
+C jlast:        the entry in a link list preceding j
+C jnext:        the entry in a link list, or path, following j
+C k:            the pivot order of an element or variable
+C knt1:         loop counter used during element construction
+C knt2:         loop counter used during element construction
+C knt3:         loop counter used during compression
+C lenj:         len (j)
+C ln:           length of a supervariable list
+C maxmem:       amount of memory needed for no compressions
+C me:           current supervariable being eliminated, and the
+C                       current element created by eliminating that
+C                       supervariable
+C mem:          memory in use assuming no compressions have occurred
+C mindeg:       current minimum degree
+C nel:          number of pivots selected so far
+C newmem:       amount of new memory needed for current pivot element
+C nleft:        n - nel, the number of nonpivotal rows/columns remaining
+C nvi:          the number of variables in a supervariable i (= nv (i))
+C nvj:          the number of variables in a supervariable j (= nv (j))
+C nvpiv:        number of pivots in current element
+C slenme:       number of variables in variable list of pivotal variable
+C we:           w (e)
+C wflg:         used for flagging the w array.  See description of iw.
+C wnvi:         wflg - nv (i)
+C x:            either a supervariable or an element
+
+C-----------------------------------------------------------------------
+C LOCAL POINTERS:
+C-----------------------------------------------------------------------
+
+        INTEGER P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2, PN, PSRC
+
+C               Any parameter (pe (...) or pfree) or local variable
+C               starting with "p" (for Pointer) is an index into iw,
+C               and all indices into iw use variables starting with
+C               "p."  The only exception to this rule is the iwlen
+C               input argument.
+
+C p:            pointer into lots of things
+C p1:           pe (i) for some variable i (start of element list)
+C p2:           pe (i) + elen (i) -  1 for some var. i (end of el. list)
+C p3:           index of first supervariable in clean list
+C pdst:         destination pointer, for compression
+C pend:         end of memory to compress
+C pj:           pointer into an element or variable
+C pme:          pointer into the current element (pme1...pme2)
+C pme1:         the current element, me, is stored in iw (pme1...pme2)
+C pme2:         the end of the current element
+C pn:           pointer into a "clean" variable, also used to compress
+C psrc:         source pointer, for compression
+
+C-----------------------------------------------------------------------
+C  FUNCTIONS CALLED:
+C-----------------------------------------------------------------------
+
+        INTRINSIC MAX, MIN, MOD
+
+C=======================================================================
+C  INITIALIZATIONS
+C=======================================================================
+
+        WFLG = 2
+        MINDEG = 1
+        NCMPA = 0
+        NEL = 0
+        HMOD = MAX (1, N-1)
+        DMAX = 0
+        MEM = PFREE - 1
+        MAXMEM = MEM
+	ME = 0
+
+        DO 10 I = 1, N
+           LAST (I) = 0
+           HEAD (I) = 0
+           NV (I) = 1
+           W (I) = 1
+           ELEN (I) = 0
+           DEGREE (I) = LEN (I)
+10         CONTINUE
+
+C       ----------------------------------------------------------------
+C       initialize degree lists and eliminate rows with no off-diag. nz.
+C       ----------------------------------------------------------------
+
+        DO 20 I = 1, N
+
+           DEG = DEGREE (I)
+
+           IF (DEG .GT. 0) THEN
+
+C             ----------------------------------------------------------
+C             place i in the degree list corresponding to its degree
+C             ----------------------------------------------------------
+
+              INEXT = HEAD (DEG)
+              IF (INEXT .NE. 0) LAST (INEXT) = I
+              NEXT (I) = INEXT
+              HEAD (DEG) = I
+
+           ELSE
+
+C             ----------------------------------------------------------
+C             we have a variable that can be eliminated at once because
+C             there is no off-diagonal non-zero in its row.
+C             ----------------------------------------------------------
+
+              NEL = NEL + 1
+              ELEN (I) = -NEL
+              PE (I) = 0
+              W (I) = 0
+
+              ENDIF
+
+20         CONTINUE
+
+C=======================================================================
+C  WHILE (selecting pivots) DO
+C=======================================================================
+
+30      CONTINUE
+        IF (NEL .LT. N) THEN
+
+C=======================================================================
+C  GET PIVOT OF MINIMUM DEGREE
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          find next supervariable for elimination
+C          -------------------------------------------------------------
+
+           DO 40 DEG = MINDEG, N
+              ME = HEAD (DEG)
+              IF (ME .GT. 0) GOTO 50
+40            CONTINUE
+50         CONTINUE
+           MINDEG = DEG
+
+C          -------------------------------------------------------------
+C          remove chosen variable from link list
+C          -------------------------------------------------------------
+
+           INEXT = NEXT (ME)
+           IF (INEXT .NE. 0) LAST (INEXT) = 0
+           HEAD (DEG) = INEXT
+
+C          -------------------------------------------------------------
+C          me represents the elimination of pivots nel+1 to nel+nv(me).
+C          place me itself as the first in this set.  It will be moved
+C          to the nel+nv(me) position when the permutation vectors are
+C          computed.
+C          -------------------------------------------------------------
+
+           ELENME = ELEN (ME)
+           ELEN (ME) = - (NEL + 1)
+           NVPIV = NV (ME)
+           NEL = NEL + NVPIV
+
+C=======================================================================
+C  CONSTRUCT NEW ELEMENT
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          At this point, me is the pivotal supervariable.  It will be
+C          converted into the current element.  Scan list of the
+C          pivotal supervariable, me, setting tree pointers and
+C          constructing new list of supervariables for the new element,
+C          me.  p is a pointer to the current position in the old list.
+C          -------------------------------------------------------------
+
+C          flag the variable "me" as being in Lme by negating nv (me)
+           NV (ME) = -NVPIV
+           DEGME = 0
+
+           IF (ELENME .EQ. 0) THEN
+
+C             ----------------------------------------------------------
+C             construct the new element in place
+C             ----------------------------------------------------------
+
+              PME1 = PE (ME)
+              PME2 = PME1 - 1
+
+              DO 60 P = PME1, PME1 + LEN (ME) - 1
+                 I = IW (P)
+                 NVI = NV (I)
+                 IF (NVI .GT. 0) THEN
+
+C                   ----------------------------------------------------
+C                   i is a principal variable not yet placed in Lme.
+C                   store i in new list
+C                   ----------------------------------------------------
+
+                    DEGME = DEGME + NVI
+C                   flag i as being in Lme by negating nv (i)
+                    NV (I) = -NVI
+                    PME2 = PME2 + 1
+                    IW (PME2) = I
+
+C                   ----------------------------------------------------
+C                   remove variable i from degree list.
+C                   ----------------------------------------------------
+
+                    ILAST = LAST (I)
+                    INEXT = NEXT (I)
+                    IF (INEXT .NE. 0) LAST (INEXT) = ILAST
+                    IF (ILAST .NE. 0) THEN
+                       NEXT (ILAST) = INEXT
+                    ELSE
+C                      i is at the head of the degree list
+                       HEAD (DEGREE (I)) = INEXT
+                       ENDIF
+
+                    ENDIF
+60               CONTINUE
+C             this element takes no new memory in iw:
+              NEWMEM = 0
+
+           ELSE
+
+C             ----------------------------------------------------------
+C             construct the new element in empty space, iw (pfree ...)
+C             ----------------------------------------------------------
+
+              P = PE (ME)
+              PME1 = PFREE
+              SLENME = LEN (ME) - ELENME
+
+              DO 120 KNT1 = 1, ELENME + 1
+
+                 IF (KNT1 .GT. ELENME) THEN
+C                   search the supervariables in me.
+                    E = ME
+                    PJ = P
+                    LN = SLENME
+                 ELSE
+C                   search the elements in me.
+                    E = IW (P)
+                    P = P + 1
+                    PJ = PE (E)
+                    LN = LEN (E)
+                    ENDIF
+
+C                -------------------------------------------------------
+C                search for different supervariables and add them to the
+C                new list, compressing when necessary. this loop is
+C                executed once for each element in the list and once for
+C                all the supervariables in the list.
+C                -------------------------------------------------------
+
+                 DO 110 KNT2 = 1, LN
+                    I = IW (PJ)
+                    PJ = PJ + 1
+                    NVI = NV (I)
+                    IF (NVI .GT. 0) THEN
+
+C                      -------------------------------------------------
+C                      compress iw, if necessary
+C                      -------------------------------------------------
+
+                       IF (PFREE .GT. IWLEN) THEN
+C                         prepare for compressing iw by adjusting
+C                         pointers and lengths so that the lists being
+C                         searched in the inner and outer loops contain
+C                         only the remaining entries.
+
+                          PE (ME) = P
+                          LEN (ME) = LEN (ME) - KNT1
+                          IF (LEN (ME) .EQ. 0) THEN
+C                            nothing left of supervariable me
+                             PE (ME) = 0
+                             ENDIF
+                          PE (E) = PJ
+                          LEN (E) = LN - KNT2
+                          IF (LEN (E) .EQ. 0) THEN
+C                            nothing left of element e
+                             PE (E) = 0
+                             ENDIF
+
+                          NCMPA = NCMPA + 1
+C                         store first item in pe
+C                         set first entry to -item
+                          DO 70 J = 1, N
+                             PN = PE (J)
+                             IF (PN .GT. 0) THEN
+                                PE (J) = IW (PN)
+                                IW (PN) = -J
+                                ENDIF
+70                           CONTINUE
+
+C                         psrc/pdst point to source/destination
+                          PDST = 1
+                          PSRC = 1
+                          PEND = PME1 - 1
+
+C                         while loop:
+80                        CONTINUE
+                          IF (PSRC .LE. PEND) THEN
+C                            search for next negative entry
+                             J = -IW (PSRC)
+                             PSRC = PSRC + 1
+                             IF (J .GT. 0) THEN
+                                IW (PDST) = PE (J)
+                                PE (J) = PDST
+                                PDST = PDST + 1
+C                               copy from source to destination
+                                LENJ = LEN (J)
+                                DO 90 KNT3 = 0, LENJ - 2
+                                   IW (PDST + KNT3) = IW (PSRC + KNT3)
+90                                 CONTINUE
+                                PDST = PDST + LENJ - 1
+                                PSRC = PSRC + LENJ - 1
+                                ENDIF
+                             GOTO 80
+                             ENDIF
+
+C                         move the new partially-constructed element
+                          P1 = PDST
+                          DO 100 PSRC = PME1, PFREE - 1
+                             IW (PDST) = IW (PSRC)
+                             PDST = PDST + 1
+100                          CONTINUE
+                          PME1 = P1
+                          PFREE = PDST
+                          PJ = PE (E)
+                          P = PE (ME)
+                          ENDIF
+
+C                      -------------------------------------------------
+C                      i is a principal variable not yet placed in Lme
+C                      store i in new list
+C                      -------------------------------------------------
+
+                       DEGME = DEGME + NVI
+C                      flag i as being in Lme by negating nv (i)
+                       NV (I) = -NVI
+                       IW (PFREE) = I
+                       PFREE = PFREE + 1
+
+C                      -------------------------------------------------
+C                      remove variable i from degree link list
+C                      -------------------------------------------------
+
+                       ILAST = LAST (I)
+                       INEXT = NEXT (I)
+                       IF (INEXT .NE. 0) LAST (INEXT) = ILAST
+                       IF (ILAST .NE. 0) THEN
+                          NEXT (ILAST) = INEXT
+                       ELSE
+C                         i is at the head of the degree list
+                          HEAD (DEGREE (I)) = INEXT
+                          ENDIF
+
+                       ENDIF
+110                 CONTINUE
+
+                 IF (E .NE. ME) THEN
+C                   set tree pointer and flag to indicate element e is
+C                   absorbed into new element me (the parent of e is me)
+                    PE (E) = -ME
+                    W (E) = 0
+                    ENDIF
+120              CONTINUE
+
+              PME2 = PFREE - 1
+C             this element takes newmem new memory in iw (possibly zero)
+              NEWMEM = PFREE - PME1
+              MEM = MEM + NEWMEM
+              MAXMEM = MAX (MAXMEM, MEM)
+              ENDIF
+
+C          -------------------------------------------------------------
+C          me has now been converted into an element in iw (pme1..pme2)
+C          -------------------------------------------------------------
+
+C          degme holds the external degree of new element
+           DEGREE (ME) = DEGME
+           PE (ME) = PME1
+           LEN (ME) = PME2 - PME1 + 1
+
+C          -------------------------------------------------------------
+C          make sure that wflg is not too large.  With the current
+C          value of wflg, wflg+n must not cause integer overflow
+C          -------------------------------------------------------------
+
+           IF (WFLG + N .LE. WFLG) THEN
+              DO 130 X = 1, N
+                 IF (W (X) .NE. 0) W (X) = 1
+130              CONTINUE
+              WFLG = 2
+              ENDIF
+
+C=======================================================================
+C  COMPUTE (w (e) - wflg) = |Le\Lme| FOR ALL ELEMENTS
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          Scan 1:  compute the external degrees of previous elements
+C          with respect to the current element.  That is:
+C               (w (e) - wflg) = |Le \ Lme|
+C          for each element e that appears in any supervariable in Lme.
+C          The notation Le refers to the pattern (list of
+C          supervariables) of a previous element e, where e is not yet
+C          absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))).
+C          The notation Lme refers to the pattern of the current element
+C          (stored in iw (pme1..pme2)).   If (w (e) - wflg) becomes
+C          zero, then the element e will be absorbed in scan 2.
+C          -------------------------------------------------------------
+
+           DO 150 PME = PME1, PME2
+              I = IW (PME)
+              ELN = ELEN (I)
+              IF (ELN .GT. 0) THEN
+C                note that nv (i) has been negated to denote i in Lme:
+                 NVI = -NV (I)
+                 WNVI = WFLG - NVI
+                 DO 140 P = PE (I), PE (I) + ELN - 1
+                    E = IW (P)
+                    WE = W (E)
+                    IF (WE .GE. WFLG) THEN
+C                      unabsorbed element e has been seen in this loop
+                       WE = WE - NVI
+                    ELSE IF (WE .NE. 0) THEN
+C                      e is an unabsorbed element
+C                      this is the first we have seen e in all of Scan 1
+                       WE = DEGREE (E) + WNVI
+                       ENDIF
+                    W (E) = WE
+140                 CONTINUE
+                 ENDIF
+150           CONTINUE
+
+C=======================================================================
+C  DEGREE UPDATE AND ELEMENT ABSORPTION
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          Scan 2:  for each i in Lme, sum up the degree of Lme (which
+C          is degme), plus the sum of the external degrees of each Le
+C          for the elements e appearing within i, plus the
+C          supervariables in i.  Place i in hash list.
+C          -------------------------------------------------------------
+
+           DO 180 PME = PME1, PME2
+              I = IW (PME)
+              P1 = PE (I)
+              P2 = P1 + ELEN (I) - 1
+              PN = P1
+              HASH = 0
+              DEG = 0
+
+C             ----------------------------------------------------------
+C             scan the element list associated with supervariable i
+C             ----------------------------------------------------------
+
+              DO 160 P = P1, P2
+                 E = IW (P)
+C                dext = | Le \ Lme |
+                 DEXT = W (E) - WFLG
+                 IF (DEXT .GT. 0) THEN
+                    DEG = DEG + DEXT
+                    IW (PN) = E
+                    PN = PN + 1
+                    HASH = HASH + E
+                 ELSE IF (DEXT .EQ. 0) THEN
+C                   aggressive absorption: e is not adjacent to me, but
+C                   the |Le \ Lme| is 0, so absorb it into me
+                    PE (E) = -ME
+                    W (E) = 0
+                 ELSE
+C                   element e has already been absorbed, due to
+C                   regular absorption, in do loop 120 above. Ignore it.
+                    CONTINUE
+                    ENDIF
+160              CONTINUE
+
+C             count the number of elements in i (including me):
+              ELEN (I) = PN - P1 + 1
+
+C             ----------------------------------------------------------
+C             scan the supervariables in the list associated with i
+C             ----------------------------------------------------------
+
+              P3 = PN
+              DO 170 P = P2 + 1, P1 + LEN (I) - 1
+                 J = IW (P)
+                 NVJ = NV (J)
+                 IF (NVJ .GT. 0) THEN
+C                   j is unabsorbed, and not in Lme.
+C                   add to degree and add to new list
+                    DEG = DEG + NVJ
+                    IW (PN) = J
+                    PN = PN + 1
+                    HASH = HASH + J
+                    ENDIF
+170              CONTINUE
+
+C             ----------------------------------------------------------
+C             update the degree and check for mass elimination
+C             ----------------------------------------------------------
+
+              IF (DEG .EQ. 0) THEN
+
+C                -------------------------------------------------------
+C                mass elimination
+C                -------------------------------------------------------
+
+C                There is nothing left of this node except for an
+C                edge to the current pivot element.  elen (i) is 1,
+C                and there are no variables adjacent to node i.
+C                Absorb i into the current pivot element, me.
+
+                 PE (I) = -ME
+                 NVI = -NV (I)
+                 DEGME = DEGME - NVI
+                 NVPIV = NVPIV + NVI
+                 NEL = NEL + NVI
+                 NV (I) = 0
+                 ELEN (I) = 0
+
+              ELSE
+
+C                -------------------------------------------------------
+C                update the upper-bound degree of i
+C                -------------------------------------------------------
+
+C                the following degree does not yet include the size
+C                of the current element, which is added later:
+                 DEGREE (I) = MIN (DEGREE (I), DEG)
+
+C                -------------------------------------------------------
+C                add me to the list for i
+C                -------------------------------------------------------
+
+C                move first supervariable to end of list
+                 IW (PN) = IW (P3)
+C                move first element to end of element part of list
+                 IW (P3) = IW (P1)
+C                add new element to front of list.
+                 IW (P1) = ME
+C                store the new length of the list in len (i)
+                 LEN (I) = PN - P1 + 1
+
+C                -------------------------------------------------------
+C                place in hash bucket.  Save hash key of i in last (i).
+C                -------------------------------------------------------
+
+                 HASH = MOD (HASH, HMOD) + 1
+                 J = HEAD (HASH)
+                 IF (J .LE. 0) THEN
+C                   the degree list is empty, hash head is -j
+                    NEXT (I) = -J
+                    HEAD (HASH) = -I
+                 ELSE
+C                   degree list is not empty
+C                   use last (head (hash)) as hash head
+                    NEXT (I) = LAST (J)
+                    LAST (J) = I
+                    ENDIF
+                 LAST (I) = HASH
+                 ENDIF
+180           CONTINUE
+
+           DEGREE (ME) = DEGME
+
+C          -------------------------------------------------------------
+C          Clear the counter array, w (...), by incrementing wflg.
+C          -------------------------------------------------------------
+
+           DMAX = MAX (DMAX, DEGME)
+           WFLG = WFLG + DMAX
+
+C          make sure that wflg+n does not cause integer overflow
+           IF (WFLG + N .LE. WFLG) THEN
+              DO 190 X = 1, N
+                 IF (W (X) .NE. 0) W (X) = 1
+190              CONTINUE
+              WFLG = 2
+              ENDIF
+C          at this point, w (1..n) .lt. wflg holds
+
+C=======================================================================
+C  SUPERVARIABLE DETECTION
+C=======================================================================
+
+           DO 250 PME = PME1, PME2
+              I = IW (PME)
+              IF (NV (I) .LT. 0) THEN
+C                i is a principal variable in Lme
+
+C                -------------------------------------------------------
+C                examine all hash buckets with 2 or more variables.  We
+C                do this by examing all unique hash keys for super-
+C                variables in the pattern Lme of the current element, me
+C                -------------------------------------------------------
+
+                 HASH = LAST (I)
+C                let i = head of hash bucket, and empty the hash bucket
+                 J = HEAD (HASH)
+                 IF (J .EQ. 0) GOTO 250
+                 IF (J .LT. 0) THEN
+C                   degree list is empty
+                    I = -J
+                    HEAD (HASH) = 0
+                 ELSE
+C                   degree list is not empty, restore last () of head
+                    I = LAST (J)
+                    LAST (J) = 0
+                    ENDIF
+                 IF (I .EQ. 0) GOTO 250
+
+C                while loop:
+200              CONTINUE
+                 IF (NEXT (I) .NE. 0) THEN
+
+C                   ----------------------------------------------------
+C                   this bucket has one or more variables following i.
+C                   scan all of them to see if i can absorb any entries
+C                   that follow i in hash bucket.  Scatter i into w.
+C                   ----------------------------------------------------
+
+                    LN = LEN (I)
+                    ELN = ELEN (I)
+C                   do not flag the first element in the list (me)
+                    DO 210 P = PE (I) + 1, PE (I) + LN - 1
+                       W (IW (P)) = WFLG
+210                    CONTINUE
+
+C                   ----------------------------------------------------
+C                   scan every other entry j following i in bucket
+C                   ----------------------------------------------------
+
+                    JLAST = I
+                    J = NEXT (I)
+
+C                   while loop:
+220                 CONTINUE
+                    IF (J .NE. 0) THEN
+
+C                      -------------------------------------------------
+C                      check if j and i have identical nonzero pattern
+C                      -------------------------------------------------
+
+                       IF (LEN (J) .NE. LN) THEN
+C                         i and j do not have same size data structure
+                          GOTO 240
+                          ENDIF
+                       IF (ELEN (J) .NE. ELN) THEN
+C                         i and j do not have same number of adjacent el
+                          GOTO 240
+                          ENDIF
+C                      do not flag the first element in the list (me)
+                       DO 230 P = PE (J) + 1, PE (J) + LN - 1
+                          IF (W (IW (P)) .NE. WFLG) THEN
+C                            an entry (iw(p)) is in j but not in i
+                             GOTO 240
+                             ENDIF
+230                       CONTINUE
+
+C                      -------------------------------------------------
+C                      found it!  j can be absorbed into i
+C                      -------------------------------------------------
+
+                       PE (J) = -I
+C                      both nv (i) and nv (j) are negated since they
+C                      are in Lme, and the absolute values of each
+C                      are the number of variables in i and j:
+                       NV (I) = NV (I) + NV (J)
+                       NV (J) = 0
+                       ELEN (J) = 0
+C                      delete j from hash bucket
+                       J = NEXT (J)
+                       NEXT (JLAST) = J
+                       GOTO 220
+
+C                      -------------------------------------------------
+240                    CONTINUE
+C                      j cannot be absorbed into i
+C                      -------------------------------------------------
+
+                       JLAST = J
+                       J = NEXT (J)
+                       GOTO 220
+                       ENDIF
+
+C                   ----------------------------------------------------
+C                   no more variables can be absorbed into i
+C                   go to next i in bucket and clear flag array
+C                   ----------------------------------------------------
+
+                    WFLG = WFLG + 1
+                    I = NEXT (I)
+                    IF (I .NE. 0) GOTO 200
+                    ENDIF
+                 ENDIF
+250           CONTINUE
+
+C=======================================================================
+C  RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT
+C=======================================================================
+
+           P = PME1
+           NLEFT = N - NEL
+           DO 260 PME = PME1, PME2
+              I = IW (PME)
+              NVI = -NV (I)
+              IF (NVI .GT. 0) THEN
+C                i is a principal variable in Lme
+C                restore nv (i) to signify that i is principal
+                 NV (I) = NVI
+
+C                -------------------------------------------------------
+C                compute the external degree (add size of current elem)
+C                -------------------------------------------------------
+
+                 DEG = MIN (DEGREE (I) + DEGME - NVI, NLEFT - NVI)
+
+C                -------------------------------------------------------
+C                place the supervariable at the head of the degree list
+C                -------------------------------------------------------
+
+                 INEXT = HEAD (DEG)
+                 IF (INEXT .NE. 0) LAST (INEXT) = I
+                 NEXT (I) = INEXT
+                 LAST (I) = 0
+                 HEAD (DEG) = I
+
+C                -------------------------------------------------------
+C                save the new degree, and find the minimum degree
+C                -------------------------------------------------------
+
+                 MINDEG = MIN (MINDEG, DEG)
+                 DEGREE (I) = DEG
+
+C                -------------------------------------------------------
+C                place the supervariable in the element pattern
+C                -------------------------------------------------------
+
+                 IW (P) = I
+                 P = P + 1
+                 ENDIF
+260           CONTINUE
+
+C=======================================================================
+C  FINALIZE THE NEW ELEMENT
+C=======================================================================
+
+           NV (ME) = NVPIV + DEGME
+C          nv (me) is now the degree of pivot (including diagonal part)
+C          save the length of the list for the new element me
+           LEN (ME) = P - PME1
+           IF (LEN (ME) .EQ. 0) THEN
+C             there is nothing left of the current pivot element
+              PE (ME) = 0
+              W (ME) = 0
+              ENDIF
+           IF (NEWMEM .NE. 0) THEN
+C             element was not constructed in place: deallocate part
+C             of it (final size is less than or equal to newmem,
+C             since newly nonprincipal variables have been removed).
+              PFREE = P
+              MEM = MEM - NEWMEM + LEN (ME)
+              ENDIF
+
+C=======================================================================
+C          END WHILE (selecting pivots)
+           GOTO 30
+           ENDIF
+C=======================================================================
+
+C=======================================================================
+C  COMPUTE THE PERMUTATION VECTORS
+C=======================================================================
+
+C       ----------------------------------------------------------------
+C       The time taken by the following code is O(n).  At this
+C       point, elen (e) = -k has been done for all elements e,
+C       and elen (i) = 0 has been done for all nonprincipal
+C       variables i.  At this point, there are no principal
+C       supervariables left, and all elements are absorbed.
+C       ----------------------------------------------------------------
+
+C       ----------------------------------------------------------------
+C       compute the ordering of unordered nonprincipal variables
+C       ----------------------------------------------------------------
+
+        DO 290 I = 1, N
+           IF (ELEN (I) .EQ. 0) THEN
+
+C             ----------------------------------------------------------
+C             i is an un-ordered row.  Traverse the tree from i until
+C             reaching an element, e.  The element, e, was the
+C             principal supervariable of i and all nodes in the path
+C             from i to when e was selected as pivot.
+C             ----------------------------------------------------------
+
+              J = -PE (I)
+C             while (j is a variable) do:
+270           CONTINUE
+              IF (ELEN (J) .GE. 0) THEN
+                 J = -PE (J)
+                 GOTO 270
+                 ENDIF
+              E = J
+
+C             ----------------------------------------------------------
+C             get the current pivot ordering of e
+C             ----------------------------------------------------------
+
+              K = -ELEN (E)
+
+C             ----------------------------------------------------------
+C             traverse the path again from i to e, and compress the
+C             path (all nodes point to e).  Path compression allows
+C             this code to compute in O(n) time.  Order the unordered
+C             nodes in the path, and place the element e at the end.
+C             ----------------------------------------------------------
+
+              J = I
+C             while (j is a variable) do:
+280           CONTINUE
+              IF (ELEN (J) .GE. 0) THEN
+                 JNEXT = -PE (J)
+                 PE (J) = -E
+                 IF (ELEN (J) .EQ. 0) THEN
+C                   j is an unordered row
+                    ELEN (J) = K
+                    K = K + 1
+                    ENDIF
+                 J = JNEXT
+                 GOTO 280
+                 ENDIF
+C             leave elen (e) negative, so we know it is an element
+              ELEN (E) = -K
+              ENDIF
+290        CONTINUE
+
+C       ----------------------------------------------------------------
+C       reset the inverse permutation (elen (1..n)) to be positive,
+C       and compute the permutation (last (1..n)).
+C       ----------------------------------------------------------------
+
+        DO 300 I = 1, N
+           K = ABS (ELEN (I))
+           LAST (K) = I
+           ELEN (I) = K
+300        CONTINUE
+
+C=======================================================================
+C  RETURN THE MEMORY USAGE IN IW
+C=======================================================================
+
+C       If maxmem is less than or equal to iwlen, then no compressions
+C       occurred, and iw (maxmem+1 ... iwlen) was unused.  Otherwise
+C       compressions did occur, and iwlen would have had to have been
+C       greater than or equal to maxmem for no compressions to occur.
+C       Return the value of maxmem in the pfree argument.
+
+        PFREE = MAXMEM
+
+        RETURN
+        END
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_1.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,181 @@
+/* ========================================================================= */
+/* === AMD_1 =============================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* AMD_1: Construct A+A' for a sparse matrix A and perform the AMD ordering.
+ *
+ * The n-by-n sparse matrix A can be unsymmetric.  It is stored in MATLAB-style
+ * compressed-column form, with sorted row indices in each column, and no
+ * duplicate entries.  Diagonal entries may be present, but they are ignored.
+ * Row indices of column j of A are stored in Ai [Ap [j] ... Ap [j+1]-1].
+ * Ap [0] must be zero, and nz = Ap [n] is the number of entries in A.  The
+ * size of the matrix, n, must be greater than or equal to zero.
+ *
+ * This routine must be preceded by a call to AMD_aat, which computes the
+ * number of entries in each row/column in A+A', excluding the diagonal.
+ * Len [j], on input, is the number of entries in row/column j of A+A'.  This
+ * routine constructs the matrix A+A' and then calls AMD_2.  No error checking
+ * is performed (this was done in AMD_aat).
+ */
+
+#include "amd_internal.h"
+
+GLOBAL void AMD_1
+(
+    Int n,		/* n > 0 */
+    const Int Ap [ ],	/* input of size n+1, not modified */
+    const Int Ai [ ],	/* input of size nz = Ap [n], not modified */
+    Int P [ ],		/* size n output permutation */
+    Int Pinv [ ],	/* size n output inverse permutation */
+    Int Len [ ],	/* size n input, undefined on output */
+    Int slen,		/* slen >= sum (Len [0..n-1]) + 7n,
+			 * ideally slen = 1.2 * sum (Len) + 8n */
+    Int S [ ],		/* size slen workspace */
+    double Control [ ],	/* input array of size AMD_CONTROL */
+    double Info [ ]	/* output array of size AMD_INFO */
+)
+{
+    Int i, j, k, p, pfree, iwlen, pj, p1, p2, pj2, *Iw, *Pe, *Nv, *Head,
+	*Elen, *Degree, *s, *W, *Sp, *Tp ;
+
+    /* --------------------------------------------------------------------- */
+    /* construct the matrix for AMD_2 */
+    /* --------------------------------------------------------------------- */
+
+    ASSERT (n > 0) ;
+
+    iwlen = slen - 6*n ;
+    s = S ;
+    Pe = s ;	    s += n ;
+    Nv = s ;	    s += n ;
+    Head = s ;	    s += n ;
+    Elen = s ;	    s += n ;
+    Degree = s ;    s += n ;
+    W = s ;	    s += n ;
+    Iw = s ;	    s += iwlen ;
+
+    ASSERT (AMD_valid (n, n, Ap, Ai)) ;
+
+    /* construct the pointers for A+A' */
+    Sp = Nv ;			/* use Nv and W as workspace for Sp and Tp [ */
+    Tp = W ;
+    pfree = 0 ;
+    for (j = 0 ; j < n ; j++)
+    {
+	Pe [j] = pfree ;
+	Sp [j] = pfree ;
+	pfree += Len [j] ;
+    }
+
+    /* Note that this restriction on iwlen is slightly more restrictive than
+     * what is strictly required in AMD_2.  AMD_2 can operate with no elbow
+     * room at all, but it will be very slow.  For better performance, at
+     * least size-n elbow room is enforced. */
+    ASSERT (iwlen >= pfree + n) ;
+
+#ifndef NDEBUG
+    for (p = 0 ; p < iwlen ; p++) Iw [p] = EMPTY ;
+#endif
+
+    for (k = 0 ; k < n ; k++)
+    {
+	AMD_DEBUG1 (("Construct row/column k= "ID" of A+A'\n", k))  ;
+	p1 = Ap [k] ;
+	p2 = Ap [k+1] ;
+
+	/* construct A+A' */
+	for (p = p1 ; p < p2 ; )
+	{
+	    /* scan the upper triangular part of A */
+	    j = Ai [p] ;
+	    ASSERT (j >= 0 && j < n) ;
+	    if (j < k)
+	    {
+		/* entry A (j,k) in the strictly upper triangular part */
+		ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ;
+		ASSERT (Sp [k] < (k == n-1 ? pfree : Pe [k+1])) ;
+		Iw [Sp [j]++] = k ;
+		Iw [Sp [k]++] = j ;
+		p++ ;
+	    }
+	    else if (j == k)
+	    {
+		/* skip the diagonal */
+		p++ ;
+		break ;
+	    }
+	    else /* j > k */
+	    {
+		/* first entry below the diagonal */
+		break ;
+	    }
+	    /* scan lower triangular part of A, in column j until reaching
+	     * row k.  Start where last scan left off. */
+	    ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ;
+	    pj2 = Ap [j+1] ;
+	    for (pj = Tp [j] ; pj < pj2 ; )
+	    {
+		i = Ai [pj] ;
+		ASSERT (i >= 0 && i < n) ;
+		if (i < k)
+		{
+		    /* A (i,j) is only in the lower part, not in upper */
+		    ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ;
+		    ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ;
+		    Iw [Sp [i]++] = j ;
+		    Iw [Sp [j]++] = i ;
+		    pj++ ;
+		}
+		else if (i == k)
+		{
+		    /* entry A (k,j) in lower part and A (j,k) in upper */
+		    pj++ ;
+		    break ;
+		}
+		else /* i > k */
+		{
+		    /* consider this entry later, when k advances to i */
+		    break ;
+		}
+	    }
+	    Tp [j] = pj ;
+	}
+	Tp [k] = p ;
+    }
+
+    /* clean up, for remaining mismatched entries */
+    for (j = 0 ; j < n ; j++)
+    {
+	for (pj = Tp [j] ; pj < Ap [j+1] ; pj++)
+	{
+	    i = Ai [pj] ;
+	    ASSERT (i >= 0 && i < n) ;
+	    /* A (i,j) is only in the lower part, not in upper */
+	    ASSERT (Sp [i] < (i == n-1 ? pfree : Pe [i+1])) ;
+	    ASSERT (Sp [j] < (j == n-1 ? pfree : Pe [j+1])) ;
+	    Iw [Sp [i]++] = j ;
+	    Iw [Sp [j]++] = i ;
+	}
+    }
+
+#ifndef NDEBUG
+    for (j = 0 ; j < n-1 ; j++) ASSERT (Sp [j] == Pe [j+1]) ;
+    ASSERT (Sp [n-1] == pfree) ;
+#endif
+
+    /* Tp and Sp no longer needed ] */
+
+    /* --------------------------------------------------------------------- */
+    /* order the matrix */
+    /* --------------------------------------------------------------------- */
+
+    AMD_2 (n, Pe, Iw, Len, iwlen, pfree,
+	Nv, Pinv, P, Head, Elen, Degree, W, Control, Info) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_2.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1823 @@
+/* ========================================================================= */
+/* === AMD_2 =============================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* AMD_2:  performs the AMD ordering on a symmetric sparse matrix A, followed
+ * by a postordering (via depth-first search) of the assembly tree using the
+ * AMD_postorder routine.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL void AMD_2
+(
+    Int n,		/* A is n-by-n, where n > 0 */
+    Int Pe [ ],		/* Pe [0..n-1]: index in Iw of row i on input */
+    Int Iw [ ],		/* workspace of size iwlen. Iw [0..pfree-1]
+			 * holds the matrix on input */
+    Int Len [ ],	/* Len [0..n-1]: length for row/column i on input */
+    Int iwlen,		/* length of Iw. iwlen >= pfree + n */
+    Int pfree,		/* Iw [pfree ... iwlen-1] is empty on input */
+
+    /* 7 size-n workspaces, not defined on input: */
+    Int Nv [ ],		/* the size of each supernode on output */
+    Int Next [ ],	/* the output inverse permutation */
+    Int Last [ ],	/* the output permutation */
+    Int Head [ ],
+    Int Elen [ ],	/* the size columns of L for each supernode */
+    Int Degree [ ],
+    Int W [ ],
+
+    /* control parameters and output statistics */
+    double Control [ ],	/* array of size AMD_CONTROL */
+    double Info [ ]	/* array of size AMD_INFO */
+)
+{
+
+/*
+ * Given a representation of the nonzero pattern of a symmetric matrix, A, 
+ * (excluding the diagonal) perform an approximate minimum (UMFPACK/MA38-style)
+ * degree ordering to compute a pivot order such that the introduction of
+ * nonzeros (fill-in) in the Cholesky factors A = LL' is kept low.  At each
+ * step, the pivot selected is the one with the minimum UMFAPACK/MA38-style
+ * upper-bound on the external degree.  This routine can optionally perform
+ * aggresive absorption (as done by MC47B in the Harwell Subroutine
+ * Library).
+ * 
+ * The approximate degree algorithm implemented here is the symmetric analog of
+ * the degree update algorithm in MA38 and UMFPACK (the Unsymmetric-pattern
+ * MultiFrontal PACKage, both by Davis and Duff).  The routine is based on the
+ * MA27 minimum degree ordering algorithm by Iain Duff and John Reid.
+ * 
+ * This routine is a translation of the original AMDBAR and MC47B routines,
+ * in Fortran, with the following modifications:
+ * 
+ * (1) dense rows/columns are removed prior to ordering the matrix, and placed
+ *	last in the output order.  The presence of a dense row/column can
+ *	increase the ordering time by up to O(n^2), unless they are removed
+ *	prior to ordering.
+ *
+ * (2) the minimum degree ordering is followed by a postordering (depth-first
+ *	search) of the assembly tree.  Note that mass elimination (discussed
+ *	below) combined with the approximate degree update can lead to the mass
+ *	elimination of nodes with lower exact degree than the current pivot
+ *	element.  No additional fill-in is caused in the representation of the
+ *	Schur complement.  The mass-eliminated nodes merge with the current
+ *	pivot element.  They are ordered prior to the current pivot element.
+ *	Because they can have lower exact degree than the current element, the
+ *	merger of two or more of these nodes in the current pivot element can
+ *	lead to a single element that is not a "fundamental supernode".  The
+ *	diagonal block can have zeros in it.  Thus, the assembly tree used here
+ *	is not guaranteed to be the precise supernodal elemination tree (with
+ *	"funadmental" supernodes), and the postordering performed by this
+ *	routine is not guaranteed to be a precise postordering of the
+ *	elimination tree.
+ *
+ * (3) input parameters are added, to control aggressive absorption and the
+ *	detection of "dense" rows/columns of A.
+ *
+ * (4) additional statistical information is returned, such as the number of
+ *	nonzeros in L, and the flop counts for subsequent LDL' and LU
+ *	factorizations.  These are slight upper bounds, because of the mass
+ *	elimination issue discussed above.
+ *
+ * (5) additional routines are added to interface this routine to MATLAB
+ *	to provide a simple C-callable user-interface, to check inputs for
+ *	errors, compute the symmetry of the pattern of A and the number of
+ *	nonzeros in each row/column of A+A', to compute the pattern of A+A',
+ *	to perform the assembly tree postordering, and to provide debugging
+ *	ouput.  Many of these functions are also provided by the Fortran
+ *	Harwell Subroutine Library routine MC47A.
+ *
+ * (6) both "int" and "long" versions are provided.  In the descriptions below
+ *	and integer is and "int" or "long", depending on which version is
+ *	being used.
+
+ **********************************************************************
+ ***** CAUTION:  ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT.  ******
+ **********************************************************************
+ ** If you want error checking, a more versatile input format, and a **
+ ** simpler user interface, use amd_order or amd_l_order instead.    **
+ ** This routine is not meant to be user-callable.                   **
+ **********************************************************************
+
+ * ----------------------------------------------------------------------------
+ * References:
+ * ----------------------------------------------------------------------------
+ *
+ *  [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern multifrontal
+ *	method for sparse LU factorization", SIAM J. Matrix Analysis and
+ *	Applications, vol. 18, no. 1, pp. 140-158.  Discusses UMFPACK / MA38,
+ *	which first introduced the approximate minimum degree used by this
+ *	routine.
+ *
+ *  [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An approximate
+ *	minimum degree ordering algorithm," SIAM J. Matrix Analysis and
+ *	Applications, vol. 17, no. 4, pp. 886-905, 1996.  Discusses AMDBAR and
+ *	MC47B, which are the Fortran versions of this routine.
+ *
+ *  [3] Alan George and Joseph Liu, "The evolution of the minimum degree
+ *	ordering algorithm," SIAM Review, vol. 31, no. 1, pp. 1-19, 1989.
+ *	We list below the features mentioned in that paper that this code
+ *	includes:
+ *
+ *	mass elimination:
+ *	    Yes.  MA27 relied on supervariable detection for mass elimination.
+ *
+ *	indistinguishable nodes:
+ *	    Yes (we call these "supervariables").  This was also in the MA27
+ *	    code - although we modified the method of detecting them (the
+ *	    previous hash was the true degree, which we no longer keep track
+ *	    of).  A supervariable is a set of rows with identical nonzero
+ *	    pattern.  All variables in a supervariable are eliminated together.
+ *	    Each supervariable has as its numerical name that of one of its
+ *	    variables (its principal variable).
+ *
+ *	quotient graph representation:
+ *	    Yes.  We use the term "element" for the cliques formed during
+ *	    elimination.  This was also in the MA27 code.  The algorithm can
+ *	    operate in place, but it will work more efficiently if given some
+ *	    "elbow room."
+ *
+ *	element absorption:
+ *	    Yes.  This was also in the MA27 code.
+ *
+ *	external degree:
+ *	    Yes.  The MA27 code was based on the true degree.
+ *
+ *	incomplete degree update and multiple elimination:
+ *	    No.  This was not in MA27, either.  Our method of degree update
+ *	    within MC47B is element-based, not variable-based.  It is thus
+ *	    not well-suited for use with incomplete degree update or multiple
+ *	    elimination.
+ *
+ * Authors, and Copyright (C) 2004 by:
+ * Timothy A. Davis, Patrick Amestoy, Iain S. Duff, John K. Reid.
+ *
+ * Acknowledgements: This work (and the UMFPACK package) was supported by the
+ * National Science Foundation (ASC-9111263, DMS-9223088, and CCR-0203270).
+ * The UMFPACK/MA38 approximate degree update algorithm, the unsymmetric analog
+ * which forms the basis of AMD, was developed while Tim Davis was supported by
+ * CERFACS (Toulouse, France) in a post-doctoral position.  This C version, and
+ * the etree postorder, were written while Tim Davis was on sabbatical at
+ * Stanford University and Lawrence Berkeley National Laboratory.
+
+ * ----------------------------------------------------------------------------
+ * INPUT ARGUMENTS (unaltered):
+ * ----------------------------------------------------------------------------
+ 
+ * n:  The matrix order.  Restriction:  n >= 1.
+ *
+ * iwlen:  The size of the Iw array.  On input, the matrix is stored in
+ *	Iw [0..pfree-1].  However, Iw [0..iwlen-1] should be slightly larger
+ *	than what is required to hold the matrix, at least iwlen >= pfree + n.
+ *	Otherwise, excessive compressions will take place.  The recommended
+ *	value of iwlen is 1.2 * pfree + n, which is the value used in the
+ *	user-callable interface to this routine (amd_order.c).  The algorithm
+ *	will not run at all if iwlen < pfree.  Restriction: iwlen >= pfree + n.
+ *	Note that this is slightly more restrictive than the actual minimum
+ *	(iwlen >= pfree), but AMD_2 will be very slow with no elbow room.
+ *	Thus, this routine enforces a bare minimum elbow room of size n.
+ *
+ * pfree: On input the tail end of the array, Iw [pfree..iwlen-1], is empty,
+ *	and the matrix is stored in Iw [0..pfree-1].  During execution,
+ *	additional data is placed in Iw, and pfree is modified so that
+ *	Iw [pfree..iwlen-1] is always the unused part of Iw.
+ *
+ * Control:  A double array of size AMD_CONTROL containing input parameters
+ *	that affect how the ordering is computed.  If NULL, then default
+ *	settings are used.
+ *
+ *	Control [AMD_DENSE] is used to determine whether or not a given input
+ *	row is "dense".  A row is "dense" if the number of entries in the row
+ *	exceeds Control [AMD_DENSE] times sqrt (n), except that rows with 16 or
+ *	fewer entries are never considered "dense".  To turn off the detection
+ *	of dense rows, set Control [AMD_DENSE] to a negative number, or to a
+ *	number larger than sqrt (n).  The default value of Control [AMD_DENSE]
+ *	is AMD_DEFAULT_DENSE, which is defined in amd.h as 10.
+ *
+ *	Control [AMD_AGGRESSIVE] is used to determine whether or not aggressive
+ *	absorption is to be performed.  If nonzero, then aggressive absorption
+ *	is performed (this is the default).
+
+ * ----------------------------------------------------------------------------
+ * INPUT/OUPUT ARGUMENTS:
+ * ----------------------------------------------------------------------------
+ *
+ * Pe:  An integer array of size n.  On input, Pe [i] is the index in Iw of
+ *	the start of row i.  Pe [i] is ignored if row i has no off-diagonal
+ *	entries.  Thus Pe [i] must be in the range 0 to pfree-1 for non-empty
+ *	rows.
+ *
+ *	During execution, it is used for both supervariables and elements:
+ *
+ *	Principal supervariable i:  index into Iw of the description of
+ *	    supervariable i.  A supervariable represents one or more rows of
+ *	    the matrix with identical nonzero pattern.  In this case,
+ *	    Pe [i] >= 0.
+ *
+ *	Non-principal supervariable i:  if i has been absorbed into another
+ *	    supervariable j, then Pe [i] = FLIP (j), where FLIP (j) is defined
+ *	    as (-(j)-2).  Row j has the same pattern as row i.  Note that j
+ *	    might later be absorbed into another supervariable j2, in which
+ *	    case Pe [i] is still FLIP (j), and Pe [j] = FLIP (j2) which is
+ *	    < EMPTY, where EMPTY is defined as (-1) in amd_internal.h.
+ *
+ *	Unabsorbed element e:  the index into Iw of the description of element
+ *	    e, if e has not yet been absorbed by a subsequent element.  Element
+ *	    e is created when the supervariable of the same name is selected as
+ *	    the pivot.  In this case, Pe [i] >= 0.
+ *
+ *	Absorbed element e:  if element e is absorbed into element e2, then
+ *	    Pe [e] = FLIP (e2).  This occurs when the pattern of e (which we
+ *	    refer to as Le) is found to be a subset of the pattern of e2 (that
+ *	    is, Le2).  In this case, Pe [i] < EMPTY.  If element e is "null"
+ *	    (it has no nonzeros outside its pivot block), then Pe [e] = EMPTY,
+ *	    and e is the root of an assembly subtree (or the whole tree if
+ *	    there is just one such root).
+ *
+ *	Dense variable i:  if i is "dense", then Pe [i] = EMPTY.
+ *
+ *	On output, Pe holds the assembly tree/forest, which implicitly
+ *	represents a pivot order with identical fill-in as the actual order
+ *	(via a depth-first search of the tree), as follows.  If Nv [i] > 0,
+ *	then i represents a node in the assembly tree, and the parent of i is
+ *	Pe [i], or EMPTY if i is a root.  If Nv [i] = 0, then (i, Pe [i])
+ *	represents an edge in a subtree, the root of which is a node in the
+ *	assembly tree.  Note that i refers to a row/column in the original
+ *	matrix, not the permuted matrix.
+ *
+ * Info:  A double array of size AMD_INFO.  If present, (that is, not NULL),
+ *	then statistics about the ordering are returned in the Info array.
+ *	See amd.h for a description.
+
+ * ----------------------------------------------------------------------------
+ * INPUT/MODIFIED (undefined on output):
+ * ----------------------------------------------------------------------------
+ *
+ * Len:  An integer array of size n.  On input, Len [i] holds the number of
+ *	entries in row i of the matrix, excluding the diagonal.  The contents
+ *	of Len are undefined on output.
+ *
+ * Iw:  An integer array of size iwlen.  On input, Iw [0..pfree-1] holds the
+ *	description of each row i in the matrix.  The matrix must be symmetric,
+ *	and both upper and lower triangular parts must be present.  The
+ *	diagonal must not be present.  Row i is held as follows:
+ *
+ *	    Len [i]:  the length of the row i data structure in the Iw array.
+ *	    Iw [Pe [i] ... Pe [i] + Len [i] - 1]:
+ *		the list of column indices for nonzeros in row i (simple
+ *		supervariables), excluding the diagonal.  All supervariables
+ *		start with one row/column each (supervariable i is just row i).
+ *		If Len [i] is zero on input, then Pe [i] is ignored on input.
+ *
+ *	    Note that the rows need not be in any particular order, and there
+ *	    may be empty space between the rows.
+ *
+ *	During execution, the supervariable i experiences fill-in.  This is
+ *	represented by placing in i a list of the elements that cause fill-in
+ *	in supervariable i:
+ *
+ *	    Len [i]:  the length of supervariable i in the Iw array.
+ *	    Iw [Pe [i] ... Pe [i] + Elen [i] - 1]:
+ *		the list of elements that contain i.  This list is kept short
+ *		by removing absorbed elements.
+ *	    Iw [Pe [i] + Elen [i] ... Pe [i] + Len [i] - 1]:
+ *		the list of supervariables in i.  This list is kept short by
+ *		removing nonprincipal variables, and any entry j that is also
+ *		contained in at least one of the elements (j in Le) in the list
+ *		for i (e in row i).
+ *
+ *	When supervariable i is selected as pivot, we create an element e of
+ *	the same name (e=i):
+ *
+ *	    Len [e]:  the length of element e in the Iw array.
+ *	    Iw [Pe [e] ... Pe [e] + Len [e] - 1]:
+ *		the list of supervariables in element e.
+ *
+ *	An element represents the fill-in that occurs when supervariable i is
+ *	selected as pivot (which represents the selection of row i and all
+ *	non-principal variables whose principal variable is i).  We use the
+ *	term Le to denote the set of all supervariables in element e.  Absorbed
+ *	supervariables and elements are pruned from these lists when
+ *	computationally convenient.
+ *
+ *  CAUTION:  THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION.
+ *  The contents of Iw are undefined on output.
+
+ * ----------------------------------------------------------------------------
+ * OUTPUT (need not be set on input):
+ * ----------------------------------------------------------------------------
+ *
+ * Nv:  An integer array of size n.  During execution, ABS (Nv [i]) is equal to
+ *	the number of rows that are represented by the principal supervariable
+ *	i.  If i is a nonprincipal or dense variable, then Nv [i] = 0.
+ *	Initially, Nv [i] = 1 for all i.  Nv [i] < 0 signifies that i is a
+ *	principal variable in the pattern Lme of the current pivot element me.
+ *	After element me is constructed, Nv [i] is set back to a positive
+ *	value.
+ *
+ *	On output, Nv [i] holds the number of pivots represented by super
+ *	row/column i of the original matrix, or Nv [i] = 0 for non-principal
+ *	rows/columns.  Note that i refers to a row/column in the original
+ *	matrix, not the permuted matrix.
+ *
+ * Elen:  An integer array of size n.  See the description of Iw above.  At the
+ *	start of execution, Elen [i] is set to zero for all rows i.  During
+ *	execution, Elen [i] is the number of elements in the list for
+ *	supervariable i.  When e becomes an element, Elen [e] = FLIP (esize) is
+ *	set, where esize is the size of the element (the number of pivots, plus
+ *	the number of nonpivotal entries).  Thus Elen [e] < EMPTY.
+ *	Elen (i) = EMPTY set when variable i becomes nonprincipal.
+ *
+ *	For variables, Elen (i) >= EMPTY holds until just before the
+ *	postordering and permutation vectors are computed.  For elements,
+ *	Elen [e] < EMPTY holds.
+ *
+ *	On output, Elen [i] is the degree of the row/column in the Cholesky
+ *	factorization of the permuted matrix, corresponding to the original row
+ *	i, if i is a super row/column.  It is equal to EMPTY if i is
+ *	non-principal.  Note that i refers to a row/column in the original
+ *	matrix, not the permuted matrix.
+ *
+ *	Note that the contents of Elen on output differ from the Fortran
+ *	version (Elen holds the inverse permutation in the Fortran version,
+ *	which is instead returned in the Next array in this C version,
+ *	described below).
+ *
+ * Last: In a degree list, Last [i] is the supervariable preceding i, or EMPTY
+ *	if i is the head of the list.  In a hash bucket, Last [i] is the hash
+ *	key for i.
+ *
+ *	Last [Head [hash]] is also used as the head of a hash bucket if
+ *	Head [hash] contains a degree list (see the description of Head,
+ *	below).
+ *
+ *	On output, Last [0..n-1] holds the permutation.  That is, if
+ *	i = Last [k], then row i is the kth pivot row (where k ranges from 0 to
+ *	n-1).  Row Last [k] of A is the kth row in the permuted matrix, PAP'.
+ *
+ * Next: Next [i] is the supervariable following i in a link list, or EMPTY if
+ *	i is the last in the list.  Used for two kinds of lists:  degree lists
+ *	and hash buckets (a supervariable can be in only one kind of list at a
+ *	time).
+ *
+ *	On output Next [0..n-1] holds the inverse permutation. 	That is, if
+ *	k = Next [i], then row i is the kth pivot row. Row i of A appears as
+ *	the (Next[i])-th row in the permuted matrix, PAP'.
+ *
+ *	Note that the contents of Next on output differ from the Fortran
+ *	version (Next is undefined on output in the Fortran version).
+
+ * ----------------------------------------------------------------------------
+ * LOCAL WORKSPACE (not input or output - used only during execution):
+ * ----------------------------------------------------------------------------
+ *
+ * Degree:  An integer array of size n.  If i is a supervariable, then
+ *	Degree [i] holds the current approximation of the external degree of
+ *	row i (an upper bound).  The external degree is the number of nonzeros
+ *	in row i, minus ABS (Nv [i]), the diagonal part.  The bound is equal to
+ *	the exact external degree if Elen [i] is less than or equal to two.
+ *
+ *	We also use the term "external degree" for elements e to refer to
+ *	|Le \ Lme|.  If e is an element, then Degree [e] is |Le|, which is the
+ *	degree of the off-diagonal part of the element e (not including the
+ *	diagonal part).
+ *
+ * Head:   An integer array of size n.  Head is used for degree lists.
+ *	Head [deg] is the first supervariable in a degree list.  All
+ *	supervariables i in a degree list Head [deg] have the same approximate
+ *	degree, namely, deg = Degree [i].  If the list Head [deg] is empty then
+ *	Head [deg] = EMPTY.
+ *
+ *	During supervariable detection Head [hash] also serves as a pointer to
+ *	a hash bucket.  If Head [hash] >= 0, there is a degree list of degree
+ *	hash.  The hash bucket head pointer is Last [Head [hash]].  If
+ *	Head [hash] = EMPTY, then the degree list and hash bucket are both
+ *	empty.  If Head [hash] < EMPTY, then the degree list is empty, and
+ *	FLIP (Head [hash]) is the head of the hash bucket.  After supervariable
+ *	detection is complete, all hash buckets are empty, and the
+ *	(Last [Head [hash]] = EMPTY) condition is restored for the non-empty
+ *	degree lists.
+ *
+ * W:  An integer array of size n.  The flag array W determines the status of
+ *	elements and variables, and the external degree of elements.
+ *
+ *	for elements:
+ *	    if W [e] = 0, then the element e is absorbed.
+ *	    if W [e] >= wflg, then W [e] - wflg is the size of the set
+ *		|Le \ Lme|, in terms of nonzeros (the sum of ABS (Nv [i]) for
+ *		each principal variable i that is both in the pattern of
+ *		element e and NOT in the pattern of the current pivot element,
+ *		me).
+ *	    if wflg > W [e] > 0, then e is not absorbed and has not yet been
+ *		seen in the scan of the element lists in the computation of
+ *		|Le\Lme| in Scan 1 below.
+ *
+ *	for variables:
+ *	    during supervariable detection, if W [j] != wflg then j is
+ *	    not in the pattern of variable i.
+ *
+ *	The W array is initialized by setting W [i] = 1 for all i, and by
+ *	setting wflg = 2.  It is reinitialized if wflg becomes too large (to
+ *	ensure that wflg+n does not cause integer overflow).
+
+ * ----------------------------------------------------------------------------
+ * LOCAL INTEGERS:
+ * ----------------------------------------------------------------------------
+ */
+
+    Int deg, degme, dext, lemax, e, elenme, eln, i, ilast, inext, j,
+	jlast, jnext, k, knt1, knt2, knt3, lenj, ln, me, mindeg, nel, nleft,
+	nvi, nvj, nvpiv, slenme, wbig, we, wflg, wnvi, x, ok, ndense, ncmpa,
+	dense, aggressive ;
+
+    unsigned Int hash ;	    /* unsigned, so that hash % n is well defined.*/
+
+/*
+ * deg:		the degree of a variable or element
+ * degme:	size, |Lme|, of the current element, me (= Degree [me])
+ * dext:	external degree, |Le \ Lme|, of some element e
+ * lemax:	largest |Le| seen so far (called dmax in Fortran version)
+ * e:		an element
+ * elenme:	the length, Elen [me], of element list of pivotal variable
+ * eln:		the length, Elen [...], of an element list
+ * hash:	the computed value of the hash function
+ * i:		a supervariable
+ * ilast:	the entry in a link list preceding i
+ * inext:	the entry in a link list following i
+ * j:		a supervariable
+ * jlast:	the entry in a link list preceding j
+ * jnext:	the entry in a link list, or path, following j
+ * k:		the pivot order of an element or variable
+ * knt1:	loop counter used during element construction
+ * knt2:	loop counter used during element construction
+ * knt3:	loop counter used during compression
+ * lenj:	Len [j]
+ * ln:		length of a supervariable list
+ * me:		current supervariable being eliminated, and the current
+ *		    element created by eliminating that supervariable
+ * mindeg:	current minimum degree
+ * nel:		number of pivots selected so far
+ * nleft:	n - nel, the number of nonpivotal rows/columns remaining
+ * nvi:		the number of variables in a supervariable i (= Nv [i])
+ * nvj:		the number of variables in a supervariable j (= Nv [j])
+ * nvpiv:	number of pivots in current element
+ * slenme:	number of variables in variable list of pivotal variable
+ * wbig:	= INT_MAX - n for the "int" version, LONG_MAX - n for the
+ *		    "long" version.  wflg is not allowed to be >= wbig.
+ * we:		W [e]
+ * wflg:	used for flagging the W array.  See description of Iw.
+ * wnvi:	wflg - Nv [i]
+ * x:		either a supervariable or an element
+ *
+ * ok:		true if supervariable j can be absorbed into i
+ * ndense:	number of "dense" rows/columns
+ * dense:	rows/columns with initial degree > dense are considered "dense"
+ * aggressive:	true if aggressive absorption is being performed
+ * ncmpa:	number of garbage collections
+
+ * ----------------------------------------------------------------------------
+ * LOCAL DOUBLES, used for statistical output only (except for alpha):
+ * ----------------------------------------------------------------------------
+ */
+
+    double f, r, ndiv, s, nms_lu, nms_ldl, dmax, alpha, lnz, lnzme ;
+
+/*
+ * f:		nvpiv
+ * r:		degme + nvpiv
+ * ndiv:	number of divisions for LU or LDL' factorizations
+ * s:		number of multiply-subtract pairs for LU factorization, for the
+ *		    current element me
+ * nms_lu	number of multiply-subtract pairs for LU factorization
+ * nms_ldl	number of multiply-subtract pairs for LDL' factorization
+ * dmax:	the largest number of entries in any column of L, including the
+ *		    diagonal
+ * alpha:	"dense" degree ratio
+ * lnz:		the number of nonzeros in L (excluding the diagonal)
+ * lnzme:	the number of nonzeros in L (excl. the diagonal) for the
+ *		    current element me
+
+ * ----------------------------------------------------------------------------
+ * LOCAL "POINTERS" (indices into the Iw array)
+ * ----------------------------------------------------------------------------
+*/
+
+    Int p, p1, p2, p3, p4, pdst, pend, pj, pme, pme1, pme2, pn, psrc ;
+
+/*
+ * Any parameter (Pe [...] or pfree) or local variable starting with "p" (for
+ * Pointer) is an index into Iw, and all indices into Iw use variables starting
+ * with "p."  The only exception to this rule is the iwlen input argument.
+ *
+ * p:           pointer into lots of things
+ * p1:          Pe [i] for some variable i (start of element list)
+ * p2:          Pe [i] + Elen [i] -  1 for some variable i
+ * p3:          index of first supervariable in clean list
+ * p4:		
+ * pdst:        destination pointer, for compression
+ * pend:        end of memory to compress
+ * pj:          pointer into an element or variable
+ * pme:         pointer into the current element (pme1...pme2)
+ * pme1:        the current element, me, is stored in Iw [pme1...pme2]
+ * pme2:        the end of the current element
+ * pn:          pointer into a "clean" variable, also used to compress
+ * psrc:        source pointer, for compression
+*/
+
+/* ========================================================================= */
+/*  INITIALIZATIONS */
+/* ========================================================================= */
+
+    /* Note that this restriction on iwlen is slightly more restrictive than
+     * what is actually required in AMD_2.  AMD_2 can operate with no elbow
+     * room at all, but it will be slow.  For better performance, at least
+     * size-n elbow room is enforced. */
+    ASSERT (iwlen >= pfree + n) ;
+    ASSERT (n > 0) ;
+
+    /* initialize output statistics */
+    lnz = 0 ;
+    ndiv = 0 ;
+    nms_lu = 0 ;
+    nms_ldl = 0 ;
+    dmax = 1 ;
+    me = EMPTY ;
+
+    wflg = 2 ;
+    mindeg = 0 ;
+    ncmpa = 0 ;
+    nel = 0 ;
+    lemax = 0 ;		/* this is called dmax in the Fortran version */
+
+#ifdef TEST_FOR_INTEGER_OVERFLOW
+    /* for testing only */
+    wbig = 3*n ;
+#else
+    /* normal operation */
+    wbig = Int_MAX - n ;
+#endif
+
+    /* get control parameters */
+    if (Control != (double *) NULL)
+    {
+	alpha = Control [AMD_DENSE] ;
+	aggressive = (Control [AMD_AGGRESSIVE] != 0) ;
+    }
+    else
+    {
+	alpha = AMD_DEFAULT_DENSE ;
+	aggressive = AMD_DEFAULT_AGGRESSIVE ;
+    }
+    if (alpha < 0)
+    {
+	/* no dense rows/columns */
+	dense = n ;
+    }
+    else
+    {
+	dense = alpha * sqrt ((double) n) ;
+    }
+    dense = MAX (16, dense) ;
+    dense = MIN (n,  dense) ;
+    AMD_DEBUG1 (("AMD (debug), alpha %g, aggr. "ID"\n", alpha, aggressive)) ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	Last [i] = EMPTY ;
+	Head [i] = EMPTY ;
+	Next [i] = EMPTY ;
+	/* if seperate Hhead array is used for hash buckets: *
+	Hhead [i] = EMPTY ;
+	*/
+	Nv [i] = 1 ;
+	W [i] = 1 ;
+	Elen [i] = 0 ;
+	Degree [i] = Len [i] ;
+    }
+
+#ifndef NDEBUG
+    AMD_DEBUG1 (("\n======Nel "ID"\n", nel)) ;
+    AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last,
+		Head, Elen, Degree, W, -1) ;
+#endif
+
+    /* --------------------------------------------------------------------- */
+    /* initialize degree lists and eliminate dense and empty rows */
+    /* --------------------------------------------------------------------- */
+
+    ndense = 0 ;
+
+    /* for (i = n-1 ; i >= 0 ; i--) */
+    for (i = 0 ; i < n ; i++)
+    {
+	deg = Degree [i] ;
+	ASSERT (deg >= 0 && deg < n) ;
+	if (deg == 0)
+	{
+
+	    /* -------------------------------------------------------------
+	     * we have a variable that can be eliminated at once because
+	     * there is no off-diagonal non-zero in its row.  Note that
+	     * Nv [i] = 1 for an empty variable i.  It is treated just
+	     * the same as an eliminated element i.
+	     * ------------------------------------------------------------- */
+
+	    Elen [i] = FLIP (1) ;
+	    nel++ ;
+	    Pe [i] = EMPTY ;
+	    W [i] = 0 ;
+
+	}
+	else if (deg > dense)
+	{
+
+	    /* -------------------------------------------------------------
+	     * Dense variables are not treated as elements, but as unordered,
+	     * non-principal variables that have no parent.  They do not take
+	     * part in the postorder, since Nv [i] = 0.  Note that the Fortran
+	     * version does not have this option.
+	     * ------------------------------------------------------------- */
+
+	    AMD_DEBUG1 (("Dense node "ID" degree "ID"\n", i, deg)) ;
+	    ndense++ ;
+	    Nv [i] = 0 ;		/* do not postorder this node */
+	    Elen [i] = EMPTY ;
+	    nel++ ;
+	    Pe [i] = EMPTY ;
+
+	}
+	else
+	{
+
+	    /* -------------------------------------------------------------
+	     * place i in the degree list corresponding to its degree
+	     * ------------------------------------------------------------- */
+
+	    inext = Head [deg] ;
+	    ASSERT (inext >= EMPTY && inext < n) ;
+	    if (inext != EMPTY) Last [inext] = i ;
+	    Next [i] = inext ;
+	    Head [deg] = i ;
+
+	}
+    }
+
+/* ========================================================================= */
+/* WHILE (selecting pivots) DO */
+/* ========================================================================= */
+
+    while (nel < n)
+    {
+
+#ifndef NDEBUG
+	AMD_DEBUG1 (("\n======Nel "ID"\n", nel)) ;
+	if (AMD_debug >= 2) AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next,
+	    Last, Head, Elen, Degree, W, nel) ;
+#endif
+
+/* ========================================================================= */
+/* GET PIVOT OF MINIMUM DEGREE */
+/* ========================================================================= */
+
+	/* ----------------------------------------------------------------- */
+	/* find next supervariable for elimination */
+	/* ----------------------------------------------------------------- */
+
+	ASSERT (mindeg >= 0 && mindeg < n) ;
+	for (deg = mindeg ; deg < n ; deg++)
+	{
+	    me = Head [deg] ;
+	    if (me != EMPTY) break ;
+	}
+	mindeg = deg ;
+	ASSERT (me >= 0 && me < n) ;
+	AMD_DEBUG1 (("=================me: "ID"\n", me)) ;
+
+	/* ----------------------------------------------------------------- */
+	/* remove chosen variable from link list */
+	/* ----------------------------------------------------------------- */
+
+	inext = Next [me] ;
+	ASSERT (inext >= EMPTY && inext < n) ;
+	if (inext != EMPTY) Last [inext] = EMPTY ;
+	Head [deg] = inext ;
+
+	/* ----------------------------------------------------------------- */
+	/* me represents the elimination of pivots nel to nel+Nv[me]-1. */
+	/* place me itself as the first in this set. */
+	/* ----------------------------------------------------------------- */
+
+	elenme = Elen [me] ;
+	nvpiv = Nv [me] ;
+	ASSERT (nvpiv > 0) ;
+	nel += nvpiv ;
+
+/* ========================================================================= */
+/* CONSTRUCT NEW ELEMENT */
+/* ========================================================================= */
+
+	/* -----------------------------------------------------------------
+	 * At this point, me is the pivotal supervariable.  It will be
+	 * converted into the current element.  Scan list of the pivotal
+	 * supervariable, me, setting tree pointers and constructing new list
+	 * of supervariables for the new element, me.  p is a pointer to the
+	 * current position in the old list.
+	 * ----------------------------------------------------------------- */
+
+	/* flag the variable "me" as being in Lme by negating Nv [me] */
+	Nv [me] = -nvpiv ;
+	degme = 0 ;
+	ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
+
+	if (elenme == 0)
+	{
+
+	    /* ------------------------------------------------------------- */
+	    /* construct the new element in place */
+	    /* ------------------------------------------------------------- */
+
+	    pme1 = Pe [me] ;
+	    pme2 = pme1 - 1 ;
+
+	    for (p = pme1 ; p <= pme1 + Len [me] - 1 ; p++)
+	    {
+		i = Iw [p] ;
+		ASSERT (i >= 0 && i < n && Nv [i] >= 0) ;
+		nvi = Nv [i] ;
+		if (nvi > 0)
+		{
+
+		    /* ----------------------------------------------------- */
+		    /* i is a principal variable not yet placed in Lme. */
+		    /* store i in new list */
+		    /* ----------------------------------------------------- */
+
+                    /* flag i as being in Lme by negating Nv [i] */
+		    degme += nvi ;
+		    Nv [i] = -nvi ;
+		    Iw [++pme2] = i ;
+
+		    /* ----------------------------------------------------- */
+		    /* remove variable i from degree list. */
+		    /* ----------------------------------------------------- */
+
+		    ilast = Last [i] ;
+		    inext = Next [i] ;
+		    ASSERT (ilast >= EMPTY && ilast < n) ;
+		    ASSERT (inext >= EMPTY && inext < n) ;
+		    if (inext != EMPTY) Last [inext] = ilast ;
+		    if (ilast != EMPTY)
+		    {
+			Next [ilast] = inext ;
+		    }
+		    else
+		    {
+                        /* i is at the head of the degree list */
+			ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
+			Head [Degree [i]] = inext ;
+		    }
+		}
+	    }
+	}
+	else
+	{
+
+	    /* ------------------------------------------------------------- */
+	    /* construct the new element in empty space, Iw [pfree ...] */
+	    /* ------------------------------------------------------------- */
+
+	    p = Pe [me] ;
+	    pme1 = pfree ;
+	    slenme = Len [me] - elenme ;
+
+	    for (knt1 = 1 ; knt1 <= elenme + 1 ; knt1++)
+	    {
+
+		if (knt1 > elenme)
+		{
+		    /* search the supervariables in me. */
+		    e = me ;
+		    pj = p ;
+		    ln = slenme ;
+		    AMD_DEBUG2 (("Search sv: "ID" "ID" "ID"\n", me,pj,ln)) ;
+		}
+		else
+		{
+                    /* search the elements in me. */
+		    e = Iw [p++] ;
+		    ASSERT (e >= 0 && e < n) ;
+		    pj = Pe [e] ;
+		    ln = Len [e] ;
+		    AMD_DEBUG2 (("Search element e "ID" in me "ID"\n", e,me)) ;
+		    ASSERT (Elen [e] < EMPTY && W [e] > 0 && pj >= 0) ;
+		}
+		ASSERT (ln >= 0 && (ln == 0 || (pj >= 0 && pj < iwlen))) ;
+
+		/* ---------------------------------------------------------
+		 * search for different supervariables and add them to the
+		 * new list, compressing when necessary. this loop is
+		 * executed once for each element in the list and once for
+		 * all the supervariables in the list.
+		 * --------------------------------------------------------- */
+
+		for (knt2 = 1 ; knt2 <= ln ; knt2++)
+		{
+		    i = Iw [pj++] ;
+		    ASSERT (i >= 0 && i < n && (i == me || Elen [i] >= EMPTY));
+		    nvi = Nv [i] ;
+		    AMD_DEBUG2 ((": "ID" "ID" "ID" "ID"\n",
+				i, Elen [i], Nv [i], wflg)) ;
+
+		    if (nvi > 0)
+		    {
+
+			/* ------------------------------------------------- */
+			/* compress Iw, if necessary */
+			/* ------------------------------------------------- */
+
+			if (pfree >= iwlen)
+			{
+
+			    AMD_DEBUG1 (("GARBAGE COLLECTION\n")) ;
+
+			    /* prepare for compressing Iw by adjusting pointers
+			     * and lengths so that the lists being searched in
+			     * the inner and outer loops contain only the
+			     * remaining entries. */
+
+			    Pe [me] = p ;
+			    Len [me] -= knt1 ;
+                            /* check if nothing left of supervariable me */
+			    if (Len [me] == 0) Pe [me] = EMPTY ;
+			    Pe [e] = pj ;
+			    Len [e] = ln - knt2 ;
+                            /* nothing left of element e */
+			    if (Len [e] == 0) Pe [e] = EMPTY ;
+
+			    ncmpa++ ;	/* one more garbage collection */
+
+                            /* store first entry of each object in Pe */
+                            /* FLIP the first entry in each object */
+			    for (j = 0 ; j < n ; j++)
+			    {
+				pn = Pe [j] ;
+				if (pn >= 0)
+				{
+				    ASSERT (pn >= 0 && pn < iwlen) ;
+				    Pe [j] = Iw [pn] ;
+				    Iw [pn] = FLIP (j) ;
+				}
+			    }
+
+                            /* psrc/pdst point to source/destination */
+			    psrc = 0 ;
+			    pdst = 0 ;
+			    pend = pme1 - 1 ;
+
+			    while (psrc <= pend)
+			    {
+				/* search for next FLIP'd entry */
+				j = FLIP (Iw [psrc++]) ;
+				if (j >= 0)
+				{
+				    AMD_DEBUG2 (("Got object j: "ID"\n", j)) ;
+				    Iw [pdst] = Pe [j] ;
+				    Pe [j] = pdst++ ;
+				    lenj = Len [j] ;
+				    /* copy from source to destination */
+				    for (knt3 = 0 ; knt3 <= lenj - 2 ; knt3++)
+				    {
+					Iw [pdst++] = Iw [psrc++] ;
+				    }
+				}
+			    }
+
+                            /* move the new partially-constructed element */
+			    p1 = pdst ;
+			    for (psrc = pme1 ; psrc <= pfree-1 ; psrc++)
+			    {
+				Iw [pdst++] = Iw [psrc] ;
+			    }
+			    pme1 = p1 ;
+			    pfree = pdst ;
+			    pj = Pe [e] ;
+			    p = Pe [me] ;
+
+			}
+
+			/* ------------------------------------------------- */
+			/* i is a principal variable not yet placed in Lme */
+			/* store i in new list */
+			/* ------------------------------------------------- */
+
+                        /* flag i as being in Lme by negating Nv [i] */
+			degme += nvi ;
+			Nv [i] = -nvi ;
+			Iw [pfree++] = i ;
+			AMD_DEBUG2 (("     s: "ID"     nv "ID"\n", i, Nv [i]));
+
+			/* ------------------------------------------------- */
+			/* remove variable i from degree link list */
+			/* ------------------------------------------------- */
+
+			ilast = Last [i] ;
+			inext = Next [i] ;
+			ASSERT (ilast >= EMPTY && ilast < n) ;
+			ASSERT (inext >= EMPTY && inext < n) ;
+			if (inext != EMPTY) Last [inext] = ilast ;
+			if (ilast != EMPTY)
+			{
+			    Next [ilast] = inext ;
+			}
+			else
+			{
+                            /* i is at the head of the degree list */
+			    ASSERT (Degree [i] >= 0 && Degree [i] < n) ;
+			    Head [Degree [i]] = inext ;
+			}
+		    }
+		}
+
+		if (e != me)
+		{
+                    /* set tree pointer and flag to indicate element e is
+                     * absorbed into new element me (the parent of e is me) */
+		    AMD_DEBUG1 ((" Element "ID" => "ID"\n", e, me)) ;
+		    Pe [e] = FLIP (me) ;
+		    W [e] = 0 ;
+		}
+	    }
+
+	    pme2 = pfree - 1 ;
+	}
+
+	/* ----------------------------------------------------------------- */
+	/* me has now been converted into an element in Iw [pme1..pme2] */
+	/* ----------------------------------------------------------------- */
+
+        /* degme holds the external degree of new element */
+	Degree [me] = degme ;
+	Pe [me] = pme1 ;
+	Len [me] = pme2 - pme1 + 1 ;
+	ASSERT (Pe [me] >= 0 && Pe [me] < iwlen) ;
+
+	Elen [me] = FLIP (nvpiv + degme) ;
+        /* FLIP (Elen (me)) is now the degree of pivot (including
+	 * diagonal part). */
+
+#ifndef NDEBUG
+	AMD_DEBUG2 (("New element structure: length= "ID"\n", pme2-pme1+1)) ;
+	for (pme = pme1 ; pme <= pme2 ; pme++) AMD_DEBUG3 ((" "ID"", Iw[pme]));
+	AMD_DEBUG3 (("\n")) ;
+#endif
+
+	/* ----------------------------------------------------------------- */
+	/* make sure that wflg is not too large. */
+	/* ----------------------------------------------------------------- */
+
+	/* With the current value of wflg, wflg+n must not cause integer
+	 * overflow */
+
+	if (wflg >= wbig)
+	{
+	    for (x = 0 ; x < n ; x++)
+	    {
+		if (W [x] != 0) W [x] = 1 ;
+	    }
+	    wflg = 2 ;
+	}
+
+/* ========================================================================= */
+/* COMPUTE (W [e] - wflg) = |Le\Lme| FOR ALL ELEMENTS */
+/* ========================================================================= */
+
+	/* -----------------------------------------------------------------
+	 * Scan 1:  compute the external degrees of previous elements with
+	 * respect to the current element.  That is:
+	 *       (W [e] - wflg) = |Le \ Lme|
+	 * for each element e that appears in any supervariable in Lme.  The
+	 * notation Le refers to the pattern (list of supervariables) of a
+	 * previous element e, where e is not yet absorbed, stored in
+	 * Iw [Pe [e] + 1 ... Pe [e] + Iw [Pe [e]]].  The notation Lme
+	 * refers to the pattern of the current element (stored in
+	 * Iw [pme1..pme2]).   If aggressive absorption is enabled, and
+	 * (W [e] - wflg) becomes zero, then the element e will be absorbed
+	 * in Scan 2.
+	 * ----------------------------------------------------------------- */
+
+	AMD_DEBUG2 (("me: ")) ;
+	for (pme = pme1 ; pme <= pme2 ; pme++)
+	{
+	    i = Iw [pme] ;
+	    ASSERT (i >= 0 && i < n) ;
+	    eln = Elen [i] ;
+	    AMD_DEBUG3 ((""ID" Elen "ID": \n", i, eln)) ;
+	    if (eln > 0)
+	    {
+                /* note that Nv [i] has been negated to denote i in Lme: */
+		nvi = -Nv [i] ;
+		ASSERT (nvi > 0 && Pe [i] >= 0 && Pe [i] < iwlen) ;
+		wnvi = wflg - nvi ;
+		for (p = Pe [i] ; p <= Pe [i] + eln - 1 ; p++)
+		{
+		    e = Iw [p] ;
+		    ASSERT (e >= 0 && e < n) ;
+		    we = W [e] ;
+		    AMD_DEBUG4 (("    e "ID" we "ID" ", e, we)) ;
+		    if (we >= wflg)
+		    {
+                        /* unabsorbed element e has been seen in this loop */
+			AMD_DEBUG4 (("    unabsorbed, first time seen")) ;
+			we -= nvi ;
+		    }
+		    else if (we != 0)
+		    {
+                        /* e is an unabsorbed element */
+                        /* this is the first we have seen e in all of Scan 1 */
+			AMD_DEBUG4 (("    unabsorbed")) ;
+			we = Degree [e] + wnvi ;
+		    }
+		    AMD_DEBUG4 (("\n")) ;
+		    W [e] = we ;
+		}
+	    }
+	}
+	AMD_DEBUG2 (("\n")) ;
+
+/* ========================================================================= */
+/* DEGREE UPDATE AND ELEMENT ABSORPTION */
+/* ========================================================================= */
+
+	/* -----------------------------------------------------------------
+	 * Scan 2:  for each i in Lme, sum up the degree of Lme (which is
+	 * degme), plus the sum of the external degrees of each Le for the
+	 * elements e appearing within i, plus the supervariables in i.
+	 * Place i in hash list.
+	 * ----------------------------------------------------------------- */
+
+	for (pme = pme1 ; pme <= pme2 ; pme++)
+	{
+	    i = Iw [pme] ;
+	    ASSERT (i >= 0 && i < n && Nv [i] < 0 && Elen [i] >= 0) ;
+	    AMD_DEBUG2 (("Updating: i "ID" "ID" "ID"\n", i, Elen[i], Len [i]));
+	    p1 = Pe [i] ;
+	    p2 = p1 + Elen [i] - 1 ;
+	    pn = p1 ;
+	    hash = 0 ;
+	    deg = 0 ;
+	    ASSERT (p1 >= 0 && p1 < iwlen && p2 >= -1 && p2 < iwlen) ;
+
+	    /* ------------------------------------------------------------- */
+	    /* scan the element list associated with supervariable i */
+	    /* ------------------------------------------------------------- */
+
+            /* UMFPACK/MA38-style approximate degree: */
+	    if (aggressive)
+	    {
+		for (p = p1 ; p <= p2 ; p++)
+		{
+		    e = Iw [p] ;
+		    ASSERT (e >= 0 && e < n) ;
+		    we = W [e] ;
+		    if (we != 0)
+		    {
+			/* e is an unabsorbed element */
+			/* dext = | Le \ Lme | */
+			dext = we - wflg ;
+			if (dext > 0)
+			{
+			    deg += dext ;
+			    Iw [pn++] = e ;
+			    hash += e ;
+			    AMD_DEBUG4 ((" e: "ID" hash = "ID"\n",e,hash)) ;
+			}
+			else
+			{
+			    /* external degree of e is zero, absorb e into me*/
+			    AMD_DEBUG1 ((" Element "ID" =>"ID" (aggressive)\n",
+				e, me)) ;
+			    ASSERT (dext == 0) ;
+			    Pe [e] = FLIP (me) ;
+			    W [e] = 0 ;
+			}
+		    }
+		}
+	    }
+	    else
+	    {
+		for (p = p1 ; p <= p2 ; p++)
+		{
+		    e = Iw [p] ;
+		    ASSERT (e >= 0 && e < n) ;
+		    we = W [e] ;
+		    if (we != 0)
+		    {
+			/* e is an unabsorbed element */
+			dext = we - wflg ;
+			ASSERT (dext >= 0) ;
+			deg += dext ;
+			Iw [pn++] = e ;
+			hash += e ;
+			AMD_DEBUG4 (("	e: "ID" hash = "ID"\n",e,hash)) ;
+		    }
+		}
+	    }
+
+            /* count the number of elements in i (including me): */
+	    Elen [i] = pn - p1 + 1 ;
+
+	    /* ------------------------------------------------------------- */
+	    /* scan the supervariables in the list associated with i */
+	    /* ------------------------------------------------------------- */
+
+	    /* The bulk of the AMD run time is typically spent in this loop,
+	     * particularly if the matrix has many dense rows that are not
+	     * removed prior to ordering. */
+	    p3 = pn ;
+	    p4 = p1 + Len [i] ;
+	    for (p = p2 + 1 ; p < p4 ; p++)
+	    {
+		j = Iw [p] ;
+		ASSERT (j >= 0 && j < n) ;
+		nvj = Nv [j] ;
+		if (nvj > 0)
+		{
+                    /* j is unabsorbed, and not in Lme. */
+                    /* add to degree and add to new list */
+		    deg += nvj ;
+		    Iw [pn++] = j ;
+		    hash += j ;
+		    AMD_DEBUG4 (("  s: "ID" hash "ID" Nv[j]= "ID"\n",
+				j, hash, nvj)) ;
+		}
+	    }
+
+	    /* ------------------------------------------------------------- */
+	    /* update the degree and check for mass elimination */
+	    /* ------------------------------------------------------------- */
+
+	    /* with aggressive absorption, deg==0 is identical to the 
+	     * Elen [i] == 1 && p3 == pn test, below. */
+	    ASSERT (IMPLIES (aggressive, (deg==0) == (Elen[i]==1 && p3==pn))) ;
+
+	    if (Elen [i] == 1 && p3 == pn)
+	    {
+
+		/* --------------------------------------------------------- */
+	        /* mass elimination */
+		/* --------------------------------------------------------- */
+
+		/* There is nothing left of this node except for an edge to
+		 * the current pivot element.  Elen [i] is 1, and there are
+		 * no variables adjacent to node i.  Absorb i into the
+		 * current pivot element, me.  Note that if there are two or
+		 * more mass eliminations, fillin due to mass elimination is
+		 * possible within the nvpiv-by-nvpiv pivot block.  It is this
+		 * step that causes AMD's analysis to be an upper bound.
+		 *
+		 * The reason is that the selected pivot has a lower
+		 * approximate degree than the true degree of the two mass
+		 * eliminated nodes.  There is no edge between the two mass
+		 * eliminated nodes.  They are merged with the current pivot
+		 * anyway.
+		 *
+		 * No fillin occurs in the Schur complement, in any case,
+		 * and this effect does not decrease the quality of the
+		 * ordering itself, just the quality of the nonzero and
+		 * flop count analysis.  It also means that the post-ordering
+		 * is not an exact elimination tree post-ordering. */
+
+		AMD_DEBUG1 (("  MASS i "ID" => parent e "ID"\n", i, me)) ;
+		Pe [i] = FLIP (me) ;
+		nvi = -Nv [i] ;
+		degme -= nvi ;
+		nvpiv += nvi ;
+		nel += nvi ;
+		Nv [i] = 0 ;
+		Elen [i] = EMPTY ;
+
+	    }
+	    else
+	    {
+
+		/* --------------------------------------------------------- */
+		/* update the upper-bound degree of i */
+		/* --------------------------------------------------------- */
+
+                /* the following degree does not yet include the size
+                 * of the current element, which is added later: */
+
+		Degree [i] = MIN (Degree [i], deg) ;
+
+		/* --------------------------------------------------------- */
+		/* add me to the list for i */
+		/* --------------------------------------------------------- */
+
+                /* move first supervariable to end of list */
+		Iw [pn] = Iw [p3] ;
+                /* move first element to end of element part of list */
+		Iw [p3] = Iw [p1] ;
+                /* add new element, me, to front of list. */
+		Iw [p1] = me ;
+                /* store the new length of the list in Len [i] */
+		Len [i] = pn - p1 + 1 ;
+
+		/* --------------------------------------------------------- */
+		/* place in hash bucket.  Save hash key of i in Last [i]. */
+		/* --------------------------------------------------------- */
+
+		/* NOTE: this can fail if hash is negative, because the ANSI C
+		 * standard does not define a % b when a and/or b are negative.
+		 * That's why hash is defined as an unsigned Int, to avoid this
+		 * problem. */
+		hash = hash % n ;
+		ASSERT (((Int) hash) >= 0 && ((Int) hash) < n) ;
+
+		/* if the Hhead array is not used: */
+		j = Head [hash] ;
+		if (j <= EMPTY)
+		{
+		    /* degree list is empty, hash head is FLIP (j) */
+		    Next [i] = FLIP (j) ;
+		    Head [hash] = FLIP (i) ;
+		}
+		else
+		{
+		    /* degree list is not empty, use Last [Head [hash]] as
+		     * hash head. */
+		    Next [i] = Last [j] ;
+		    Last [j] = i ;
+		}
+
+		/* if a seperate Hhead array is used: *
+		Next [i] = Hhead [hash] ;
+		Hhead [hash] = i ;
+		*/
+
+		Last [i] = hash ;
+	    }
+	}
+
+	Degree [me] = degme ;
+
+	/* ----------------------------------------------------------------- */
+	/* Clear the counter array, W [...], by incrementing wflg. */
+	/* ----------------------------------------------------------------- */
+
+        /* make sure that wflg+n does not cause integer overflow */
+	lemax =  MAX (lemax, degme) ;
+	wflg += lemax ;
+	if (wflg >= wbig)
+	{
+	    for (x = 0 ; x < n ; x++)
+	    {
+		if (W [x] != 0) W [x] = 1 ;
+	    }
+	    wflg = 2 ;
+	}
+        /*  at this point, W [0..n-1] < wflg holds */
+
+/* ========================================================================= */
+/* SUPERVARIABLE DETECTION */
+/* ========================================================================= */
+
+	AMD_DEBUG1 (("Detecting supervariables:\n")) ;
+	for (pme = pme1 ; pme <= pme2 ; pme++)
+	{
+	    i = Iw [pme] ;
+	    ASSERT (i >= 0 && i < n) ;
+	    AMD_DEBUG2 (("Consider i "ID" nv "ID"\n", i, Nv [i])) ;
+	    if (Nv [i] < 0)
+	    {
+                /* i is a principal variable in Lme */
+
+		/* ---------------------------------------------------------
+		 * examine all hash buckets with 2 or more variables.  We do
+		 * this by examing all unique hash keys for supervariables in
+		 * the pattern Lme of the current element, me
+		 * --------------------------------------------------------- */
+
+                /* let i = head of hash bucket, and empty the hash bucket */
+		ASSERT (Last [i] >= 0 && Last [i] < n) ;
+		hash = Last [i] ;
+
+		/* if Hhead array is not used: */
+		j = Head [hash] ;
+		if (j == EMPTY)
+		{
+		    /* hash bucket and degree list are both empty */
+		    i = EMPTY ;
+		}
+		else if (j < EMPTY)
+		{
+		    /* degree list is empty */
+		    i = FLIP (j) ;
+		    Head [hash] = EMPTY ;
+		}
+		else
+		{
+		    /* degree list is not empty, restore Last [j] of head j */
+		    i = Last [j] ;
+		    Last [j] = EMPTY ;
+		}
+
+		/* if seperate Hhead array is used: *
+		i = Hhead [hash] ;
+		Hhead [hash] = EMPTY ;
+		*/
+
+		ASSERT (i >= EMPTY && i < n) ;
+		AMD_DEBUG2 (("----i "ID" hash "ID"\n", i, hash)) ;
+
+		while (i != EMPTY && Next [i] != EMPTY)
+		{
+
+		    /* -----------------------------------------------------
+		     * this bucket has one or more variables following i.
+		     * scan all of them to see if i can absorb any entries
+		     * that follow i in hash bucket.  Scatter i into w.
+		     * ----------------------------------------------------- */
+
+		    ln = Len [i] ;
+		    eln = Elen [i] ;
+		    ASSERT (ln >= 0 && eln >= 0) ;
+		    ASSERT (Pe [i] >= 0 && Pe [i] < iwlen) ;
+                    /* do not flag the first element in the list (me) */
+		    for (p = Pe [i] + 1 ; p <= Pe [i] + ln - 1 ; p++)
+		    {
+			ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
+			W [Iw [p]] = wflg ;
+		    }
+
+		    /* ----------------------------------------------------- */
+		    /* scan every other entry j following i in bucket */
+		    /* ----------------------------------------------------- */
+
+		    jlast = i ;
+		    j = Next [i] ;
+		    ASSERT (j >= EMPTY && j < n) ;
+
+		    while (j != EMPTY)
+		    {
+			/* ------------------------------------------------- */
+			/* check if j and i have identical nonzero pattern */
+			/* ------------------------------------------------- */
+
+			AMD_DEBUG3 (("compare i "ID" and j "ID"\n", i,j)) ;
+
+			/* check if i and j have the same Len and Elen */
+			ASSERT (Len [j] >= 0 && Elen [j] >= 0) ;
+			ASSERT (Pe [j] >= 0 && Pe [j] < iwlen) ;
+			ok = (Len [j] == ln) && (Elen [j] == eln) ;
+                        /* skop the first element in the list (me) */
+			for (p = Pe [j] + 1 ; ok && p <= Pe [j] + ln - 1 ; p++)
+			{
+			    ASSERT (Iw [p] >= 0 && Iw [p] < n) ;
+			    if (W [Iw [p]] != wflg) ok = 0 ;
+			}
+			if (ok)
+			{
+			    /* --------------------------------------------- */
+			    /* found it!  j can be absorbed into i */
+			    /* --------------------------------------------- */
+
+			    AMD_DEBUG1 (("found it! j "ID" => i "ID"\n", j,i));
+			    Pe [j] = FLIP (i) ;
+			    /* both Nv [i] and Nv [j] are negated since they */
+			    /* are in Lme, and the absolute values of each */
+			    /* are the number of variables in i and j: */
+			    Nv [i] += Nv [j] ;
+			    Nv [j] = 0 ;
+			    Elen [j] = EMPTY ;
+			    /* delete j from hash bucket */
+			    ASSERT (j != Next [j]) ;
+			    j = Next [j] ;
+			    Next [jlast] = j ;
+
+			}
+			else
+			{
+			    /* j cannot be absorbed into i */
+			    jlast = j ;
+			    ASSERT (j != Next [j]) ;
+			    j = Next [j] ;
+			}
+			ASSERT (j >= EMPTY && j < n) ;
+		    }
+
+		    /* -----------------------------------------------------
+		     * no more variables can be absorbed into i
+		     * go to next i in bucket and clear flag array
+		     * ----------------------------------------------------- */
+
+		    wflg++ ;
+		    i = Next [i] ;
+		    ASSERT (i >= EMPTY && i < n) ;
+
+		}
+	    }
+	}
+	AMD_DEBUG2 (("detect done\n")) ;
+
+/* ========================================================================= */
+/* RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVARIABLES FROM ELEMENT */
+/* ========================================================================= */
+
+	p = pme1 ;
+	nleft = n - nel ;
+	for (pme = pme1 ; pme <= pme2 ; pme++)
+	{
+	    i = Iw [pme] ;
+	    ASSERT (i >= 0 && i < n) ;
+	    nvi = -Nv [i] ;
+	    AMD_DEBUG3 (("Restore i "ID" "ID"\n", i, nvi)) ;
+	    if (nvi > 0)
+	    {
+                /* i is a principal variable in Lme */
+                /* restore Nv [i] to signify that i is principal */
+		Nv [i] = nvi ;
+
+		/* --------------------------------------------------------- */
+		/* compute the external degree (add size of current element) */
+		/* --------------------------------------------------------- */
+
+		deg = Degree [i] + degme - nvi ;
+		deg = MIN (deg, nleft - nvi) ;
+		ASSERT (IMPLIES (aggressive, deg > 0) && deg >= 0 && deg < n) ;
+
+		/* --------------------------------------------------------- */
+		/* place the supervariable at the head of the degree list */
+		/* --------------------------------------------------------- */
+
+		inext = Head [deg] ;
+		ASSERT (inext >= EMPTY && inext < n) ;
+		if (inext != EMPTY) Last [inext] = i ;
+		Next [i] = inext ;
+		Last [i] = EMPTY ;
+		Head [deg] = i ;
+
+		/* --------------------------------------------------------- */
+		/* save the new degree, and find the minimum degree */
+		/* --------------------------------------------------------- */
+
+		mindeg = MIN (mindeg, deg) ;
+		Degree [i] = deg ;
+
+		/* --------------------------------------------------------- */
+		/* place the supervariable in the element pattern */
+		/* --------------------------------------------------------- */
+
+		Iw [p++] = i ;
+
+	    }
+	}
+	AMD_DEBUG2 (("restore done\n")) ;
+
+/* ========================================================================= */
+/* FINALIZE THE NEW ELEMENT */
+/* ========================================================================= */
+
+	AMD_DEBUG2 (("ME = "ID" DONE\n", me)) ;
+	Nv [me] = nvpiv ;
+        /* save the length of the list for the new element me */
+	Len [me] = p - pme1 ;
+	if (Len [me] == 0)
+	{
+            /* there is nothing left of the current pivot element */
+	    /* it is a root of the assembly tree */
+	    Pe [me] = EMPTY ;
+	    W [me] = 0 ;
+	}
+	if (elenme != 0)
+	{
+	    /* element was not constructed in place: deallocate part of */
+	    /* it since newly nonprincipal variables may have been removed */
+	    pfree = p ;
+	}
+
+	/* The new element has nvpiv pivots and the size of the contribution
+	 * block for a multifrontal method is degme-by-degme, not including
+	 * the "dense" rows/columns.  If the "dense" rows/columns are included,
+	 * the frontal matrix is no larger than
+	 * (degme+ndense)-by-(degme+ndense).
+	 */
+
+	if (Info != (double *) NULL)
+	{
+	    f = nvpiv ;
+	    r = degme + ndense ;
+	    dmax = MAX (dmax, f + r) ;
+
+	    /* number of nonzeros in L (excluding the diagonal) */
+	    lnzme = f*r + (f-1)*f/2 ;
+	    lnz += lnzme ;
+
+	    /* number of divide operations for LDL' and for LU */
+	    ndiv += lnzme ;
+
+	    /* number of multiply-subtract pairs for LU */
+	    s = f*r*r + r*(f-1)*f + (f-1)*f*(2*f-1)/6 ;
+	    nms_lu += s ;
+
+	    /* number of multiply-subtract pairs for LDL' */
+	    nms_ldl += (s + lnzme)/2 ;
+	}
+
+#ifndef NDEBUG
+	AMD_DEBUG2 (("finalize done nel "ID" n "ID"\n   ::::\n", nel, n)) ;
+	for (pme = Pe [me] ; pme <= Pe [me] + Len [me] - 1 ; pme++)
+	{
+	      AMD_DEBUG3 ((" "ID"", Iw [pme])) ;
+	}
+	AMD_DEBUG3 (("\n")) ;
+#endif
+
+    }
+
+/* ========================================================================= */
+/* DONE SELECTING PIVOTS */
+/* ========================================================================= */
+
+    if (Info != (double *) NULL)
+    {
+
+	/* count the work to factorize the ndense-by-ndense submatrix */
+	f = ndense ;
+	dmax = MAX (dmax, (double) ndense) ;
+
+	/* number of nonzeros in L (excluding the diagonal) */
+	lnzme = (f-1)*f/2 ;
+	lnz += lnzme ;
+
+	/* number of divide operations for LDL' and for LU */
+	ndiv += lnzme ;
+
+	/* number of multiply-subtract pairs for LU */
+	s = (f-1)*f*(2*f-1)/6 ;
+	nms_lu += s ;
+
+	/* number of multiply-subtract pairs for LDL' */
+	nms_ldl += (s + lnzme)/2 ;
+
+	/* number of nz's in L (excl. diagonal) */
+	Info [AMD_LNZ] = lnz ;
+
+	/* number of divide ops for LU and LDL' */
+	Info [AMD_NDIV] = ndiv ;
+
+	/* number of multiply-subtract pairs for LDL' */
+	Info [AMD_NMULTSUBS_LDL] = nms_ldl ;
+
+	/* number of multiply-subtract pairs for LU */
+	Info [AMD_NMULTSUBS_LU] = nms_lu ;
+
+	/* number of "dense" rows/columns */
+	Info [AMD_NDENSE] = ndense ;
+
+	/* largest front is dmax-by-dmax */
+	Info [AMD_DMAX] = dmax ;
+
+	/* number of garbage collections in AMD */
+	Info [AMD_NCMPA] = ncmpa ;
+
+	/* successful ordering */
+	Info [AMD_STATUS] = AMD_OK ;
+    }
+
+/* -------------------------------------------------------------------------
+ * Variables at this point:
+ *
+ * Pe: holds the elimination tree.  The parent of j is FLIP (Pe [j]),
+ *	or EMPTY if j is a root.  The tree holds both elements and
+ *	non-principal (unordered) variables absorbed into them.
+ *	Dense variables are non-principal and unordered.
+ *
+ * Elen: holds the size of each element, including the diagonal part.
+ *	FLIP (Elen [e]) > 0 if e is an element.  For unordered
+ *	variables i, Elen [i] is EMPTY.
+ *
+ * Nv: Nv [e] > 0 is the number of pivots represented by the element e.
+ *	For unordered variables i, Nv [i] is zero.
+ *
+ * Contents no longer needed:
+ *	W, Iw, Len, Degree, Head, Next, Last.
+ *
+ * The matrix itself has been destroyed.
+ *
+ * n: the size of the matrix.
+ * No other scalars needed (pfree, iwlen, etc.)
+ * ------------------------------------------------------------------------- */
+
+    for (i = 0 ; i < n ; i++)
+    {
+	Pe [i] = FLIP (Pe [i]) ;
+	Elen [i] = FLIP (Elen [i]) ;
+    }
+
+/* Now the parent of j is Pe [j], or EMPTY if j is a root.  Elen [e] > 0
+ * is the size of element e.  Elen [i] is EMPTY for unordered variable i. */
+
+#ifndef NDEBUG
+    AMD_DEBUG2 (("\nTree:\n")) ;
+    for (i = 0 ; i < n ; i++)
+    {
+	AMD_DEBUG2 ((" "ID" parent: "ID"   ", i, Pe [i])) ;
+	ASSERT (Pe [i] >= EMPTY && Pe [i] < n) ;
+	if (Nv [i] > 0)
+	{
+	    /* this is an element */
+	    e = i ;
+	    AMD_DEBUG2 ((" element, size is "ID"\n", Elen [i])) ;
+	    ASSERT (Elen [e] > 0) ;
+	}
+	AMD_DEBUG2 (("\n")) ;
+    }
+    AMD_DEBUG2 (("\nelements:\n")) ;
+    for (e = 0 ; e < n ; e++)
+    {
+	if (Nv [e] > 0)
+	{
+	    AMD_DEBUG3 (("Element e= "ID" size "ID" nv "ID" \n", e,
+		Elen [e], Nv [e])) ;
+	}
+    }
+    AMD_DEBUG2 (("\nvariables:\n")) ;
+    for (i = 0 ; i < n ; i++)
+    {
+	Int cnt ;
+	if (Nv [i] == 0)
+	{
+	    AMD_DEBUG3 (("i unordered: "ID"\n", i)) ;
+	    j = Pe [i] ;
+	    cnt = 0 ;
+	    AMD_DEBUG3 (("  j: "ID"\n", j)) ;
+	    if (j == EMPTY)
+	    {
+		AMD_DEBUG3 (("	i is a dense variable\n")) ;
+	    }
+	    else
+	    {
+		ASSERT (j >= 0 && j < n) ;
+		while (Nv [j] == 0)
+		{
+		    AMD_DEBUG3 (("	j : "ID"\n", j)) ;
+		    j = Pe [j] ;
+		    AMD_DEBUG3 (("	j:: "ID"\n", j)) ;
+		    cnt++ ;
+		    if (cnt > n) break ;
+		}
+		e = j ;
+		AMD_DEBUG3 (("	got to e: "ID"\n", e)) ;
+	    }
+	}
+    }
+#endif
+
+/* ========================================================================= */
+/* compress the paths of the variables */
+/* ========================================================================= */
+
+    for (i = 0 ; i < n ; i++)
+    {
+	if (Nv [i] == 0)
+	{
+
+	    /* -------------------------------------------------------------
+	     * i is an un-ordered row.  Traverse the tree from i until
+	     * reaching an element, e.  The element, e, was the principal
+	     * supervariable of i and all nodes in the path from i to when e
+	     * was selected as pivot.
+	     * ------------------------------------------------------------- */
+
+	    AMD_DEBUG1 (("Path compression, i unordered: "ID"\n", i)) ;
+	    j = Pe [i] ;
+	    ASSERT (j >= EMPTY && j < n) ;
+	    AMD_DEBUG3 (("	j: "ID"\n", j)) ;
+	    if (j == EMPTY)
+	    {
+		/* Skip a dense variable.  It has no parent. */
+		AMD_DEBUG3 (("      i is a dense variable\n")) ;
+		continue ;
+	    }
+
+	    /* while (j is a variable) */
+	    while (Nv [j] == 0)
+	    {
+		AMD_DEBUG3 (("		j : "ID"\n", j)) ;
+		j = Pe [j] ;
+		AMD_DEBUG3 (("		j:: "ID"\n", j)) ;
+		ASSERT (j >= 0 && j < n) ;
+	    }
+	    /* got to an element e */
+	    e = j ;
+	    AMD_DEBUG3 (("got to e: "ID"\n", e)) ;
+
+	    /* -------------------------------------------------------------
+	     * traverse the path again from i to e, and compress the path
+	     * (all nodes point to e).  Path compression allows this code to
+	     * compute in O(n) time.
+	     * ------------------------------------------------------------- */
+
+	    j = i ;
+	    /* while (j is a variable) */
+	    while (Nv [j] == 0)
+	    {
+		jnext = Pe [j] ;
+		AMD_DEBUG3 (("j "ID" jnext "ID"\n", j, jnext)) ;
+		Pe [j] = e ;
+		j = jnext ;
+		ASSERT (j >= 0 && j < n) ;
+	    }
+	}
+    }
+
+/* ========================================================================= */
+/* postorder the assembly tree */
+/* ========================================================================= */
+
+    AMD_postorder (n, Pe, Nv, Elen,
+	W,			/* output order */
+	Head, Next, Last) ;	/* workspace */
+
+/* ========================================================================= */
+/* compute output permutation and inverse permutation */
+/* ========================================================================= */
+
+    /* W [e] = k means that element e is the kth element in the new
+     * order.  e is in the range 0 to n-1, and k is in the range 0 to
+     * the number of elements.  Use Head for inverse order. */
+
+    for (k = 0 ; k < n ; k++)
+    {
+	Head [k] = EMPTY ;
+	Next [k] = EMPTY ;
+    }
+    for (e = 0 ; e < n ; e++)
+    {
+	k = W [e] ;
+	ASSERT ((k == EMPTY) == (Nv [e] == 0)) ;
+	if (k != EMPTY)
+	{
+	    ASSERT (k >= 0 && k < n) ;
+	    Head [k] = e ;
+	}
+    }
+
+    /* construct output inverse permutation in Next,
+     * and permutation in Last */
+    nel = 0 ;
+    for (k = 0 ; k < n ; k++)
+    {
+	e = Head [k] ;
+	if (e == EMPTY) break ;
+	ASSERT (e >= 0 && e < n && Nv [e] > 0) ;
+	Next [e] = nel ;
+	nel += Nv [e] ;
+    }
+    ASSERT (nel == n - ndense) ;
+
+    /* order non-principal variables (dense, & those merged into supervar's) */
+    for (i = 0 ; i < n ; i++)
+    {
+	if (Nv [i] == 0)
+	{
+	    e = Pe [i] ;
+	    ASSERT (e >= EMPTY && e < n) ;
+	    if (e != EMPTY)
+	    {
+		/* This is an unordered variable that was merged
+		 * into element e via supernode detection or mass
+		 * elimination of i when e became the pivot element.
+		 * Place i in order just before e. */
+		ASSERT (Next [i] == EMPTY && Nv [e] > 0) ;
+		Next [i] = Next [e] ;
+		Next [e]++ ;
+	    }
+	    else
+	    {
+		/* This is a dense unordered variable, with no parent.
+		 * Place it last in the output order. */
+		Next [i] = nel++ ;
+	    }
+	}
+    }
+    ASSERT (nel == n) ; 
+
+    AMD_DEBUG2 (("\n\nPerm:\n")) ;
+    for (i = 0 ; i < n ; i++)
+    {
+	k = Next [i] ;
+	ASSERT (k >= 0 && k < n) ;
+	Last [k] = i ;
+	AMD_DEBUG2 (("   perm ["ID"] = "ID"\n", k, i)) ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_aat.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,180 @@
+/* ========================================================================= */
+/* === AMD_aat ============================================================= */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* AMD_aat:  compute the symmetry of the pattern of A, and count the number of
+ * nonzeros each column of A+A' (excluding the diagonal).  Assume the input
+ * matrix has no errors.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL Int AMD_aat	/* returns nz in A+A' */
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    Int Len [ ],	/* Len [j]: length of column j of A+A', excl diagonal*/
+    Int Tp [ ],		/* workspace of size n */
+    double Info [ ]
+) 
+{
+    Int p1, p2, p, i, j, pj, pj2, k, nzdiag, nzboth, nz, nzaat ;
+    double sym ;
+
+#ifndef NDEBUG
+    AMD_debug_init ("AMD AAT") ;
+    for (k = 0 ; k < n ; k++) Tp [k] = EMPTY ;
+    ASSERT (AMD_valid (n, n, Ap, Ai)) ;
+#endif
+
+    if (Info != (double *) NULL)
+    {
+	/* clear the Info array, if it exists */
+	for (i = 0 ; i < AMD_INFO ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+	Info [AMD_STATUS] = AMD_OK ;
+    }
+
+    for (k = 0 ; k < n ; k++)
+    {
+	Len [k] = 0 ;
+    }
+
+    nzdiag = 0 ;
+    nzboth = 0 ;
+    nz = Ap [n] ;
+
+    for (k = 0 ; k < n ; k++)
+    {
+	p1 = Ap [k] ;
+	p2 = Ap [k+1] ;
+	AMD_DEBUG2 (("\nAAT Column: "ID" p1: "ID" p2: "ID"\n", k, p1, p2)) ;
+
+	/* construct A+A' */
+	for (p = p1 ; p < p2 ; )
+	{
+	    /* scan the upper triangular part of A */
+	    j = Ai [p] ;
+	    if (j < k)
+	    {
+		/* entry A (j,k) is in the strictly upper triangular part,
+		 * add both A (j,k) and A (k,j) to the matrix A+A' */
+		Len [j]++ ;
+		Len [k]++ ;
+		AMD_DEBUG3 (("    upper ("ID","ID") ("ID","ID")\n", j,k, k,j));
+		p++ ;
+	    }
+	    else if (j == k)
+	    {
+		/* skip the diagonal */
+		p++ ;
+		nzdiag++ ;
+		break ;
+	    }
+	    else /* j > k */
+	    {
+		/* first entry below the diagonal */
+		break ;
+	    }
+	    /* scan lower triangular part of A, in column j until reaching
+	     * row k.  Start where last scan left off. */
+	    ASSERT (Tp [j] != EMPTY) ;
+	    ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ;
+	    pj2 = Ap [j+1] ;
+	    for (pj = Tp [j] ; pj < pj2 ; )
+	    {
+		i = Ai [pj] ;
+		if (i < k)
+		{
+		    /* A (i,j) is only in the lower part, not in upper.
+		     * add both A (i,j) and A (j,i) to the matrix A+A' */
+		    Len [i]++ ;
+		    Len [j]++ ;
+		    AMD_DEBUG3 (("    lower ("ID","ID") ("ID","ID")\n",
+			i,j, j,i)) ;
+		    pj++ ;
+		}
+		else if (i == k)
+		{
+		    /* entry A (k,j) in lower part and A (j,k) in upper */
+		    pj++ ;
+		    nzboth++ ;
+		    break ;
+		}
+		else /* i > k */
+		{
+		    /* consider this entry later, when k advances to i */
+		    break ;
+		}
+	    }
+	    Tp [j] = pj ;
+	}
+	/* Tp [k] points to the entry just below the diagonal in column k */
+	Tp [k] = p ;
+    }
+
+    /* clean up, for remaining mismatched entries */
+    for (j = 0 ; j < n ; j++)
+    {
+	for (pj = Tp [j] ; pj < Ap [j+1] ; pj++)
+	{
+	    i = Ai [pj] ;
+	    /* A (i,j) is only in the lower part, not in upper.
+	     * add both A (i,j) and A (j,i) to the matrix A+A' */
+	    Len [i]++ ;
+	    Len [j]++ ;
+	    AMD_DEBUG3 (("    lower cleanup ("ID","ID") ("ID","ID")\n",
+		i,j, j,i)) ;
+	}
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* compute the symmetry of the nonzero pattern of A */
+    /* --------------------------------------------------------------------- */
+
+    /* Given a matrix A, the symmetry of A is:
+     *	B = tril (spones (A), -1) + triu (spones (A), 1) ;
+     *  sym = nnz (B & B') / nnz (B) ;
+     *  or 1 if nnz (B) is zero.
+     */
+
+    if (nz == nzdiag)
+    {
+	sym = 1 ;
+    }
+    else
+    {
+	sym = ((double) (2 * nzboth)) / ((double) (nz - nzdiag)) ;
+    }
+
+    nzaat = 0 ;
+    for (k = 0 ; k < n ; k++)
+    {
+	nzaat += Len [k] ;
+    }
+    AMD_DEBUG1 (("AMD nz in A+A', excluding diagonal (nzaat) = "ID"\n",nzaat));
+    AMD_DEBUG1 (("   nzboth: "ID" nz: "ID" nzdiag: "ID" symmetry: %g\n",
+		nzboth, nz, nzdiag, sym)) ;
+
+    if (Info != (double *) NULL)
+    {
+	Info [AMD_STATUS] = AMD_OK ;
+	Info [AMD_N] = n ;
+	Info [AMD_NZ] = nz ;
+	Info [AMD_SYMMETRY] = sym ;	    /* symmetry of pattern of A */
+	Info [AMD_NZDIAG] = nzdiag ;	    /* nonzeros on diagonal of A */
+	Info [AMD_NZ_A_PLUS_AT] = nzaat ;   /* nonzeros in A+A' */
+    }
+
+    return (nzaat) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_control.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,61 @@
+/* ========================================================================= */
+/* === AMD_control ========================================================= */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* User-callable.  Prints the control parameters for AMD.  See amd.h
+ * for details.  If the Control array is not present, the defaults are
+ * printed instead.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL void AMD_control
+(
+    double Control [ ]
+)
+{
+    double alpha ;
+    Int aggressive ;
+
+    if (Control != (double *) NULL)
+    {
+	alpha = Control [AMD_DENSE] ;
+	aggressive = Control [AMD_AGGRESSIVE] != 0 ;
+    }
+    else
+    {
+	alpha = AMD_DEFAULT_DENSE ;
+	aggressive = AMD_DEFAULT_AGGRESSIVE ;
+    }
+
+    PRINTF (("\namd:  approximate minimum degree ordering, parameters:\n"
+	"    dense row parameter: %g\n", alpha)) ;
+
+    if (alpha < 0)
+    {
+	PRINTF (("    no rows treated as dense\n")) ;
+    }
+    else
+    {
+	PRINTF ((
+	"    (rows with more than max (%g * sqrt (n), 16) entries are\n"
+	"    considered \"dense\", and placed last in output permutation)\n",
+	alpha)) ;
+    }
+
+    if (aggressive)
+    {
+	PRINTF (("    aggressive absorption:  yes\n\n")) ;
+    }
+    else
+    {
+	PRINTF (("    aggressive absorption:  no\n\n")) ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_defaults.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,33 @@
+/* ========================================================================= */
+/* === AMD_defaults ======================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* User-callable.  Sets default control parameters for AMD.  See amd.h
+ * for details.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL void AMD_defaults
+(
+    double Control [ ]
+)
+{
+    Int i ;
+    if (Control != (double *) NULL)
+    {
+	for (i = 0 ; i < AMD_CONTROL ; i++)
+	{
+	    Control [i] = 0 ;
+	}
+	Control [AMD_DENSE] = AMD_DEFAULT_DENSE ;
+	Control [AMD_AGGRESSIVE] = AMD_DEFAULT_AGGRESSIVE ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_dump.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,176 @@
+/* ========================================================================= */
+/* === AMD_dump ============================================================ */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Debugging routines for AMD.  Not used if NDEBUG is not defined at compile-
+ * time (the default).  See comments in amd_internal.h on how to enable
+ * debugging.  Not user-callable.
+ */
+
+#include "amd_internal.h"
+
+#ifndef NDEBUG
+
+/* This global variable is present only when debugging */
+GLOBAL Int AMD_debug = -999 ;		/* default is no debug printing */
+
+/* ========================================================================= */
+/* === AMD_debug_init ====================================================== */
+/* ========================================================================= */
+
+/* Sets the debug print level, by reading the file debug.amd (if it exists) */
+
+GLOBAL void AMD_debug_init ( char *s )
+{
+    FILE *f ;
+    f = fopen ("debug.amd", "r") ;
+    if (f == (FILE *) NULL)
+    {
+	AMD_debug = -999 ;
+    }
+    else
+    {
+	fscanf (f, ID, &AMD_debug) ;
+	fclose (f) ;
+    }
+    if (AMD_debug >= 0) printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug);
+}
+
+/* ========================================================================= */
+/* === AMD_dump ============================================================ */
+/* ========================================================================= */
+
+/* Dump AMD's data structure, except for the hash buckets.  This routine
+ * cannot be called when the hash buckets are non-empty.
+ */
+
+GLOBAL void AMD_dump (
+    Int n,	    /* A is n-by-n */
+    Int Pe [ ],	    /* pe [0..n-1]: index in iw of start of row i */
+    Int Iw [ ],	    /* workspace of size iwlen, iwlen [0..pfree-1]
+		     * holds the matrix on input */
+    Int Len [ ],    /* len [0..n-1]: length for row i */
+    Int iwlen,	    /* length of iw */
+    Int pfree,	    /* iw [pfree ... iwlen-1] is empty on input */
+    Int Nv [ ],	    /* nv [0..n-1] */
+    Int Next [ ],   /* next [0..n-1] */
+    Int Last [ ],   /* last [0..n-1] */
+    Int Head [ ],   /* head [0..n-1] */
+    Int Elen [ ],   /* size n */
+    Int Degree [ ], /* size n */
+    Int W [ ],	    /* size n */
+    Int nel
+)
+{
+    Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ;
+
+    if (AMD_debug < 0) return ;
+    ASSERT (pfree <= iwlen) ;
+    for (i = 0 ; i < n ; i++)
+    {
+	pe = Pe [i] ;
+	elen = Elen [i] ;
+	nv = Nv [i] ;
+	len = Len [i] ;
+	w = W [i] ;
+
+	if (elen >= EMPTY)
+	{
+	    if (nv == 0)
+	    {
+		AMD_DEBUG3 (("\nI "ID": nonprincipal:    ", i)) ;
+		ASSERT (elen == EMPTY) ;
+		if (pe == EMPTY)
+		{
+		    AMD_DEBUG3 ((" dense node\n")) ;
+		    ASSERT (w == 1) ;
+		}
+		else
+		{
+		    ASSERT (pe < EMPTY) ;
+		    AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i])));
+		}
+	    }
+	    else
+	    {
+		AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i));
+		AMD_DEBUG3 (("   nv(i): "ID"  Flag: %d\n", nv, (nv < 0))) ;
+		ASSERT (elen >= 0) ;
+		ASSERT (nv > 0 && pe >= 0) ;
+		p = pe ;
+		AMD_DEBUG3 (("   e/s: ")) ;
+		if (elen == 0) AMD_DEBUG3 ((" : ")) ;
+		ASSERT (pe < pfree) ;
+		for (k = 0 ; k < len ; k++)
+		{
+		    j = Iw [p] ;
+		    AMD_DEBUG3 (("  "ID"", j)) ;
+		    ASSERT (j >= 0 && j < n) ;
+		    if (k == elen-1) AMD_DEBUG3 ((" : ")) ;
+		    p++ ;
+		}
+		AMD_DEBUG3 (("\n")) ;
+	    }
+	}
+	else
+	{
+	    e = i ;
+	    if (w == 0)
+	    {
+		AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ;
+		ASSERT (nv > 0 && pe < 0) ;
+		AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ;
+	    }
+	    else
+	    {
+		AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ;
+		ASSERT (nv > 0 && pe >= 0) ;
+		p = pe ;
+		AMD_DEBUG3 ((" : ")) ;
+		ASSERT (pe < pfree) ;
+		for (k = 0 ; k < len ; k++)
+		{
+		    j = Iw [p] ;
+		    AMD_DEBUG3 (("  "ID"", j)) ;
+		    ASSERT (j >= 0 && j < n) ;
+		    p++ ;
+		}
+		AMD_DEBUG3 (("\n")) ;
+	    }
+	}
+    }
+
+    /* this routine cannot be called when the hash buckets are non-empty */
+    AMD_DEBUG3 (("\nDegree lists:\n")) ;
+    if (nel >= 0)
+    {
+	cnt = 0 ;
+	for (deg = 0 ; deg < n ; deg++)
+	{
+	    if (Head [deg] == EMPTY) continue ;
+	    ilast = EMPTY ;
+	    AMD_DEBUG3 ((ID": ", deg)) ;
+	    for (i = Head [deg] ; i != EMPTY ; i = Next [i])
+	    {
+		AMD_DEBUG3 ((" "ID" : next "ID" last "ID" deg "ID"\n",
+		    i, Next [i], Last [i], Degree [i])) ;
+		ASSERT (i >= 0 && i < n && ilast == Last [i] &&
+		    deg == Degree [i]) ;
+		cnt += Nv [i] ;
+		ilast = i ;
+	    }
+	    AMD_DEBUG3 (("\n")) ;
+	}
+	ASSERT (cnt == n - nel) ;
+    }
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_info.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,115 @@
+/* ========================================================================= */
+/* === AMD_info ============================================================ */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* User-callable.  Prints the output statistics for AMD.  See amd.h
+ * for details.  If the Info array is not present, nothing is printed.
+ */
+
+#include "amd_internal.h"
+
+#define PRI(format,x) { if (x >= 0) { PRINTF ((format, x)) ; }}
+
+GLOBAL void AMD_info
+(
+    double Info [ ]
+)
+{
+    double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ;
+
+    if (!Info)
+    {
+	return ;
+    }
+
+    n = Info [AMD_N] ;
+    ndiv = Info [AMD_NDIV] ;
+    nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ;
+    nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ;
+    lnz = Info [AMD_LNZ] ;
+    lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ;
+
+    /* AMD return status */
+    PRINTF ((
+	"\namd:  approximate minimum degree ordering, results:\n"
+	"    status: ")) ;
+    if (Info [AMD_STATUS] == AMD_OK)
+    {
+	PRINTF (("OK\n")) ;
+    }
+    else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY)
+    {
+	PRINTF (("out of memory\n")) ;
+    }
+    else if (Info [AMD_STATUS] == AMD_INVALID)
+    {
+	PRINTF (("invalid matrix\n")) ;
+    }
+    else
+    {
+	PRINTF (("unknown\n")) ;
+    }
+
+    /* statistics about the input matrix */
+    PRI ("    n, dimension of A:                                  %.20g\n", n);
+    PRI ("    nz, number of nonzeros in A:                        %.20g\n",
+	Info [AMD_NZ]) ;
+    PRI ("    symmetry of A:                                      %.4f\n",
+	Info [AMD_SYMMETRY]) ;
+    PRI ("    number of nonzeros on diagonal:                     %.20g\n",
+	Info [AMD_NZDIAG]) ;
+    PRI ("    nonzeros in pattern of A+A' (excl. diagonal):       %.20g\n",
+	Info [AMD_NZ_A_PLUS_AT]) ;
+    PRI ("    # dense rows/columns of A+A':                       %.20g\n",
+	Info [AMD_NDENSE]) ;
+
+    /* statistics about AMD's behavior  */
+    PRI ("    memory used, in bytes:                              %.20g\n",
+	Info [AMD_MEMORY]) ;
+    PRI ("    # of memory compactions:                            %.20g\n",
+	Info [AMD_NCMPA]) ;
+
+    /* statistics about the ordering quality */
+    PRINTF (("\n"
+	"    The following approximate statistics are for a subsequent\n"
+	"    factorization of A(P,P) + A(P,P)'.  They are slight upper\n"
+	"    bounds if there are no dense rows/columns in A+A', and become\n"
+	"    looser if dense rows/columns exist.\n\n")) ;
+
+    PRI ("    nonzeros in L (excluding diagonal):                 %.20g\n",
+	lnz) ;
+    PRI ("    nonzeros in L (including diagonal):                 %.20g\n",
+	lnzd) ;
+    PRI ("    # divide operations for LDL' or LU:                 %.20g\n",
+	ndiv) ;
+    PRI ("    # multiply-subtract operations for LDL':            %.20g\n",
+	nmultsubs_ldl) ;
+    PRI ("    # multiply-subtract operations for LU:              %.20g\n",
+	nmultsubs_lu) ;
+    PRI ("    max nz. in any column of L (incl. diagonal):        %.20g\n",
+	Info [AMD_DMAX]) ;
+
+    /* total flop counts for various factorizations */
+
+    if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0)
+    {
+	PRINTF (("\n"
+	"    chol flop count for real A, sqrt counted as 1 flop: %.20g\n"
+	"    LDL' flop count for real A:                         %.20g\n"
+	"    LDL' flop count for complex A:                      %.20g\n"
+	"    LU flop count for real A (with no pivoting):        %.20g\n"
+	"    LU flop count for complex A (with no pivoting):     %.20g\n\n",
+	n + ndiv + 2*nmultsubs_ldl,
+	    ndiv + 2*nmultsubs_ldl,
+	  9*ndiv + 8*nmultsubs_ldl,
+	    ndiv + 2*nmultsubs_lu,
+	  9*ndiv + 8*nmultsubs_lu)) ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_internal.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,426 @@
+/* ========================================================================= */
+/* === amd_internal.h ====================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* This file is for internal use in AMD itself, and does not normally need to
+ * be included in user code.  Use amd.h instead.
+ *
+ * The following compile-time definitions affect how AMD is compiled.
+ *
+ *	-DMATLAB_MEX_FILE
+ *
+ *	    This flag is turned on when compiling the amd mexFunction for
+ *	    use in MATLAB.
+ *
+ *	-DMATHWORKS
+ *
+ *	    This flag is turned on when compiling amd as a built-in routine
+ *	    in MATLAB.  Internal routines utMalloc, utFree, utRealloc, and
+ *	    utPrintf are used, and the MathWorks "util.h" file is included.  
+ *	    This option is intended for use by The MathWorks, Inc., only.
+ *
+ *	-DNDEBUG
+ *
+ *	    Debugging mode (if NDEBUG is not defined).  The default, of course,
+ *	    is no debugging.  Turning on debugging takes some work (see below).
+ *	    If you do not edit this file, then debugging is turned off anyway,
+ *	    regardless of whether or not -DNDEBUG is specified in your compiler
+ *	    options.
+ *
+ *	-DALLOCATE=allocation_routine
+ *	-DFREE=free_routine
+ *
+ *	    If you do not wish to use malloc or free, you can define the
+ *	    routines to be used here.  You must specify both of them, or
+ *	    neither.
+ *
+ *	-DPRINTF=printf_routine
+ *
+ *	    If you wish to use a routine other than printf, you can define it
+ *	    with -DPRINTF= followed by the name of the printf replacement.
+ */
+
+/* ========================================================================= */
+/* === NDEBUG ============================================================== */
+/* ========================================================================= */
+
+/*
+    AMD will be exceedingly slow when running in debug mode.  The next three
+    lines ensure that debugging is turned off.
+*/
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+
+/*
+    To enable debugging, uncomment the following line:
+#undef NDEBUG
+*/
+
+/* ------------------------------------------------------------------------- */
+/* ANSI include files */
+/* ------------------------------------------------------------------------- */
+
+/* from stdlib.h:  malloc, free, realloc (when not compiling for MATLAB) */
+#include <stdlib.h>
+
+/* from stdio.h:  printf.  When in debug mode:  fopen, fscanf */
+#include <stdio.h>
+
+/* from limits.h:  INT_MAX and LONG_MAX */
+#include <limits.h>
+
+/* from math.h: sqrt */
+#include <math.h>
+
+/* ------------------------------------------------------------------------- */
+/* MATLAB include files (only if being used in or via MATLAB) */
+/* ------------------------------------------------------------------------- */
+
+#ifdef MATHWORKS
+#include "util.h"
+#endif
+
+#ifdef MATLAB_MEX_FILE
+#include "matrix.h"
+#include "mex.h"
+#endif
+
+/* ------------------------------------------------------------------------- */
+/* basic definitions */
+/* ------------------------------------------------------------------------- */
+
+#ifdef FLIP
+#undef FLIP
+#endif
+
+#ifdef MAX
+#undef MAX
+#endif
+
+#ifdef MIN
+#undef MIN
+#endif
+
+#ifdef EMPTY
+#undef EMPTY
+#endif
+
+#ifdef GLOBAL
+#undef GLOBAL
+#endif
+
+#ifdef PRIVATE
+#undef PRIVATE
+#endif
+
+/* FLIP is a "negation about -1", and is used to mark an integer i that is
+ * normally non-negative.  FLIP (EMPTY) is EMPTY.  FLIP of a number > EMPTY
+ * is negative, and FLIP of a number < EMTPY is positive.  FLIP (FLIP (i)) = i
+ * for all integers i.  UNFLIP (i) is >= EMPTY. */
+#define EMPTY (-1)
+#define FLIP(i) (-(i)-2)
+#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i))
+
+/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+/* logical expression of p implies q: */
+#define IMPLIES(p,q) (!(p) || (q))
+
+/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in <types.h>. */
+/* The Compaq Alpha also predefines TRUE and FALSE. */
+#ifdef TRUE
+#undef TRUE
+#endif
+#ifdef FALSE
+#undef FALSE
+#endif
+
+#define TRUE (1)
+#define FALSE (0)
+#define PRIVATE static
+#define GLOBAL
+#define EMPTY (-1)
+
+/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */
+/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0).  We */
+/* need to use the ANSI standard value of 0. */
+#ifdef NULL
+#undef NULL
+#endif
+
+#define NULL 0
+
+/* ------------------------------------------------------------------------- */
+/* integer type for AMD: int or long */
+/* ------------------------------------------------------------------------- */
+
+#if defined (DLONG) || defined (ZLONG)
+
+#define Int long
+#define ID "%ld"
+#define Int_MAX LONG_MAX
+#define Int_MIN LONG_MIN
+
+#define AMD_order amd_l_order
+#define AMD_defaults amd_l_defaults
+#define AMD_control amd_l_control
+#define AMD_info amd_l_info
+#define AMD_1 amd_l1
+#define AMD_2 amd_l2
+#define AMD_valid amd_l_valid
+#define AMD_aat amd_l_aat
+#define AMD_postorder amd_l_postorder
+#define AMD_post_tree amd_l_post_tree
+#define AMD_dump amd_l_dump
+#define AMD_debug amd_l_debug
+#define AMD_debug_init amd_l_debug_init
+#define AMD_wpreprocess amd_l_wpreprocess
+#define AMD_preprocess amd_l_preprocess
+#define AMD_preprocess_valid amd_l_preprocess_valid
+
+#else
+
+#define Int int
+#define ID "%d"
+#define Int_MAX INT_MAX
+#define Int_MIN INT_MIN
+
+#define AMD_order amd_order
+#define AMD_defaults amd_defaults
+#define AMD_control amd_control
+#define AMD_info amd_info
+#define AMD_1 amd_1
+#define AMD_2 amd_2
+#define AMD_valid amd_valid
+#define AMD_aat amd_aat
+#define AMD_postorder amd_postorder
+#define AMD_post_tree amd_post_tree
+#define AMD_dump amd_dump
+#define AMD_debug amd_debug
+#define AMD_debug_init amd_debug_init
+#define AMD_wpreprocess amd_wpreprocess
+#define AMD_preprocess amd_preprocess
+#define AMD_preprocess_valid amd_preprocess_valid
+
+#endif
+
+/* ========================================================================= */
+/* === Memory allocator ==================================================== */
+/* ========================================================================= */
+
+/* The MATLAB mexFunction uses MATLAB's memory manager, while the C-callable */
+/* AMD routine uses the ANSI C malloc, free, and realloc routines. */
+
+#ifndef ALLOCATE
+#ifdef MATLAB_MEX_FILE
+#define ALLOCATE mxMalloc
+#define FREE mxFree
+#else
+#ifdef MATHWORKS
+/* Compiling as a built-in routine.  Since out-of-memory conditions are checked
+ * after every allocation, we can use ut* routines here. */
+#define ALLOCATE utMalloc
+#define FREE utFree
+#else
+/* use the ANSI C memory allocation routines */
+#define ALLOCATE malloc
+#define FREE free
+#endif
+#endif
+#endif
+
+
+/* ========================================================================= */
+/* === PRINTF macro ======================================================== */
+/* ========================================================================= */
+
+/* All output goes through the PRINTF macro.  */
+
+#ifndef PRINTF
+#ifdef MATLAB_MEX_FILE
+#define PRINTF(params) { (void) mexPrintf params ; }
+#else
+#ifdef MATHWORKS
+#define PRINTF(params) { (void) utPrintf params ; }
+#else
+#define PRINTF(params) { (void) printf params ; }
+#endif
+#endif
+#endif
+
+/* ------------------------------------------------------------------------- */
+/* AMD routine definitions (user-callable) */
+/* ------------------------------------------------------------------------- */
+
+#include "amd.h"
+
+/* ------------------------------------------------------------------------- */
+/* AMD routine definitions (not user-callable) */
+/* ------------------------------------------------------------------------- */
+
+GLOBAL Int AMD_valid
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ]
+) ;
+
+GLOBAL Int AMD_aat
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    Int Len [ ],
+    Int Tp [ ],	
+    double Info [ ]
+) ;
+
+GLOBAL void AMD_1
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    Int P [ ],
+    Int Pinv [ ],
+    Int Len [ ],
+    Int slen,
+    Int S [ ],
+    double Control [ ],
+    double Info [ ]
+) ;
+
+GLOBAL void AMD_2 (
+    Int n,
+    Int Pe [ ],
+    Int Iw [ ],
+    Int Len [ ],
+    Int iwlen,
+    Int pfree,
+    Int Nv [ ],
+    Int Next [ ], 
+    Int Last [ ],
+    Int Head [ ],
+    Int Elen [ ],
+    Int Degree [ ],
+    Int W [ ],
+    double Control [ ],
+    double Info [ ]
+) ;
+
+GLOBAL void AMD_postorder
+(
+    Int nn,
+    Int Parent [ ],
+    Int Npiv [ ],
+    Int Fsize [ ],
+    Int Order [ ],
+    Int Child [ ],
+    Int Sibling [ ],
+    Int Stack [ ]
+) ;
+
+GLOBAL Int AMD_post_tree
+(
+    Int root,
+    Int k,
+    Int Child [ ],
+    const Int Sibling [ ],
+    Int Order [ ],
+    Int Stack [ ]
+#ifndef NDEBUG
+    , Int nn
+#endif
+) ;
+
+GLOBAL void AMD_wpreprocess
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    Int Rp [ ],
+    Int Ri [ ],
+    Int W [ ],
+    Int Flag [ ]
+) ;
+
+GLOBAL Int AMD_preprocess_valid
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ]
+) ;
+
+/* ------------------------------------------------------------------------- */
+/* debugging definitions */
+/* ------------------------------------------------------------------------- */
+
+/* from assert.h:  assert macro */
+#if !defined (MATHWORKS) && !defined (MATLAB_MEX_FILE)
+#include <assert.h>
+#endif
+
+#ifndef NDEBUG
+
+GLOBAL Int AMD_debug ;
+
+GLOBAL void AMD_debug_init ( char *s ) ;
+
+GLOBAL void AMD_dump (
+    Int n,
+    Int Pe [ ],
+    Int Iw [ ],
+    Int Len [ ],
+    Int iwlen,
+    Int pfree,
+    Int Nv [ ],
+    Int Next [ ],
+    Int Last [ ],
+    Int Head [ ],
+    Int Elen [ ],
+    Int Degree [ ],
+    Int W [ ],
+    Int nel
+) ;
+
+#ifdef ASSERT
+#undef ASSERT
+#endif
+
+#ifdef MATLAB_MEX_FILE
+#define ASSERT(expression) (mxAssert ((expression), ""))
+#else
+#ifdef MATHWORKS
+#define ASSERT(expression) (utAssert (expression))
+#else
+#define ASSERT(expression) (assert (expression))
+#endif
+#endif /* MATLAB_MEX_FILE */
+
+#define AMD_DEBUG0(params) { PRINTF (params) ; }
+#define AMD_DEBUG1(params) { if (AMD_debug >= 1) PRINTF (params) ; }
+#define AMD_DEBUG2(params) { if (AMD_debug >= 2) PRINTF (params) ; }
+#define AMD_DEBUG3(params) { if (AMD_debug >= 3) PRINTF (params) ; }
+#define AMD_DEBUG4(params) { if (AMD_debug >= 4) PRINTF (params) ; }
+
+#else
+
+#define AMD_DEBUG0(params)
+#define AMD_DEBUG1(params)
+#define AMD_DEBUG2(params)
+#define AMD_DEBUG3(params)
+#define AMD_DEBUG4(params)
+
+#define ASSERT(expression)
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_order.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,139 @@
+/* ========================================================================= */
+/* === AMD_order =========================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* User-callable AMD minimum degree ordering routine.  See amd.h for
+ * documentation.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL Int AMD_order
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    Int P [ ],
+    double Control [ ],
+    double Info [ ]
+)
+{
+    Int slen, *Len, *S, nz, nzaat, i, *Pinv, info ;
+
+#ifndef NDEBUG
+    AMD_debug_init ("amd") ;
+#endif
+
+    /* clear the Info array, if it exists */
+    info = Info != (double *) NULL ;
+    if (info)
+    {
+	for (i = 0 ; i < AMD_INFO ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+	Info [AMD_N] = n ;
+	Info [AMD_STATUS] = AMD_OK ;
+    }
+
+    /* make sure inputs exist and n is >= 0 */
+    if (Ai == (Int *) NULL || Ap == (Int *) NULL || P == (Int *) NULL || n < 0)
+    {
+	if (info) Info [AMD_STATUS] = AMD_INVALID ;
+	return (AMD_INVALID) ;	    /* arguments are invalid */
+    }
+
+    if (n == 0)
+    {
+	return (AMD_OK) ;	    /* n is 0 so there's nothing to do */
+    }
+
+    nz = Ap [n] ;
+    if (info)
+    {
+	Info [AMD_NZ] = nz ;
+    }
+    if (nz < 0)
+    {
+	if (info) Info [AMD_STATUS] = AMD_INVALID ;
+	return (AMD_INVALID) ;
+    }
+
+    /* Avoid integer overflow in memory size calculations.  The space required
+     * by AMD is at most 2.4nz + 8n for S, and n for Len.
+     * Note nz - n <= nzaat <= 2*nz, below. */
+    if ((2.4 * (double) nz + 8 * (double) n) > (double) Int_MAX / sizeof (Int))
+    {
+	/* :: int overflow :: */
+	if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
+	return (AMD_OUT_OF_MEMORY) ;
+    }
+
+    if (!AMD_valid (n, n, Ap, Ai))
+    {
+	if (info) Info [AMD_STATUS] = AMD_INVALID ;
+	return (AMD_INVALID) ;	    /* matrix is invalid */
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* determine the symmetry and count off-diagonal nonzeros in A+A' */
+    /* --------------------------------------------------------------------- */
+
+    /* allocate size-n integer workspace */
+    Len = (Int *) ALLOCATE (n * sizeof (Int)) ;
+    if (!Len)
+    {
+	/* :: out of memory :: */
+	if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
+	return (AMD_OUT_OF_MEMORY) ;
+    }
+    nzaat = AMD_aat (n, Ap, Ai, Len, P, Info) ;
+    AMD_DEBUG1 (("nzaat: "ID"\n", nzaat)) ;
+    ASSERT (nz-n <= nzaat && nzaat <= 2*nz) ;
+
+    /* --------------------------------------------------------------------- */
+    /* allocate workspace for matrix, elbow room, and 7 size-n vectors */
+    /* --------------------------------------------------------------------- */
+
+    slen = (nzaat + nzaat/5 + n) + 7*n ;
+    if (info)
+    {
+	/* memory usage (Len and S), in bytes. */
+	Info [AMD_MEMORY] = ((double) slen + n) * sizeof (Int) ;
+    }
+    S = (Int *) ALLOCATE (slen * sizeof (Int)) ;
+    AMD_DEBUG1 ((" S "ID" Len "ID" n "ID" nzaat "ID" slen "ID"\n",
+	(Int) S, (Int) Len, n, nzaat, slen)) ;
+    if (S == (Int *) NULL)
+    {
+	/* :: out of memory :: */
+	FREE (Len) ;
+	if (Info != (double *) NULL) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
+	return (AMD_OUT_OF_MEMORY) ;
+    }
+
+    /* allocate space from S for Pinv */
+    Pinv = S + slen - n ;
+    slen -= n ;
+
+    /* --------------------------------------------------------------------- */
+    /* order the matrix */
+    /* --------------------------------------------------------------------- */
+
+    AMD_1 (n, Ap, Ai, P, Pinv, Len, slen, S, Control, Info) ;
+
+    /* --------------------------------------------------------------------- */
+    /* free the workspace */
+    /* --------------------------------------------------------------------- */
+
+    FREE (Len) ;
+    FREE (S) ;
+    return (AMD_OK) ;	    /* successful ordering */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_post_tree.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,121 @@
+/* ========================================================================= */
+/* === AMD_post_tree ======================================================= */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Post-ordering of a supernodal elimination tree.  */
+
+#include "amd_internal.h"
+
+GLOBAL Int AMD_post_tree
+(
+    Int root,			/* root of the tree */
+    Int k,			/* start numbering at k */
+    Int Child [ ],		/* input argument of size nn, undefined on
+				 * output.  Child [i] is the head of a link
+				 * list of all nodes that are children of node
+				 * i in the tree. */
+    const Int Sibling [ ],	/* input argument of size nn, not modified.
+				 * If f is a node in the link list of the
+				 * children of node i, then Sibling [f] is the
+				 * next child of node i.
+				 */
+    Int Order [ ],		/* output order, of size nn.  Order [i] = k
+				 * if node i is the kth node of the reordered
+				 * tree. */
+    Int Stack [ ]		/* workspace of size nn */
+#ifndef NDEBUG
+    , Int nn			/* nodes are in the range 0..nn-1. */
+#endif
+)
+{
+    Int f, head, h, i ;
+
+#if 0
+    /* --------------------------------------------------------------------- */
+    /* recursive version (Stack [ ] is not used): */
+    /* --------------------------------------------------------------------- */
+
+    /* this is simple, but can caouse stack overflow if nn is large */
+    i = root ;
+    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+    {
+	k = AMD_post_tree (f, k, Child, Sibling, Order, Stack, nn) ;
+    }
+    Order [i] = k++ ;
+    return (k) ;
+#endif
+
+    /* --------------------------------------------------------------------- */
+    /* non-recursive version, using an explicit stack */
+    /* --------------------------------------------------------------------- */
+
+    /* push root on the stack */
+    head = 0 ;
+    Stack [0] = root ;
+
+    while (head >= 0)
+    {
+	/* get head of stack */
+	ASSERT (head < nn) ;
+	i = Stack [head] ;
+	AMD_DEBUG1 (("head of stack "ID" \n", i)) ;
+	ASSERT (i >= 0 && i < nn) ;
+
+	if (Child [i] != EMPTY)
+	{
+	    /* the children of i are not yet ordered */
+	    /* push each child onto the stack in reverse order */
+	    /* so that small ones at the head of the list get popped first */
+	    /* and the biggest one at the end of the list gets popped last */
+	    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+	    {
+		head++ ;
+		ASSERT (head < nn) ;
+		ASSERT (f >= 0 && f < nn) ;
+	    }
+	    h = head ;
+	    ASSERT (head < nn) ;
+	    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+	    {
+		ASSERT (h > 0) ;
+		Stack [h--] = f ;
+		AMD_DEBUG1 (("push "ID" on stack\n", f)) ;
+		ASSERT (f >= 0 && f < nn) ;
+	    }
+	    ASSERT (Stack [h] == i) ;
+
+	    /* delete child list so that i gets ordered next time we see it */
+	    Child [i] = EMPTY ;
+	}
+	else
+	{
+	    /* the children of i (if there were any) are already ordered */
+	    /* remove i from the stack and order it.  Front i is kth front */
+	    head-- ;
+	    AMD_DEBUG1 (("pop "ID" order "ID"\n", i, k)) ;
+	    Order [i] = k++ ;
+	    ASSERT (k <= nn) ;
+	}
+
+#ifndef NDEBUG
+	AMD_DEBUG1 (("\nStack:")) ;
+	for (h = head ; h >= 0 ; h--)
+	{
+	    Int j = Stack [h] ;
+	    AMD_DEBUG1 ((" "ID, j)) ;
+	    ASSERT (j >= 0 && j < nn) ;
+	}
+	AMD_DEBUG1 (("\n\n")) ;
+	ASSERT (head < nn) ;
+#endif
+
+    }
+    return (k) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_postorder.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,207 @@
+/* ========================================================================= */
+/* === AMD_postorder ======================================================= */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Perform a postordering (via depth-first search) of an assembly tree. */
+
+#include "amd_internal.h"
+
+GLOBAL void AMD_postorder
+(
+    /* inputs, not modified on output: */
+    Int nn,		/* nodes are in the range 0..nn-1 */
+    Int Parent [ ],	/* Parent [j] is the parent of j, or EMPTY if root */
+    Int Nv [ ],		/* Nv [j] > 0 number of pivots represented by node j,
+			 * or zero if j is not a node. */
+    Int Fsize [ ],	/* Fsize [j]: size of node j */
+
+    /* output, not defined on input: */
+    Int Order [ ],	/* output post-order */
+
+    /* workspaces of size nn: */
+    Int Child [ ],
+    Int Sibling [ ],
+    Int Stack [ ]
+)
+{
+    Int i, j, k, parent, frsize, f, fprev, maxfrsize, bigfprev, bigf, fnext ;
+
+    for (j = 0 ; j < nn ; j++)
+    {
+	Child [j] = EMPTY ;
+	Sibling [j] = EMPTY ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* place the children in link lists - bigger elements tend to be last */
+    /* --------------------------------------------------------------------- */
+
+    for (j = nn-1 ; j >= 0 ; j--)
+    {
+	if (Nv [j] > 0)
+	{
+	    /* this is an element */
+	    parent = Parent [j] ;
+	    if (parent != EMPTY)
+	    {
+		/* place the element in link list of the children its parent */
+		/* bigger elements will tend to be at the end of the list */
+		Sibling [j] = Child [parent] ;
+		Child [parent] = j ;
+	    }
+	}
+    }
+
+#ifndef NDEBUG
+    {
+	Int nels, ff, nchild ;
+	AMD_DEBUG1 (("\n\n================================ AMD_postorder:\n"));
+	nels = 0 ;
+	for (j = 0 ; j < nn ; j++)
+	{
+	    if (Nv [j] > 0)
+	    {
+		AMD_DEBUG1 (( ""ID" :  nels "ID" npiv "ID" size "ID
+		    " parent "ID" maxfr "ID"\n", j, nels,
+		    Nv [j], Fsize [j], Parent [j], Fsize [j])) ;
+		/* this is an element */
+		/* dump the link list of children */
+		nchild = 0 ;
+		AMD_DEBUG1 (("    Children: ")) ;
+		for (ff = Child [j] ; ff != EMPTY ; ff = Sibling [ff])
+		{
+		    AMD_DEBUG1 ((ID" ", ff)) ;
+		    ASSERT (Parent [ff] == j) ;
+		    nchild++ ;
+		    ASSERT (nchild < nn) ;
+		}
+		AMD_DEBUG1 (("\n")) ;
+		parent = Parent [j] ;
+		if (parent != EMPTY)
+		{
+		    ASSERT (Nv [parent] > 0) ;
+		}
+		nels++ ;
+	    }
+	}
+    }
+    AMD_DEBUG1 (("\n\nGo through the children of each node, and put\n"
+		 "the biggest child last in each list:\n")) ;
+#endif
+
+    /* --------------------------------------------------------------------- */
+    /* place the largest child last in the list of children for each node */
+    /* --------------------------------------------------------------------- */
+
+    for (i = 0 ; i < nn ; i++)
+    {
+	if (Nv [i] > 0 && Child [i] != EMPTY)
+	{
+
+#ifndef NDEBUG
+	    Int nchild ;
+	    AMD_DEBUG1 (("Before partial sort, element "ID"\n", i)) ;
+	    nchild = 0 ;
+	    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+	    {
+		ASSERT (f >= 0 && f < nn) ;
+		AMD_DEBUG1 (("      f: "ID"  size: "ID"\n", f, Fsize [f])) ;
+		nchild++ ;
+		ASSERT (nchild <= nn) ;
+	    }
+#endif
+
+	    /* find the biggest element in the child list */
+	    fprev = EMPTY ;
+	    maxfrsize = EMPTY ;
+	    bigfprev = EMPTY ;
+	    bigf = EMPTY ;
+	    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+	    {
+		ASSERT (f >= 0 && f < nn) ;
+		frsize = Fsize [f] ;
+		if (frsize >= maxfrsize)
+		{
+		    /* this is the biggest seen so far */
+		    maxfrsize = frsize ;
+		    bigfprev = fprev ;
+		    bigf = f ;
+		}
+		fprev = f ;
+	    }
+	    ASSERT (bigf != EMPTY) ;
+
+	    fnext = Sibling [bigf] ;
+
+	    AMD_DEBUG1 (("bigf "ID" maxfrsize "ID" bigfprev "ID" fnext "ID
+		" fprev " ID"\n", bigf, maxfrsize, bigfprev, fnext, fprev)) ;
+
+	    if (fnext != EMPTY)
+	    {
+		/* if fnext is EMPTY then bigf is already at the end of list */
+
+		if (bigfprev == EMPTY)
+		{
+		    /* delete bigf from the element of the list */
+		    Child [i] = fnext ;
+		}
+		else
+		{
+		    /* delete bigf from the middle of the list */
+		    Sibling [bigfprev] = fnext ;
+		}
+
+		/* put bigf at the end of the list */
+		Sibling [bigf] = EMPTY ;
+		ASSERT (Child [i] != EMPTY) ;
+		ASSERT (fprev != bigf) ;
+		ASSERT (fprev != EMPTY) ;
+		Sibling [fprev] = bigf ;
+	    }
+
+#ifndef NDEBUG
+	    AMD_DEBUG1 (("After partial sort, element "ID"\n", i)) ;
+	    for (f = Child [i] ; f != EMPTY ; f = Sibling [f])
+	    {
+		ASSERT (f >= 0 && f < nn) ;
+		AMD_DEBUG1 (("        "ID"  "ID"\n", f, Fsize [f])) ;
+		ASSERT (Nv [f] > 0) ;
+		nchild-- ;
+	    }
+	    ASSERT (nchild == 0) ;
+#endif
+
+	}
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* postorder the assembly tree */
+    /* --------------------------------------------------------------------- */
+
+    for (i = 0 ; i < nn ; i++)
+    {
+	Order [i] = EMPTY ;
+    }
+
+    k = 0 ;
+
+    for (i = 0 ; i < nn ; i++)
+    {
+	if (Parent [i] == EMPTY && Nv [i] > 0)
+	{
+	    AMD_DEBUG1 (("Root of assembly tree "ID"\n", i)) ;
+	    k = AMD_post_tree (i, k, Child, Sibling, Order, Stack
+#ifndef NDEBUG
+		, nn
+#endif
+		) ;
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_preprocess.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,225 @@
+/* ========================================================================= */
+/* === AMD_preprocess ====================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Sorts, removes duplicate entries, and transposes from the nonzero pattern of
+ * a column-form matrix A, to obtain the matrix R.
+ * See amd.h for a complete description of AMD_preprocess 
+ */
+
+#include "amd_internal.h"
+
+GLOBAL Int AMD_preprocess   /* returns AMD_OK if input is OK, AMD_INVALID
+			     * if the matrix is invalid, or AMD_OUT_OF_MEMORY
+			     * if out of memory for the 2n workspace. */
+(
+    Int n,		/* input matrix: A is n-by-n */
+    const Int Ap [ ],	/* size n+1 */
+    const Int Ai [ ],	/* size nz = Ap [n] */
+
+    /* output matrix R: */
+    Int Rp [ ],		/* size n+1 */
+    Int Ri [ ]		/* size nz (or less, if duplicates present) */
+)
+{
+    /* --------------------------------------------------------------------- */
+    /* local variables */
+    /* --------------------------------------------------------------------- */
+
+    Int *Flag, *W ;
+
+    /* --------------------------------------------------------------------- */
+    /* check inputs (note: fewer restrictions than AMD_order) */
+    /* --------------------------------------------------------------------- */
+
+    if (!AMD_preprocess_valid (n, Ap, Ai) || !Ri || !Rp)
+    {
+	return (AMD_INVALID) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* --------------------------------------------------------------------- */
+
+    W = (Int *) ALLOCATE (MAX (n,1) * sizeof (Int)) ;
+    if (!W)
+    {
+	return (AMD_OUT_OF_MEMORY) ;
+    }
+    Flag = (Int *) ALLOCATE (MAX (n,1) * sizeof (Int)) ;
+    if (!Flag)
+    {
+	FREE (W) ;
+	return (AMD_OUT_OF_MEMORY) ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* preprocess the matrix:  sort, remove duplicates, and transpose */
+    /* --------------------------------------------------------------------- */
+
+    AMD_wpreprocess (n, Ap, Ai, Rp, Ri, W, Flag) ;
+
+    /* --------------------------------------------------------------------- */
+    /* free the workspace */
+    /* --------------------------------------------------------------------- */
+
+    FREE (W) ;
+    FREE (Flag) ;
+    return (AMD_OK) ;
+}
+
+
+/* ========================================================================= */
+/* === AMD_wpreprocess ===================================================== */
+/* ========================================================================= */
+
+/* The AMD_wpreprocess routine is not user-callable.  It does not check its
+ * input for errors or allocate workspace (that is done by the user-callable
+ * AMD_preprocess routine).  It does handle the n=0 case. */
+
+GLOBAL void AMD_wpreprocess
+(
+    Int n,		/* input matrix: A is n-by-n */
+    const Int Ap [ ],	/* size n+1 */
+    const Int Ai [ ],	/* size nz = Ap [n] */
+
+    /* output matrix R: */
+    Int Rp [ ],		/* size n+1 */
+    Int Ri [ ],		/* size nz (or less, if duplicates present) */
+
+    Int W [ ],		/* workspace of size n */
+    Int Flag [ ]	/* workspace of size n */
+)
+{
+
+    /* --------------------------------------------------------------------- */
+    /* local variables */
+    /* --------------------------------------------------------------------- */
+
+    Int i, j, p, p2 ;
+
+    /* --------------------------------------------------------------------- */
+    /* count the entries in each row of A (excluding duplicates) */
+    /* --------------------------------------------------------------------- */
+
+    for (i = 0 ; i < n ; i++)
+    {
+	W [i] = 0 ;		/* # of nonzeros in row i (excl duplicates) */
+	Flag [i] = EMPTY ;	/* Flag [i] = j if i appears in column j */
+    }
+    for (j = 0 ; j < n ; j++)
+    {
+	p2 = Ap [j+1] ;
+	for (p = Ap [j] ; p < p2 ; p++)
+	{
+	    i = Ai [p] ;
+	    if (Flag [i] != j)
+	    {
+		/* row index i has not yet appeared in column j */
+		W [i]++ ;	    /* one more entry in row i */
+		Flag [i] = j ;	    /* flag row index i as appearing in col j*/
+	    }
+	}
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* compute the row pointers for R */
+    /* --------------------------------------------------------------------- */
+
+    Rp [0] = 0 ;
+    for (i = 0 ; i < n ; i++)
+    {
+	Rp [i+1] = Rp [i] + W [i] ;
+    }
+    for (i = 0 ; i < n ; i++)
+    {
+	W [i] = Rp [i] ;
+	Flag [i] = EMPTY ;
+    }
+
+    /* --------------------------------------------------------------------- */
+    /* construct the row form matrix R */
+    /* --------------------------------------------------------------------- */
+
+    /* R = row form of pattern of A */
+    for (j = 0 ; j < n ; j++)
+    {
+	p2 = Ap [j+1] ;
+	for (p = Ap [j] ; p < p2 ; p++)
+	{
+	    i = Ai [p] ;
+	    if (Flag [i] != j)
+	    {
+		/* row index i has not yet appeared in column j */
+		Ri [W [i]++] = j ;  /* put col j in row i */
+		Flag [i] = j ;	    /* flag row index i as appearing in col j*/
+	    }
+	}
+    }
+
+#ifndef NDEBUG
+    for (j = 0 ; j < n ; j++)
+    {
+	ASSERT (W [j] == Rp [j+1]) ;
+    }
+    ASSERT (AMD_valid (n, n, Rp, Ri)) ;
+#endif
+}
+
+
+/* ========================================================================= */
+/* === AMD_preprocess_valid ================================================ */
+/* ========================================================================= */
+
+/* Not user-callable.  Checks a matrix and returns TRUE if it is valid as input
+ * to AMD_wpreprocess, FALSE otherwise. */
+
+GLOBAL Int AMD_preprocess_valid
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ]
+)
+{
+    Int i, j, p, nz ;
+
+    if (n < 0 || !Ai || !Ap)
+    {
+	return (FALSE) ;
+    }
+    nz = Ap [n] ;
+    if (Ap [0] != 0 || nz < 0)
+    {
+	/* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */
+	AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ;
+	return (FALSE) ;
+    }
+    for (j = 0 ; j < n ; j++)
+    {
+	if (Ap [j] > Ap [j+1])
+	{
+	    /* column pointers must be ascending */
+	    AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ;
+	    return (FALSE) ;
+	}
+    }
+    for (p = 0 ; p < nz ; p++)
+    {
+	i = Ai [p] ;
+	AMD_DEBUG3 (("row: "ID"\n", i)) ;
+	if (i < 0 || i >= n)
+	{
+	    /* row index out of range */
+	    AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i)) ;
+	    return (FALSE) ;
+	}
+    }
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amd_valid.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,78 @@
+/* ========================================================================= */
+/* === AMD_valid =========================================================== */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* AMD Version 1.1 (Jan. 21, 2004), Copyright (c) 2004 by Timothy A. Davis,  */
+/* Patrick R. Amestoy, and Iain S. Duff.  See ../README for License.         */
+/* email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.           */
+/* web: http://www.cise.ufl.edu/research/sparse/amd                          */
+/* ------------------------------------------------------------------------- */
+
+/* Check if a column-form matrix is valid or not.  The matrix A is
+ * n_row-by-n_col.  The row indices of entries in column j are in
+ * Ai [Ap [j] ... Ap [j+1]-1].  Required conditions are:
+ *
+ *	n_row >= 0
+ *	n_col >= 0
+ *	nz = Ap [n_col] >= 0	    number of entries in the matrix
+ *	Ap [0] == 0
+ *	Ap [j] <= Ap [j+1] for all j in the range 0 to n_col.
+ *	row indices in Ai [Ap [j] ... Ap [j+1]-1] must be sorted in ascending
+ *	    order, must be in the range 0 to n_row-1, and no duplicate entries
+ *	    can exist.
+ *
+ * Not user-callable.
+ */
+
+#include "amd_internal.h"
+
+GLOBAL Int AMD_valid
+(
+    /* inputs, not modified on output: */
+    Int n_row,		/* A is n_row-by-n_col */
+    Int n_col,
+    const Int Ap [ ],	/* column pointers of A, of size n_col+1 */
+    const Int Ai [ ]	/* row indices of A, of size nz = Ap [n_col] */
+)
+{
+    Int nz, j, p1, p2, ilast, i, p ;
+    if (n_row < 0 || n_col < 0)
+    {
+	AMD_DEBUG0 (("n must be >= 0: "ID" "ID"\n", n_row, n_col)) ;
+	return (FALSE) ;
+    }
+    nz = Ap [n_col] ;
+    if (Ap [0] != 0 || nz < 0)
+    {
+	/* column pointers must start at Ap [0] = 0, and Ap [n] must be >= 0 */
+	AMD_DEBUG0 (("column 0 pointer bad or nz < 0\n")) ;
+	return (FALSE) ;
+    }
+    for (j = 0 ; j < n_col ; j++)
+    {
+	p1 = Ap [j] ;
+	p2 = Ap [j+1] ;
+	AMD_DEBUG2 (("\nColumn: "ID" p1: "ID" p2: "ID"\n", j, p1, p2)) ;
+	if (p1 > p2)
+	{
+	    /* column pointers must be ascending */
+	    AMD_DEBUG0 (("column "ID" pointer bad\n", j)) ;
+	    return (FALSE) ;
+	}
+	ilast = EMPTY ;
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    i = Ai [p] ;
+	    AMD_DEBUG3 (("row: "ID"\n", i)) ;
+	    if (i <= ilast || i >= n_row)
+	    {
+		/* row index out of range, or unsorted */
+		AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i));
+		return (FALSE) ;
+	    }
+	    ilast = i ;
+	}
+    }
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/AMD/Source/amdbar.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1206 @@
+C-----------------------------------------------------------------------
+C AMDBAR:  approximate minimum degree, without aggressive absorption
+C-----------------------------------------------------------------------
+
+        SUBROUTINE AMDBAR
+     $          (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
+     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
+
+        INTEGER N, IWLEN, PFREE, NCMPA, IW (IWLEN), PE (N),
+     $          DEGREE (N), NV (N), NEXT (N), LAST (N), HEAD (N),
+     $          ELEN (N), W (N), LEN (N)
+
+C Given a representation of the nonzero pattern of a symmetric matrix,
+C       A, (excluding the diagonal) perform an approximate minimum
+C       (UMFPACK/MA38-style) degree ordering to compute a pivot order
+C       such that the introduction of nonzeros (fill-in) in the Cholesky
+C       factors A = LL^T are kept low.  At each step, the pivot
+C       selected is the one with the minimum UMFPACK/MA38-style
+C       upper-bound on the external degree.
+C
+C       This routine does not do aggresive absorption (as done by AMD).
+
+C **********************************************************************
+C ***** CAUTION:  ARGUMENTS ARE NOT CHECKED FOR ERRORS ON INPUT.  ******
+C **********************************************************************
+
+C       References:
+C
+C       [1] Timothy A. Davis and Iain Duff, "An unsymmetric-pattern
+C           multifrontal method for sparse LU factorization", SIAM J.
+C           Matrix Analysis and Applications, vol. 18, no. 1, pp.
+C           140-158.  Discusses UMFPACK / MA38, which first introduced
+C           the approximate minimum degree used by this routine.
+C
+C       [2] Patrick Amestoy, Timothy A. Davis, and Iain S. Duff, "An
+C           approximate degree ordering algorithm," SIAM J. Matrix
+C           Analysis and Applications, vol. 17, no. 4, pp. 886-905,
+C           1996.  Discusses AMD, AMDBAR, and MC47B.
+C
+C       [3] Alan George and Joseph Liu, "The evolution of the minimum
+C           degree ordering algorithm," SIAM Review, vol. 31, no. 1,
+C           pp. 1-19, 1989.  We list below the features mentioned in
+C           that paper that this code includes:
+C
+C       mass elimination:
+C               Yes.  MA27 relied on supervariable detection for mass
+C               elimination.
+C       indistinguishable nodes:
+C               Yes (we call these "supervariables").  This was also in
+C               the MA27 code - although we modified the method of
+C               detecting them (the previous hash was the true degree,
+C               which we no longer keep track of).  A supervariable is
+C               a set of rows with identical nonzero pattern.  All
+C               variables in a supervariable are eliminated together.
+C               Each supervariable has as its numerical name that of
+C               one of its variables (its principal variable).
+C       quotient graph representation:
+C               Yes.  We use the term "element" for the cliques formed
+C               during elimination.  This was also in the MA27 code.
+C               The algorithm can operate in place, but it will work
+C               more efficiently if given some "elbow room."
+C       element absorption:
+C               Yes.  This was also in the MA27 code.
+C       external degree:
+C               Yes.  The MA27 code was based on the true degree.
+C       incomplete degree update and multiple elimination:
+C               No.  This was not in MA27, either.  Our method of
+C               degree update within MC47B/BD is element-based, not
+C               variable-based.  It is thus not well-suited for use
+C               with incomplete degree update or multiple elimination.
+
+C-----------------------------------------------------------------------
+C Authors, and Copyright (C) 1995 by:
+C       Timothy A. Davis, Patrick Amestoy, Iain S. Duff, & John K. Reid.
+C
+C Acknowledgements:
+C       This work (and the UMFPACK package) was supported by the
+C       National Science Foundation (ASC-9111263 and DMS-9223088).
+C       The UMFPACK/MA38 approximate degree update algorithm, the
+C       unsymmetric analog which forms the basis of MC47B/BD, was
+C       developed while Tim Davis was supported by CERFACS (Toulouse,
+C       France) in a post-doctoral position.
+C
+C Date:  September, 1995
+C-----------------------------------------------------------------------
+
+C-----------------------------------------------------------------------
+C INPUT ARGUMENTS (unaltered):
+C-----------------------------------------------------------------------
+
+C n:    The matrix order.
+C
+C       Restriction:  1 .le. n .lt. (iovflo/2)-2, where iovflo is
+C       the largest positive integer that your computer can represent.
+
+C iwlen:        The length of iw (1..iwlen).  On input, the matrix is
+C       stored in iw (1..pfree-1).  However, iw (1..iwlen) should be
+C       slightly larger than what is required to hold the matrix, at
+C       least iwlen .ge. pfree + n is recommended.  Otherwise,
+C       excessive compressions will take place.
+C       *** We do not recommend running this algorithm with ***
+C       ***      iwlen .lt. pfree + n.                      ***
+C       *** Better performance will be obtained if          ***
+C       ***      iwlen .ge. pfree + n                       ***
+C       *** or better yet                                   ***
+C       ***      iwlen .gt. 1.2 * pfree                     ***
+C       *** (where pfree is its value on input).            ***
+C       The algorithm will not run at all if iwlen .lt. pfree-1.
+C
+C       Restriction: iwlen .ge. pfree-1
+
+C-----------------------------------------------------------------------
+C INPUT/OUPUT ARGUMENTS:
+C-----------------------------------------------------------------------
+
+C pe:   On input, pe (i) is the index in iw of the start of row i, or
+C       zero if row i has no off-diagonal non-zeros.
+C
+C       During execution, it is used for both supervariables and
+C       elements:
+C
+C       * Principal supervariable i:  index into iw of the
+C               description of supervariable i.  A supervariable
+C               represents one or more rows of the matrix
+C               with identical nonzero pattern.
+C       * Non-principal supervariable i:  if i has been absorbed
+C               into another supervariable j, then pe (i) = -j.
+C               That is, j has the same pattern as i.
+C               Note that j might later be absorbed into another
+C               supervariable j2, in which case pe (i) is still -j,
+C               and pe (j) = -j2.
+C       * Unabsorbed element e:  the index into iw of the description
+C               of element e, if e has not yet been absorbed by a
+C               subsequent element.  Element e is created when
+C               the supervariable of the same name is selected as
+C               the pivot.
+C       * Absorbed element e:  if element e is absorbed into element
+C               e2, then pe (e) = -e2.  This occurs when the pattern of
+C               e (that is, Le) is found to be a subset of the pattern
+C               of e2 (that is, Le2).  If element e is "null" (it has
+C               no nonzeros outside its pivot block), then pe (e) = 0.
+C
+C       On output, pe holds the assembly tree/forest, which implicitly
+C       represents a pivot order with identical fill-in as the actual
+C       order (via a depth-first search of the tree).
+C
+C       On output:
+C       If nv (i) .gt. 0, then i represents a node in the assembly tree,
+C       and the parent of i is -pe (i), or zero if i is a root.
+C       If nv (i) = 0, then (i,-pe (i)) represents an edge in a
+C       subtree, the root of which is a node in the assembly tree.
+
+C pfree:        On input the tail end of the array, iw (pfree..iwlen),
+C       is empty, and the matrix is stored in iw (1..pfree-1).
+C       During execution, additional data is placed in iw, and pfree
+C       is modified so that iw (pfree..iwlen) is always the unused part
+C       of iw.  On output, pfree is set equal to the size of iw that
+C       would have been needed for no compressions to occur.  If
+C       ncmpa is zero, then pfree (on output) is less than or equal to
+C       iwlen, and the space iw (pfree+1 ... iwlen) was not used.
+C       Otherwise, pfree (on output) is greater than iwlen, and all the
+C       memory in iw was used.
+
+C-----------------------------------------------------------------------
+C INPUT/MODIFIED (undefined on output):
+C-----------------------------------------------------------------------
+
+C len:  On input, len (i) holds the number of entries in row i of the
+C       matrix, excluding the diagonal.  The contents of len (1..n)
+C       are undefined on output.
+
+C iw:   On input, iw (1..pfree-1) holds the description of each row i
+C       in the matrix.  The matrix must be symmetric, and both upper
+C       and lower triangular parts must be present.  The diagonal must
+C       not be present.  Row i is held as follows:
+C
+C               len (i):  the length of the row i data structure
+C               iw (pe (i) ... pe (i) + len (i) - 1):
+C                       the list of column indices for nonzeros
+C                       in row i (simple supervariables), excluding
+C                       the diagonal.  All supervariables start with
+C                       one row/column each (supervariable i is just
+C                       row i).
+C               if len (i) is zero on input, then pe (i) is ignored
+C               on input.
+C
+C               Note that the rows need not be in any particular order,
+C               and there may be empty space between the rows.
+C
+C       During execution, the supervariable i experiences fill-in.
+C       This is represented by placing in i a list of the elements
+C       that cause fill-in in supervariable i:
+C
+C               len (i):  the length of supervariable i
+C               iw (pe (i) ... pe (i) + elen (i) - 1):
+C                       the list of elements that contain i.  This list
+C                       is kept short by removing absorbed elements.
+C               iw (pe (i) + elen (i) ... pe (i) + len (i) - 1):
+C                       the list of supervariables in i.  This list
+C                       is kept short by removing nonprincipal
+C                       variables, and any entry j that is also
+C                       contained in at least one of the elements
+C                       (j in Le) in the list for i (e in row i).
+C
+C       When supervariable i is selected as pivot, we create an
+C       element e of the same name (e=i):
+C
+C               len (e):  the length of element e
+C               iw (pe (e) ... pe (e) + len (e) - 1):
+C                       the list of supervariables in element e.
+C
+C       An element represents the fill-in that occurs when supervariable
+C       i is selected as pivot (which represents the selection of row i
+C       and all non-principal variables whose principal variable is i).
+C       We use the term Le to denote the set of all supervariables
+C       in element e.  Absorbed supervariables and elements are pruned
+C       from these lists when computationally convenient.
+C
+C       CAUTION:  THE INPUT MATRIX IS OVERWRITTEN DURING COMPUTATION.
+C       The contents of iw are undefined on output.
+
+C-----------------------------------------------------------------------
+C OUTPUT (need not be set on input):
+C-----------------------------------------------------------------------
+
+C nv:   During execution, abs (nv (i)) is equal to the number of rows
+C       that are represented by the principal supervariable i.  If i is
+C       a nonprincipal variable, then nv (i) = 0.  Initially,
+C       nv (i) = 1 for all i.  nv (i) .lt. 0 signifies that i is a
+C       principal variable in the pattern Lme of the current pivot
+C       element me.  On output, nv (e) holds the true degree of element
+C       e at the time it was created (including the diagonal part).
+
+C ncmpa:        The number of times iw was compressed.  If this is
+C       excessive, then the execution took longer than what could have
+C       been.  To reduce ncmpa, try increasing iwlen to be 10% or 20%
+C       larger than the value of pfree on input (or at least
+C       iwlen .ge. pfree + n).  The fastest performance will be
+C       obtained when ncmpa is returned as zero.  If iwlen is set to
+C       the value returned by pfree on *output*, then no compressions
+C       will occur.
+
+C elen: See the description of iw above.  At the start of execution,
+C       elen (i) is set to zero.  During execution, elen (i) is the
+C       number of elements in the list for supervariable i.  When e
+C       becomes an element, elen (e) = -nel is set, where nel is the
+C       current step of factorization.  elen (i) = 0 is done when i
+C       becomes nonprincipal.
+C
+C       For variables, elen (i) .ge. 0 holds until just before the
+C       permutation vectors are computed.  For elements,
+C       elen (e) .lt. 0 holds.
+C
+C       On output elen (1..n) holds the inverse permutation (the same
+C       as the 'INVP' argument in Sparspak).  That is, if k = elen (i),
+C       then row i is the kth pivot row.  Row i of A appears as the
+C       (elen(i))-th row in the permuted matrix, PAP^T.
+
+C last: In a degree list, last (i) is the supervariable preceding i,
+C       or zero if i is the head of the list.  In a hash bucket,
+C       last (i) is the hash key for i.  last (head (hash)) is also
+C       used as the head of a hash bucket if head (hash) contains a
+C       degree list (see head, below).
+C
+C       On output, last (1..n) holds the permutation (the same as the
+C       'PERM' argument in Sparspak).  That is, if i = last (k), then
+C       row i is the kth pivot row.  Row last (k) of A is the k-th row
+C       in the permuted matrix, PAP^T.
+
+C-----------------------------------------------------------------------
+C LOCAL (not input or output - used only during execution):
+C-----------------------------------------------------------------------
+
+C degree:       If i is a supervariable, then degree (i) holds the
+C       current approximation of the external degree of row i (an upper
+C       bound).  The external degree is the number of nonzeros in row i,
+C       minus abs (nv (i)) (the diagonal part).  The bound is equal to
+C       the external degree if elen (i) is less than or equal to two.
+C
+C       We also use the term "external degree" for elements e to refer
+C       to |Le \ Lme|.  If e is an element, then degree (e) holds |Le|,
+C       which is the degree of the off-diagonal part of the element e
+C       (not including the diagonal part).
+
+C head: head is used for degree lists.  head (deg) is the first
+C       supervariable in a degree list (all supervariables i in a
+C       degree list deg have the same approximate degree, namely,
+C       deg = degree (i)).  If the list deg is empty then
+C       head (deg) = 0.
+C
+C       During supervariable detection head (hash) also serves as a
+C       pointer to a hash bucket.
+C       If head (hash) .gt. 0, there is a degree list of degree hash.
+C               The hash bucket head pointer is last (head (hash)).
+C       If head (hash) = 0, then the degree list and hash bucket are
+C               both empty.
+C       If head (hash) .lt. 0, then the degree list is empty, and
+C               -head (hash) is the head of the hash bucket.
+C       After supervariable detection is complete, all hash buckets
+C       are empty, and the (last (head (hash)) = 0) condition is
+C       restored for the non-empty degree lists.
+
+C next: next (i) is the supervariable following i in a link list, or
+C       zero if i is the last in the list.  Used for two kinds of
+C       lists:  degree lists and hash buckets (a supervariable can be
+C       in only one kind of list at a time).
+
+C w:    The flag array w determines the status of elements and
+C       variables, and the external degree of elements.
+C
+C       for elements:
+C          if w (e) = 0, then the element e is absorbed
+C          if w (e) .ge. wflg, then w (e) - wflg is the size of
+C               the set |Le \ Lme|, in terms of nonzeros (the
+C               sum of abs (nv (i)) for each principal variable i that
+C               is both in the pattern of element e and NOT in the
+C               pattern of the current pivot element, me).
+C          if wflg .gt. w (e) .gt. 0, then e is not absorbed and has
+C               not yet been seen in the scan of the element lists in
+C               the computation of |Le\Lme| in loop 150 below.
+C
+C       for variables:
+C          during supervariable detection, if w (j) .ne. wflg then j is
+C          not in the pattern of variable i
+C
+C       The w array is initialized by setting w (i) = 1 for all i,
+C       and by setting wflg = 2.  It is reinitialized if wflg becomes
+C       too large (to ensure that wflg+n does not cause integer
+C       overflow).
+
+C-----------------------------------------------------------------------
+C LOCAL INTEGERS:
+C-----------------------------------------------------------------------
+
+        INTEGER DEG, DEGME, DMAX, E, ELENME, ELN, HASH, HMOD, I,
+     $          ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3,
+     $          LENJ, LN, MAXMEM, ME, MEM, MINDEG, NEL, NEWMEM,
+     $          NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X
+
+C deg:          the degree of a variable or element
+C degme:        size, |Lme|, of the current element, me (= degree (me))
+C dext:         external degree, |Le \ Lme|, of some element e
+C dmax:         largest |Le| seen so far
+C e:            an element
+C elenme:       the length, elen (me), of element list of pivotal var.
+C eln:          the length, elen (...), of an element list
+C hash:         the computed value of the hash function
+C hmod:         the hash function is computed modulo hmod = max (1,n-1)
+C i:            a supervariable
+C ilast:        the entry in a link list preceding i
+C inext:        the entry in a link list following i
+C j:            a supervariable
+C jlast:        the entry in a link list preceding j
+C jnext:        the entry in a link list, or path, following j
+C k:            the pivot order of an element or variable
+C knt1:         loop counter used during element construction
+C knt2:         loop counter used during element construction
+C knt3:         loop counter used during compression
+C lenj:         len (j)
+C ln:           length of a supervariable list
+C maxmem:       amount of memory needed for no compressions
+C me:           current supervariable being eliminated, and the
+C                       current element created by eliminating that
+C                       supervariable
+C mem:          memory in use assuming no compressions have occurred
+C mindeg:       current minimum degree
+C nel:          number of pivots selected so far
+C newmem:       amount of new memory needed for current pivot element
+C nleft:        n - nel, the number of nonpivotal rows/columns remaining
+C nvi:          the number of variables in a supervariable i (= nv (i))
+C nvj:          the number of variables in a supervariable j (= nv (j))
+C nvpiv:        number of pivots in current element
+C slenme:       number of variables in variable list of pivotal variable
+C we:           w (e)
+C wflg:         used for flagging the w array.  See description of iw.
+C wnvi:         wflg - nv (i)
+C x:            either a supervariable or an element
+
+C-----------------------------------------------------------------------
+C LOCAL POINTERS:
+C-----------------------------------------------------------------------
+
+        INTEGER P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2, PN, PSRC
+
+C               Any parameter (pe (...) or pfree) or local variable
+C               starting with "p" (for Pointer) is an index into iw,
+C               and all indices into iw use variables starting with
+C               "p."  The only exception to this rule is the iwlen
+C               input argument.
+
+C p:            pointer into lots of things
+C p1:           pe (i) for some variable i (start of element list)
+C p2:           pe (i) + elen (i) -  1 for some var. i (end of el. list)
+C p3:           index of first supervariable in clean list
+C pdst:         destination pointer, for compression
+C pend:         end of memory to compress
+C pj:           pointer into an element or variable
+C pme:          pointer into the current element (pme1...pme2)
+C pme1:         the current element, me, is stored in iw (pme1...pme2)
+C pme2:         the end of the current element
+C pn:           pointer into a "clean" variable, also used to compress
+C psrc:         source pointer, for compression
+
+C-----------------------------------------------------------------------
+C  FUNCTIONS CALLED:
+C-----------------------------------------------------------------------
+
+        INTRINSIC MAX, MIN, MOD
+
+C=======================================================================
+C  INITIALIZATIONS
+C=======================================================================
+
+        WFLG = 2
+        MINDEG = 1
+        NCMPA = 0
+        NEL = 0
+        HMOD = MAX (1, N-1)
+        DMAX = 0
+        MEM = PFREE - 1
+        MAXMEM = MEM
+	ME = 0
+
+        DO 10 I = 1, N
+           LAST (I) = 0
+           HEAD (I) = 0
+           NV (I) = 1
+           W (I) = 1
+           ELEN (I) = 0
+           DEGREE (I) = LEN (I)
+10         CONTINUE
+
+C       ----------------------------------------------------------------
+C       initialize degree lists and eliminate rows with no off-diag. nz.
+C       ----------------------------------------------------------------
+
+        DO 20 I = 1, N
+
+           DEG = DEGREE (I)
+
+           IF (DEG .GT. 0) THEN
+
+C             ----------------------------------------------------------
+C             place i in the degree list corresponding to its degree
+C             ----------------------------------------------------------
+
+              INEXT = HEAD (DEG)
+              IF (INEXT .NE. 0) LAST (INEXT) = I
+              NEXT (I) = INEXT
+              HEAD (DEG) = I
+
+           ELSE
+
+C             ----------------------------------------------------------
+C             we have a variable that can be eliminated at once because
+C             there is no off-diagonal non-zero in its row.
+C             ----------------------------------------------------------
+
+              NEL = NEL + 1
+              ELEN (I) = -NEL
+              PE (I) = 0
+              W (I) = 0
+
+              ENDIF
+
+20         CONTINUE
+
+C=======================================================================
+C  WHILE (selecting pivots) DO
+C=======================================================================
+
+30      CONTINUE
+        IF (NEL .LT. N) THEN
+
+C=======================================================================
+C  GET PIVOT OF MINIMUM DEGREE
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          find next supervariable for elimination
+C          -------------------------------------------------------------
+
+           DO 40 DEG = MINDEG, N
+              ME = HEAD (DEG)
+              IF (ME .GT. 0) GOTO 50
+40            CONTINUE
+50         CONTINUE
+           MINDEG = DEG
+
+C          -------------------------------------------------------------
+C          remove chosen variable from link list
+C          -------------------------------------------------------------
+
+           INEXT = NEXT (ME)
+           IF (INEXT .NE. 0) LAST (INEXT) = 0
+           HEAD (DEG) = INEXT
+
+C          -------------------------------------------------------------
+C          me represents the elimination of pivots nel+1 to nel+nv(me).
+C          place me itself as the first in this set.  It will be moved
+C          to the nel+nv(me) position when the permutation vectors are
+C          computed.
+C          -------------------------------------------------------------
+
+           ELENME = ELEN (ME)
+           ELEN (ME) = - (NEL + 1)
+           NVPIV = NV (ME)
+           NEL = NEL + NVPIV
+
+C=======================================================================
+C  CONSTRUCT NEW ELEMENT
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          At this point, me is the pivotal supervariable.  It will be
+C          converted into the current element.  Scan list of the
+C          pivotal supervariable, me, setting tree pointers and
+C          constructing new list of supervariables for the new element,
+C          me.  p is a pointer to the current position in the old list.
+C          -------------------------------------------------------------
+
+C          flag the variable "me" as being in Lme by negating nv (me)
+           NV (ME) = -NVPIV
+           DEGME = 0
+
+           IF (ELENME .EQ. 0) THEN
+
+C             ----------------------------------------------------------
+C             construct the new element in place
+C             ----------------------------------------------------------
+
+              PME1 = PE (ME)
+              PME2 = PME1 - 1
+
+              DO 60 P = PME1, PME1 + LEN (ME) - 1
+                 I = IW (P)
+                 NVI = NV (I)
+                 IF (NVI .GT. 0) THEN
+
+C                   ----------------------------------------------------
+C                   i is a principal variable not yet placed in Lme.
+C                   store i in new list
+C                   ----------------------------------------------------
+
+                    DEGME = DEGME + NVI
+C                   flag i as being in Lme by negating nv (i)
+                    NV (I) = -NVI
+                    PME2 = PME2 + 1
+                    IW (PME2) = I
+
+C                   ----------------------------------------------------
+C                   remove variable i from degree list.
+C                   ----------------------------------------------------
+
+                    ILAST = LAST (I)
+                    INEXT = NEXT (I)
+                    IF (INEXT .NE. 0) LAST (INEXT) = ILAST
+                    IF (ILAST .NE. 0) THEN
+                       NEXT (ILAST) = INEXT
+                    ELSE
+C                      i is at the head of the degree list
+                       HEAD (DEGREE (I)) = INEXT
+                       ENDIF
+
+                    ENDIF
+60               CONTINUE
+C             this element takes no new memory in iw:
+              NEWMEM = 0
+
+           ELSE
+
+C             ----------------------------------------------------------
+C             construct the new element in empty space, iw (pfree ...)
+C             ----------------------------------------------------------
+
+              P = PE (ME)
+              PME1 = PFREE
+              SLENME = LEN (ME) - ELENME
+
+              DO 120 KNT1 = 1, ELENME + 1
+
+                 IF (KNT1 .GT. ELENME) THEN
+C                   search the supervariables in me.
+                    E = ME
+                    PJ = P
+                    LN = SLENME
+                 ELSE
+C                   search the elements in me.
+                    E = IW (P)
+                    P = P + 1
+                    PJ = PE (E)
+                    LN = LEN (E)
+                    ENDIF
+
+C                -------------------------------------------------------
+C                search for different supervariables and add them to the
+C                new list, compressing when necessary. this loop is
+C                executed once for each element in the list and once for
+C                all the supervariables in the list.
+C                -------------------------------------------------------
+
+                 DO 110 KNT2 = 1, LN
+                    I = IW (PJ)
+                    PJ = PJ + 1
+                    NVI = NV (I)
+                    IF (NVI .GT. 0) THEN
+
+C                      -------------------------------------------------
+C                      compress iw, if necessary
+C                      -------------------------------------------------
+
+                       IF (PFREE .GT. IWLEN) THEN
+C                         prepare for compressing iw by adjusting
+C                         pointers and lengths so that the lists being
+C                         searched in the inner and outer loops contain
+C                         only the remaining entries.
+
+                          PE (ME) = P
+                          LEN (ME) = LEN (ME) - KNT1
+                          IF (LEN (ME) .EQ. 0) THEN
+C                            nothing left of supervariable me
+                             PE (ME) = 0
+                             ENDIF
+                          PE (E) = PJ
+                          LEN (E) = LN - KNT2
+                          IF (LEN (E) .EQ. 0) THEN
+C                            nothing left of element e
+                             PE (E) = 0
+                             ENDIF
+
+                          NCMPA = NCMPA + 1
+C                         store first item in pe
+C                         set first entry to -item
+                          DO 70 J = 1, N
+                             PN = PE (J)
+                             IF (PN .GT. 0) THEN
+                                PE (J) = IW (PN)
+                                IW (PN) = -J
+                                ENDIF
+70                           CONTINUE
+
+C                         psrc/pdst point to source/destination
+                          PDST = 1
+                          PSRC = 1
+                          PEND = PME1 - 1
+
+C                         while loop:
+80                        CONTINUE
+                          IF (PSRC .LE. PEND) THEN
+C                            search for next negative entry
+                             J = -IW (PSRC)
+                             PSRC = PSRC + 1
+                             IF (J .GT. 0) THEN
+                                IW (PDST) = PE (J)
+                                PE (J) = PDST
+                                PDST = PDST + 1
+C                               copy from source to destination
+                                LENJ = LEN (J)
+                                DO 90 KNT3 = 0, LENJ - 2
+                                   IW (PDST + KNT3) = IW (PSRC + KNT3)
+90                                 CONTINUE
+                                PDST = PDST + LENJ - 1
+                                PSRC = PSRC + LENJ - 1
+                                ENDIF
+                             GOTO 80
+                             ENDIF
+
+C                         move the new partially-constructed element
+                          P1 = PDST
+                          DO 100 PSRC = PME1, PFREE - 1
+                             IW (PDST) = IW (PSRC)
+                             PDST = PDST + 1
+100                          CONTINUE
+                          PME1 = P1
+                          PFREE = PDST
+                          PJ = PE (E)
+                          P = PE (ME)
+                          ENDIF
+
+C                      -------------------------------------------------
+C                      i is a principal variable not yet placed in Lme
+C                      store i in new list
+C                      -------------------------------------------------
+
+                       DEGME = DEGME + NVI
+C                      flag i as being in Lme by negating nv (i)
+                       NV (I) = -NVI
+                       IW (PFREE) = I
+                       PFREE = PFREE + 1
+
+C                      -------------------------------------------------
+C                      remove variable i from degree link list
+C                      -------------------------------------------------
+
+                       ILAST = LAST (I)
+                       INEXT = NEXT (I)
+                       IF (INEXT .NE. 0) LAST (INEXT) = ILAST
+                       IF (ILAST .NE. 0) THEN
+                          NEXT (ILAST) = INEXT
+                       ELSE
+C                         i is at the head of the degree list
+                          HEAD (DEGREE (I)) = INEXT
+                          ENDIF
+
+                       ENDIF
+110                 CONTINUE
+
+                 IF (E .NE. ME) THEN
+C                   set tree pointer and flag to indicate element e is
+C                   absorbed into new element me (the parent of e is me)
+                    PE (E) = -ME
+                    W (E) = 0
+                    ENDIF
+120              CONTINUE
+
+              PME2 = PFREE - 1
+C             this element takes newmem new memory in iw (possibly zero)
+              NEWMEM = PFREE - PME1
+              MEM = MEM + NEWMEM
+              MAXMEM = MAX (MAXMEM, MEM)
+              ENDIF
+
+C          -------------------------------------------------------------
+C          me has now been converted into an element in iw (pme1..pme2)
+C          -------------------------------------------------------------
+
+C          degme holds the external degree of new element
+           DEGREE (ME) = DEGME
+           PE (ME) = PME1
+           LEN (ME) = PME2 - PME1 + 1
+
+C          -------------------------------------------------------------
+C          make sure that wflg is not too large.  With the current
+C          value of wflg, wflg+n must not cause integer overflow
+C          -------------------------------------------------------------
+
+           IF (WFLG + N .LE. WFLG) THEN
+              DO 130 X = 1, N
+                 IF (W (X) .NE. 0) W (X) = 1
+130              CONTINUE
+              WFLG = 2
+              ENDIF
+
+C=======================================================================
+C  COMPUTE (w (e) - wflg) = |Le\Lme| FOR ALL ELEMENTS
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          Scan 1:  compute the external degrees of previous elements
+C          with respect to the current element.  That is:
+C               (w (e) - wflg) = |Le \ Lme|
+C          for each element e that appears in any supervariable in Lme.
+C          The notation Le refers to the pattern (list of
+C          supervariables) of a previous element e, where e is not yet
+C          absorbed, stored in iw (pe (e) + 1 ... pe (e) + iw (pe (e))).
+C          The notation Lme refers to the pattern of the current element
+C          (stored in iw (pme1..pme2)).   If (w (e) - wflg) becomes
+C          zero, then the element e will be absorbed in scan 2.
+C          -------------------------------------------------------------
+
+           DO 150 PME = PME1, PME2
+              I = IW (PME)
+              ELN = ELEN (I)
+              IF (ELN .GT. 0) THEN
+C                note that nv (i) has been negated to denote i in Lme:
+                 NVI = -NV (I)
+                 WNVI = WFLG - NVI
+                 DO 140 P = PE (I), PE (I) + ELN - 1
+                    E = IW (P)
+                    WE = W (E)
+                    IF (WE .GE. WFLG) THEN
+C                      unabsorbed element e has been seen in this loop
+                       WE = WE - NVI
+                    ELSE IF (WE .NE. 0) THEN
+C                      e is an unabsorbed element
+C                      this is the first we have seen e in all of Scan 1
+                       WE = DEGREE (E) + WNVI
+                       ENDIF
+                    W (E) = WE
+140                 CONTINUE
+                 ENDIF
+150           CONTINUE
+
+C=======================================================================
+C  DEGREE UPDATE AND ELEMENT ABSORPTION
+C=======================================================================
+
+C          -------------------------------------------------------------
+C          Scan 2:  for each i in Lme, sum up the degree of Lme (which
+C          is degme), plus the sum of the external degrees of each Le
+C          for the elements e appearing within i, plus the
+C          supervariables in i.  Place i in hash list.
+C          -------------------------------------------------------------
+
+           DO 180 PME = PME1, PME2
+              I = IW (PME)
+              P1 = PE (I)
+              P2 = P1 + ELEN (I) - 1
+              PN = P1
+              HASH = 0
+              DEG = 0
+
+C             ----------------------------------------------------------
+C             scan the element list associated with supervariable i
+C             ----------------------------------------------------------
+
+C             UMFPACK/MA38-style approximate degree:
+              DO 160 P = P1, P2
+                 E = IW (P)
+                 WE = W (E)
+                 IF (WE .NE. 0) THEN
+C                   e is an unabsorbed element
+                    DEG = DEG + WE - WFLG
+                    IW (PN) = E
+                    PN = PN + 1
+                    HASH = HASH + E
+                    ENDIF
+160              CONTINUE
+
+C             count the number of elements in i (including me):
+              ELEN (I) = PN - P1 + 1
+
+C             ----------------------------------------------------------
+C             scan the supervariables in the list associated with i
+C             ----------------------------------------------------------
+
+              P3 = PN
+              DO 170 P = P2 + 1, P1 + LEN (I) - 1
+                 J = IW (P)
+                 NVJ = NV (J)
+                 IF (NVJ .GT. 0) THEN
+C                   j is unabsorbed, and not in Lme.
+C                   add to degree and add to new list
+                    DEG = DEG + NVJ
+                    IW (PN) = J
+                    PN = PN + 1
+                    HASH = HASH + J
+                    ENDIF
+170              CONTINUE
+
+C             ----------------------------------------------------------
+C             update the degree and check for mass elimination
+C             ----------------------------------------------------------
+
+              IF (ELEN (I) .EQ. 1 .AND. P3 .EQ. PN) THEN
+
+C                -------------------------------------------------------
+C                mass elimination
+C                -------------------------------------------------------
+
+C                There is nothing left of this node except for an
+C                edge to the current pivot element.  elen (i) is 1,
+C                and there are no variables adjacent to node i.
+C                Absorb i into the current pivot element, me.
+
+                 PE (I) = -ME
+                 NVI = -NV (I)
+                 DEGME = DEGME - NVI
+                 NVPIV = NVPIV + NVI
+                 NEL = NEL + NVI
+                 NV (I) = 0
+                 ELEN (I) = 0
+
+              ELSE
+
+C                -------------------------------------------------------
+C                update the upper-bound degree of i
+C                -------------------------------------------------------
+
+C                the following degree does not yet include the size
+C                of the current element, which is added later:
+                 DEGREE (I) = MIN (DEGREE (I), DEG)
+
+C                -------------------------------------------------------
+C                add me to the list for i
+C                -------------------------------------------------------
+
+C                move first supervariable to end of list
+                 IW (PN) = IW (P3)
+C                move first element to end of element part of list
+                 IW (P3) = IW (P1)
+C                add new element to front of list.
+                 IW (P1) = ME
+C                store the new length of the list in len (i)
+                 LEN (I) = PN - P1 + 1
+
+C                -------------------------------------------------------
+C                place in hash bucket.  Save hash key of i in last (i).
+C                -------------------------------------------------------
+
+                 HASH = MOD (HASH, HMOD) + 1
+                 J = HEAD (HASH)
+                 IF (J .LE. 0) THEN
+C                   the degree list is empty, hash head is -j
+                    NEXT (I) = -J
+                    HEAD (HASH) = -I
+                 ELSE
+C                   degree list is not empty
+C                   use last (head (hash)) as hash head
+                    NEXT (I) = LAST (J)
+                    LAST (J) = I
+                    ENDIF
+                 LAST (I) = HASH
+                 ENDIF
+180           CONTINUE
+
+           DEGREE (ME) = DEGME
+
+C          -------------------------------------------------------------
+C          Clear the counter array, w (...), by incrementing wflg.
+C          -------------------------------------------------------------
+
+           DMAX = MAX (DMAX, DEGME)
+           WFLG = WFLG + DMAX
+
+C          make sure that wflg+n does not cause integer overflow
+           IF (WFLG + N .LE. WFLG) THEN
+              DO 190 X = 1, N
+                 IF (W (X) .NE. 0) W (X) = 1
+190              CONTINUE
+              WFLG = 2
+              ENDIF
+C          at this point, w (1..n) .lt. wflg holds
+
+C=======================================================================
+C  SUPERVARIABLE DETECTION
+C=======================================================================
+
+           DO 250 PME = PME1, PME2
+              I = IW (PME)
+              IF (NV (I) .LT. 0) THEN
+C                i is a principal variable in Lme
+
+C                -------------------------------------------------------
+C                examine all hash buckets with 2 or more variables.  We
+C                do this by examing all unique hash keys for super-
+C                variables in the pattern Lme of the current element, me
+C                -------------------------------------------------------
+
+                 HASH = LAST (I)
+C                let i = head of hash bucket, and empty the hash bucket
+                 J = HEAD (HASH)
+                 IF (J .EQ. 0) GOTO 250
+                 IF (J .LT. 0) THEN
+C                   degree list is empty
+                    I = -J
+                    HEAD (HASH) = 0
+                 ELSE
+C                   degree list is not empty, restore last () of head
+                    I = LAST (J)
+                    LAST (J) = 0
+                    ENDIF
+                 IF (I .EQ. 0) GOTO 250
+
+C                while loop:
+200              CONTINUE
+                 IF (NEXT (I) .NE. 0) THEN
+
+C                   ----------------------------------------------------
+C                   this bucket has one or more variables following i.
+C                   scan all of them to see if i can absorb any entries
+C                   that follow i in hash bucket.  Scatter i into w.
+C                   ----------------------------------------------------
+
+                    LN = LEN (I)
+                    ELN = ELEN (I)
+C                   do not flag the first element in the list (me)
+                    DO 210 P = PE (I) + 1, PE (I) + LN - 1
+                       W (IW (P)) = WFLG
+210                    CONTINUE
+
+C                   ----------------------------------------------------
+C                   scan every other entry j following i in bucket
+C                   ----------------------------------------------------
+
+                    JLAST = I
+                    J = NEXT (I)
+
+C                   while loop:
+220                 CONTINUE
+                    IF (J .NE. 0) THEN
+
+C                      -------------------------------------------------
+C                      check if j and i have identical nonzero pattern
+C                      -------------------------------------------------
+
+                       IF (LEN (J) .NE. LN) THEN
+C                         i and j do not have same size data structure
+                          GOTO 240
+                          ENDIF
+                       IF (ELEN (J) .NE. ELN) THEN
+C                         i and j do not have same number of adjacent el
+                          GOTO 240
+                          ENDIF
+C                      do not flag the first element in the list (me)
+                       DO 230 P = PE (J) + 1, PE (J) + LN - 1
+                          IF (W (IW (P)) .NE. WFLG) THEN
+C                            an entry (iw(p)) is in j but not in i
+                             GOTO 240
+                             ENDIF
+230                       CONTINUE
+
+C                      -------------------------------------------------
+C                      found it!  j can be absorbed into i
+C                      -------------------------------------------------
+
+                       PE (J) = -I
+C                      both nv (i) and nv (j) are negated since they
+C                      are in Lme, and the absolute values of each
+C                      are the number of variables in i and j:
+                       NV (I) = NV (I) + NV (J)
+                       NV (J) = 0
+                       ELEN (J) = 0
+C                      delete j from hash bucket
+                       J = NEXT (J)
+                       NEXT (JLAST) = J
+                       GOTO 220
+
+C                      -------------------------------------------------
+240                    CONTINUE
+C                      j cannot be absorbed into i
+C                      -------------------------------------------------
+
+                       JLAST = J
+                       J = NEXT (J)
+                       GOTO 220
+                       ENDIF
+
+C                   ----------------------------------------------------
+C                   no more variables can be absorbed into i
+C                   go to next i in bucket and clear flag array
+C                   ----------------------------------------------------
+
+                    WFLG = WFLG + 1
+                    I = NEXT (I)
+                    IF (I .NE. 0) GOTO 200
+                    ENDIF
+                 ENDIF
+250           CONTINUE
+
+C=======================================================================
+C  RESTORE DEGREE LISTS AND REMOVE NONPRINCIPAL SUPERVAR. FROM ELEMENT
+C=======================================================================
+
+           P = PME1
+           NLEFT = N - NEL
+           DO 260 PME = PME1, PME2
+              I = IW (PME)
+              NVI = -NV (I)
+              IF (NVI .GT. 0) THEN
+C                i is a principal variable in Lme
+C                restore nv (i) to signify that i is principal
+                 NV (I) = NVI
+
+C                -------------------------------------------------------
+C                compute the external degree (add size of current elem)
+C                -------------------------------------------------------
+
+                 DEG = MAX (1, MIN (DEGREE (I) + DEGME-NVI, NLEFT-NVI))
+
+C                -------------------------------------------------------
+C                place the supervariable at the head of the degree list
+C                -------------------------------------------------------
+
+                 INEXT = HEAD (DEG)
+                 IF (INEXT .NE. 0) LAST (INEXT) = I
+                 NEXT (I) = INEXT
+                 LAST (I) = 0
+                 HEAD (DEG) = I
+
+C                -------------------------------------------------------
+C                save the new degree, and find the minimum degree
+C                -------------------------------------------------------
+
+                 MINDEG = MIN (MINDEG, DEG)
+                 DEGREE (I) = DEG
+
+C                -------------------------------------------------------
+C                place the supervariable in the element pattern
+C                -------------------------------------------------------
+
+                 IW (P) = I
+                 P = P + 1
+                 ENDIF
+260           CONTINUE
+
+C=======================================================================
+C  FINALIZE THE NEW ELEMENT
+C=======================================================================
+
+           NV (ME) = NVPIV + DEGME
+C          nv (me) is now the degree of pivot (including diagonal part)
+C          save the length of the list for the new element me
+           LEN (ME) = P - PME1
+           IF (LEN (ME) .EQ. 0) THEN
+C             there is nothing left of the current pivot element
+              PE (ME) = 0
+              W (ME) = 0
+              ENDIF
+           IF (NEWMEM .NE. 0) THEN
+C             element was not constructed in place: deallocate part
+C             of it (final size is less than or equal to newmem,
+C             since newly nonprincipal variables have been removed).
+              PFREE = P
+              MEM = MEM - NEWMEM + LEN (ME)
+              ENDIF
+
+C=======================================================================
+C          END WHILE (selecting pivots)
+           GOTO 30
+           ENDIF
+C=======================================================================
+
+C=======================================================================
+C  COMPUTE THE PERMUTATION VECTORS
+C=======================================================================
+
+C       ----------------------------------------------------------------
+C       The time taken by the following code is O(n).  At this
+C       point, elen (e) = -k has been done for all elements e,
+C       and elen (i) = 0 has been done for all nonprincipal
+C       variables i.  At this point, there are no principal
+C       supervariables left, and all elements are absorbed.
+C       ----------------------------------------------------------------
+
+C       ----------------------------------------------------------------
+C       compute the ordering of unordered nonprincipal variables
+C       ----------------------------------------------------------------
+
+        DO 290 I = 1, N
+           IF (ELEN (I) .EQ. 0) THEN
+
+C             ----------------------------------------------------------
+C             i is an un-ordered row.  Traverse the tree from i until
+C             reaching an element, e.  The element, e, was the
+C             principal supervariable of i and all nodes in the path
+C             from i to when e was selected as pivot.
+C             ----------------------------------------------------------
+
+              J = -PE (I)
+C             while (j is a variable) do:
+270           CONTINUE
+              IF (ELEN (J) .GE. 0) THEN
+                 J = -PE (J)
+                 GOTO 270
+                 ENDIF
+              E = J
+
+C             ----------------------------------------------------------
+C             get the current pivot ordering of e
+C             ----------------------------------------------------------
+
+              K = -ELEN (E)
+
+C             ----------------------------------------------------------
+C             traverse the path again from i to e, and compress the
+C             path (all nodes point to e).  Path compression allows
+C             this code to compute in O(n) time.  Order the unordered
+C             nodes in the path, and place the element e at the end.
+C             ----------------------------------------------------------
+
+              J = I
+C             while (j is a variable) do:
+280           CONTINUE
+              IF (ELEN (J) .GE. 0) THEN
+                 JNEXT = -PE (J)
+                 PE (J) = -E
+                 IF (ELEN (J) .EQ. 0) THEN
+C                   j is an unordered row
+                    ELEN (J) = K
+                    K = K + 1
+                    ENDIF
+                 J = JNEXT
+                 GOTO 280
+                 ENDIF
+C             leave elen (e) negative, so we know it is an element
+              ELEN (E) = -K
+              ENDIF
+290        CONTINUE
+
+C       ----------------------------------------------------------------
+C       reset the inverse permutation (elen (1..n)) to be positive,
+C       and compute the permutation (last (1..n)).
+C       ----------------------------------------------------------------
+
+        DO 300 I = 1, N
+           K = ABS (ELEN (I))
+           LAST (K) = I
+           ELEN (I) = K
+300        CONTINUE
+
+C=======================================================================
+C  RETURN THE MEMORY USAGE IN IW
+C=======================================================================
+
+C       If maxmem is less than or equal to iwlen, then no compressions
+C       occurred, and iw (maxmem+1 ... iwlen) was unused.  Otherwise
+C       compressions did occur, and iwlen would have had to have been
+C       greater than or equal to maxmem for no compressions to occur.
+C       Return the value of maxmem in the pfree argument.
+
+        PFREE = MAXMEM
+
+        RETURN
+        END
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/README.txt	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,5 @@
+UMFPACK v4.4 and AMD v1.1.
+
+See UMFPACK/README.txt and AMD/README.txt for details.  Documention is in
+UMFPACK/Doc and AMD/Doc.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/arc130.rua	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,506 @@
+1UNSYMMETRIC MATRIX FROM LASER PROBLEM. A.R.CURTIS, OCT 1974            ARC130  
+           502             9            65           428             0          
+RUA                      130           130          1282             0          
+(16I5)          (20I4)          (1P3D24.15)                                     
+    1   41  102  163  224  285  325  344  363  380  397  413  423  433  443  452
+  461  471  595  597  721  722  723  724  725  726  732  737  744  750  755  761
+  766  773  779  785  791  796  801  806  812  818  824  830  836  841  847  852
+  858  863  868  874  879  884  889  896  903  908  914  919  925  931  936  943
+  948  953  959  964  971  976  981  986  991  997 1002 1008 1013 1018 1023 1028
+ 1033 1038 1043 1048 1053 1058 1063 1068 1073 1078 1083 1088 1093 1098 1103 1108
+ 1113 1118 1123 1128 1133 1138 1143 1148 1153 1158 1163 1168 1173 1178 1183 1188
+ 1193 1198 1203 1208 1213 1218 1223 1228 1233 1238 1243 1248 1253 1258 1263 1268
+ 1273 1278 1283                                                                 
+   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18  19  20  26
+  31  36  41  46  51  56  61  66  71  76  81  86  91  96 101 106 111 116 121 126
+   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18  19  20  26
+  27  31  32  36  37  41  42  46  47  51  52  56  57  61  62  66  67  71  72  76
+  77  81  82  86  87  91  92  96  97 101 102 106 107 111 112 116 117 121 122 126
+ 127   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18  19  20
+  27  28  32  33  37  38  42  43  47  48  52  53  57  58  62  63  67  68  72  73
+  77  78  82  83  87  88  92  93  97  98 102 103 107 108 112 113 117 118 122 123
+ 127 128   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18  19
+  20  28  29  33  34  38  39  43  44  48  49  53  54  58  59  63  64  68  69  73
+  74  78  79  83  84  88  89  93  94  98  99 103 104 108 109 113 114 118 119 123
+ 124 128 129   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18
+  19  20  29  30  34  35  39  40  44  45  49  50  54  55  59  60  64  65  69  70
+  74  75  79  80  84  85  89  90  94  95  99 100 104 105 109 110 114 115 119 120
+ 124 125 129 130   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17
+  18  19  20  30  35  40  45  50  55  60  65  70  75  80  85  90  95 100 105 110
+ 115 120 125 130   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17
+  18  19  20   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  17  18
+  19  20   1   2   3   4   5   6   7   8   9  12  13  14  15  17  18  19  20   1
+   2   3   4   5   6   7   8  10  11  12  14  15  17  18  19  20   1   2   3   4
+   5   6   7   8  11  12  14  15  17  18  19  20   7   9  11  12  13  14  15  18
+  19  20   7   9  11  12  13  14  15  18  19  20   8  10  11  12  14  15  17  18
+  19  20   1   2   3   4   5   6  15  18  20   1   2   3   4   5   6  16  18  20
+   1   2   3   4   5   6  11  17  18  20   1   2   3   4   5   6   7   8   9  10
+  11  12  13  14  15  17  18  19  20  26  27  28  29  30  31  32  33  34  35  36
+  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56
+  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76
+  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
+  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
+ 117 118 119 120 121 122 123 124 125 126 127 128 129 130  18  19   1   2   3   4
+   5   6   7   8   9  10  11  12  13  14  15  17  18  19  20  26  27  28  29  30
+  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50
+  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70
+  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
+  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110
+ 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
+  21  22  23  24  25   1   2  11  20  21  26   2   3  20  22  27   3   4  11  18
+  20  23  28   4   5  11  20  24  29   5   6  20  25  30   1   2  11  20  21  31
+   2   3  20  22  32   3   4  11  18  20  23  33   4   5  11  20  24  34   5   6
+  18  20  25  35   1   2  11  20  21  36   2   3  20  22  37   3   4  20  23  38
+   4   5  20  24  39   5   6  18  20  25  40   1   2  18  20  21  41   2   3  18
+  20  22  42   3   4  11  20  23  43   4   5  11  20  24  44   5   6  20  25  45
+   1   2  18  20  21  46   2   3  20  22  47   3   4  11  20  23  48   4   5  20
+  24  49   5   6  20  25  50   1   2  11  20  21  51   2   3  20  22  52   3   4
+  20  23  53   4   5  20  24  54   5   6  11  18  20  25  55   1   2  11  18  20
+  21  56   2   3  20  22  57   3   4  18  20  23  58   4   5  20  24  59   5   6
+  18  20  25  60   1   2  11  20  21  61   2   3  20  22  62   3   4  11  18  20
+  23  63   4   5  20  24  64   5   6  20  25  65   1   2  11  20  21  66   2   3
+  20  22  67   3   4  11  18  20  23  68   4   5  20  24  69   5   6  20  25  70
+   1   2  20  21  71   2   3  20  22  72   3   4  11  20  23  73   4   5  20  24
+  74   5   6  11  20  25  75   1   2  20  21  76   2   3  20  22  77   3   4  20
+  23  78   4   5  20  24  79   5   6  20  25  80   1   2  20  21  81   2   3  20
+  22  82   3   4  20  23  83   4   5  20  24  84   5   6  20  25  85   1   2  20
+  21  86   2   3  20  22  87   3   4  20  23  88   4   5  20  24  89   5   6  20
+  25  90   1   2  20  21  91   2   3  20  22  92   3   4  20  23  93   4   5  20
+  24  94   5   6  20  25  95   1   2  20  21  96   2   3  20  22  97   3   4  20
+  23  98   4   5  20  24  99   5   6  20  25 100   1   2  20  21 101   2   3  20
+  22 102   3   4  20  23 103   4   5  20  24 104   5   6  20  25 105   1   2  20
+  21 106   2   3  20  22 107   3   4  20  23 108   4   5  20  24 109   5   6  20
+  25 110   1   2  20  21 111   2   3  20  22 112   3   4  20  23 113   4   5  20
+  24 114   5   6  20  25 115   1   2  20  21 116   2   3  20  22 117   3   4  20
+  23 118   4   5  20  24 119   5   6  20  25 120   1   2  20  21 121   2   3  20
+  22 122   3   4  20  23 123   4   5  20  24 124   5   6  20  25 125   1   2  20
+  21 126   2   3  20  22 127   3   4  20  23 128   4   5  20  24 129   5   6  20
+  25 130                                                                        
+   1.000000408955316D+00  -6.310289677458059D-07   2.096665525641583D-07        
+   6.421004172807443D-08   3.956404981408923D-09   6.194351698241007D-10        
+   5.637896549615107D-08  -5.637896549615107D-08  -5.637896549615107D-08        
+   0.0                     0.0                     1.127578798332252D-06        
+  -5.637896549615107D-08  -5.074106752545049D-07   6.088927761993546D-07        
+  -5.637896549615107D-08  -2.043932134654369D-09   0.0                          
+   1.878335326910019D-02   3.624941025245822D-16   6.846256028048394D-16        
+   8.682574753301250D-16   8.829475677343563D-16   7.596007241310538D-16        
+   5.641173783660228D-16   3.637011244744196D-16   2.010050211992837D-16        
+   9.149849743076945D-17   3.147608842710462D-17   7.345189304361637D-18        
+   1.130718674232424D-18   1.234088333455879D-19   1.030108373210172D-20        
+   6.833493328871848D-22   3.659321266573640D-23   1.588981222142243D-24        
+   5.608268555010370D-26   1.610701819995700D-27   3.764561095514044D-29        
+   7.172442880553562D-31  -1.426527305739000D-04   1.000147870872752D+00        
+  -5.613608664134517D-06   4.753307507598947D-07  -5.725276253087941D-09        
+  -1.773762647871990D-08   5.637896549615107D-08  -5.637896549615107D-08        
+  -5.637896549615107D-08   0.0                     8.516936613432724D-15        
+   1.127578798332252D-06  -5.637896549615107D-08  -5.074106752545049D-07        
+   6.088927761993546D-07  -5.637896549615107D-08   1.437741730114794D-07        
+   0.0                    -1.321256637573242D+00  -1.114484955602561D-14        
+   1.733296665917816D-12  -2.074384704265318D-14   2.677037702625285D-09        
+  -2.624046067782083D-14   6.328248787212942D-07  -2.673591396559240D-14        
+   3.107915290456731D-06  -2.314677109379638D-14   3.159706807309703D-07        
+  -1.742469422872858D-14   2.779751095971505D-09  -1.155559277280817D-14        
+   1.449127970398756D-11  -6.786512676696180D-15   1.984121417511475D-13        
+  -3.535647235462748D-15   1.024009300748183D-14  -1.631147863670078D-15        
+   1.059880891954518D-15  -6.681999398916840D-16   1.302165587382207D-16        
+  -2.461975376577509D-16   1.523580661538971D-17  -8.232749965727973D-17        
+   1.550961994175702D-18  -2.496269623029467D-17   1.321670733700876D-19        
+  -6.841421422065817D-18   9.270355296549564D-21  -1.693073277773537D-18        
+   5.325857707782005D-22  -3.781317617533563D-19   2.498061216103135D-23        
+  -7.624842319058412D-20   9.576834498255501D-25  -1.388670166119169D-20        
+   3.002645577625813D-26  -2.284276225230092D-21   7.695759909088791D-28        
+  -3.396618468231539D-22   1.614779109984465D-29   3.172130163875408D-06        
+  -4.288838244974613D-04   1.050343558192253D+00  -4.991767182946205D-02        
+  -9.393625077791512D-08  -2.995422221374611D-08   5.637896549615107D-08        
+  -5.637896549615107D-08  -5.637896549615107D-08   0.0                          
+  -1.143995922298080D-15   1.127578798332252D-06  -5.637896549615107D-08        
+  -5.074106752545049D-07   6.088927761993546D-07  -5.637896549615107D-08        
+  -1.144809175457340D-06   0.0                     1.052057933807373D+01        
+  -1.889024527079730D-12   2.473666237123862D-12  -3.191809705427318D-09        
+   4.265404740522172D-08  -8.364604013877397D-07   3.888504579663277D-04        
+  -4.564798473438714D-06   3.816828131675720D-02  -5.168877237338165D-07        
+   1.131986826658249D-02  -5.076469022924357D-09   3.749688039533794D-05        
+  -2.963390643984098D-11   1.865166154857434D-08  -4.676906106317047D-13        
+   1.635970525715180D-11  -3.327468305774385D-14   1.099596759132626D-13        
+  -6.362139005726408D-15   5.006533924413470D-15  -1.834683316389945D-15        
+   4.881095121188686D-16  -5.997685715994827D-16   5.444201036336569D-17        
+  -1.954991746932328D-16   5.645564756136680D-18  -5.996761655988932D-17        
+   5.045512223359075D-19  -1.687755499051556D-17   3.764540326759457D-20        
+  -4.318695916068944D-18   2.317379201706768D-21  -1.000719796344203D-18        
+   1.172540887632911D-22  -2.099449018144940D-19   4.871730427049952D-24        
+  -3.988113352283189D-20   1.662654519802644D-25  -6.857663320188449D-21        
+   4.662922914394380D-27  -1.068200969380841D-21   1.074941789167073D-28        
+   9.677614798420109D-07  -1.245291059603915D-06  -7.536840438842773D-02        
+   1.075373947620392D+00  -5.109401172376238D-06  -1.163272145277006D-07        
+   5.637896549615107D-08  -5.637896549615107D-08  -5.637896549615107D-08        
+   0.0                     2.726002957774963D-15   1.127578798332252D-06        
+  -5.637896549615107D-08  -5.074106752545049D-07   6.088927761993546D-07        
+  -5.637896549615107D-08   3.242677848902531D-06   0.0                          
+  -2.979957580566406D+01  -2.690164063734457D-12   1.124147229838481D-14        
+  -5.062177166337278D-08   2.393615836679235D-14  -5.103659350425005D-04        
+   3.258340252883067D-14  -5.552677810192108D-02   3.506025222747844D-14        
+  -1.829450204968452D-02   3.150090797476683D-14  -6.747333100065589D-05        
+   2.389203133837219D-14  -3.745336840665914D-08   1.510693087010233D-14        
+  -3.676196846935653D-11   7.677818342037568D-15  -2.876134660295682D-13        
+   2.945648553635133D-15  -1.940820822197292D-14   8.095830795573460D-16        
+  -3.855263683164370D-15   1.612334891334645D-16  -1.105984048240622D-15        
+   2.450439846627089D-17  -3.484403436219757D-16   2.962714454342404D-18        
+  -1.076261635651689D-16   2.911501014282256D-19  -3.103228286741277D-17        
+   2.346465182333734D-20  -8.193536641609284D-18   1.555002212474875D-21        
+  -1.967818836691188D-18   8.483679018543260D-23  -4.290093147860203D-19        
+   3.815631846132649D-24  -8.487715775043102D-20   1.415514258958216D-25        
+  -1.524028579840669D-20   4.334547236644489D-27  -2.483863638318878D-21        
+   1.096037222071676D-28   2.067174023068219D-07  -3.464035103206697D-07        
+   8.871005547916866D-07  -1.004851656034589D-03   1.001007388811558D+00        
+  -3.227999513910618D-06   5.637894062715532D-08  -5.637894062715532D-08        
+  -5.637894062715532D-08   0.0                     0.0                          
+   1.127578798332252D-06  -5.637894062715532D-08  -5.074106752545049D-07        
+   6.088923782954225D-07  -5.637894062715532D-08   9.148621415988600D-07        
+   0.0                    -8.407408714294434D+00  -4.977862197962091D-14        
+   8.301786856698343D-15  -9.878084678352494D-14   1.892736794660739D-14        
+  -1.325998230487790D-13   2.600578511758635D-14  -1.439277841873421D-13        
+   2.763043835613335D-14  -1.330588200385008D-13   2.406133628386938D-14        
+  -1.065598347407826D-13   1.723105233259088D-14  -7.396622377087159D-14        
+   9.875153944354995D-15  -4.402636024844475D-14   4.349897043042991D-15        
+  -2.220723876057012D-14   1.437176048199422D-15  -9.662081112407281D-15        
+   3.596410837999929D-16  -3.830770878461565D-15   7.011335073232172D-17        
+  -1.436664440299280D-15   1.093826418912559D-17  -5.079756111055342D-16        
+   1.388715480107101D-18  -1.665747200801725D-16   1.447536603658476D-19        
+  -5.007023509456983D-17   1.243767186728059D-20  -1.371575222480206D-17        
+   8.829125121689631D-22  -3.416913538430984D-18   5.181441636060790D-23        
+  -7.740067027423400D-19   2.517640901542902D-24  -1.594267587579844D-19        
+   1.013315498583546D-25  -2.986853872288083D-20   3.380210430601726D-27        
+  -5.090734445941291D-21   9.355154149199958D-29   1.471342443437607D-07        
+  -1.266278104594676D-07   4.008210794381739D-07   1.813951712392736D-06        
+  -1.041745999827981D-03   1.001039566937834D+00   5.637089728338651D-08        
+  -5.637089728338651D-08  -5.637896549615107D-08  -8.085981537120368D-12        
+  -4.542686146409396D-14   1.127425093727652D-06  -5.637896549615107D-08        
+  -5.073379156783631D-07   6.087796009524027D-07  -5.637089728338651D-08        
+   9.095310815609992D-07   0.0                    -8.358414649963379D+00        
+  -5.387848167289801D-14  -1.065863976940085D-13  -1.420175283796399D-13        
+  -1.525375420592667D-13  -1.390970129876157D-13  -1.094549255918620D-13        
+  -7.446164995358884D-14  -4.389770949628398D-14  -2.282676882258729D-14        
+  -1.078032045684525D-14  -4.709645488269049D-15  -1.906120381095478D-15        
+  -7.101397174837966D-16  -2.421286031373780D-16  -7.530431274023090D-17        
+  -2.133795108141790D-17  -5.505686860192738D-18  -1.294189415607603D-18        
+  -2.771874994834836D-19  -5.410633946266530D-20  -9.630518136308248D-21        
+  -1.259340933756903D-05  -1.634575164644048D-04  -3.157716710120440D-04        
+  -5.238812882453203D-04  -1.138667576014996D-04  -2.637367288116366D-05        
+   1.001156237442046D+00  -1.022412441670895D-03  -1.463538410462206D-07        
+   1.089178491383791D-03   6.691245653200895D-05   2.203556895256042D-02        
+  -1.463538410462206D-07  -9.134795516729355D-03   1.585229113698006D-02        
+  -1.022412441670895D-03   4.045813511766028D-06   6.691245653200895D-05        
+  -3.734263610839844D+01  -4.186565638519824D-05  -1.590017291164258D-07        
+  -1.589597218298877D-07  -1.589597218298877D-07  -1.589597218298877D-07        
+  -1.589597218298877D-07  -4.075298784300685D-05   1.000055276526837D+00        
+   4.170673491898924D-05  -6.308013325906359D-06   7.261772225319874D-06        
+  -8.087516762316227D-04   4.170673491898924D-05   5.047505255788565D-04        
+  -4.733889363706112D-04   5.527652683667839D-05   4.606268078077846D-08        
+   7.261772225319874D-06  -4.409304857254028D-01  -1.230297129950486D-06        
+  -1.238937771819160D-12  -2.037324342022181D-18   0.0                          
+   0.0                     0.0                    -1.230298039445188D-06        
+   1.230298039445188D-06   1.000001230298039D+00  -2.460596442688257D-05        
+   1.230298039445188D-06   1.107268144551199D-05  -1.328722373727942D-05        
+   1.230298039445188D-06  -2.200477799974010D-09   0.0                          
+   2.022196725010872D-02  -7.543263791376376D-09  -7.543263791376376D-07        
+  -1.508652530901600D-06  -2.539273737056646D-06  -5.087317163088301D-07        
+  -7.543263791376376D-08   5.393962055677548D-06  -5.393962055677548D-06        
+   1.000005393962056D+00   0.0                     1.024852826958522D-04        
+  -4.854565486311913D-05   7.551546150352806D-05  -5.393962055677548D-06        
+   1.420877993041358D-08   0.0                    -1.305759549140930D-01        
+  -4.203418058068564D-09  -4.203418058068564D-09  -4.203418058068564D-09        
+  -4.203418058068564D-09  -4.203418058068564D-09  -4.203418058068564D-09        
+   2.522051900655242D-08   2.522051900655242D-08   1.000000025220519D+00        
+   5.044103090767749D-07   2.522051545383874D-07   2.269846390845487D-07        
+   2.522051900655242D-08   2.554505496021875D-10   2.522051900655242D-08        
+  -2.408750355243683D-03   2.477248961518796D-11  -1.238624654231746D-11        
+   1.238624654231746D-11   1.000000000495450D+00  -1.238624654231746D-11        
+   1.238625261384962D-11   2.452476000058823D-10   1.574671382870152D-13        
+   1.238624654231746D-11  -1.477152181905694D-06   2.184934178028897D-11        
+  -1.092467522695317D-11   1.092467522695317D-11   4.369868911169306D-10        
+   9.999999999890753D-01   1.092467522695317D-11   2.163085821571542D-10        
+   1.388860272448500D-13   1.092467522695317D-11  -1.302848431805614D-06        
+   1.345329678770213D-07  -6.726645551680122D-08   6.726645551680122D-08        
+   6.726645551680122D-08   1.000001278062882D+00  -3.363325618011004D-07        
+   1.345329678770213D-07   4.668525566131621D-10   6.726645551680122D-08        
+  -4.453532397747040D-03  -1.054020426494162D-09  -4.277477927416840D-09        
+  -1.088280576766465D-09   4.067786107952998D-09   1.694434592636185D-09        
+   6.575595623559138D-10   1.000000000000000D+00   1.521864578801768D-11        
+  -1.398565364070237D-04  -5.132014604947166D-12  -2.082700678585070D-11        
+  -5.298826481758834D-12   1.980600405904198D-11   8.250184389824167D-12        
+   3.201650750073171D-12   1.000000000000000D+00   7.409947221787005D-14        
+  -6.809601131863019D-07  -6.473783287219703D-08  -4.636610242414463D-07        
+  -5.365741913010424D-07   7.723452881691628D-07   2.271788730467961D-07        
+   6.544928510265891D-08   0.0                     1.000000000000000D+00        
+   1.931242499253472D-09  -1.774775609374046D-02  -4.218190908432007D-03        
+  -3.070430830121040D-04  -2.048411639407277D-03   8.487612940371037D-04        
+  -1.524399995105341D-04  -4.570157034322619D-05  -2.428856445476413D-03        
+   4.073116928339005D-03   4.175942391157150D-03   9.249553550034761D-04        
+   8.221305906772614D-04  -4.950208216905594D-02   4.175942391157150D-03        
+   3.748018294572830D-02  -2.475163340568542D-02   4.073116928339005D-03        
+   1.000018495076802D+00   8.221305906772614D-04  -1.014492340087891D+02        
+  -2.471087598205393D-17  -1.873189645930362D-13   4.888664885231708D-14        
+  -3.043990772877252D-16  -1.286887362945006D-16  -2.790847829749812D-17        
+  -3.319902130982655D-10   3.139515314387609D-10  -4.006040206456845D-16        
+  -1.686210855062899D-16  -3.125035414666135D-17  -9.123220934270648D-08        
+  -3.244133949920069D-06  -4.812402866748730D-16  -1.976705171837396D-16        
+  -3.494794412900199D-17  -5.191453169572924D-07  -9.969023521989584D-04        
+  -5.606729188860132D-16  -2.226699269983418D-16  -3.903872945243604D-17        
+  -6.099668325987295D-08  -5.238358862698078D-04  -6.322302622700565D-16        
+  -2.419947719317118D-16  -4.343730537307861D-17  -6.189664336631040D-10        
+  -2.593829776742496D-06  -6.731455535124650D-16  -2.488745852875481D-16        
+  -4.778463580041231D-17  -3.720013880270656D-12  -1.776293334643242D-09        
+  -6.517935469780786D-16  -2.327123496209888D-16  -5.103115426856043D-17        
+  -6.057437537676513D-14  -2.046598134020083D-12  -5.521360973271107D-16        
+  -1.877159742293702D-16  -5.069799238760367D-17  -4.548197620390590D-15        
+  -1.881829720805535D-14  -3.943213655176626D-16  -1.259239545802135D-16        
+  -4.296864469034077D-17  -9.248773926893387D-16  -1.645467590918122D-15        
+  -2.305333573641771D-16  -7.042313979789018D-17  -2.772176047218775D-17        
+  -2.775064164871116D-16  -4.056637719561081D-16  -1.113570922349179D-16        
+  -3.375268799619757D-17  -1.308748704287211D-17  -9.240036252646867D-17        
+  -1.296943629262385D-16  -4.625534428392427D-17  -1.425923056676471D-17        
+  -4.840895863954283D-18  -3.032876906515887D-17  -4.265090145600200D-17        
+  -1.706723743114132D-17  -5.404603734977533D-18  -1.517272582187642D-18        
+  -9.324217265533531D-18  -1.336685488705270D-17  -5.681662918068494D-18        
+  -1.854034353170231D-18  -4.197349140592874D-19  -2.625968399791454D-18        
+  -3.870900037102137D-18  -1.715837288230996D-18  -5.777406282236940D-19        
+  -1.041151557505182D-19  -6.720563303536613D-19  -1.023229862353608D-18        
+  -4.706283903187430D-19  -1.637971158256200D-19  -2.326514296817294D-20        
+  -1.557337075156648D-19  -2.458146584996669D-19  -1.172823201387139D-19        
+  -4.226950445047938D-20  -4.691781359097844D-21  -3.267222217268957D-20        
+  -5.359393661610564D-20  -2.656896049584655D-20  -9.936381092496801D-21        
+  -8.545038260582033D-22  -6.206423377690597D-21  -1.060338916542145D-20        
+  -5.472649550870706D-21  -2.128172137901634D-21  -1.405610283842565D-22        
+  -1.067211220312940D-21  -1.903915315123482D-21  -1.025301274472632D-21        
+  -4.154147080474621D-22  -2.090081288584553D-23  -1.662368100185176D-22        
+  -3.103005701485727D-22  -1.747504367213780D-22  -7.394070257460893D-23        
+   2.863205506020705D-11   1.000000000000000D+00  -4.014349741510159D-09        
+  -9.617298624142734D-11   1.790963349845853D-10  -6.729825585694016D-10        
+  -5.825459559183344D-11  -4.065924680274335D-12  -3.366472656196606D-09        
+   3.135385950869818D-09   4.016598609268840D-09   7.656726364047017D-10        
+  -1.155434775634845D-10  -6.809511887695407D-08   4.016598609268840D-09        
+   2.810291377386420D-08  -3.369975942746350D-08   3.135385950869818D-09        
+  -1.771422635313269D-13  -1.155434775634845D-10   9.999941390788081D-01        
+   9.258888843571604D-24   1.602456287903206D-20   2.057477099391917D-22        
+   3.790063917561350D-23   1.265028470551178D-23   2.967497825759503D-23        
+   2.640151404010411D-17   1.192485938020208D-16   8.872690943367984D-23        
+   2.428638932088789D-23   5.485064732149495D-23   5.627280325742889D-15        
+   2.097305835946361D-12   1.503074364226984D-22   3.654340714362437D-23        
+   7.372330513090450D-23   1.681930622879878D-14   2.737321480594801D-10        
+   1.947877940148048D-22   4.299390383295486D-23   7.854277825614900D-23        
+  -4.953118332693719D-16   8.360855063838102D-11   1.958871505723208D-22        
+   3.781022940498793D-23   6.825535047624489D-23  -3.696815741287290D-17        
+   1.911188763671634D-13   1.445337823900475D-22   1.984496358497428D-23        
+   4.766340503378597D-23  -4.550524242880046D-19  -1.640866931465110D-17        
+   5.772616522788313D-23  -4.807225270830030D-24   2.362661130331001D-23        
+  -1.189888325165020D-20  -1.973999840420913D-19  -2.738506020014500D-23        
+  -2.428158042480967D-23   2.509290808861137D-24  -1.294584510672371D-21        
+  -3.717966827098453D-21  -7.478883533280463D-23  -2.996065950125539D-23        
+  -1.037705815595532D-23  -3.566438890326746D-22  -5.413638615218143D-22        
+  -7.477866218257090D-23  -2.431505337074001D-23  -1.238172726552106D-23        
+  -1.375019772551033D-22  -1.876708297674201D-22  -5.030145687504091D-23        
+  -1.532134485362388D-23  -7.948924568162411D-24  -5.671434067641046D-23        
+  -7.661519347879783D-23  -2.663720744022099D-23  -8.085988361583657D-24        
+  -3.645409862282249D-24  -2.248603203033078D-23  -3.072957800279242D-23        
+  -1.198979750198010D-23  -3.714077048638117D-24  -1.364280504177280D-24        
+  -8.197194872253568D-24  -1.145321036994424D-23  -4.748082791043800D-24        
+  -1.512755170592547D-24  -4.417921329419716D-25  -2.697872741419652D-24        
+  -3.879402572849811D-24  -1.677462227854547D-24  -5.512122187882033D-25        
+  -1.265862414857133D-25  -7.973125637443234D-25  -1.184497526155601D-24        
+  -5.315078538823665D-25  -1.805181470815384D-25  -3.233673662629892D-26        
+  -2.112101611057460D-25  -3.253289983263135D-25  -1.514428048749681D-25        
+  -5.326447996620163D-26  -7.390221523433456D-27  -5.021731366753499D-26        
+  -8.038901845796694D-26  -3.888457796247278D-26  -1.419193740413248D-26        
+  -1.513852580882299D-27  -1.072950979457684D-26  -1.788974446777135D-26        
+  -9.009346205447938D-27  -3.419209741603590D-27  -2.782304323808742D-28        
+  -2.061430478961550D-27  -3.589193859239163D-27  -1.886021979637610D-27        
+  -7.457784301440527D-28  -4.595369958630025D-29  -3.566718256788164D-28        
+  -6.497723631603045D-28  -3.570664487244213D-28  -1.474525909938138D-28        
+   1.000000000000000D+00   1.000000000000000D+00   1.000000000000000D+00        
+   1.000000000000000D+00   1.000000000000000D+00   7.811995148658752D-01        
+  -7.201683521270752D-01   0.0                     0.0                          
+  -5.653844921875000D+04   1.740456342697144D+00  -8.308809995651245D-02        
+   8.304953575134277D-02  -5.771726608276367D+00  -5.449882812500000D+04        
+   9.420697018504143D-01   2.393694594502449D-02  -2.386506274342537D-02        
+   7.188270683400333D-05   0.0                     0.0                          
+  -5.246062109375000D+04   1.049086261540651D+00   1.366583108901978D-01        
+  -1.281171441078186D-01   0.0                     0.0                          
+  -5.045838671875000D+04   1.151831865310669D+00   4.490368068218231D-02        
+  -4.476334899663925D-02   0.0                    -4.844616015625000D+04        
+   1.070025980472565D+00   1.036765098571777D+00  -1.198760032653809D+00        
+  -1.727943420410156D-01   0.0                    -5.611478125000000D+04        
+   2.215560913085937D+00  -1.629607677459717D-01   1.629607677459717D-01        
+  -2.116955566406250D+01  -5.408718359375000D+04   8.621966838836670D-01        
+   1.399642601609230D-02  -1.399642601609230D-02   0.0                          
+  -2.007014927585260D-07   1.844083786010742D+00  -5.207436718750000D+04        
+   1.039153832942247D+00   2.189477086067200D-01  -2.052634358406067D-01        
+   1.824564114212990D-02   0.0                    -5.007060937500000D+04        
+   1.231180489063263D+00   7.386076450347900D-02  -7.407057285308838D-02        
+   0.0                     0.0                    -4.807021875000000D+04        
+   1.099351406097412D+00   1.389152526855469D+00  -1.331271171569824D+00        
+   0.0                     0.0                    -5.567945703125000D+04        
+   2.367364883422852D+00  -2.162640094757080D-01   2.162640094757080D-01        
+  -4.326069641113281D+01  -5.366410156250000D+04   8.088933825492859D-01        
+  -1.824025437235832D-02   1.824025437235832D-02  -3.646347999572754D+00        
+  -5.166330859375000D+04   1.006917160004377D+00   2.334227561950684D-01        
+  -2.275872230529785D-01   0.0                    -4.967141796875000D+04        
+   1.252006113529205D+00   8.269733190536499D-02  -8.349931240081787D-02        
+   0.0                     0.0                    -4.768283984375000D+04        
+   1.108648717403412D+00   1.188438415527344D+00  -1.216734886169434D+00        
+   0.0                     0.0                    -5.523291015625000D+04        
+   2.239842414855957D+00  -2.303062677383423D-01   2.303062677383423D-01        
+   6.817922439950053D-06  -6.265542602539062D+01  -5.322976562500000D+04        
+   7.948511838912964D-01  -5.301721021533012D-02   5.301721021533012D-02        
+   0.0                    -1.431075477600098D+01  -5.124100000000000D+04        
+   9.721402078866959D-01   2.035216093063354D-01  -2.001296281814575D-01        
+   0.0                     0.0                    -4.926116406250000D+04        
+   1.225186288356781D+00   7.491928339004517D-02  -7.571291923522949D-02        
+   0.0                    -4.728442578125000D+04   1.100826203823090D+00        
+   9.620693325996399D-01  -9.302363991737366D-01   0.0                          
+   0.0                    -5.477548437500000D+04   1.955817461013794D+00        
+  -2.077405452728271D-01   2.077405452728271D-01  -7.184405517578125D+01        
+  -5.278476953125000D+04   8.174169063568115D-01  -7.419836521148682D-02        
+   7.419836521148682D-02   0.0                    -2.535458374023437D+01        
+  -5.080805859375000D+04   9.509590044617653D-01   1.569298505783081D-01        
+  -1.486306786537170D-01   0.0                    -4.884024609375000D+04        
+   1.173709630966187D+00   5.782072991132736D-02  -5.818950012326241D-02        
+   0.0                    -4.687537109375000D+04   1.083329916000366D+00        
+   6.685049533843994D-01  -6.127962470054626D-01   1.114175319671631D-01        
+   0.0                    -5.430739843750000D+04   1.642910003662109D+00        
+  -1.625726222991943D-01   1.625726222991943D-01  -6.851022338867187D+01        
+  -5.232892187500000D+04   8.625847697257996D-01  -7.636785507202148D-02        
+   7.636785507202148D-02  -3.171057128906250D+01  -5.036466406250000D+04        
+   9.487895332276821D-01   8.871358633041382D-02  -9.425818920135498D-02        
+   0.0                    -4.840866406250000D+04   1.119902253150940D+00        
+   3.970580548048019D-02  -3.875695168972015D-02  -1.868509128689766D-02        
+   0.0                     0.0                    -4.645562890625000D+04        
+   1.063922047615051D+00   4.062695503234863D-01  -3.618338108062744D-01        
+   0.0                     0.0                     0.0                          
+  -5.382864453125000D+04   1.385215580463409D+00  -1.119138002395630D-01        
+   1.119064092636108D-01  -5.542092895507812D+01  -5.186281250000000D+04        
+   9.132438302040100D-01  -6.388950347900391D-02   6.388950347900391D-02        
+   3.410244971746579D-06  -3.133937072753906D+01  -4.991057812500000D+04        
+   9.612678736448288D-01   5.389992520213127D-02  -5.187865719199181D-02        
+   0.0                    -4.796682031250000D+04   1.077387571334839D+00        
+   2.305793017148972D-02  -2.265761792659760D-02   0.0                          
+   0.0                    -4.602543750000000D+04   1.047769121825695D+00        
+   1.912040114402771D-01  -1.852288842201233D-01   0.0                          
+   0.0                    -5.333987500000000D+04   1.210645496845245D+00        
+  -6.831127405166626D-02   6.840813159942627D-02  -2.901747131347656D+01        
+  -5.138643750000000D+04   9.568538181483746D-01  -4.531185328960419D-02        
+   4.531185328960419D-02   0.0                     2.789366590150166D-06        
+  -2.550216674804687D+01  -4.944372265625000D+04   9.798460863530636D-01        
+   2.319774404168129D-02  -2.464760094881058D-02   0.0                          
+  -4.751471484375000D+04   1.049969587475061D+00   1.143456250429153D-02        
+  -1.153665781021118D-02   0.0                    -4.558538281250000D+04        
+   1.036741930991411D+00   9.722059965133667D-02  -8.506804704666138D-02        
+   0.0                     0.0                    -5.284100000000000D+04        
+   1.110036253929138D+00  -3.708969801664352D-02   3.684729337692261D-02        
+   0.0                    -5.090041796875000D+04   9.880154319107533D-01        
+  -2.788387611508369D-02   2.788387611508369D-02   0.0                          
+   2.178428985644132D-06  -1.827397155761719D+01  -4.882808593750000D+04        
+   9.973230699542910D-01   0.0                    -1.018907129764557D-02        
+   0.0                    -4.705296093750000D+04   1.035176958888769D+00        
+   4.984032362699509D-03  -5.139783024787903D-03   0.0                          
+  -4.513525781250000D+04   1.030361384153366D+00   1.168304681777954D-01        
+  -2.920761704444885D-02   0.0                    -5.233266406250000D+04        
+   1.059764284640551D+00  -1.802648976445198D-02   2.338571846485138D-02        
+   0.0                    -5.040475000000000D+04   1.007092889398336D+00        
+  -1.836121454834938D-02   1.836121454834938D-02   0.0                          
+   0.0                    -4.950804687500000D+04   1.010153356939554D+00        
+   2.381398528814316D-02  -4.465121775865555D-03   0.0                          
+  -4.658174609375000D+04   1.028476625680923D+00   0.0                          
+  -1.977193402126431D-03   0.0                     0.0                          
+  -4.467566796875000D+04   1.027193285524845D+00   0.0                          
+  -1.157634705305099D-02   0.0                    -5.181486718750000D+04        
+   1.037754297256470D+00  -7.477629929780960D-03   0.0                          
+   0.0                    -4.989975390625000D+04   1.017277095466852D+00        
+   0.0                     0.0                     0.0                          
+  -4.388837500000000D+04   1.017999485135078D+00   0.0                          
+  -2.978397300466895D-03   0.0                    -4.610101562500000D+04        
+   1.025970183312893D+00   0.0                     0.0                          
+   0.0                    -4.420680468750000D+04   1.025839652866125D+00        
+   0.0                     0.0                     0.0                          
+  -5.128776953125000D+04   1.029255405068398D+00  -4.347227513790131D-03        
+   0.0                     0.0                    -4.938562109375000D+04        
+   1.022067971527576D+00   0.0                     0.0                          
+   0.0                    -3.449262500000000D+04   1.022117994725704D+00        
+   0.0                     0.0                     0.0                          
+  -4.561122656250000D+04   1.025238625705242D+00   0.0                          
+  -1.408393494784832D-03   0.0                    -4.372866796875000D+04        
+   1.025346063077450D+00   0.0                     0.0                          
+   0.0                    -5.075201562500000D+04   1.026350062340498D+00        
+   0.0                     0.0                     0.0                          
+  -4.886151953125000D+04   1.024067506194115D+00   0.0                          
+   0.0                     0.0                    -1.051556250000000D+05        
+   1.024003818631172D+00   0.0                     1.899568364024162D-02        
+   0.0                    -4.511256640625000D+04   1.025104723870754D+00        
+   0.0                     3.719797125086188D-03   0.0                          
+  -4.324184375000000D+04   1.025196127593517D+00   0.0                          
+   0.0                     0.0                    -5.020757421875000D+04        
+   1.025468096137047D+00   0.0                     0.0                          
+   0.0                    -4.833664062500000D+04   1.024810910224915D+00        
+   0.0                     0.0                     0.0                          
+   0.0                     1.024764768779278D+00   0.0                          
+   0.0                     0.0                    -4.460540625000000D+04        
+   1.025115087628365D+00   0.0                     0.0                          
+   0.0                    -4.274633984375000D+04   1.025160629302263D+00        
+   0.0                     0.0                     0.0                          
+  -4.965484765625000D+04   1.025229826569557D+00   0.0                          
+   0.0                     0.0                    -4.778404687500000D+04        
+   1.025058060884476D+00   0.0                     0.0                          
+   0.0                     0.0                     1.025037329643965D+00        
+   0.0                     0.0                     0.0                          
+  -4.408996093750000D+04   1.025137882679701D+00   0.0                          
+   0.0                     0.0                    -4.224254687500000D+04        
+   1.025155592709780D+00   0.0                     0.0                          
+   0.0                    -4.909400000000000D+04   1.025172512978315D+00        
+   0.0                     0.0                     0.0                          
+  -4.720000000000000D+04   1.025131687521935D+00   0.0                          
+   0.0                     0.0                     0.0                          
+   1.025124348700047D+00   0.0                     0.0                          
+   0.0                    -4.356644531250000D+04   1.025150395929813D+00        
+   0.0                     0.0                     0.0                          
+  -4.173044140625000D+04   1.025156177580357D+00   0.0                          
+   0.0                     0.0                    -4.852547656250000D+04        
+   1.025160226970911D+00   0.0                     0.0                          
+   0.0                    -4.671788281250000D+04   1.025151398032904D+00        
+   0.0                     0.0                     0.0                          
+   0.0                     1.025149203836918D+00   0.0                          
+   0.0                     0.0                    -4.303501953125000D+04        
+   1.025155294686556D+00   0.0                     0.0                          
+   0.0                    -4.121045312500000D+04   1.025156926363707D+00        
+   0.0                     0.0                     0.0                          
+  -4.794926171875000D+04   1.025157883763313D+00   0.0                          
+   0.0                     0.0                    -4.640971484375000D+04        
+   1.025156144052744D+00   0.0                     0.0                          
+   0.0                     0.0                     1.025155574083328D+00        
+   0.0                     0.0                     0.0                          
+  -4.249608593750000D+04   1.025156859308481D+00   0.0                          
+   0.0                     0.0                    -4.068298437500000D+04        
+   1.025157265365124D+00   0.0                     0.0                          
+   0.0                    -4.736593359375000D+04   1.025157485157251D+00        
+   0.0                     0.0                     0.0                          
+  -4.888311328125000D+04   1.025157172232866D+00   0.0                          
+   0.0                     0.0                     0.0                          
+   1.025157041847706D+00   0.0                     0.0                          
+   0.0                    -4.194966796875000D+04   1.025157287716866D+00        
+   0.0                     0.0                     0.0                          
+  -4.014781640625000D+04   1.025157377123833D+00   0.0                          
+   0.0                     0.0                    -4.677552734375000D+04        
+   1.025157421827316D+00   0.0                     0.0                          
+   0.0                    -9.480337500000000D+04   1.025157373398542D+00        
+   0.0                     0.0                     0.0                          
+   0.0                     1.025157347321510D+00   0.0                          
+   0.0                     0.0                    -4.139616796875000D+04        
+   1.025157388299704D+00   0.0                     0.0                          
+   0.0                    -3.960572656250000D+04   1.025157406926155D+00        
+   0.0                     0.0                     0.0                          
+  -4.617843750000000D+04   1.025157414376736D+00   0.0                          
+   0.0                     0.0                     0.0                          
+   1.025157406926155D+00   0.0                     0.0                          
+   0.0                     0.0                     1.025157403200865D+00        
+   0.0                     0.0                     0.0                          
+  -4.083592968750000D+04   1.025157410651445D+00   0.0                          
+   0.0                     0.0                    -3.905636718750000D+04        
+   1.025157410651445D+00                                                        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/can_24.psa	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+1SYMMETRIC PATTERN FROM CANNES,LUCIEN MARRO,JUNE 1981.                  CAN   24
+             8             2             6             0             0          
+PSA                       24            24            92             0          
+(16I5)          (16I5)                                                          
+    1   10   16   22   28   34   39   45   52   55   60   65   69   71   73   74
+   77   78   81   83   86   89   91   92   93                                   
+    1    6    7   13   14   18   19   20   22    2    9   10   14   15   18    3
+    7   12   21   22   23    4    8   11   16   19   20    5    8   10   15   16
+   17    6    7   13   14   18    7   12   13   20   22   24    8   10   15   16
+   17   18   19    9   10   15   10   14   15   18   19   11   19   20   21   22
+   12   13   22   24   13   24   14   18   15   16   17   19   17   18   19   20
+   19   20   20   21   22   21   22   23   22   23   23   24                    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/fs_183_6.rua	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,361 @@
+1UNSYMMETRIC FACSIMILE CONVERGENCE MATRIX                               FS 183 6
+           357            17            72           268             0          
+RUA                      183           183          1069             0          
+(11I7)          (15I5)          (4D20.12)                                       
+      1    106    142    149    152    155    158    162    166    170    175   
+    181    187    196    199    203    207    210    213    216    224    232   
+    239    248    255    264    270    275    280    287    292    296    300   
+    303    306    309    312    315    318    321    324    327    342    352   
+    356    362    365    371    374    431    435    439    440    441    442   
+    443    449    456    460    466    472    479    486    490    496    503   
+    507    509    515    517    523    529    532    538    545    547    554   
+    558    565    567    574    581    588    590    595    599    601    607   
+    610    612    618    625    632    639    646    648    655    659    661   
+    668    672    674    676    682    685    690    693    697    701    706   
+    709    711    717    720    726    732    736    739    744    747    749   
+    753    759    765    768    773    779    785    790    795    801    807   
+    813    819    828    837    844    948    950    953    965    969    971   
+    973    976    977    978    979    980    981    982    983    984    985   
+    986    987    988    989    991    996   1001   1006   1009   1012   1017   
+   1020   1024   1027   1030   1033   1036   1039   1042   1045   1048   1050   
+   1053   1056   1058   1061   1063   1065   1068   1070                        
+    1    2   20   21   22   23   24   26   27   42   43   44   49   50   51     
+   56   57   59   60   61   62   64   65   67   68   70   71   72   73   74     
+   75   76   78   79   80   81   82   83   84   86   87   89   90   91   92     
+   93   94   95   96   98   99  101  102  103  104  105  106  107  109  110     
+  112  113  114  115  116  118  119  122  123  124  125  126  127  128  129     
+  130  131  132  133  136  137  140  144  158  159  160  161  162  163  164     
+  165  166  167  168  169  170  171  172  173  174  175  176  177  179  182     
+    1    2   42   43   45   46   51   52   53   57   58   62   63   65   66     
+   76   77   84   85   96   97   99  100  108  109  110  111  118  119  120     
+  121  136  137  140  141  147    3   49  137  142  143  144  146    4  137     
+  138    5  137  158    6   56  137    7   64   70  137    8   59   60  137     
+    9   74   78  137   10   80   81   82  137   11   91   92   93   94  137     
+   12   20   42   68   69  137   13   20   21   42   43   69   73  137  158     
+   14  125  137   15  103  137  178   16  115  137  181   17  112  137   18     
+  122  137   19  123  137    4   20   43   45   48  137  138  140    4   21     
+   43   45   57  137  140  158    4    6   22   43   56   62  137    4    7     
+   12   21   23   43   64   65  137    4    7   24   43   70   76  137    4     
+    8   13   21   25   43   60   84  137    4   26   57   71  137  158   27     
+   56   57   61  137   28   56   62   90  137   29   57   64   65   87  137     
+  158   30   57   70   76  158   20   31   43  137   21   32   43  137   33     
+  127  137   34  128  137   35  130  137   36  129  137   37  131  137   38     
+  132  137   39  133  137   40  126  137   41  137  180    1    2   12   13     
+   20   21   42   43   69  136  137  139  140  148  158    1    2   42   43     
+   46   47   49   55  136  137    1    2   44  137    2   45   53  137  140     
+  145    2   43   46   43   45   47   54  137  140   48  137  138    1    2     
+    3   20   31   43   49   55   56   57   59   60   61   62   64   65   67     
+   68   70   71   73   74   76   78   80   81   82   87   90   91   92   93     
+   94   96   99  143  144  158  159  160  161  162  163  164  165  166  167     
+  168  169  170  171  172  173  174  175  176  177    1    2   50   51    2     
+   51   52   53   52   53   54   55    1    2   49   56  144  159    1    2     
+   49   57   58  144  158    2   57   58  149    1    2   49   59  144  160     
+    1    2   49   60  144  161    1    2   43   49   61   67  144    1    2     
+   49   56   62   63  144    2   62   63  150    1    2   49   64  144  162     
+    1    2   49   64   65   66  144    2   65   66  151   57   67    1    2     
+   49   68  144  163   43   69    1    2   49   70  144  164    1    2   49     
+   71  144  165    4   21   72    1    2   49   73  144  166    1    2   49     
+   74   75  144  167   53   75    1    2   49   70   76   77  144    2   76     
+   77  152    1    2   49   78   79  144  168   53   79    1    2   49   80     
+   83  144  169    1    2   49   81   86  144  170    1    2   49   82   89     
+  144  171   53   83    1    2   60   84   85    2   84   85  153   53   86     
+    1    2   49   87  144  172   57   62   88   53   89    1    2   49   90     
+  144  173    1    2   49   91   95  144  174    1    2   49   92   98  144     
+  175    1    2   49   93  101  144  176    1    2   49   94  102  144  177     
+   53   95    1    2   49   59   96   97  144    2   96   97  154   53   98     
+    1    2   49   74   99  100  144    2   99  100  155   53  101   53  102     
+    1    2   43   72  103  104  104  105  137    1    2   43  105  106    4     
+   20  106    1    2  107  179    2  108  109  156    1    2  108  109  110     
+    2  110  111   53  111    1    2   43   72  112  113  113  114  137    1     
+    2   43   72  106  114    1    2   43   67  104  115    1    2  116  182     
+  117  137  183    1    2  118  119  121    2  119  120   53  120    2  118     
+  121  157    1    2   43   72  113  122    1    2   43  104  123  124    4     
+   22  124    1    2   43  106  125    1    2   20   26   43  126    1    2     
+   20   22   43  127    1    2   21   43  128    1    2   23   43  129    1     
+    2   21   22   43  130    1    2   20   27   43  131    1    2   20   24     
+   43  132    1    2   21   26   43  133    4    8   13   21   43   59   96     
+  134  137    4    9   13   21   43   74   99  135  137    1    2   42   43     
+  136  137  138    1    2    3    4    5    6    7    8    9   10   11   12     
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27     
+   28   29   31   32   33   34   35   36   37   38   39   40   41   42   43     
+   44   45   47   48   56   57   59   60   61   62   64   65   68   70   71     
+   73   74   76   78   80   81   82   84   87   90   91   92   93   94   96     
+   99  103  104  105  112  113  114  115  117  122  123  125  126  127  128     
+  129  130  131  132  133  134  135  136  137  138  140  142  158  178  180     
+  181  183   43  138  136  137  139    1    2    4   20   21   43   45   47     
+   57  136  140  141    2   53  140  141   50  142   52  143   20   43  144     
+  145  146  147  148  149  150  151  152  153  154  155  156  157   49  158     
+   20   21   43  158  159   21   27   43   56  160   20   23   43   64  161     
+   22   43  162   20   43  163   21   26   43  158  164   43   72  165   20     
+   21   43  166   24   43  167   26  158  168   25   43  169   29   43  170     
+   28   43  171   43   88  172   43   88  173   43  134  174  135  175   30     
+   43  176   26   56  177  107  178   41   43  179  109  180  116  181   43     
+  117  182  118  183                                                            
+  1.847033583457D-01 -3.719276202958D-07 -4.461673147532D-09 -8.427241381743D-09
+ -2.952632177562D-09 -1.230224173345D-09 -5.684978286767D-10 -1.382403178450D-09
+ -1.856794974832D-09  1.144783933290D-10  1.190860003543D-07 -4.043289140002D-08
+  6.134758538482D-08  2.882401728331D-09 -2.882401728331D-09  4.701102853922D-09
+  5.438916710635D-08  2.074214768257D-09  4.409820290234D-10  2.310863880436D-10
+  9.891607491932D-09  2.684350720208D-09  1.838141765470D-09 -2.566882438264D-09
+  9.518614355670D-09  1.651578667869D-09  1.400407236018D-10 -1.388193610099D-08
+  8.256918013496D-09  4.026496986174D-10 -9.548140743659D-11  1.319228178802D-09
+  9.872533764800D-10 -8.178430337704D-11  2.995364457734D-10  1.165688277582D-09
+  6.650224788487D-10 -4.160228413520D-11  5.159413302221D-10 -1.619011496642D-10
+  1.298098286898D-10 -9.236423317343D-11  1.182732136117D-10  4.400353753151D-10
+  2.727607746019D-10  1.082721999108D-09  1.434879053241D-09 -6.111602434929D-11
+  7.081639208067D-10 -3.788344091693D-11  7.499472911528D-10 -1.503780554317D-10
+ -1.992887573946D-10  3.841609782970D-09 -7.828529540224D-09  4.552122268525D-10
+ -2.273182572124D-09  8.045368924923D-10  2.793167046723D-09 -2.793167046724D-09
+  6.855383527411D-09 -9.555567765423D-09  4.847585525976D-10  2.335796050220D-09
+  7.201575068565D-10  1.991127877266D-09 -1.991127877266D-09  2.700184238015D-09
+  1.651123707030D-09 -1.651123707030D-09  8.779995658213D-10  7.625016818901D-10
+  1.273878662141D-09  3.064293184879D-09  1.230224173345D-09  1.678753515422D-09
+  1.856794974828D-09  5.684978286771D-10  6.199014965641D-10  2.448465652502D-52
+ -1.103713326844D-07  1.040881988802D-12 -6.134758538482D-08 -5.438916710635D-08
+ -1.459271034585D-08 -2.782378689063D-09 -9.569233592455D-10 -4.522492485678D-09
+ -9.518614355670D-09 -2.970806846671D-09 -1.400407236018D-10 -8.256918013496D-09
+ -1.057115582334D-09 -9.054690731029D-10 -2.579341616382D-10 -1.003787127918D-09
+ -5.726582456752D-10 -1.298098286898D-10 -1.182732136117D-10 -3.789193509658D-10
+ -2.348773336850D-10 -9.323439436764D-10 -1.235590295847D-09 -8.045368924923D-10
+ -7.201575068565D-10 -4.250627856579D-16  1.847055555443D-01  2.206024722187D-13
+  1.904376186660D-08 -3.706348378336D-08 -1.904376186660D-08  3.861889986008D-09
+ -3.861889986002D-09 -3.861889986015D-09  2.928647459573D-08 -2.928647459573D-08
+  5.757801375901D-09 -5.757801375901D-09  1.069963117214D-09 -1.069963117214D-09
+  7.679089398996D-10 -7.679089398996D-10  3.003240578905D-10 -3.003240578905D-10
+  4.122148195741D-10 -4.122148195741D-10  4.365364829098D-10 -4.365364829098D-10
+ -3.513984349104D-09  3.513984349104D-09  3.746925132324D-09 -3.746925132324D-09
+  2.504967329464D-09  2.713294194836D-09 -2.713294194836D-09 -2.504967329464D-09
+  1.203714182606D-51  3.706348378336D-08 -7.008254286648D-14 -1.500950157540D-13
+ -2.500000000000D-06  1.847229489334D-01  1.625711012677D-10  3.706348378340D-09
+ -3.706348378335D-09 -1.625711012698D-10 -1.625711012677D-10 -2.000000000000D-05
+  1.847029460547D-01  9.902723341668D-10 -9.902723341667D-10  1.847029450890D-01
+  2.457629270846D-11 -2.457629270846D-11  1.847029460141D-01 -9.496895772062D-10
+  9.496895772072D-10  1.847029527910D-01 -4.020236988304D-09 -3.706348378335D-09
+  7.726585366653D-09  1.847029529962D-01 -6.798659578255D-09 -1.133109929709D-09
+  7.931769507959D-09  1.847029530529D-01 -1.982942376991D-09 -6.005482627459D-09
+  7.988425004450D-09  1.847029570932D-01 -1.246680818167D-09 -7.075755995003D-09
+ -3.706348378335D-09  1.202878519150D-08  1.847029556781D-01 -1.246680818167D-09
+ -6.064933710003D-10 -3.706348378335D-09 -5.054111425002D-09  1.061363399250D-08
+  1.847029723998D-01 -1.139575996950D-14  1.139576217480D-14 -2.733538205877D-08
+ -1.139576217480D-14  2.733538205877D-08  1.847030326876D-01 -3.617187029084D-14
+ -3.617175913233D-14  7.234362556953D-14 -3.617181471159D-14 -3.617181278477D-14
+ -8.762304482526D-08  8.762304482526D-08 -3.617181254052D-14  1.847029472803D-01
+ -2.215887192612D-09  2.215887192612D-09  1.847029666287D-01 -1.819480113001D-08
+  2.156420874667D-08 -3.369407616668D-09  1.847029922362D-01 -3.706348378335D-08
+  4.717170663335D-08 -1.010822285000D-08  1.847030259302D-01 -8.086578280003D-08
+  8.086578280003D-08  1.847029956056D-01 -5.054111425002D-08  5.054111425002D-08
+  1.847029703350D-01 -2.527055712501D-08  2.527055712501D-08 -3.125510468576D-08
+  1.847029763195D-01 -3.125510469012D-08 -4.383761260308D-17  0.0               
+  3.125510464629D-08  0.0                 4.382661005511D-17  0.0               
+  1.847030008084D-01  0.0                -2.259574994278D-17 -5.574398606689D-08
+  5.574398604462D-08  2.246113765381D-17  0.0                 0.0               
+  0.0                 1.847030124526D-01  0.0                 0.0               
+ -6.738815233337D-08  6.738815233413D-08  0.0                 0.0               
+  0.0                 0.0                 1.847029956056D-01  0.0               
+  0.0                -5.054111425002D-08  5.054111424976D-08  0.0               
+  0.0                 1.847029956056D-01  0.0                 0.0               
+ -5.054111425002D-08  5.054111425034D-08  0.0                 0.0               
+  0.0                 0.0                 1.847029501186D-01  0.0               
+  0.0                -5.054111425056D-09  5.054111424340D-09  0.0               
+  1.847029467491D-01  0.0                -1.684703808334D-09  1.684703808322D-09
+  0.0                 1.847029565204D-01  0.0                 0.0               
+ -1.145598589667D-08  1.145598589640D-08  1.847029642701D-01  0.0               
+  0.0                -1.920562341501D-08  1.920562341711D-08  1.847029642701D-01
+  0.0                 0.0                 0.0                -1.920562341501D-08
+  1.920562341525D-08  0.0                 1.847029450644D-01  0.0               
+  0.0                 0.0                 0.0                -3.706348346422D-09
+  1.847029487708D-01 -3.706348346422D-09  3.706348346422D-09 -1.111904513493D-08
+  1.847029561835D-01 -1.111904513493D-08  1.111904513493D-08  1.847030710273D-01
+ -1.259628398745D-07  1.259628398745D-07  1.847031578433D-01 -2.127788399299D-07
+  2.127788399299D-07  1.847032483111D-01 -3.032466855001D-07  3.032466855001D-07
+  1.847030479367D-01 -1.028722755757D-07  1.028722755758D-07  1.847031472617D-01
+ -2.021972313040D-07  2.021972313040D-07  1.847030531121D-01 -1.080476738911D-07
+  1.080476738911D-07  1.847029753940D-01 -3.032958469560D-08  3.032958469560D-08
+  1.847031167522D-01 -1.716877491549D-07  1.716877491550D-07  1.847029888667D-01
+  4.380229901688D-08 -4.380229901668D-08  2.162322755874D-02 -2.159089062210D-02
+  7.403155341658D-07  1.269397070520D-06 -1.375006599097D-06 -6.346985352602D-07
+  2.063755196007D-01 -6.349214311879D-07 -1.375004465968D-06  1.715103318883D-53
+  2.226157903684D-10  0.0                -3.233695633350D-05 -1.500000000000D-05
+ -6.346987395270D-07  1.136828992780D+01 -1.025418486412D+01  1.456594534583D-11
+  1.266709834095D+01 -1.114105063695D+00 -9.632867826155D-08  3.987593050105D-08
+ -3.987593050105D-08  4.632458716482D-51 -1.136828975598D+01  0.0               
+ -2.223809030011D-08  1.847029673025D-01  2.223809027155D-08  0.0               
+  1.847579453340D-01 -3.000000000000D-05  2.695526101250D-10 -2.695526093335D-10
+ -2.500000000000D-05 -6.072063216193D-02 -6.072063216165D-02  2.454235772261D-01
+ -2.651534895039D-09  0.0                 1.847329477160D-01 -3.000000000000D-05
+  2.651534895039D-09  2.244826079078D-17  1.847029450831D-01  1.867160023467D-11
+ -1.867160023409D-11  2.806985167356D+00 -2.806985167362D+00  5.553294944544D-03
+ -2.025786930574D-08 -2.025780774980D-08  2.418462261829D-08  2.997241497978D+00
+ -2.420314707957D-08  8.077212345811D-10  5.438916911567D-10  1.615750248838D-10
+  6.465663647432D-11  1.863605937612D-11  3.690836612132D-10  2.369817612475D-10
+  6.858762712566D-11 -1.863570149278D-11  7.676301581984D-10  1.903564507687D-10
+  1.129363521820D-11  6.658804341147D-10  5.726902954421D-11  4.922613821110D-11
+  7.302162281710D-11  2.080107466611D-11  8.095061777596D-11  4.618207195721D-11
+  1.046853516843D-11  9.538217415503D-12  3.055804827568D-11  1.894169175196D-11
+  7.518905381967D-11  9.964438584132D-11  2.642467459327D-11  2.798361444007D-11
+ -5.553294889907D-03 -2.812538488194D+00 -5.438910648609D-10 -1.176812053461D-09
+ -1.879989837104D-10 -6.465663647432D-11 -3.055693883732D-10 -7.676454577113D-10
+ -2.395814258589D-10 -1.129363521820D-11 -6.658806130563D-10 -8.525210715926D-11
+ -7.302108599209D-11 -2.080161149113D-11 -8.095034936346D-11 -4.618269825307D-11
+ -1.046853516843D-11 -9.538217415503D-12 -3.055751145067D-11 -1.894204963531D-11
+ -7.518842752382D-11 -9.964474372466D-11  1.403492583625D+00 -1.403492583686D+00
+  1.588195528744D+00 -1.403492583680D+00  1.089185606479D+00  1.273888551548D+00
+ -1.089185606482D+00 -1.089185606482D+00  1.847029450644D-01  1.847029450644D-01
+  1.847029450644D-01  1.847029450644D-01  4.350827009395D-01 -4.350827009433D-01
+  7.668448156647D-10  6.197856467720D-01 -7.668448156647D-10 -4.350827017076D-01
+  3.649080717567D+00 -2.124220868494D+00  7.975186647603D-10  5.358643512506D+00
+ -1.524859849077D+00 -7.975186075522D-10 -3.649080718365D+00 -2.849177309245D-04
+ -2.849177309245D-04  1.849928627954D-01 -5.000000000000D-06  5.192922559506D-01
+ -5.192922559754D-01  7.668446736793D-10  7.039952017928D-01 -7.668448157585D-10
+ -5.192922567283D-01  5.192922559568D-01 -5.192922559568D-01  7.668444858664D-10
+  7.039952017928D-01 -7.668448457748D-10 -5.192922567284D-01  4.350827008612D-01
+ -4.350827008612D-01 -4.350827017073D-01  7.668467484525D-10  6.197856467720D-01
+ -4.350827017076D-01 -7.668449040245D-10  9.403400310568D-01 -5.155576445380D-01
+  7.668448049200D-10 -9.403400318322D-01  1.549825363425D+00 -4.247823865286D-01
+ -7.668448167006D-10 -2.849177309250D-04 -2.849177309245D-04  1.849928627954D-01
+ -5.000000000000D-06  5.192922559592D-01 -5.192922559592D-01  7.668449471519D-10
+  7.039952017928D-01 -7.668448155349D-10 -5.192922567284D-01  9.403400310659D-01
+ -5.155576445636D-01  7.668452184158D-10 -9.403400318323D-01  1.549825363425D+00
+ -4.247823865286D-01 -7.668448258865D-10 -2.849177309199D-04 -2.849177309245D-04
+  1.849928627954D-01 -5.000000000000D-06  0.0                 1.847029450644D-01
+  4.350827009381D-01 -4.350827009381D-01  7.668448205427D-10  6.197856467720D-01
+ -7.668448149473D-10 -4.350827017076D-01 -4.472000000002D+03  2.236184702945D+03
+  4.350827009255D-01 -4.350827009448D-01  7.668446561058D-10  6.197856468258D-01
+ -7.668448218254D-10 -4.350827017613D-01  4.350827007568D-01 -4.350827007568D-01
+  7.668427698781D-10  6.197856467720D-01 -7.668446900881D-10 -4.350827017076D-01
+  0.0                 0.0                 1.847029450644D-01  4.350827009364D-01
+ -4.350827009364D-01  7.668448049201D-10  6.197856467720D-01 -7.668448177886D-10
+ -4.350827017076D-01  4.743804932312D-01 -4.350827009500D-01  7.668441251095D-10
+  6.590834391150D-01 -3.929779234304D-02 -7.668448253707D-10 -4.350827017076D-01
+ -2.999999999975D-05  1.847329450644D-01  9.403400309955D-01 -5.155576444381D-01
+  7.668444001463D-10 -9.403400318322D-01  1.549825363425D+00 -4.247823865285D-01
+ -7.668447696707D-10 -2.849177309241D-04 -2.849177309245D-04  1.849928627954D-01
+ -5.000000000000D-06  4.743804932838D-01 -4.350827009530D-01  7.668440849248D-10
+  6.590834391152D-01 -3.929779234303D-02 -7.668448602203D-10 -4.350827017077D-01
+ -2.999999999999D-05  1.847329450644D-01  5.052573299108D-01 -4.350827009926D-01
+  7.668427470318D-10  6.899602759560D-01 -7.017462918400D-02 -7.668448254578D-10
+ -4.350827017076D-01  5.052573301008D-01 -4.350827009046D-01  7.668446147586D-10
+  6.899602759560D-01 -7.017462918399D-02 -7.668447743280D-10 -4.350827017076D-01
+  5.052573300679D-01 -4.350827009326D-01  7.668438364657D-10  6.899602759560D-01
+ -7.017462918399D-02 -7.668448631294D-10 -4.350827017076D-01 -3.000000000044D-05
+  1.847329450644D-01  9.403400308871D-01 -5.155576445108D-01 -9.403400310654D-01
+  1.549825362658D+00 -4.247823865286D-01 -2.849177309421D-04 -2.849177309245D-04
+  1.849928627954D-01 -5.000000000000D-06 -2.999999999987D-05  1.847329450644D-01
+  4.350827006437D-01 -4.350827010779D-01  7.668440769557D-10  6.197856467720D-01
+ -7.668449051812D-10 -4.350827017076D-01  0.0                 0.0               
+  1.847029450644D-01 -2.999999999970D-05  1.847329450644D-01  4.350827005205D-01
+ -4.350827005205D-01  7.668488614599D-10  6.197856467720D-01 -7.668447518146D-10
+ -4.350827017076D-01  5.052573300039D-01 -4.350827010178D-01  7.668460149417D-10
+  6.899602759560D-01 -7.017462918399D-02 -7.668448844073D-10 -4.350827017075D-01
+  5.052573301274D-01 -4.350827008233D-01  7.668442740500D-10  6.899602759559D-01
+ -7.017462918395D-02 -7.668449594799D-10 -4.350827017075D-01  5.052573300968D-01
+ -4.350827009617D-01  7.668445556523D-10  6.899602759560D-01 -7.017462918398D-02
+ -7.668447849049D-10 -4.350827017076D-01  5.052573300844D-01 -4.350827009337D-01
+  7.668448795622D-10  6.899602759560D-01 -7.017462918399D-02 -7.668448363304D-10
+ -4.350827017076D-01 -2.999999999962D-05  1.847329450644D-01  9.403400309788D-01
+ -5.155576446611D-01  7.668446717407D-10 -9.403400318323D-01  1.549825363425D+00
+ -4.247823865285D-01 -7.668448516647D-10 -2.849177308965D-04 -2.849177309245D-04
+  1.849928627954D-01 -5.000000000000D-06 -3.000000000037D-05  1.847329450644D-01
+  9.403400310374D-01 -5.155576445930D-01  7.668453760661D-10 -9.403400318323D-01
+  1.549825363425D+00 -4.247823865285D-01 -7.668448690614D-10 -2.849177309083D-04
+ -2.849177309245D-04  1.849928627954D-01 -5.000000000000D-06 -2.999999999990D-05
+  1.847329450644D-01 -3.000000000006D-05  1.847329450644D-01  4.350827009285D-01
+ -4.350827009431D-01 -4.350827009407D-01 -4.350827009407D-01  6.197856460051D-01
+ -4.350827009413D-01  1.847030124526D-01 -6.738815233336D-08  6.738815233336D-08
+  4.350827008982D-01 -4.350827008982D-01 -4.350827009408D-01  6.197856460051D-01
+ -8.701654018812D-01  0.0                 0.0                 1.847029450644D-01
+  4.350827009215D-01 -4.350827009215D-01  6.197856460051D-01 -4.350827009407D-01
+ -2.849177309244D-04  1.849928627954D-01 -2.849177309245D-04 -5.000000000000D-06
+  4.350827009261D-01 -1.030031442269D-02 -4.247823865285D-01  1.044568032534D+00
+ -4.350827009407D-01  4.247823865384D-01  6.094853315930D-01 -4.247823865286D-01
+ -2.999999999995D-05  1.847329450644D-01  4.350827009375D-01 -4.350827009458D-01
+ -4.350827009408D-01 -4.350827009408D-01  6.197856460052D-01 -4.350827009406D-01
+  1.847030124526D-01 -6.738815233337D-08  6.738815233335D-08  4.350827008530D-01
+ -4.350827009655D-01 -4.350827009404D-01 -4.350827009409D-01 -4.350827009404D-01
+  6.197856460052D-01  4.350827009246D-01 -4.350827009487D-01 -4.350827009408D-01
+ -4.350827009407D-01 -4.350827009411D-01  6.197856460052D-01  4.350827009394D-01
+ -4.350827009394D-01  6.197856460051D-01 -4.350827009407D-01  1.847030124526D-01
+  6.738815233404D-08 -6.738815233336D-08  4.350827009232D-01 -1.030031443112D-02
+  1.044568032534D+00 -4.350827009407D-01 -4.247823865285D-01  4.247823865426D-01
+  6.094853315930D-01 -4.247823865285D-01 -2.999999999994D-05  1.847329450644D-01
+ -2.852765693834D-04 -2.852765693766D-04  1.849932216338D-01 -5.000000000000D-06
+  4.350827009321D-01 -4.350827009321D-01 -4.350827009407D-01 -4.350827009406D-01
+ -4.350827009399D-01  6.197856460052D-01  4.350827009333D-01 -4.350827009672D-01
+ -4.350827009407D-01 -4.350827009418D-01  6.197856460052D-01 -4.350827009407D-01
+  0.0                 0.0                 1.847029450644D-01  4.350827009443D-01
+ -4.350827009443D-01 -4.350827009405D-01 -4.350827009405D-01  6.197856460052D-01
+  4.350827009142D-01 -4.350827009867D-01 -4.350827009414D-01 -4.350827009414D-01
+ -4.350827009405D-01  6.197856460052D-01  4.350827009181D-01 -4.350827009613D-01
+ -4.350827009424D-01 -4.350827009397D-01 -4.350827009407D-01  6.197856460052D-01
+  4.350827009249D-01 -4.350827009249D-01 -8.701654018813D-01 -4.350827009407D-01
+  6.197856460052D-01  4.350827009103D+00 -4.350827009103D+00 -4.350827009408D+00
+ -8.701654018815D+00  4.535529954472D+00  4.350827009378D-01 -4.350827009378D-01
+ -4.350827009399D-01 -4.350827009399D-01 -4.350827009408D-01  6.197856460052D-01
+  4.350827009142D-01 -4.350827009142D-01 -4.350827009402D-01 -4.350827009421D-01
+ -4.350827009407D-01  6.197856460052D-01  4.350827009067D-01 -4.350827009067D-01
+ -4.350827009371D-01 -4.350827009405D-01 -4.350827009407D-01  6.197856460051D-01
+  4.350827008840D-01 -4.350827009730D-01 -4.350827009396D-01 -4.350827009396D-01
+ -4.350827009407D-01  6.197856460052D-01  0.0                 0.0               
+  0.0                 0.0                 0.0                 0.0               
+ -5.054111424998D-08  1.847029956056D-01  5.054111424909D-08  0.0               
+  0.0                 0.0                 0.0                 0.0               
+  0.0                -1.617315655999D-07  1.847031067960D-01  1.617315655999D-07
+ -7.321241211920D+00  7.305730107658D+00 -8.216644762503D+04  0.0               
+  8.217914180010D+04  0.0                 0.0                 1.684191100414D+01
+  1.194789706065D+01  1.152570637560D+00  3.203752497504D+00  5.801590314942D-01
+  7.877230884797D-01  1.334284295919D+00  9.522628221382D-01  4.836031467433D-01
+  7.443160981249D-01  1.154866622749D+00  3.916088093325D+00  3.390590023192D+00
+  3.180521162968D-01  1.839620866156D+00  1.177388037480D+00  2.807229515941D+00
+  1.076822896977D+00  6.399743827870D-01  1.221654249014D+00  4.544019124820D-01
+  1.612808099323D-01  3.488652332781D-02  1.823010530775D-02  5.786837962657D-04
+  1.072060324264D-02  4.862946661956D-02  1.657310781745D-03  6.460785183840D-03
+  9.641696141492D-05  2.800172909824D-01  4.827856220525D-01  1.228202872892D+00
+  6.513945810814D-01  4.647322366774D-01  7.254763669924D-01  1.891034737044D-01
+  2.105061559182D-01  2.698759421753D-01  4.190646638201D-02  5.718157988633D-10
+ -1.501867945347D+00 -1.680876639348D+01 -1.198067969175D+01  4.520363481073D-06
+  7.772471985027D-02 -7.877230884717D-01 -7.344192034644D-01 -8.162252761229D-01
+ -1.360375460205D-01 -4.862946662078D-02 -1.612808099323D-01 -6.942444591950D-01
+ -3.488652332776D-02 -3.916088093312D+00 -6.400398367040D-01 -1.072060324096D-02
+ -3.390590023191D+00 -1.200433342982D-01 -1.823010530772D-02 -3.635598124461D-01
+ -7.714200456749D-02 -4.378329988966D-01 -2.293410946601D-01 -5.786837962657D-04
+ -6.460785183864D-03 -1.657310781756D-03 -1.356510001334D-01 -6.599237844325D-02
+ -4.032867571532D-01 -5.499364870271D-01 -3.692655530801D-03 -4.959949739895D-03
+ -1.552180105819D+00  1.419500447260D-01 -1.419500447255D-01 -2.807229515941D+00
+  1.542530815584D-01 -1.542530815580D-01 -9.250906008783D-01  1.146811089419D-02
+ -1.076822896977D+00 -6.399743827853D-01 -3.180521162486D-01 -2.698759421752D-01
+ -4.827856220511D-01 -1.228202872895D+00 -4.647322366781D-01 -6.513945810810D-01
+ -7.254763669918D-01 -1.891034737043D-01 -2.105061559178D-01  3.692655530801D-03
+  4.959949739895D-03  5.544942290657D-51  6.299896663454D+01 -4.503227883208D+00
+ -3.619795712679D-04 -1.152570637528D+00 -5.801590381620D-01 -2.874407603369D-01
+ -4.190646638189D-02 -2.522974366032D-01 -1.146811089416D-02 -7.441570462111D+06
+  7.441570646800D+06 -7.650000000000D+08 -2.162948497570D+08  8.731391781590D+08
+  2.665790957288D+01 -5.034857288321D+01 -9.125978334718D-05  1.053408827308D-04
+  1.818065996370D-05 -1.053408827308D-04 -1.236997844589D-04  2.349867010473D-09
+ -1.818065996370D-05  0.0                 2.984376498507D+01 -2.984147403773D+00
+ -8.054210242782D-02 -6.000094255021D-05 -8.054208350577D-02  2.652589908414D-01
+ -5.200000000000D+03  5.200184686907D+03 -4.278550085040D+05  4.278551931939D+05
+ -9.360000000000D+03 -9.360000000000D+03  9.360184686907D+03  1.846869073356D-01
+  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01
+  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01
+  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01  1.846869073356D-01
+ -2.652000000000D+06  2.652000184687D+06 -3.300000000007D+01 -1.924000000000D+02
+ -1.924000000000D+02 -3.299999999994D+01  2.255846869073D+02 -1.200000000002D+03
+ -1.091999999999D+03 -1.092000000006D+03 -1.200000000000D+03  2.292184686907D+03
+ -3.200000000005D+03 -1.923999999994D+02 -1.923999999821D+02 -3.200000000001D+03
+  3.392584686907D+03 -1.924000000000D+02 -1.924000000000D+02  1.925846869073D+02
+ -4.472000000000D+03 -2.236000000000D+03  2.236184686907D+03 -1.099999999998D+03
+ -1.924000000000D+02 -1.924000000000D+02 -1.100000000000D+03  1.292584686907D+03
+ -1.923999999998D+02 -1.924000000005D+02  1.925846869073D+02 -2.236000000000D+03
+ -2.236000000000D+03 -2.236000000000D+03  2.236184686907D+03 -1.923999999999D+02
+ -1.923999999999D+02  1.925846869073D+02 -3.329999999981D+01 -3.330000000000D+01
+  3.348468690734D+01 -1.924000000000D+02 -1.924000000002D+02  1.925846869073D+02
+ -1.924000000000D+02 -1.924000000000D+02  1.925846869073D+02 -1.924000000000D+02
+ -1.923999999999D+02  1.925846869073D+02 -1.923999999995D+02 -1.924000000000D+02
+  1.925846869073D+02 -1.924000000006D+02 -1.924000000000D+02  1.925846869073D+02
+ -1.924000000001D+02 -1.924000000000D+02  1.925846869073D+02 -1.924000000000D+02
+  1.925846869073D+02 -1.924000000000D+02 -1.924000000000D+02  1.925846869073D+02
+ -3.200000000000D+03 -3.200000000000D+03  3.200184686907D+03 -2.236000000000D+03
+  2.236184686907D+03 -2.235999999999D+03 -2.236000000000D+03  2.236184686907D+03
+ -2.235999999997D+03  2.236184686907D+03 -2.236000000000D+03  2.236184686907D+03
+ -2.236000000000D+03 -2.236000000000D+03  2.236184686907D+03 -2.235999999997D+03
+  2.236184686907D+03                                                            
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/qc324.cua	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,19516 @@
+MODEL H2+ IN AN ELECTROMAGNETIC FIELD, S.I. CHU                         QC324   
+         19512            21          1671         17820             0
+CUA                      324           324         26730             0
+(16I5)          (16I5)          (3D22.16)           (3D22.16)           
+    1   83  165  247  329  411  493  575  657  739  821  903  985 1067 1149 1231
+ 1313 1395 1477 1559 1641 1723 1805 1887 1969 2051 2133 2215 2297 2379 2461 2543
+ 2625 2707 2789 2871 2953 3035 3117 3199 3281 3363 3445 3527 3609 3691 3773 3855
+ 3937 4019 4101 4183 4265 4347 4429 4511 4593 4675 4757 4839 4921 5003 5085 5167
+ 5249 5331 5413 5495 5577 5659 5741 5823 5905 5987 6069 6151 6233 6315 6397 6479
+ 6561 6643 6726 6809 6892 6975 7058 7141 7224 7307 7390 7473 7556 7639 7722 7805
+ 7888 7971 8054 8137 8220 8303 8386 8469 8552 8635 8718 8801 8884 8967 9050 9133
+ 9216 9299 9382 9465 9548 9631 9714 9797 9880 9963100461012910212102951037810461
+10544106271071010793108761095911042111251120811291113741145711540116231170611789
+11872119551203812121122041228712370124531253612619127021278512868129511303413117
+13200132831336613449135321361513698137811386413947140301411314196142791436214445
+14528146111469414777148601494315026151091519215275153581544115524156071569015773
+15856159391602216105161881627116354164371652016603166861676916852169351701817101
+17184172671735017433175161759917682177651784817931180141809718180182631834618429
+18512185951867818761188441892719010190931917619259193421942519508195911967419757
+19840199232000620089201712025320335204172049920581206632074520827209092099121073
+21155212372131921401214832156521647217292181121893219752205722139222212230322385
+22467225492263122713227952287722959230412312323205232872336923451235332361523697
+23779238612394324025241072418924271243532443524517245992468124763248452492725009
+25091251732525525337254192550125583256652574725829259112599326075261572623926321
+2640326485265672664926731
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81   82    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81   83    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81   84    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81   85    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81   86    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81   87    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81   88    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   89
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81   90    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81   91    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81   92    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81   93    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81   94    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81   95    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81   96    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   97
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81   98    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81   99    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  100    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  101    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  102    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  103    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  104    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  105
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  106    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  107    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  108    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  109    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  110    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  111    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  112    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  113
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  114    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  115    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  116    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  117    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  118    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  119    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  120    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  121
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  122    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  123    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  124    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  125    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  126    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  127    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  128    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  129
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  130    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  131    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  132    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  133    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  134    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  135    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  136    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  137
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  138    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  139    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  140    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  141    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  142    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  143    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  144    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  145
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  146    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  147    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  148    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  149    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  150    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  151    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  152    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  153
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  154    1    2    3    4    5    6    7    8    9   10   11   12   13   14
+   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46
+   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62
+   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
+   79   80   81  155    1    2    3    4    5    6    7    8    9   10   11   12
+   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28
+   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44
+   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
+   77   78   79   80   81  156    1    2    3    4    5    6    7    8    9   10
+   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
+   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
+   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58
+   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74
+   75   76   77   78   79   80   81  157    1    2    3    4    5    6    7    8
+    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24
+   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40
+   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56
+   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72
+   73   74   75   76   77   78   79   80   81  158    1    2    3    4    5    6
+    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22
+   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
+   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54
+   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70
+   71   72   73   74   75   76   77   78   79   80   81  159    1    2    3    4
+    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20
+   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36
+   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
+   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
+   69   70   71   72   73   74   75   76   77   78   79   80   81  160    1    2
+    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
+   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
+   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50
+   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66
+   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81  161
+    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
+   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32
+   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48
+   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64
+   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80
+   81  162    1   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  163    2   82   83   84   85   86   87   88   89   90   91
+   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107
+  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123
+  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139
+  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155
+  156  157  158  159  160  161  162  164    3   82   83   84   85   86   87   88
+   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
+  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
+  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
+  153  154  155  156  157  158  159  160  161  162  165    4   82   83   84   85
+   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101
+  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117
+  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
+  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149
+  150  151  152  153  154  155  156  157  158  159  160  161  162  166    5   82
+   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98
+   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
+  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
+  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146
+  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162
+  167    6   82   83   84   85   86   87   88   89   90   91   92   93   94   95
+   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
+  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
+  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
+  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
+  160  161  162  168    7   82   83   84   85   86   87   88   89   90   91   92
+   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108
+  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124
+  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140
+  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
+  157  158  159  160  161  162  169    8   82   83   84   85   86   87   88   89
+   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121
+  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137
+  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
+  154  155  156  157  158  159  160  161  162  170    9   82   83   84   85   86
+   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
+  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118
+  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134
+  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+  151  152  153  154  155  156  157  158  159  160  161  162  171   10   82   83
+   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99
+  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115
+  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131
+  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
+  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  172
+   11   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96
+   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112
+  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128
+  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144
+  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160
+  161  162  173   12   82   83   84   85   86   87   88   89   90   91   92   93
+   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109
+  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125
+  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141
+  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157
+  158  159  160  161  162  174   13   82   83   84   85   86   87   88   89   90
+   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106
+  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122
+  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138
+  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154
+  155  156  157  158  159  160  161  162  175   14   82   83   84   85   86   87
+   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103
+  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
+  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151
+  152  153  154  155  156  157  158  159  160  161  162  176   15   82   83   84
+   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100
+  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116
+  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132
+  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148
+  149  150  151  152  153  154  155  156  157  158  159  160  161  162  177   16
+   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97
+   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113
+  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129
+  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145
+  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161
+  162  178   17   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  179   18   82   83   84   85   86   87   88   89   90   91
+   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107
+  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123
+  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139
+  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155
+  156  157  158  159  160  161  162  180   19   82   83   84   85   86   87   88
+   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
+  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
+  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
+  153  154  155  156  157  158  159  160  161  162  181   20   82   83   84   85
+   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101
+  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117
+  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
+  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149
+  150  151  152  153  154  155  156  157  158  159  160  161  162  182   21   82
+   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98
+   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
+  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
+  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146
+  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162
+  183   22   82   83   84   85   86   87   88   89   90   91   92   93   94   95
+   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
+  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
+  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
+  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
+  160  161  162  184   23   82   83   84   85   86   87   88   89   90   91   92
+   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108
+  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124
+  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140
+  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
+  157  158  159  160  161  162  185   24   82   83   84   85   86   87   88   89
+   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121
+  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137
+  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
+  154  155  156  157  158  159  160  161  162  186   25   82   83   84   85   86
+   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
+  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118
+  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134
+  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+  151  152  153  154  155  156  157  158  159  160  161  162  187   26   82   83
+   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99
+  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115
+  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131
+  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
+  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  188
+   27   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96
+   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112
+  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128
+  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144
+  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160
+  161  162  189   28   82   83   84   85   86   87   88   89   90   91   92   93
+   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109
+  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125
+  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141
+  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157
+  158  159  160  161  162  190   29   82   83   84   85   86   87   88   89   90
+   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106
+  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122
+  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138
+  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154
+  155  156  157  158  159  160  161  162  191   30   82   83   84   85   86   87
+   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103
+  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
+  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151
+  152  153  154  155  156  157  158  159  160  161  162  192   31   82   83   84
+   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100
+  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116
+  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132
+  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148
+  149  150  151  152  153  154  155  156  157  158  159  160  161  162  193   32
+   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97
+   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113
+  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129
+  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145
+  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161
+  162  194   33   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  195   34   82   83   84   85   86   87   88   89   90   91
+   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107
+  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123
+  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139
+  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155
+  156  157  158  159  160  161  162  196   35   82   83   84   85   86   87   88
+   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
+  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
+  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
+  153  154  155  156  157  158  159  160  161  162  197   36   82   83   84   85
+   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101
+  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117
+  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
+  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149
+  150  151  152  153  154  155  156  157  158  159  160  161  162  198   37   82
+   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98
+   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
+  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
+  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146
+  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162
+  199   38   82   83   84   85   86   87   88   89   90   91   92   93   94   95
+   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
+  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
+  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
+  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
+  160  161  162  200   39   82   83   84   85   86   87   88   89   90   91   92
+   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108
+  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124
+  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140
+  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
+  157  158  159  160  161  162  201   40   82   83   84   85   86   87   88   89
+   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121
+  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137
+  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
+  154  155  156  157  158  159  160  161  162  202   41   82   83   84   85   86
+   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
+  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118
+  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134
+  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+  151  152  153  154  155  156  157  158  159  160  161  162  203   42   82   83
+   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99
+  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115
+  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131
+  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
+  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  204
+   43   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96
+   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112
+  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128
+  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144
+  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160
+  161  162  205   44   82   83   84   85   86   87   88   89   90   91   92   93
+   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109
+  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125
+  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141
+  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157
+  158  159  160  161  162  206   45   82   83   84   85   86   87   88   89   90
+   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106
+  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122
+  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138
+  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154
+  155  156  157  158  159  160  161  162  207   46   82   83   84   85   86   87
+   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103
+  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
+  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151
+  152  153  154  155  156  157  158  159  160  161  162  208   47   82   83   84
+   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100
+  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116
+  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132
+  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148
+  149  150  151  152  153  154  155  156  157  158  159  160  161  162  209   48
+   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97
+   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113
+  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129
+  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145
+  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161
+  162  210   49   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  211   50   82   83   84   85   86   87   88   89   90   91
+   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107
+  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123
+  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139
+  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155
+  156  157  158  159  160  161  162  212   51   82   83   84   85   86   87   88
+   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
+  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
+  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
+  153  154  155  156  157  158  159  160  161  162  213   52   82   83   84   85
+   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101
+  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117
+  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
+  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149
+  150  151  152  153  154  155  156  157  158  159  160  161  162  214   53   82
+   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98
+   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
+  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
+  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146
+  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162
+  215   54   82   83   84   85   86   87   88   89   90   91   92   93   94   95
+   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
+  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
+  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
+  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
+  160  161  162  216   55   82   83   84   85   86   87   88   89   90   91   92
+   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108
+  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124
+  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140
+  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
+  157  158  159  160  161  162  217   56   82   83   84   85   86   87   88   89
+   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121
+  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137
+  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
+  154  155  156  157  158  159  160  161  162  218   57   82   83   84   85   86
+   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
+  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118
+  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134
+  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+  151  152  153  154  155  156  157  158  159  160  161  162  219   58   82   83
+   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99
+  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115
+  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131
+  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
+  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  220
+   59   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96
+   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112
+  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128
+  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144
+  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160
+  161  162  221   60   82   83   84   85   86   87   88   89   90   91   92   93
+   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109
+  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125
+  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141
+  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157
+  158  159  160  161  162  222   61   82   83   84   85   86   87   88   89   90
+   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106
+  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122
+  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138
+  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154
+  155  156  157  158  159  160  161  162  223   62   82   83   84   85   86   87
+   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103
+  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
+  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151
+  152  153  154  155  156  157  158  159  160  161  162  224   63   82   83   84
+   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100
+  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116
+  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132
+  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148
+  149  150  151  152  153  154  155  156  157  158  159  160  161  162  225   64
+   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97
+   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113
+  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129
+  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145
+  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161
+  162  226   65   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  227   66   82   83   84   85   86   87   88   89   90   91
+   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107
+  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123
+  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139
+  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155
+  156  157  158  159  160  161  162  228   67   82   83   84   85   86   87   88
+   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
+  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136
+  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
+  153  154  155  156  157  158  159  160  161  162  229   68   82   83   84   85
+   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101
+  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117
+  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
+  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149
+  150  151  152  153  154  155  156  157  158  159  160  161  162  230   69   82
+   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98
+   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
+  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
+  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146
+  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162
+  231   70   82   83   84   85   86   87   88   89   90   91   92   93   94   95
+   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
+  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
+  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
+  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
+  160  161  162  232   71   82   83   84   85   86   87   88   89   90   91   92
+   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108
+  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124
+  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140
+  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
+  157  158  159  160  161  162  233   72   82   83   84   85   86   87   88   89
+   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121
+  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137
+  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153
+  154  155  156  157  158  159  160  161  162  234   73   82   83   84   85   86
+   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
+  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118
+  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134
+  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+  151  152  153  154  155  156  157  158  159  160  161  162  235   74   82   83
+   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99
+  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115
+  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131
+  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
+  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  236
+   75   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96
+   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112
+  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128
+  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144
+  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160
+  161  162  237   76   82   83   84   85   86   87   88   89   90   91   92   93
+   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109
+  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125
+  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141
+  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157
+  158  159  160  161  162  238   77   82   83   84   85   86   87   88   89   90
+   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106
+  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122
+  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138
+  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154
+  155  156  157  158  159  160  161  162  239   78   82   83   84   85   86   87
+   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103
+  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119
+  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151
+  152  153  154  155  156  157  158  159  160  161  162  240   79   82   83   84
+   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100
+  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116
+  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132
+  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148
+  149  150  151  152  153  154  155  156  157  158  159  160  161  162  241   80
+   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97
+   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113
+  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129
+  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145
+  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161
+  162  242   81   82   83   84   85   86   87   88   89   90   91   92   93   94
+   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110
+  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
+  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142
+  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158
+  159  160  161  162  243   82  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  244   83  163  164  165  166  167  168  169
+  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185
+  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201
+  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217
+  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233
+  234  235  236  237  238  239  240  241  242  243  245   84  163  164  165  166
+  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
+  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198
+  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214
+  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230
+  231  232  233  234  235  236  237  238  239  240  241  242  243  246   85  163
+  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179
+  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211
+  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227
+  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243
+  247   86  163  164  165  166  167  168  169  170  171  172  173  174  175  176
+  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192
+  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
+  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224
+  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+  241  242  243  248   87  163  164  165  166  167  168  169  170  171  172  173
+  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
+  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205
+  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
+  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237
+  238  239  240  241  242  243  249   88  163  164  165  166  167  168  169  170
+  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186
+  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202
+  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218
+  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
+  235  236  237  238  239  240  241  242  243  250   89  163  164  165  166  167
+  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183
+  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199
+  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
+  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
+  232  233  234  235  236  237  238  239  240  241  242  243  251   90  163  164
+  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196
+  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212
+  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
+  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  252
+   91  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177
+  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193
+  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
+  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241
+  242  243  253   92  163  164  165  166  167  168  169  170  171  172  173  174
+  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
+  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206
+  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222
+  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
+  239  240  241  242  243  254   93  163  164  165  166  167  168  169  170  171
+  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
+  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203
+  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219
+  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235
+  236  237  238  239  240  241  242  243  255   94  163  164  165  166  167  168
+  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184
+  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216
+  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232
+  233  234  235  236  237  238  239  240  241  242  243  256   95  163  164  165
+  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181
+  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197
+  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213
+  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229
+  230  231  232  233  234  235  236  237  238  239  240  241  242  243  257   96
+  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178
+  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194
+  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226
+  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242
+  243  258   97  163  164  165  166  167  168  169  170  171  172  173  174  175
+  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
+  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
+  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
+  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
+  240  241  242  243  259   98  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  260   99  163  164  165  166  167  168  169
+  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185
+  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201
+  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217
+  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233
+  234  235  236  237  238  239  240  241  242  243  261  100  163  164  165  166
+  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
+  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198
+  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214
+  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230
+  231  232  233  234  235  236  237  238  239  240  241  242  243  262  101  163
+  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179
+  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211
+  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227
+  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243
+  263  102  163  164  165  166  167  168  169  170  171  172  173  174  175  176
+  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192
+  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
+  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224
+  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+  241  242  243  264  103  163  164  165  166  167  168  169  170  171  172  173
+  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
+  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205
+  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
+  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237
+  238  239  240  241  242  243  265  104  163  164  165  166  167  168  169  170
+  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186
+  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202
+  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218
+  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
+  235  236  237  238  239  240  241  242  243  266  105  163  164  165  166  167
+  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183
+  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199
+  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
+  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
+  232  233  234  235  236  237  238  239  240  241  242  243  267  106  163  164
+  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196
+  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212
+  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
+  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  268
+  107  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177
+  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193
+  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
+  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241
+  242  243  269  108  163  164  165  166  167  168  169  170  171  172  173  174
+  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
+  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206
+  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222
+  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
+  239  240  241  242  243  270  109  163  164  165  166  167  168  169  170  171
+  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
+  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203
+  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219
+  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235
+  236  237  238  239  240  241  242  243  271  110  163  164  165  166  167  168
+  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184
+  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216
+  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232
+  233  234  235  236  237  238  239  240  241  242  243  272  111  163  164  165
+  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181
+  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197
+  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213
+  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229
+  230  231  232  233  234  235  236  237  238  239  240  241  242  243  273  112
+  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178
+  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194
+  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226
+  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242
+  243  274  113  163  164  165  166  167  168  169  170  171  172  173  174  175
+  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
+  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
+  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
+  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
+  240  241  242  243  275  114  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  276  115  163  164  165  166  167  168  169
+  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185
+  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201
+  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217
+  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233
+  234  235  236  237  238  239  240  241  242  243  277  116  163  164  165  166
+  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
+  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198
+  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214
+  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230
+  231  232  233  234  235  236  237  238  239  240  241  242  243  278  117  163
+  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179
+  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211
+  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227
+  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243
+  279  118  163  164  165  166  167  168  169  170  171  172  173  174  175  176
+  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192
+  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
+  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224
+  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+  241  242  243  280  119  163  164  165  166  167  168  169  170  171  172  173
+  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
+  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205
+  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
+  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237
+  238  239  240  241  242  243  281  120  163  164  165  166  167  168  169  170
+  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186
+  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202
+  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218
+  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
+  235  236  237  238  239  240  241  242  243  282  121  163  164  165  166  167
+  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183
+  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199
+  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
+  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
+  232  233  234  235  236  237  238  239  240  241  242  243  283  122  163  164
+  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196
+  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212
+  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
+  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  284
+  123  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177
+  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193
+  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
+  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241
+  242  243  285  124  163  164  165  166  167  168  169  170  171  172  173  174
+  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
+  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206
+  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222
+  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
+  239  240  241  242  243  286  125  163  164  165  166  167  168  169  170  171
+  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
+  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203
+  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219
+  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235
+  236  237  238  239  240  241  242  243  287  126  163  164  165  166  167  168
+  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184
+  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216
+  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232
+  233  234  235  236  237  238  239  240  241  242  243  288  127  163  164  165
+  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181
+  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197
+  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213
+  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229
+  230  231  232  233  234  235  236  237  238  239  240  241  242  243  289  128
+  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178
+  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194
+  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226
+  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242
+  243  290  129  163  164  165  166  167  168  169  170  171  172  173  174  175
+  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
+  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
+  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
+  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
+  240  241  242  243  291  130  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  292  131  163  164  165  166  167  168  169
+  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185
+  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201
+  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217
+  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233
+  234  235  236  237  238  239  240  241  242  243  293  132  163  164  165  166
+  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
+  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198
+  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214
+  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230
+  231  232  233  234  235  236  237  238  239  240  241  242  243  294  133  163
+  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179
+  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211
+  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227
+  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243
+  295  134  163  164  165  166  167  168  169  170  171  172  173  174  175  176
+  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192
+  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
+  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224
+  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+  241  242  243  296  135  163  164  165  166  167  168  169  170  171  172  173
+  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
+  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205
+  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
+  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237
+  238  239  240  241  242  243  297  136  163  164  165  166  167  168  169  170
+  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186
+  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202
+  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218
+  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
+  235  236  237  238  239  240  241  242  243  298  137  163  164  165  166  167
+  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183
+  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199
+  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
+  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
+  232  233  234  235  236  237  238  239  240  241  242  243  299  138  163  164
+  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196
+  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212
+  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
+  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  300
+  139  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177
+  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193
+  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
+  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241
+  242  243  301  140  163  164  165  166  167  168  169  170  171  172  173  174
+  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
+  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206
+  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222
+  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
+  239  240  241  242  243  302  141  163  164  165  166  167  168  169  170  171
+  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
+  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203
+  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219
+  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235
+  236  237  238  239  240  241  242  243  303  142  163  164  165  166  167  168
+  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184
+  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216
+  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232
+  233  234  235  236  237  238  239  240  241  242  243  304  143  163  164  165
+  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181
+  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197
+  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213
+  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229
+  230  231  232  233  234  235  236  237  238  239  240  241  242  243  305  144
+  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178
+  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194
+  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226
+  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242
+  243  306  145  163  164  165  166  167  168  169  170  171  172  173  174  175
+  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
+  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
+  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
+  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
+  240  241  242  243  307  146  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  308  147  163  164  165  166  167  168  169
+  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185
+  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201
+  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217
+  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233
+  234  235  236  237  238  239  240  241  242  243  309  148  163  164  165  166
+  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
+  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198
+  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214
+  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230
+  231  232  233  234  235  236  237  238  239  240  241  242  243  310  149  163
+  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179
+  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211
+  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227
+  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243
+  311  150  163  164  165  166  167  168  169  170  171  172  173  174  175  176
+  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192
+  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
+  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224
+  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+  241  242  243  312  151  163  164  165  166  167  168  169  170  171  172  173
+  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
+  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205
+  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221
+  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237
+  238  239  240  241  242  243  313  152  163  164  165  166  167  168  169  170
+  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186
+  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202
+  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218
+  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
+  235  236  237  238  239  240  241  242  243  314  153  163  164  165  166  167
+  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183
+  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199
+  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215
+  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
+  232  233  234  235  236  237  238  239  240  241  242  243  315  154  163  164
+  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196
+  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212
+  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
+  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  316
+  155  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177
+  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193
+  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
+  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241
+  242  243  317  156  163  164  165  166  167  168  169  170  171  172  173  174
+  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
+  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206
+  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222
+  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238
+  239  240  241  242  243  318  157  163  164  165  166  167  168  169  170  171
+  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187
+  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203
+  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219
+  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235
+  236  237  238  239  240  241  242  243  319  158  163  164  165  166  167  168
+  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184
+  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200
+  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216
+  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232
+  233  234  235  236  237  238  239  240  241  242  243  320  159  163  164  165
+  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181
+  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197
+  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213
+  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229
+  230  231  232  233  234  235  236  237  238  239  240  241  242  243  321  160
+  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178
+  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194
+  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226
+  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242
+  243  322  161  163  164  165  166  167  168  169  170  171  172  173  174  175
+  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
+  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
+  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
+  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
+  240  241  242  243  323  162  163  164  165  166  167  168  169  170  171  172
+  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188
+  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204
+  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220
+  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236
+  237  238  239  240  241  242  243  324  163  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  164  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  165  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  166  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  167  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  168  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  169  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  170  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  171  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  172  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  173  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  174  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  175  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  176  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  177  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  178  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  179  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  180  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  181  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  182  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  183  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  184  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  185  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  186  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  187  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  188  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  189  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  190  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  191  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  192  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  193  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  194  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  195  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  196  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  197  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  198  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  199  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  200  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  201  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  202  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  203  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  204  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  205  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  206  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  207  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  208  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  209  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  210  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  211  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  212  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  213  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  214  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  215  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  216  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  217  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  218  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  219  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  220  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  221  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  222  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  223  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  224  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  225  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  226  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  227  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  228  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  229  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  230  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  231  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  232  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  233  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  234  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  235  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324  236  244  245  246  247  248
+  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264
+  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280
+  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296
+  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
+  313  314  315  316  317  318  319  320  321  322  323  324  237  244  245  246
+  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262
+  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278
+  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
+  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310
+  311  312  313  314  315  316  317  318  319  320  321  322  323  324  238  244
+  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
+  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276
+  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292
+  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308
+  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324
+  239  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258
+  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274
+  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290
+  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306
+  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322
+  323  324  240  244  245  246  247  248  249  250  251  252  253  254  255  256
+  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272
+  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288
+  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
+  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320
+  321  322  323  324  241  244  245  246  247  248  249  250  251  252  253  254
+  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270
+  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
+  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302
+  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318
+  319  320  321  322  323  324  242  244  245  246  247  248  249  250  251  252
+  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268
+  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284
+  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300
+  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316
+  317  318  319  320  321  322  323  324  243  244  245  246  247  248  249  250
+  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
+  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282
+  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298
+  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314
+  315  316  317  318  319  320  321  322  323  324
+0.3907880596378435D+00-.5085988217165716D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03
+0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02
+0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03
+-.7089509216132388D-020.1144101174176753D-020.1597157490519940D-01
+-.2577484145293108D-02-.6393452627818492D-010.1031771937313466D-01
+0.1315499101020305D-030.3980931060364731D-05-.6393452627818429D-01
+0.1031771937313455D-010.2927527143407817D+00-.5061033237937254D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02
+0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03
+-.2541776982554263D-020.4101905987537787D-030.3980741565709959D-02
+-.6424099272005126D-03-.7089509216132388D-020.1144101174176753D-02
+0.1597157490519940D-01-.2577484145293108D-020.1444546692054133D-03
+0.5038740027685473D-050.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2157239452786765D+00
+-.4868036798000584D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1557709757413722D+00-.4569036816326588D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03
+0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02
+0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03
+0.1704618139382066D-030.7186682901146465D-050.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1096566252142961D+00-.4209739735795140D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02
+0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03
+-.2541776982554263D-020.4101905987537787D-030.1835648671152865D-03
+0.8276981869115928D-05-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.7471858919825108D-01
+-.3823258786163024D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.4877067593222251D-01-.3433058868290575D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03
+0.2099716165654131D-030.1049065173767338D-04-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.3002068643018266D-01-.3055268727498139D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.9826448017572174D-03-.1585786882018380D-030.2232759905057449D-03
+0.1161419108758396D-040.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1700216908900937D-01
+-.2700489567358313D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.8517736161626044D-02-.2375203779188533D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+0.2500884437803040D-030.1389510403850428D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.3592010968872295D-02-.2082866889705388D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.2635972110537330D-03
+0.1505264954137583D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1432593898717735D-02
+-.1824749233535114D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1397702131734624D-02-.1600580484709967D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.2908215597085934D-030.1740235273557609D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.2969361130056608D-02-.1409039418766617D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-040.3045378394557195D-03
+0.1859468584754816D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.5731212358601079D-02
+-.1248122626208860D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.9350157447874083D-02-.1115418954076180D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+0.3321803688867207D-030.2101475811579130D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1356118906725279D-01-.1008310886583305D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.3461073275196676D-03
+0.2224267627894746D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1815486735526482D-01
+-.9241196217609635D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.2296699136715612D-01-.8602070427593237D-02-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.3741744183745985D-030.2473472872899837D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.2787009059662764D-01-.8140449450940520D-02
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-040.3883152702882559D-03
+0.2599904567771967D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.3276642467527989D-01
+-.7832596231436846D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.3758223191522410D-01-.7656581262990280D-02-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+0.4168133998999086D-030.2856472231265750D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.4226301116560104D-01-.7592410749930865D-02
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.4311714081937841D-03
+0.2986626838560346D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.4676965794798595D-01
+-.7622058049335034D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.5107530622773573D-01-.7729427242199239D-02-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.4601071520344119D-030.3250724673348925D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.5516275247888457D-01-.7900270743738223D-02
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-040.4746856292452647D-03
+0.3384686919130694D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.5902235975385258D-01
+-.8122077438341108D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.6265035698167873D-01-.8383943600343269D-02-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+0.5040656624027409D-030.3656486094640881D-040.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.6604746327913752D-01-.8676435588169473D-02
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5188679712481502D-03
+0.3794342429527186D-04-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.6921777916009794D-01
+-.8991450776860036D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.7216789658063694D-01-.9322081262977695D-02-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.5486990699241699D-030.4074017597105377D-04-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.7490618810353455D-01-.9662483409213413D-02
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-050.5637286240571986D-03
+0.4215856229213537D-040.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.7744224239182489D-01
+-.1000775519245637D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.7978641898553364D-01-.1035382249831074D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+0.5940176670878278D-030.4503585588621884D-040.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.8194950007742326D-01-.1069733490338830D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.6092779318629489D-03
+0.4649496517120420D-04-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.8394242094818047D-01
+-.1103557105390731D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.8577606398706922D-01-.1136635344559469D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.6400319022618756D-030.4945461884251627D-04-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.8746110392560591D-01-.1168797220454049D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-050.6555263955123291D-03
+0.5095536933526217D-040.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.8900789414501604D-01
+-.1199911733718971D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.9042638576277094D-01-.1229881884115071D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+0.6867523820371290D-030.5399923809358637D-040.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.9172607272565819D-01-.1258639403228736D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.7024846748638742D-03
+0.5554256663803711D-040.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.9291595739173754D-01
+-.1286140143634197D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.9400453211699690D-01-.1312360060645681D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+0.7341898736056463D-030.5867254304618804D-040.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.9499977321263603D-01-.1337291725485198D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.7501635911780829D-03
+0.6025940544065905D-04-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.9590914433729904D-01
+-.1360941312262982D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.9673960696151584D-01-.1383326005253246D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.7823553071748006D-030.6347742032950520D-04-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.9749763601089485D-01-.1404471777278064D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-050.7985741295434327D-03
+0.6510879168744751D-040.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.9818923917831297D-01
+-.1424411494392620D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.9881997870846726D-01-.1443183306359489D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+0.8312597784173505D-030.6841681488401041D-040.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.9939499471310484D-01-.1460829286515623D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.8477274413385733D-03
+0.7009369000137130D-04-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.9991902928232077D-01
+-.1477394288514098D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1003964508250222D+00-.1492924991028709D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.8809145509580565D-030.7349373107023372D-04-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1008312782070416D+00-.1507469104826736D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-050.8976348467312377D-03
+0.7521712479953038D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1012272043642645D+00
+-.1521074719639924D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1015876191553175D+00-.1533789771001627D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+0.9313310588973688D-030.7871123379778959D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1019156312878210D+00-.1545661609680803D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.9483078372144148D-03
+0.8048218142901548D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1022140892071981D+00
+-.1556736658546946D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1024856008802586D+00-.1567060143662068D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.9825209093727470D-030.8407244967502225D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1027325524394487D+00-.1576675888135830D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-040.9997580781803323D-03
+0.8589200732350710D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1029571256795995D+00
+-.1585626158817118D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1031613144187102D+00-.1593951557249072D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+0.1034495885158160D-020.8958056817963518D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1033469397490001D+00-.1601690947502950D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1051997411532808D-02
+0.9144981318098186D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1035156642151411D+00
+-.1608881414546571D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1036690049640822D+00-.1615558247711579D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1087267947302331D-020.9523884285067672D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1038083459158393D+00-.1621754944615051D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-040.1105037858338542D-02
+0.9715887416290131D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1039349490076170D+00
+-.1627503231578771D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1040499645650695D+00-.1632833097185782D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+0.1140849237806308D-020.1010505925022613D-030.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1041544408547741D+00-.1637772836129954D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.1158891621517917D-02
+0.1030225311152631D-03-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1042493328713475D+00
+-.1642349100959841D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1043355104113325D+00-.1646586959702118D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.1195252082340932D-020.1070192024594111D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1044137654841926D+00-.1650509957680039D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-030.1213571088575899D-02
+0.1090441918119028D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1044848191086251D+00
+-.1654140182125686D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1045493275400524D+00-.1657498328427346D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+0.1250488993004788D-020.1131481258164096D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1046078879726769D+00-.1660603767060543D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.1269088834373626D-02
+0.1152273322204408D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1046610437569370D+00
+-.1663474610427858D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03
+0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02
+0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1047092891706644D+00-.1666127778982718D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1306572671123266D-020.1194408847180681D-03-.2541776982554263D-02
+0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03
+-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1047530737797218D+00-.1668579066139561D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-030.1325457623941280D-02
+0.1215754977912746D-030.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1047928064214595D+00
+-.1670843201580279D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03
+-.7089509216132388D-020.1144101174176753D-020.3980741565709959D-02
+-.6424099272005126D-03-.2541776982554263D-020.4101905987537787D-03
+0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02
+0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1048288588419666D+00-.1672933912657333D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+0.1363516010089288D-020.1259010716643076D-030.1597157490519940D-01
+-.2577484145293108D-02-.7089509216132388D-020.1144101174176753D-02
+0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02
+0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03
+-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1048615690158307D+00-.1674863983669926D-01
+-.6393452627818429D-010.1031771937313455D-010.1382690415332871D-02
+0.1280923047700254D-03-.6393452627818492D-010.1031771937313466D-01
+0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1048912441749794D+00
+-.1676645312853028D-010.1401962280695231D-020.1303026850247933D-03
+0.1315499101020305D-030.3980931060364731D-050.1495712768796483D+01
+-.8758582323213338D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02
+-.6393452627818492D-010.1031771937313466D-010.1315499101020305D-03
+0.3980931060364731D-050.1444546692054133D-030.5038740027685473D-05
+-.6393452627818429D-010.1031771937313455D-010.1284018775367995D+01
+-.9274586432417488D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02
+0.1444546692054133D-030.5038740027685473D-050.1574251928385321D-03
+0.6107296557512106D-050.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1103394708518522D+01
+-.9497234835585190D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05
+0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.9490240426135286D+00
+-.9506540400453242D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-030.1704618139382066D-03
+0.7186682901146465D-050.1835648671152865D-030.8276981869115928D-05
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.8168613374502116D+00
+-.9363985243360058D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.1835648671152865D-030.8276981869115928D-050.1967346886630121D-03
+0.9378276834732454D-05-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.7035067815698437D+00
+-.9116507089552443D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05
+0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.6061012742425287D+00
+-.8799665629787737D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.2099716165654131D-03
+0.1049065173767338D-040.2232759905057449D-030.1161419108758396D-04
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.5222386826466781D+00
+-.8440152302463712D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+0.2232759905057449D-030.1161419108758396D-040.2366481518749747D-03
+0.1274897996770195D-040.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.4498924598572777D+00
+-.8057775134654636D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04
+0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.3873542691813320D+00
+-.7667024547805577D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-030.2500884437803040D-03
+0.1389510403850428D-040.2635972110537330D-030.1505264954137583D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.3331826455172370D+00
+-.7278305234447378D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.2635972110537330D-030.1505264954137583D-040.2771748002606731D-03
+0.1622170330230075D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2861600468480754D+00
+-.6898902412495479D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04
+0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2452569188515565D+00
+-.6533737207443764D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.2908215597085934D-03
+0.1740235273557609D-040.3045378394557195D-030.1859468584754816D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2096016214375600D+00
+-.6185954984913972D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+0.3045378394557195D-030.1859468584754816D-040.3183239913197660D-03
+0.1979879124037159D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1784552549543353D+00
+-.5857381656377866D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04
+0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1511905818315803D+00
+-.5548875902979072D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-040.3321803688867207D-03
+0.2101475811579130D-040.3461073275196676D-030.2224267627894746D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1272743715807420D+00
+-.5260599576185822D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.3461073275196676D-030.2224267627894746D-040.3601052243676528D-03
+0.2348263614220369D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1062526075652616D+00
+-.4992223971674474D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04
+0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.8773808631923941D-01
+-.4743086017203506D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.3741744183745985D-03
+0.2473472872899837D-040.3883152702882559D-030.2599904567771967D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.7140001739248367D-01
+-.4512305490328010D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+0.3883152702882559D-030.2599904567771967D-040.4025281426692064D-03
+0.2727567924560386D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.5695529621298243D-01
+-.4298872045172876D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04
+0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.4416117636119962D-01
+-.4101708963900788D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-040.4168133998999086D-03
+0.2856472231265750D-040.4311714081937841D-030.2986626838560346D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.3280911268293057D-01
+-.3919719064856946D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.4311714081937841D-030.2986626838560346D-040.4456025356043519D-03
+0.3118041160185087D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2271958428400390D-01
+-.3751817020459010D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04
+0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.1373773786865687D-01
+-.3596951403082874D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.4601071520344119D-03
+0.3250724673348925D-040.4746856292452647D-030.3384686919130694D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.5729718122685731D-02
+-.3454119037607182D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+0.4746856292452647D-030.3384686919130694D-040.4893383408659858D-03
+0.3519937502883382D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1420426245443279D-02
+-.3322373655592117D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04
+0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.7813353894945640D-02
+-.3200830386663087D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-050.5040656624027409D-03
+0.3656486094640881D-040.5188679712481502D-030.3794342429527186D-04
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1353663748560101D-01
+-.3088667262160822D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5188679712481502D-030.3794342429527186D-040.5337456466906940D-03
+0.3933516308168090D-04-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1866663060706036D-01
+-.2985124624149579D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04
+0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2327004940642635D-01
+-.2889503113144904D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.5486990699241699D-03
+0.4074017597105377D-040.5637286240571986D-030.4215856229213537D-04
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2740531442145211D-01
+-.2801160737399670D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+0.5637286240571986D-030.4215856229213537D-040.5788346941227656D-03
+0.4359042204118991D-040.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3112369069937826D-01
+-.2719509394869411D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04
+0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3447025807878468D-01
+-.2644011117776505D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-050.5940176670878278D-03
+0.4503585588621884D-040.6092779318629489D-030.4649496517120420D-04
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3748473833137467D-01
+-.2574174232414716D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.6092779318629489D-030.4649496517120420D-040.6246158793119950D-03
+0.4796785192037780D-04-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4020220153327811D-01
+-.2509549568248576D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04
+0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4265367042011983D-01
+-.2449726806321739D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.6400319022618756D-03
+0.4945461884251627D-040.6555263955123291D-030.5095536933526217D-04
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4486663845896954D-01
+-.2394331024220700D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+0.6555263955123291D-030.5095536933526217D-040.6710997558457615D-03
+0.5247020748947131D-040.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4686551484505416D-01
+-.2343019470765194D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04
+0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4867200751975501D-01
+-.2295478586186883D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-060.6867523820371290D-03
+0.5399923809358637D-040.7024846748638742D-030.5554256663803711D-04
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5030545354048027D-01
+-.2251421271226276D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.7024846748638742D-030.5554256663803711D-040.7182970371159094D-03
+0.5710029931966725D-040.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5178310465540323D-01
+-.2210584400084966D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04
+0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5312037469915137D-01
+-.2172726566553483D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-050.7341898736056463D-03
+0.5867254304618804D-040.7501635911780829D-030.6025940544065905D-04
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5433105438958483D-01
+-.2137626049149093D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.7501635911780829D-030.6025940544065905D-040.7662185987209308D-03
+0.6186099484599586D-04-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5542749823766951D-01
+-.2105078979169252D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04
+0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5642078755448146D-01
+-.2074897694756246D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.7823553071748006D-03
+0.6347742032950520D-040.7985741295434327D-030.6510879168744751D-04
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5732087292851082D-01
+-.2046909264043303D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+0.7985741295434327D-030.6510879168744751D-040.8148754809039821D-03
+0.6675521944962719D-040.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5813669903342966D-01
+-.2020954160960765D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04
+0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5887631419529668D-01
+-.1996885078135194D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-050.8312597784173505D-03
+0.6841681488401041D-040.8477274413385733D-030.7009369000137130D-04
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.5954696678540483D-01
+-.1974565862376031D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.8477274413385733D-030.7009369000137130D-040.8642788910272550D-03
+0.7178595755996570D-04-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6015519019946330D-01
+-.1953870559413300D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04
+0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6070687792621943D-01
+-.1934682555754028D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.8809145509580565D-03
+0.7349373107023372D-040.8976348467312377D-030.7521712479953038D-04
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6120734999118643D-01
+-.1916893806714917D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+0.8976348467312377D-030.7521712479953038D-040.9144402060832480D-03
+0.7695625377688507D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6166141187735572D-01
+-.1900404140831033D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04
+0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6207340686920948D-01
+-.1885120631913809D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-040.9313310588973688D-03
+0.7871123379778959D-040.9483078372144148D-030.8048218142901548D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6244726263448086D-01
+-.1870957031024471D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.9483078372144148D-030.8048218142901548D-040.9653709752434816D-03
+0.8226921401346013D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6278653274614820D-01
+-.1857833251535415D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04
+0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6309443375193149D-01
+-.1845674901271196D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.9825209093727470D-03
+0.8407244967502225D-040.9997580781803323D-030.8589200732350710D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6337387831743405D-01
+-.1834412856454672D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+0.9997580781803323D-030.8589200732350710D-040.1017082922445208D-02
+0.8772800665956083D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6362750489982794D-01
+-.1823982872836648D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04
+0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6385770434976151D-01
+-.1814325229964734D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-040.1034495885158160D-02
+0.8958056817963518D-040.1051997411532808D-020.9144981318098186D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6406664378841609D-01
+-.1805384405054882D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1051997411532808D-020.9144981318098186D-040.1069587949016678D-02
+0.9333586376667711D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6425628806305758D-01
+-.1797108773373967D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04
+0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6442841904691948D-01
+-.1789450332429918D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1087267947302331D-02
+0.9523884285067672D-040.1105037858338542D-020.9715887416290131D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6458465301690153D-01
+-.1782364447603602D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+0.1105037858338542D-020.9715887416290131D-040.1122898136341541D-02
+0.9909608225435285D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6472645631459964D-01
+-.1775809617149684D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04
+0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6485515947194923D-01
+-.1769747254747372D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-040.1140849237806308D-02
+0.1010505925022613D-030.1158891621517917D-020.1030225311152631D-03
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6497196996171620D-01
+-.1764141488001286D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.1158891621517917D-020.1030225311152631D-030.1177025748562945D-02
+0.1050120251386102D-03-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6507798371474940D-01
+-.1758958971482033D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03
+0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6517419552992140D-01
+-.1754168713059499D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.1195252082340932D-02
+0.1070192024594111D-030.1213571088575899D-020.1090441918119028D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6526150848870371D-01
+-.1749741912422772D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+0.1213571088575899D-020.1090441918119028D-030.1231983235327929D-02
+0.1110871227827559D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6534074247406860D-01
+-.1745651810802267D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03
+0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6541264188264254D-01
+-.1741873551014634D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-030.1250488993004788D-02
+0.1131481258164096D-030.1269088834373626D-020.1152273322204408D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6547788260955756D-01
+-.1738384047041783D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.1269088834373626D-020.1152273322204408D-030.1287783234572715D-02
+0.1173248741709648D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6553707837708347D-01
+-.1735161862434064D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03
+0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6559078647072791D-01
+-.1732187096895809D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1306572671123266D-02
+0.1194408847180681D-030.1325457623941280D-020.1215754977912746D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6563951293994072D-01
+-.1729441280470915D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+0.1325457623941280D-020.1215754977912746D-030.1344438575349479D-02
+0.1237288482050448D-030.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6568371731474190D-01
+-.1726907274797979D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03
+0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6572381688442269D-01
+-.1724569180949983D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-020.1363516010089288D-02
+0.1259010716643076D-030.1382690415332871D-020.1280923047700254D-03
+0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6576019057985988D-01
+-.1722412253413513D-01-.6393452627818429D-010.1031771937313455D-01
+0.1382690415332871D-020.1280923047700254D-030.1401962280695231D-02
+0.1303026850247933D-03-.6393452627818492D-010.1031771937313466D-01
+0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.6579318249687402D-01
+-.1720422819797903D-010.1401962280695231D-020.1303026850247933D-03
+0.1315499101020305D-030.3980931060364731D-050.4820685663032476D-01
+-.5085988217165716D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02
+-.6393452627818492D-010.1031771937313466D-010.1315499101020305D-03
+0.3980931060364731D-050.1444546692054133D-030.5038740027685473D-05
+-.6393452627818429D-010.1031771937313455D-01-.4982848866673706D-01
+-.5061033237937254D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02
+0.1444546692054133D-030.5038740027685473D-050.1574251928385321D-03
+0.6107296557512106D-050.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1268572577288423D+00
+-.4868036798000584D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1574251928385321D-030.6107296557512106D-05
+0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1868102272661466D+00
+-.4569036816326588D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-030.1704618139382066D-03
+0.7186682901146465D-050.1835648671152865D-030.8276981869115928D-05
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2329245777932227D+00
+-.4209739735795140D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.1835648671152865D-030.8276981869115928D-050.1967346886630121D-03
+0.9378276834732454D-05-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2678626138092677D+00
+-.3823258786163024D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-030.1967346886630121D-030.9378276834732454D-05
+0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2938105270752963D+00
+-.3433058868290575D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.2099716165654131D-03
+0.1049065173767338D-040.2232759905057449D-030.1161419108758396D-04
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3125605165773361D+00
+-.3055268727498139D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+0.2232759905057449D-030.1161419108758396D-040.2366481518749747D-03
+0.1274897996770195D-040.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3255790339185094D+00
+-.2700489567358313D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.2366481518749747D-030.1274897996770195D-04
+0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3340634668458927D+00
+-.2375203779188533D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-030.2500884437803040D-03
+0.1389510403850428D-040.2635972110537330D-030.1505264954137583D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3389891920386465D+00
+-.2082866889705388D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.2635972110537330D-030.1505264954137583D-040.2771748002606731D-03
+0.1622170330230075D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3411486091088010D+00
+-.1824749233535114D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-040.2771748002606731D-030.1622170330230075D-04
+0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3411835008757841D+00
+-.1600580484709967D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.2908215597085934D-03
+0.1740235273557609D-040.3045378394557195D-030.1859468584754816D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3396118418774621D+00
+-.1409039418766617D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+0.3045378394557195D-030.1859468584754816D-040.3183239913197660D-03
+0.1979879124037159D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3368499906489177D+00
+-.1248122626208860D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3183239913197660D-030.1979879124037159D-04
+0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3332310455596447D+00
+-.1115418954076180D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-040.3321803688867207D-03
+0.2101475811579130D-040.3461073275196676D-030.2224267627894746D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3290200139402660D+00
+-.1008310886583305D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.3461073275196676D-030.2224267627894746D-040.3601052243676528D-03
+0.2348263614220369D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3244263356522539D+00
+-.9241196217609635D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-040.3601052243676528D-030.2348263614220369D-04
+0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3196142116403626D+00
+-.8602070427593237D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.3741744183745985D-03
+0.2473472872899837D-040.3883152702882559D-030.2599904567771967D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3147111124108911D+00
+-.8140449450940520D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+0.3883152702882559D-030.2599904567771967D-040.4025281426692064D-03
+0.2727567924560386D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3098147783322389D+00
+-.7832596231436846D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.4025281426692064D-030.2727567924560386D-04
+0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3049989710922947D+00
+-.7656581262990280D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-040.4168133998999086D-03
+0.2856472231265750D-040.4311714081937841D-030.2986626838560346D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3003181918419177D+00
+-.7592410749930865D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.4311714081937841D-030.2986626838560346D-040.4456025356043519D-03
+0.3118041160185087D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2958115450595328D+00
+-.7622058049335034D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-040.4456025356043519D-030.3118041160185087D-04
+0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2915058967797831D+00
+-.7729427242199239D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.4601071520344119D-03
+0.3250724673348925D-040.4746856292452647D-030.3384686919130694D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2874184505286342D+00
+-.7900270743738223D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+0.4746856292452647D-030.3384686919130694D-040.4893383408659858D-03
+0.3519937502883382D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2835588432536662D+00
+-.8122077438341108D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.4893383408659858D-030.3519937502883382D-04
+0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2799308460258400D+00
+-.8383943600343269D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-050.5040656624027409D-03
+0.3656486094640881D-040.5188679712481502D-030.3794342429527186D-04
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2765337397283812D+00
+-.8676435588169473D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5188679712481502D-030.3794342429527186D-040.5337456466906940D-03
+0.3933516308168090D-04-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2733634238474208D+00
+-.8991450776860036D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-050.5337456466906940D-030.3933516308168090D-04
+0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2704133064268818D+00
+-.9322081262977695D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.5486990699241699D-03
+0.4074017597105377D-040.5637286240571986D-030.4215856229213537D-04
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2676750149039842D+00
+-.9662483409213413D-02-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+0.5637286240571986D-030.4215856229213537D-040.5788346941227656D-03
+0.4359042204118991D-040.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2651389606156939D+00
+-.1000775519245637D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.5788346941227656D-030.4359042204118991D-04
+0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2627947840219851D+00
+-.1035382249831074D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-050.5940176670878278D-03
+0.4503585588621884D-040.6092779318629489D-030.4649496517120420D-04
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2606317029300955D+00
+-.1069733490338830D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.6092779318629489D-030.4649496517120420D-040.6246158793119950D-03
+0.4796785192037780D-04-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2586387820593383D+00
+-.1103557105390731D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-050.6246158793119950D-030.4796785192037780D-04
+0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2568051390204495D+00
+-.1136635344559469D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.6400319022618756D-03
+0.4945461884251627D-040.6555263955123291D-030.5095536933526217D-04
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2551200990819129D+00
+-.1168797220454049D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+0.6555263955123291D-030.5095536933526217D-040.6710997558457615D-03
+0.5247020748947131D-040.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2535733088625027D+00
+-.1199911733718971D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.6710997558457615D-030.5247020748947131D-04
+0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2521548172447478D+00
+-.1229881884115071D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-060.6867523820371290D-03
+0.5399923809358637D-040.7024846748638742D-030.5554256663803711D-04
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2508551302818606D+00
+-.1258639403228736D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.7024846748638742D-030.5554256663803711D-040.7182970371159094D-03
+0.5710029931966725D-040.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2496652456157812D+00
+-.1286140143634197D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.7182970371159094D-030.5710029931966725D-04
+0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2485766708905219D+00
+-.1312360060645681D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-050.7341898736056463D-03
+0.5867254304618804D-040.7501635911780829D-030.6025940544065905D-04
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2475814297948827D+00
+-.1337291725485198D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.7501635911780829D-030.6025940544065905D-040.7662185987209308D-03
+0.6186099484599586D-04-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2466720586702197D+00
+-.1360941312262982D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-050.7662185987209308D-030.6186099484599586D-04
+0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2458415960460029D+00
+-.1383326005253246D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.7823553071748006D-03
+0.6347742032950520D-040.7985741295434327D-030.6510879168744751D-04
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2450835669966239D+00
+-.1404471777278064D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+0.7985741295434327D-030.6510879168744751D-040.8148754809039821D-03
+0.6675521944962719D-040.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2443919638292058D+00
+-.1424411494392620D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.8148754809039821D-030.6675521944962719D-04
+0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2437612242990515D+00
+-.1443183306359489D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-050.8312597784173505D-03
+0.6841681488401041D-040.8477274413385733D-030.7009369000137130D-04
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2431862082944139D+00
+-.1460829286515623D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.8477274413385733D-030.7009369000137130D-040.8642788910272550D-03
+0.7178595755996570D-04-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2426621737251980D+00
+-.1477394288514098D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-050.8642788910272550D-030.7178595755996570D-04
+0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2421847521824966D+00
+-.1492924991028709D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.8809145509580565D-03
+0.7349373107023372D-040.8976348467312377D-030.7521712479953038D-04
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2417499248004771D+00
+-.1507469104826736D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+0.8976348467312377D-030.7521712479953038D-040.9144402060832480D-03
+0.7695625377688507D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2413539986432542D+00
+-.1521074719639924D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.9144402060832480D-030.7695625377688507D-04
+0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2409935838522013D+00
+-.1533789771001627D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-040.9313310588973688D-03
+0.7871123379778959D-040.9483078372144148D-030.8048218142901548D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2406655717196978D+00
+-.1545661609680803D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.9483078372144148D-030.8048218142901548D-040.9653709752434816D-03
+0.8226921401346013D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2403671138003207D+00
+-.1556736658546946D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-040.9653709752434816D-030.8226921401346013D-04
+0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2400956021272602D+00
+-.1567060143662068D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.9825209093727470D-03
+0.8407244967502225D-040.9997580781803323D-030.8589200732350710D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2398486505680700D+00
+-.1576675888135830D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+0.9997580781803323D-030.8589200732350710D-040.1017082922445208D-02
+0.8772800665956083D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2396240773279193D+00
+-.1585626158817118D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1017082922445208D-020.8772800665956083D-04
+0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2394198885888085D+00
+-.1593951557249072D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-040.1034495885158160D-02
+0.8958056817963518D-040.1051997411532808D-020.9144981318098186D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2392342632585187D+00
+-.1601690947502950D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1051997411532808D-020.9144981318098186D-040.1069587949016678D-02
+0.9333586376667711D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2390655387923777D+00
+-.1608881414546571D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-040.1069587949016678D-020.9333586376667711D-04
+0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2389121980434366D+00
+-.1615558247711579D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1087267947302331D-02
+0.9523884285067672D-040.1105037858338542D-020.9715887416290131D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2387728570916794D+00
+-.1621754944615051D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+0.1105037858338542D-020.9715887416290131D-040.1122898136341541D-02
+0.9909608225435285D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2386462539999018D+00
+-.1627503231578771D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.1122898136341541D-020.9909608225435285D-04
+0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2385312384424493D+00
+-.1632833097185782D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-040.1140849237806308D-02
+0.1010505925022613D-030.1158891621517917D-020.1030225311152631D-03
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2384267621527447D+00
+-.1637772836129954D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.1158891621517917D-020.1030225311152631D-030.1177025748562945D-02
+0.1050120251386102D-03-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2383318701361712D+00
+-.1642349100959841D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-040.1177025748562945D-020.1050120251386102D-03
+0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2382456925961863D+00
+-.1646586959702118D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.1195252082340932D-02
+0.1070192024594111D-030.1213571088575899D-020.1090441918119028D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2381674375233261D+00
+-.1650509957680039D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+0.1213571088575899D-020.1090441918119028D-030.1231983235327929D-02
+0.1110871227827559D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2380963838988937D+00
+-.1654140182125686D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.1231983235327929D-020.1110871227827559D-03
+0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2380318754674663D+00
+-.1657498328427346D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-030.1250488993004788D-02
+0.1131481258164096D-030.1269088834373626D-020.1152273322204408D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2379733150348419D+00
+-.1660603767060543D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.1269088834373626D-020.1152273322204408D-030.1287783234572715D-02
+0.1173248741709648D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2379201592505817D+00
+-.1663474610427858D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-030.1287783234572715D-020.1173248741709648D-03
+0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2378719138368543D+00
+-.1666127778982718D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1306572671123266D-02
+0.1194408847180681D-030.1325457623941280D-020.1215754977912746D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2378281292277970D+00
+-.1668579066139561D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+0.1325457623941280D-020.1215754977912746D-030.1344438575349479D-02
+0.1237288482050448D-030.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2377883965860592D+00
+-.1670843201580279D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.1344438575349479D-020.1237288482050448D-03
+0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2377523441655522D+00
+-.1672933912657333D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-020.1363516010089288D-02
+0.1259010716643076D-030.1382690415332871D-020.1280923047700254D-03
+0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2377196339916881D+00
+-.1674863983669926D-01-.6393452627818429D-010.1031771937313455D-01
+0.1382690415332871D-020.1280923047700254D-030.1401962280695231D-02
+0.1303026850247933D-03-.6393452627818492D-010.1031771937313466D-01
+0.1597157490519940D-01-.2577484145293108D-02-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2376899588325394D+00
+-.1676645312853028D-010.1401962280695231D-020.1303026850247933D-03
+0.1315499101020305D-030.3980931060364731D-050.1153131565788964D+01
+-.8758582323213338D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-03-.7089509216132388D-02
+0.1144101174176753D-020.1597157490519940D-01-.2577484145293108D-02
+-.6393452627818492D-010.1031771937313466D-010.1444546692054133D-03
+0.5038740027685473D-05-.6393452627818429D-010.1031771937313455D-01
+0.9414375723604762D+00-.9274586432417488D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03
+0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02
+0.4101905987537787D-030.3980741565709959D-02-.6424099272005126D-03
+-.7089509216132388D-020.1144101174176753D-020.1597157490519940D-01
+-.2577484145293108D-020.1574251928385321D-030.6107296557512106D-05
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.7608135055110032D+00-.9497234835585190D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02
+0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03
+-.2541776982554263D-020.4101905987537787D-030.3980741565709959D-02
+-.6424099272005126D-03-.7089509216132388D-020.1144101174176753D-02
+0.1704618139382066D-030.7186682901146465D-05-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.6064428396060100D+00
+-.9506540400453242D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.1760064559812521D-02
+-.2840382695217011D-03-.2541776982554263D-020.4101905987537787D-03
+0.3980741565709959D-02-.6424099272005126D-030.1835648671152865D-03
+0.8276981869115928D-050.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.4742801344426930D+00-.9363985243360058D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-03-.1288661285438230D-020.2079634633143654D-03
+0.1760064559812521D-02-.2840382695217011D-03-.2541776982554263D-02
+0.4101905987537787D-030.1967346886630121D-030.9378276834732454D-05
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.3609255785623250D+00-.9116507089552443D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.9826448017572174D-03-.1585786882018380D-03-.1288661285438230D-02
+0.2079634633143654D-030.1760064559812521D-02-.2840382695217011D-03
+0.2099716165654131D-030.1049065173767338D-040.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.2635200712350100D+00
+-.8799665629787737D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-03-.7727812230408974D-03
+0.1247110170406368D-030.9826448017572174D-03-.1585786882018380D-03
+-.1288661285438230D-020.2079634633143654D-030.2232759905057449D-03
+0.1161419108758396D-04-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+0.1796574796391594D+00-.8440152302463712D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.6226054234809117D-03-.1004757274921672D-03
+-.7727812230408974D-030.1247110170406368D-030.9826448017572174D-03
+-.1585786882018380D-030.2366481518749747D-030.1274897996770195D-04
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-010.1073112568497590D+00-.8057775134654636D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+-.5114288231755168D-030.8253410768850847D-040.6226054234809117D-03
+-.1004757274921672D-03-.7727812230408974D-030.1247110170406368D-03
+0.2500884437803040D-030.1389510403850428D-04-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-010.4477306617381333D-01
+-.7667024547805577D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.4268045368520104D-03
+-.6887748599651892D-04-.5114288231755168D-030.8253410768850847D-04
+0.6226054234809117D-03-.1004757274921672D-030.2635972110537330D-03
+0.1505264954137583D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.9398557490281734D-02-.7278305234447378D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-04-.3608796739013979D-030.5823856716450639D-04
+0.4268045368520104D-03-.6887748599651892D-04-.5114288231755168D-03
+0.8253410768850847D-040.2771748002606731D-030.1622170330230075D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.5642115615944338D-01-.6898902412495479D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3085010747980624D-03-.4978573708714430D-04-.3608796739013979D-03
+0.5823856716450639D-040.4268045368520104D-03-.6887748599651892D-04
+0.2908215597085934D-030.1740235273557609D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.9732428415596228D-01
+-.6533737207443764D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2661733971656788D-03
+0.4295491929665637D-040.3085010747980624D-03-.4978573708714430D-04
+-.3608796739013979D-030.5823856716450639D-040.3045378394557195D-03
+0.1859468584754816D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.1329795815699588D+00-.6185954984913972D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.2314578281220329D-03-.3735253948527681D-04
+-.2661733971656788D-030.4295491929665637D-040.3085010747980624D-03
+-.4978573708714430D-040.3183239913197660D-030.1979879124037159D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.1641259480531834D+00-.5857381656377866D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+-.2026106452901076D-030.3269719667613068D-040.2314578281220329D-03
+-.3735253948527681D-04-.2661733971656788D-030.4295491929665637D-04
+0.3321803688867207D-030.2101475811579130D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.1913906211759385D+00
+-.5548875902979072D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.1783582025511267D-03
+-.2878335054540236D-04-.2026106452901076D-030.3269719667613068D-04
+0.2314578281220329D-03-.3735253948527681D-040.3461073275196676D-03
+0.2224267627894746D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.2153068314267767D+00-.5260599576185822D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-04-.1577525118211425D-030.2545801528732096D-04
+0.1783582025511267D-03-.2878335054540236D-04-.2026106452901076D-03
+0.3269719667613068D-040.3601052243676528D-030.2348263614220369D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.2363285954422571D+00-.4992223971674474D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1577525118211425D-03
+0.2545801528732096D-040.1783582025511267D-03-.2878335054540236D-04
+0.3741744183745985D-030.2473472872899837D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2548431166882794D+00
+-.4743086017203506D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-04-.1247774371157844D-03
+0.2013651551366699D-040.1400760388418106D-03-.2260539561021587D-04
+-.1577525118211425D-030.2545801528732096D-040.3883152702882559D-03
+0.2599904567771967D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.2711811856150351D+00-.4512305490328010D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.1114272391272199D-03-.1798206776156415D-04
+-.1247774371157844D-030.2013651551366699D-040.1400760388418106D-03
+-.2260539561021587D-040.4025281426692064D-030.2727567924560386D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.2856259067945363D+00-.4298872045172876D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+-.9968672138364864D-040.1608738933935444D-040.1114272391272199D-03
+-.1798206776156415D-04-.1247774371157844D-030.2013651551366699D-04
+0.4168133998999086D-030.2856472231265750D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.2984200266463191D+00
+-.4101708963900788D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.8928564729752786D-04
+-.1440886961226929D-04-.9968672138364864D-040.1608738933935444D-04
+0.1114272391272199D-03-.1798206776156415D-040.4311714081937841D-03
+0.2986626838560346D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3097720903245881D+00-.3919719064856946D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-04-.8000610566205314D-040.1291134218726644D-04
+0.8928564729752786D-04-.1440886961226929D-04-.9968672138364864D-04
+0.1608738933935444D-040.4456025356043519D-030.3118041160185087D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3198616187235148D+00-.3751817020459010D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.7167060586276605D-04-.1156616372469904D-04-.8000610566205314D-04
+0.1291134218726644D-040.8928564729752786D-04-.1440886961226929D-04
+0.4601071520344119D-030.3250724673348925D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3288434651388619D+00
+-.3596951403082874D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-05-.6413319184916952D-04
+0.1034977991584680D-040.7167060586276605D-04-.1156616372469904D-04
+-.8000610566205314D-040.1291134218726644D-040.4746856292452647D-03
+0.3384686919130694D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3368514848848330D+00-.3454119037607182D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5727272713271265D-04-.9242641819512053D-05
+-.6413319184916952D-040.1034977991584680D-040.7167060586276605D-04
+-.1156616372469904D-040.4893383408659858D-030.3519937502883382D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3440016292529620D+00-.3322373655592117D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+-.5098776122625716D-040.8228377410789080D-050.5727272713271265D-04
+-.9242641819512053D-05-.6413319184916952D-040.1034977991584680D-04
+0.5040656624027409D-030.3656486094640881D-04-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3503945569024643D+00
+-.3200830386663087D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.4519256146756725D-04
+-.7293151198878877D-05-.5098776122625716D-040.8228377410789080D-05
+0.5727272713271265D-04-.9242641819512053D-050.5188679712481502D-03
+0.3794342429527186D-040.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3561178404931197D+00-.3088667262160822D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-05-.3981401266047105D-040.6425163892851680D-05
+0.4519256146756725D-04-.7293151198878877D-05-.5098776122625716D-04
+0.8228377410789080D-050.5337456466906940D-030.3933516308168090D-04
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3612478336145791D+00-.2985124624149579D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3981401266047105D-04
+0.6425163892851680D-050.4519256146756725D-04-.7293151198878877D-05
+0.5486990699241699D-030.4074017597105377D-040.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3658512524139451D+00
+-.2889503113144904D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-05-.3006329973746788D-04
+0.4851599099553577D-050.3478916893609630D-04-.5614257322333374D-05
+-.3981401266047105D-040.6425163892851680D-050.5637286240571986D-03
+0.4215856229213537D-04-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3699865174289708D+00-.2801160737399670D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.2558831255668139D-04-.4129428081521270D-05
+-.3006329973746788D-040.4851599099553577D-050.3478916893609630D-04
+-.5614257322333374D-050.5788346941227656D-030.4359042204118991D-04
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3737048937068970D+00-.2719509394869411D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+-.2132146425429693D-040.3440846403443515D-050.2558831255668139D-04
+-.4129428081521270D-05-.3006329973746788D-040.4851599099553577D-05
+0.5940176670878278D-030.4503585588621884D-04-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3770514610863034D+00
+-.2644011117776505D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.1722429384947072D-04
+-.2779647252972395D-05-.2132146425429693D-040.3440846403443515D-05
+0.2558831255668139D-04-.4129428081521270D-050.6092779318629489D-03
+0.4649496517120420D-040.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3800659413388934D+00-.2574174232414716D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-05-.1326172498198105D-040.2140170026010777D-05
+0.1722429384947072D-04-.2779647252972395D-05-.2132146425429693D-04
+0.3440846403443515D-050.6246158793119950D-030.4796785192037780D-04
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3827834045407968D+00-.2509549568248576D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.9401297415863014D-05-.1517176307183306D-05-.1326172498198105D-04
+0.2140170026010777D-050.1722429384947072D-04-.2779647252972395D-05
+0.6400319022618756D-030.4945461884251627D-040.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3852348734276386D+00
+-.2449726806321739D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-06-.5612495043042305D-05
+0.9057414234252119D-060.9401297415863014D-05-.1517176307183306D-05
+-.1326172498198105D-040.2140170026010777D-050.6555263955123291D-03
+0.5095536933526217D-04-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3874478414664883D+00-.2394331024220700D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.1866143715512185D-05-.3011572664637594D-06
+-.5612495043042305D-050.9057414234252119D-060.9401297415863014D-05
+-.1517176307183306D-050.6710997558457615D-030.5247020748947131D-04
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3894467178525729D+00-.2343019470765194D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.1866143715712640D-05-.3011572664961087D-060.1866143715512185D-05
+-.3011572664637594D-06-.5612495043042305D-050.9057414234252119D-06
+0.6867523820371290D-030.5399923809358637D-04-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3912532105272737D+00
+-.2295478586186883D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-05-.5612495043095234D-05
+0.9057414234337534D-060.1866143715712640D-05-.3011572664961087D-06
+0.1866143715512185D-05-.3011572664637594D-060.7024846748638742D-03
+0.5554256663803711D-040.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3928866565479990D+00-.2251421271226276D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.9401297415583386D-05-.1517176307138179D-05
+-.5612495043095234D-050.9057414234337534D-060.1866143715712640D-05
+-.3011572664961087D-060.7182970371159094D-030.5710029931966725D-04
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3943643076629220D+00-.2210584400084966D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+-.1326172498190355D-040.2140170025998270D-050.9401297415583386D-05
+-.1517176307138179D-05-.5612495043095234D-050.9057414234337534D-06
+0.7341898736056463D-030.5867254304618804D-04-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3957015777066701D+00
+-.2172726566553483D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.1722429384915639D-04
+-.2779647252921669D-05-.1326172498190355D-040.2140170025998270D-05
+0.9401297415583386D-05-.1517176307138179D-050.7501635911780829D-03
+0.6025940544065905D-040.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3969122573971036D+00-.2137626049149093D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-05-.2132146425430071D-040.3440846403444125D-05
+0.1722429384915639D-04-.2779647252921669D-05-.1326172498190355D-04
+0.2140170025998270D-050.7662185987209308D-030.6186099484599586D-04
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.3980087012451882D+00-.2105078979169252D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.2558831255660659D-04-.4129428081509198D-05-.2132146425430071D-04
+0.3440846403444125D-050.1722429384915639D-04-.2779647252921669D-05
+0.7823553071748006D-030.6347742032950520D-040.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.3990019905620002D+00
+-.2074897694756246D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3006329973748652D-04
+0.4851599099556584D-050.2558831255660659D-04-.4129428081509198D-05
+-.2132146425430071D-040.3440846403444125D-050.7985741295434327D-03
+0.6510879168744751D-04-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.3999020759360296D+00-.2046909264043303D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.3478916893617300D-04-.5614257322345751D-05
+-.3006329973748652D-040.4851599099556584D-050.2558831255660659D-04
+-.4129428081509198D-050.8148754809039821D-030.6675521944962719D-04
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4007179020409484D+00-.2020954160960765D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+-.3981401266032415D-040.6425163892827973D-050.3478916893617300D-04
+-.5614257322345751D-05-.3006329973748652D-040.4851599099556584D-05
+0.8312597784173505D-030.6841681488401041D-04-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4014575172028155D+00
+-.1996885078135194D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.4519256146769957D-04
+-.7293151198900231D-05-.3981401266032415D-040.6425163892827973D-05
+0.3478916893617300D-04-.5614257322345751D-050.8477274413385733D-03
+0.7009369000137130D-040.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4021281697929236D+00-.1974565862376031D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-05-.5098776122600387D-040.8228377410748204D-05
+0.4519256146769957D-04-.7293151198900231D-05-.3981401266032415D-04
+0.6425163892827973D-050.8642788910272550D-030.7178595755996570D-04
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4027363932069820D+00-.1953870559413300D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.5727272713271211D-04-.9242641819511967D-05-.5098776122600387D-04
+0.8228377410748204D-050.4519256146769957D-04-.7293151198900231D-05
+0.8809145509580565D-030.7349373107023372D-040.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4032880809337382D+00
+-.1934682555754028D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-04-.6413319184882657D-04
+0.1034977991579146D-040.5727272713271211D-04-.9242641819511967D-05
+-.5098776122600387D-040.8228377410748204D-050.8976348467312377D-03
+0.7521712479953038D-04-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4037885529987051D+00-.1916893806714917D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.7167060586256731D-04-.1156616372466696D-04
+-.6413319184882657D-040.1034977991579146D-040.5727272713271211D-04
+-.9242641819511967D-050.9144402060832480D-030.7695625377688507D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4042426148848744D+00-.1900404140831033D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+-.8000610566205206D-040.1291134218726627D-040.7167060586256731D-04
+-.1156616372466696D-04-.6413319184882657D-040.1034977991579146D-04
+0.9313310588973688D-030.7871123379778959D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4046546098767282D+00
+-.1885120631913809D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.8928564729795884D-04
+-.1440886961233884D-04-.8000610566205206D-040.1291134218726627D-04
+0.7167060586256731D-04-.1156616372466696D-040.9483078372144148D-03
+0.8048218142901548D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4050284656419996D+00-.1870957031024471D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-04-.9968672138332729D-040.1608738933930258D-04
+0.8928564729795884D-04-.1440886961233884D-04-.8000610566205206D-04
+0.1291134218726627D-040.9653709752434816D-030.8226921401346013D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4053677357536670D+00-.1857833251535415D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1114272391270168D-03-.1798206776153138D-04-.9968672138332729D-04
+0.1608738933930258D-040.8928564729795884D-04-.1440886961233884D-04
+0.9825209093727470D-030.8407244967502225D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4056756367594502D+00
+-.1845674901271196D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1247774371156127D-03
+0.2013651551363927D-040.1114272391270168D-03-.1798206776153138D-04
+-.9968672138332729D-040.1608738933930258D-040.9997580781803323D-03
+0.8589200732350710D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4059550813249528D+00-.1834412856454672D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1400760388416475D-03-.2260539561018954D-04
+-.1247774371156127D-030.2013651551363927D-040.1114272391270168D-03
+-.1798206776153138D-040.1017082922445208D-020.8772800665956083D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4062087079073467D+00-.1823982872836648D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+-.1577525118210161D-030.2545801528730057D-040.1400760388416475D-03
+-.2260539561018954D-04-.1247774371156127D-030.2013651551363927D-04
+0.1034495885158160D-020.8958056817963518D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4064389073572802D+00
+-.1814325229964734D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1783582025510641D-03
+-.2878335054539225D-04-.1577525118210161D-030.2545801528730057D-04
+0.1400760388416475D-03-.2260539561018954D-040.1051997411532808D-02
+0.9144981318098186D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4066478467959349D+00-.1805384405054882D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-04-.2026106452901065D-030.3269719667613051D-04
+0.1783582025510641D-03-.2878335054539225D-04-.1577525118210161D-03
+0.2545801528730057D-040.1069587949016678D-020.9333586376667711D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4068374910705764D+00-.1797108773373967D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2026106452901065D-03
+0.3269719667613051D-040.1783582025510641D-03-.2878335054539225D-04
+0.1087267947302331D-020.9523884285067672D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4070096220544382D+00
+-.1789450332429918D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-04-.2661733971656183D-03
+0.4295491929664661D-040.2314578281220545D-03-.3735253948528030D-04
+-.2026106452901065D-030.3269719667613051D-040.1105037858338542D-02
+0.9715887416290131D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4071658560244203D+00-.1782364447603602D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.3085010747974997D-03-.4978573708705348D-04
+-.2661733971656183D-030.4295491929664661D-040.2314578281220545D-03
+-.3735253948528030D-040.1122898136341541D-020.9909608225435285D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4073076593221184D+00-.1775809617149684D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+-.3608796739011819D-030.5823856716447153D-040.3085010747974997D-03
+-.4978573708705348D-04-.2661733971656183D-030.4295491929664661D-04
+0.1140849237806308D-020.1010505925022613D-03-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4074363624794680D+00
+-.1769747254747372D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.4268045368517673D-03
+-.6887748599647970D-04-.3608796739011819D-030.5823856716447153D-04
+0.3085010747974997D-03-.4978573708705348D-040.1158891621517917D-02
+0.1030225311152631D-030.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4075531729692349D+00-.1764141488001286D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-03-.5114288231753483D-030.8253410768848127D-04
+0.4268045368517673D-03-.6887748599647970D-04-.3608796739011819D-03
+0.5823856716447153D-040.1177025748562945D-020.1050120251386102D-03
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4076591867222681D+00-.1758958971482033D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.6226054234808307D-03-.1004757274921541D-03-.5114288231753483D-03
+0.8253410768848127D-040.4268045368517673D-03-.6887748599647970D-04
+0.1195252082340932D-020.1070192024594111D-030.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4077553985374401D+00
+-.1754168713059499D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-03-.7727812230406976D-03
+0.1247110170406046D-030.6226054234808307D-03-.1004757274921541D-03
+-.5114288231753483D-030.8253410768848127D-040.1213571088575899D-02
+0.1090441918119028D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4078427114962225D+00-.1749741912422772D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.9826448017570867D-03-.1585786882018169D-03
+-.7727812230406976D-030.1247110170406046D-030.6226054234808307D-03
+-.1004757274921541D-030.1231983235327929D-020.1110871227827559D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4079219454815874D+00-.1745651810802267D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+-.1288661285438060D-020.2079634633143379D-030.9826448017570867D-03
+-.1585786882018169D-03-.7727812230406976D-030.1247110170406046D-03
+0.1250488993004788D-020.1131481258164096D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4079938448901613D+00
+-.1741873551014634D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1760064559812291D-02
+-.2840382695216640D-03-.1288661285438060D-020.2079634633143379D-03
+0.9826448017570867D-03-.1585786882018169D-030.1269088834373626D-02
+0.1152273322204408D-030.9826448017572174D-03-.1585786882018380D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4080590856170763D+00-.1738384047041783D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-03-.2541776982553532D-020.4101905987536608D-03
+0.1760064559812291D-02-.2840382695216640D-03-.1288661285438060D-02
+0.2079634633143379D-030.1287783234572715D-020.1173248741709648D-03
+-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4081182813846022D+00-.1735161862434064D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.3980741565709701D-02-.6424099272004710D-03-.2541776982553532D-02
+0.4101905987536608D-030.1760064559812291D-02-.2840382695216640D-03
+0.1306572671123266D-020.1194408847180681D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4081719894782467D+00
+-.1732187096895809D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-02-.7089509216132070D-02
+0.1144101174176702D-020.3980741565709701D-02-.6424099272004710D-03
+-.2541776982553532D-020.4101905987536608D-030.1325457623941280D-02
+0.1215754977912746D-03-.2541776982554263D-020.4101905987537787D-03
+0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02
+0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4082207159474594D+00-.1729441280470915D-01-.6393452627818429D-01
+0.1031771937313455D-010.1597157490519900D-01-.2577484145293042D-02
+-.7089509216132070D-020.1144101174176702D-020.3980741565709701D-02
+-.6424099272004710D-030.1344438575349479D-020.1237288482050448D-03
+0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02
+0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03
+-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4082649203222606D+00-.1726907274797979D-01
+-.6393452627818429D-010.1031771937313455D-010.1597157490519900D-01
+-.2577484145293042D-02-.7089509216132070D-020.1144101174176702D-02
+0.1363516010089288D-020.1259010716643076D-03-.7089509216132388D-02
+0.1144101174176753D-020.3980741565709959D-02-.6424099272005126D-03
+-.2541776982554263D-020.4101905987537787D-030.1760064559812521D-02
+-.2840382695217011D-03-.1288661285438230D-020.2079634633143654D-03
+0.9826448017572174D-03-.1585786882018380D-03-.7727812230408974D-03
+0.1247110170406368D-030.6226054234809117D-03-.1004757274921672D-03
+-.5114288231755168D-030.8253410768850847D-040.4268045368520104D-03
+-.6887748599651892D-04-.3608796739013979D-030.5823856716450639D-04
+0.3085010747980624D-03-.4978573708714430D-04-.2661733971656788D-03
+0.4295491929665637D-040.2314578281220329D-03-.3735253948527681D-04
+-.2026106452901076D-030.3269719667613068D-040.1783582025511267D-03
+-.2878335054540236D-04-.1577525118211425D-030.2545801528732096D-04
+0.1400760388418106D-03-.2260539561021587D-04-.1247774371157844D-03
+0.2013651551366699D-040.1114272391272199D-03-.1798206776156415D-04
+-.9968672138364864D-040.1608738933935444D-040.8928564729752786D-04
+-.1440886961226929D-04-.8000610566205314D-040.1291134218726644D-04
+0.7167060586276605D-04-.1156616372469904D-04-.6413319184916952D-04
+0.1034977991584680D-040.5727272713271265D-04-.9242641819512053D-05
+-.5098776122625716D-040.8228377410789080D-050.4519256146756725D-04
+-.7293151198878877D-05-.3981401266047105D-040.6425163892851680D-05
+0.3478916893609630D-04-.5614257322333374D-05-.3006329973746788D-04
+0.4851599099553577D-050.2558831255668139D-04-.4129428081521270D-05
+-.2132146425429693D-040.3440846403443515D-050.1722429384947072D-04
+-.2779647252972395D-05-.1326172498198105D-040.2140170026010777D-05
+0.9401297415863014D-05-.1517176307183306D-05-.5612495043042305D-05
+0.9057414234252119D-060.1866143715512185D-05-.3011572664637594D-06
+0.1866143715712640D-05-.3011572664961087D-06-.5612495043095234D-05
+0.9057414234337534D-060.9401297415583386D-05-.1517176307138179D-05
+-.1326172498190355D-040.2140170025998270D-050.1722429384915639D-04
+-.2779647252921669D-05-.2132146425430071D-040.3440846403444125D-05
+0.2558831255660659D-04-.4129428081509198D-05-.3006329973748652D-04
+0.4851599099556584D-050.3478916893617300D-04-.5614257322345751D-05
+-.3981401266032415D-040.6425163892827973D-050.4519256146769957D-04
+-.7293151198900231D-05-.5098776122600387D-040.8228377410748204D-05
+0.5727272713271211D-04-.9242641819511967D-05-.6413319184882657D-04
+0.1034977991579146D-040.7167060586256731D-04-.1156616372466696D-04
+-.8000610566205206D-040.1291134218726627D-040.8928564729795884D-04
+-.1440886961233884D-04-.9968672138332729D-040.1608738933930258D-04
+0.1114272391270168D-03-.1798206776153138D-04-.1247774371156127D-03
+0.2013651551363927D-040.1400760388416475D-03-.2260539561018954D-04
+-.1577525118210161D-030.2545801528730057D-040.1783582025510641D-03
+-.2878335054539225D-04-.2026106452901065D-030.3269719667613051D-04
+0.2314578281220545D-03-.3735253948528030D-04-.2661733971656183D-03
+0.4295491929664661D-040.3085010747974997D-03-.4978573708705348D-04
+-.3608796739011819D-030.5823856716447153D-040.4268045368517673D-03
+-.6887748599647970D-04-.5114288231753483D-030.8253410768848127D-04
+0.6226054234808307D-03-.1004757274921541D-03-.7727812230406976D-03
+0.1247110170406046D-030.9826448017570867D-03-.1585786882018169D-03
+-.1288661285438060D-020.2079634633143379D-030.1760064559812291D-02
+-.2840382695216640D-03-.2541776982553532D-020.4101905987536608D-03
+0.3980741565709701D-02-.6424099272004710D-03-.7089509216132070D-02
+0.1144101174176702D-020.1597157490519900D-01-.2577484145293042D-02
+-.6393452627818429D-010.1031771937313455D-01-.4083050198919414D+00
+-.1724569180949983D-01-.6393452627818429D-010.1031771937313455D-01
+0.1597157490519900D-01-.2577484145293042D-020.1382690415332871D-02
+0.1280923047700254D-030.1597157490519940D-01-.2577484145293108D-02
+-.7089509216132388D-020.1144101174176753D-020.3980741565709959D-02
+-.6424099272005126D-03-.2541776982554263D-020.4101905987537787D-03
+0.1760064559812521D-02-.2840382695217011D-03-.1288661285438230D-02
+0.2079634633143654D-030.9826448017572174D-03-.1585786882018380D-03
+-.7727812230408974D-030.1247110170406368D-030.6226054234809117D-03
+-.1004757274921672D-03-.5114288231755168D-030.8253410768850847D-04
+0.4268045368520104D-03-.6887748599651892D-04-.3608796739013979D-03
+0.5823856716450639D-040.3085010747980624D-03-.4978573708714430D-04
+-.2661733971656788D-030.4295491929665637D-040.2314578281220329D-03
+-.3735253948527681D-04-.2026106452901076D-030.3269719667613068D-04
+0.1783582025511267D-03-.2878335054540236D-04-.1577525118211425D-03
+0.2545801528732096D-040.1400760388418106D-03-.2260539561021587D-04
+-.1247774371157844D-030.2013651551366699D-040.1114272391272199D-03
+-.1798206776156415D-04-.9968672138364864D-040.1608738933935444D-04
+0.8928564729752786D-04-.1440886961226929D-04-.8000610566205314D-04
+0.1291134218726644D-040.7167060586276605D-04-.1156616372469904D-04
+-.6413319184916952D-040.1034977991584680D-040.5727272713271265D-04
+-.9242641819512053D-05-.5098776122625716D-040.8228377410789080D-05
+0.4519256146756725D-04-.7293151198878877D-05-.3981401266047105D-04
+0.6425163892851680D-050.3478916893609630D-04-.5614257322333374D-05
+-.3006329973746788D-040.4851599099553577D-050.2558831255668139D-04
+-.4129428081521270D-05-.2132146425429693D-040.3440846403443515D-05
+0.1722429384947072D-04-.2779647252972395D-05-.1326172498198105D-04
+0.2140170026010777D-050.9401297415863014D-05-.1517176307183306D-05
+-.5612495043042305D-050.9057414234252119D-060.1866143715512185D-05
+-.3011572664637594D-060.1866143715712640D-05-.3011572664961087D-06
+-.5612495043095234D-050.9057414234337534D-060.9401297415583386D-05
+-.1517176307138179D-05-.1326172498190355D-040.2140170025998270D-05
+0.1722429384915639D-04-.2779647252921669D-05-.2132146425430071D-04
+0.3440846403444125D-050.2558831255660659D-04-.4129428081509198D-05
+-.3006329973748652D-040.4851599099556584D-050.3478916893617300D-04
+-.5614257322345751D-05-.3981401266032415D-040.6425163892827973D-05
+0.4519256146769957D-04-.7293151198900231D-05-.5098776122600387D-04
+0.8228377410748204D-050.5727272713271211D-04-.9242641819511967D-05
+-.6413319184882657D-040.1034977991579146D-040.7167060586256731D-04
+-.1156616372466696D-04-.8000610566205206D-040.1291134218726627D-04
+0.8928564729795884D-04-.1440886961233884D-04-.9968672138332729D-04
+0.1608738933930258D-040.1114272391270168D-03-.1798206776153138D-04
+-.1247774371156127D-030.2013651551363927D-040.1400760388416475D-03
+-.2260539561018954D-04-.1577525118210161D-030.2545801528730057D-04
+0.1783582025510641D-03-.2878335054539225D-04-.2026106452901065D-03
+0.3269719667613051D-040.2314578281220545D-03-.3735253948528030D-04
+-.2661733971656183D-030.4295491929664661D-040.3085010747974997D-03
+-.4978573708705348D-04-.3608796739011819D-030.5823856716447153D-04
+0.4268045368517673D-03-.6887748599647970D-04-.5114288231753483D-03
+0.8253410768848127D-040.6226054234808307D-03-.1004757274921541D-03
+-.7727812230406976D-030.1247110170406046D-030.9826448017570867D-03
+-.1585786882018169D-03-.1288661285438060D-020.2079634633143379D-03
+0.1760064559812291D-02-.2840382695216640D-03-.2541776982553532D-02
+0.4101905987536608D-030.3980741565709701D-02-.6424099272004710D-03
+-.7089509216132070D-020.1144101174176702D-020.1597157490519900D-01
+-.2577484145293042D-02-.6393452627818429D-010.1031771937313455D-01
+-.4083413935873786D+00-.1722412253413513D-01-.6393452627818429D-01
+0.1031771937313455D-010.1401962280695231D-020.1303026850247933D-03
+-.6393452627818492D-010.1031771937313466D-010.1597157490519940D-01
+-.2577484145293108D-02-.7089509216132388D-020.1144101174176753D-02
+0.3980741565709959D-02-.6424099272005126D-03-.2541776982554263D-02
+0.4101905987537787D-030.1760064559812521D-02-.2840382695217011D-03
+-.1288661285438230D-020.2079634633143654D-030.9826448017572174D-03
+-.1585786882018380D-03-.7727812230408974D-030.1247110170406368D-03
+0.6226054234809117D-03-.1004757274921672D-03-.5114288231755168D-03
+0.8253410768850847D-040.4268045368520104D-03-.6887748599651892D-04
+-.3608796739013979D-030.5823856716450639D-040.3085010747980624D-03
+-.4978573708714430D-04-.2661733971656788D-030.4295491929665637D-04
+0.2314578281220329D-03-.3735253948527681D-04-.2026106452901076D-03
+0.3269719667613068D-040.1783582025511267D-03-.2878335054540236D-04
+-.1577525118211425D-030.2545801528732096D-040.1400760388418106D-03
+-.2260539561021587D-04-.1247774371157844D-030.2013651551366699D-04
+0.1114272391272199D-03-.1798206776156415D-04-.9968672138364864D-04
+0.1608738933935444D-040.8928564729752786D-04-.1440886961226929D-04
+-.8000610566205314D-040.1291134218726644D-040.7167060586276605D-04
+-.1156616372469904D-04-.6413319184916952D-040.1034977991584680D-04
+0.5727272713271265D-04-.9242641819512053D-05-.5098776122625716D-04
+0.8228377410789080D-050.4519256146756725D-04-.7293151198878877D-05
+-.3981401266047105D-040.6425163892851680D-050.3478916893609630D-04
+-.5614257322333374D-05-.3006329973746788D-040.4851599099553577D-05
+0.2558831255668139D-04-.4129428081521270D-05-.2132146425429693D-04
+0.3440846403443515D-050.1722429384947072D-04-.2779647252972395D-05
+-.1326172498198105D-040.2140170026010777D-050.9401297415863014D-05
+-.1517176307183306D-05-.5612495043042305D-050.9057414234252119D-06
+0.1866143715512185D-05-.3011572664637594D-060.1866143715712640D-05
+-.3011572664961087D-06-.5612495043095234D-050.9057414234337534D-06
+0.9401297415583386D-05-.1517176307138179D-05-.1326172498190355D-04
+0.2140170025998270D-050.1722429384915639D-04-.2779647252921669D-05
+-.2132146425430071D-040.3440846403444125D-050.2558831255660659D-04
+-.4129428081509198D-05-.3006329973748652D-040.4851599099556584D-05
+0.3478916893617300D-04-.5614257322345751D-05-.3981401266032415D-04
+0.6425163892827973D-050.4519256146769957D-04-.7293151198900231D-05
+-.5098776122600387D-040.8228377410748204D-050.5727272713271211D-04
+-.9242641819511967D-05-.6413319184882657D-040.1034977991579146D-04
+0.7167060586256731D-04-.1156616372466696D-04-.8000610566205206D-04
+0.1291134218726627D-040.8928564729795884D-04-.1440886961233884D-04
+-.9968672138332729D-040.1608738933930258D-040.1114272391270168D-03
+-.1798206776153138D-04-.1247774371156127D-030.2013651551363927D-04
+0.1400760388416475D-03-.2260539561018954D-04-.1577525118210161D-03
+0.2545801528730057D-040.1783582025510641D-03-.2878335054539225D-04
+-.2026106452901065D-030.3269719667613051D-040.2314578281220545D-03
+-.3735253948528030D-04-.2661733971656183D-030.4295491929664661D-04
+0.3085010747974997D-03-.4978573708705348D-04-.3608796739011819D-03
+0.5823856716447153D-040.4268045368517673D-03-.6887748599647970D-04
+-.5114288231753483D-030.8253410768848127D-040.6226054234808307D-03
+-.1004757274921541D-03-.7727812230406976D-030.1247110170406046D-03
+0.9826448017570867D-03-.1585786882018169D-03-.1288661285438060D-02
+0.2079634633143379D-030.1760064559812291D-02-.2840382695216640D-03
+-.2541776982553532D-020.4101905987536608D-030.3980741565709701D-02
+-.6424099272004710D-03-.7089509216132070D-020.1144101174176702D-02
+0.1597157490519900D-01-.2577484145293042D-02-.6393452627818429D-01
+0.1031771937313455D-01-.4083743855043928D+00-.1720422819797903D-01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/HB/west0067.rua	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,115 @@
+1U CAVETT PROBLEM WITH 5 COMPONENTS ( CHEM. ENG. FROM WESTERBERG )      WEST0067
+           111             7            30            74             0          
+RUA                       67            67           294             0          
+(10I8)          (10I8)          (4E20.12)                                       
+       1      11      15      19      23      27      30      35      38      41
+      44      47      49      54      59      64      69      73      78      80
+      90      93      96      99     102     105     109     113     117     121
+     124     134     137     140     143     146     149     159     164     169
+     174     179     183     188     192     196     200     204     207     217
+     220     223     226     229     232     242     247     252     257     262
+     266     271     275     279     283     287     290     295                
+       5       6       7       8       9      25      26      27      28      29
+       5      21      25      61       6      22      26      61       7      23
+      27      61       8      24      28      61       9      29      61       5
+       6       7       8       9       1       5      57       2       6      57
+       3       7      57       4       8      57       9      57       1       5
+      10      11      58       2       6      10      12      58       3       7
+      10      13      58       4       8      10      14      58       9      10
+      15      58       1       2       3       4      10      15      56      11
+      12      13      14      15      16      17      18      19      20      11
+      16      59      12      17      59      13      18      59      14      19
+      59      15      20      59      16      36      40      64      17      37
+      41      64      18      38      42      64      19      39      43      64
+      20      44      64      16      17      18      19      20      25      26
+      27      28      29      16      25      60      17      26      60      18
+      27      60      19      28      60      20      29      60      25      26
+      27      28      29      31      32      33      34      35      21      25
+      30      31      62      22      26      30      32      62      23      27
+      30      33      62      24      28      30      34      62      29      30
+      35      62      21      22      23      24      30      31      46      50
+      66      32      47      51      66      33      48      52      66      34
+      49      53      66      35      54      66      31      32      33      34
+      35      40      41      42      43      44      31      40      63      32
+      41      63      33      42      63      34      43      63      35      44
+      63      40      41      42      43      44      50      51      52      53
+      54      36      40      45      50      65      37      41      45      51
+      65      38      42      45      52      65      39      43      45      53
+      65      44      45      54      65      36      37      38      39      45
+      46      50      55      67      47      51      55      67      48      52
+      55      67      49      53      55      67      54      55      67      46
+      47      48      49      55                                                
+  -.278841600000E+00  -.268018600000E+00  -.232371700000E+00  -.157508200000E+00
+  -.632597800000E-01   .139420800000E+00   .134009300000E+00   .116185900000E+00
+   .787541100000E-01   .316298900000E-01  -.800000000000E+00  -.915953300000E+00
+   .400000000000E+00   .100000000000E+01  -.800000000000E+00  -.915953300000E+00
+   .400000000000E+00   .100000000000E+01  -.800000000000E+00  -.915953300000E+00
+   .400000000000E+00   .100000000000E+01  -.800000000000E+00  -.915953300000E+00
+   .400000000000E+00   .100000000000E+01  -.800000000000E+00   .400000000000E+00
+   .100000000000E+01   .134462200000E+00   .117567900000E+00   .885926200000E-01
+   .475943900000E-01   .117829100000E-01  -.834181800000E+00   .400000000000E+00
+   .100000000000E+01  -.834181800000E+00   .400000000000E+00   .100000000000E+01
+  -.834181800000E+00   .400000000000E+00   .100000000000E+01  -.834181800000E+00
+   .400000000000E+00   .100000000000E+01   .400000000000E+00   .100000000000E+01
+   .126582300000E+01   .400000000000E+00  -.126582300000E+01   .333333300000E+00
+   .100000000000E+01   .101265800000E+01   .400000000000E+00  -.101265800000E+01
+   .333333300000E+00   .100000000000E+01   .759493700000E+00   .400000000000E+00
+  -.759493700000E+00   .333333300000E+00   .100000000000E+01   .506329100000E+00
+   .400000000000E+00  -.506329100000E+00   .333333300000E+00   .100000000000E+01
+   .400000000000E+00  -.253164600000E+00   .333333300000E+00   .100000000000E+01
+  -.336155600000E+00  -.293919600000E+00  -.221481500000E+00  -.118986000000E+00
+   .100000000000E+01   .666666700000E+00   .100000000000E+01  -.207175900000E+00
+  -.214039200000E+00  -.214420600000E+00  -.198676800000E+00  -.165687400000E+00
+   .124305500000E+00   .128423500000E+00   .128652400000E+00   .119206100000E+00
+   .994124600000E-01  -.100000000000E+01   .600000000000E+00   .100000000000E+01
+  -.100000000000E+01   .600000000000E+00   .100000000000E+01  -.100000000000E+01
+   .600000000000E+00   .100000000000E+01  -.100000000000E+01   .600000000000E+00
+   .100000000000E+01  -.100000000000E+01   .600000000000E+00   .100000000000E+01
+   .450000000000E+00  -.958318700000E+00   .500000000000E+00   .100000000000E+01
+   .450000000000E+00  -.958318700000E+00   .500000000000E+00   .100000000000E+01
+   .450000000000E+00  -.958318700000E+00   .500000000000E+00   .100000000000E+01
+   .450000000000E+00  -.958318700000E+00   .500000000000E+00   .100000000000E+01
+   .450000000000E+00   .500000000000E+00   .100000000000E+01  -.207098600000E+00
+  -.223299700000E+00  -.228626400000E+00  -.202452800000E+00  -.138522600000E+00
+  -.207098600000E+00  -.223299700000E+00  -.228626400000E+00  -.202452800000E+00
+  -.138522600000E+00  -.105000000000E+01  -.105000000000E+01   .100000000000E+01
+  -.105000000000E+01  -.105000000000E+01   .100000000000E+01  -.105000000000E+01
+  -.105000000000E+01   .100000000000E+01  -.105000000000E+01  -.105000000000E+01
+   .100000000000E+01  -.105000000000E+01  -.105000000000E+01   .100000000000E+01
+   .814744900000E-01   .978901500000E-01   .113160800000E+00   .115055500000E+00
+   .924190900000E-01   .905272100000E-01   .108766800000E+00   .125734200000E+00
+   .127839400000E+00   .102687900000E+00   .156739800000E+01   .650000000000E+00
+  -.156739800000E+01   .722222200000E+00   .100000000000E+01   .125391800000E+01
+   .650000000000E+00  -.125391800000E+01   .722222200000E+00   .100000000000E+01
+   .940438900000E+00   .650000000000E+00  -.940438900000E+00   .722222200000E+00
+   .100000000000E+01   .626959200000E+00   .650000000000E+00  -.626959200000E+00
+   .722222200000E+00   .100000000000E+01   .650000000000E+00  -.313479600000E+00
+   .722222200000E+00   .100000000000E+01  -.278841600000E+00  -.268018600000E+00
+  -.232371700000E+00  -.157508200000E+00   .100000000000E+01   .250000000000E+00
+  -.824224800000E+00   .500000000000E+00   .100000000000E+01   .250000000000E+00
+  -.824224800000E+00   .500000000000E+00   .100000000000E+01   .250000000000E+00
+  -.824224800000E+00   .500000000000E+00   .100000000000E+01   .250000000000E+00
+  -.824224800000E+00   .500000000000E+00   .100000000000E+01   .250000000000E+00
+   .500000000000E+00   .100000000000E+01  -.158162600000E+00  -.194771100000E+00
+  -.230391700000E+00  -.236284500000E+00  -.180390000000E+00  -.158162600000E+00
+  -.194771100000E+00  -.230391700000E+00  -.236284500000E+00  -.180390000000E+00
+  -.972222200000E+00  -.972222200000E+00   .100000000000E+01  -.972222200000E+00
+  -.972222200000E+00   .100000000000E+01  -.972222200000E+00  -.972222200000E+00
+   .100000000000E+01  -.972222200000E+00  -.972222200000E+00   .100000000000E+01
+  -.972222200000E+00  -.972222200000E+00   .100000000000E+01   .532286400000E-01
+   .757454200000E-01   .106102800000E+00   .133387800000E+00   .131535300000E+00
+  -.106457300000E+00  -.151490800000E+00  -.212205600000E+00  -.266775700000E+00
+  -.263070600000E+00   .186335400000E+01   .472222200000E+00  -.186335400000E+01
+  -.944444400000E+00   .100000000000E+01   .149068300000E+01   .472222200000E+00
+  -.149068300000E+01  -.944444400000E+00   .100000000000E+01   .111801200000E+01
+   .472222200000E+00  -.111801200000E+01  -.944444400000E+00   .100000000000E+01
+   .745341600000E+00   .472222200000E+00  -.745341600000E+00  -.944444400000E+00
+   .100000000000E+01   .472222200000E+00  -.372670800000E+00  -.944444400000E+00
+   .100000000000E+01  -.206995400000E+00  -.235646900000E+00  -.247567500000E+00
+  -.207487300000E+00   .100000000000E+01   .186335400000E+01   .444444400000E+00
+  -.186335400000E+01   .100000000000E+01   .149068300000E+01   .444444400000E+00
+  -.149068300000E+01   .100000000000E+01   .111801200000E+01   .444444400000E+00
+  -.111801200000E+01   .100000000000E+01   .745341600000E+00   .444444400000E+00
+  -.745341600000E+00   .100000000000E+01   .444444400000E+00  -.372670800000E+00
+   .100000000000E+01  -.144335400000E+00  -.191855700000E+00  -.242149800000E+00
+  -.254119300000E+00   .100000000000E+01                                        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,165 @@
+#-------------------------------------------------------------------------------
+# compile the UMFPACK demos (for GNU make and original make)
+#-------------------------------------------------------------------------------
+
+# UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+# All Rights Reserved.  See ../Doc/License for License.
+
+all: umfpack_di_demo umfpack_zi_demo umfpack_dl_demo umfpack_zl_demo \
+	umfpack_simple
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include
+
+INC = ../Include/umfpack.h ../../AMD/Include/amd.h
+
+../Lib/libumfpack.a:
+	( cd ../Source ; make )
+
+../../AMD/Lib/libamd.a:
+	( cd ../../AMD/Source ; make )
+
+UMFPACK = ../Lib/libumfpack.a ../../AMD/Lib/libamd.a
+
+#-------------------------------------------------------------------------------
+# Create the demo programs, run them, and compare the output
+#-------------------------------------------------------------------------------
+
+dist: umfpack_di_demo.c umfpack_dl_demo.c umfpack_zi_demo.c umfpack_zl_demo.c
+
+umfpack_simple: umfpack_simple.c $(INC) $(UMFPACK)
+	$(C) -o umfpack_simple umfpack_simple.c $(UMFPACK) $(LIB)
+	./umfpack_simple
+
+# the GNU rules are simpler:
+# umfpack_%_demo.c: umfpack_xx_demo.c umfpack_%_demo.sed
+# 	- sed -f umfpack_$*_demo.sed < umfpack_xx_demo.c > umfpack_$*_demo.c
+# 
+# umfpack_%_demo: umfpack_%_demo.c $(INC) $(UMFPACK)
+# 	$(C) -o umfpack_$*_demo umfpack_$*_demo.c $(UMFPACK) $(LIB)
+# 	./umfpack_$*_demo > my_umfpack_$*_demo.out
+
+# but do this via brute-force, so we can use just a single Makefile:
+
+# double-precision, int verion:
+umfpack_di_demo.c: umfpack_xx_demo.c umfpack_di_demo.sed
+	- sed -f umfpack_di_demo.sed < umfpack_xx_demo.c > umfpack_di_demo.c
+
+umfpack_di_demo: umfpack_di_demo.c $(INC) $(UMFPACK)
+	$(C) -o umfpack_di_demo umfpack_di_demo.c $(UMFPACK) $(LIB)
+	./umfpack_di_demo > my_umfpack_di_demo.out
+	- diff umfpack_di_demo.out my_umfpack_di_demo.out
+
+# double-precision, long verion:
+umfpack_dl_demo.c: umfpack_xx_demo.c umfpack_dl_demo.sed
+	- sed -f umfpack_dl_demo.sed < umfpack_xx_demo.c > umfpack_dl_demo.c
+
+umfpack_dl_demo: umfpack_dl_demo.c $(INC) $(UMFPACK)
+	$(C) -o umfpack_dl_demo umfpack_dl_demo.c $(UMFPACK) $(LIB)
+	./umfpack_dl_demo > my_umfpack_dl_demo.out
+	- diff umfpack_dl_demo.out my_umfpack_dl_demo.out
+
+# complex, int verion:
+umfpack_zi_demo.c: umfpack_xx_demo.c umfpack_zi_demo.sed
+	- sed -f umfpack_zi_demo.sed < umfpack_xx_demo.c > umfpack_zi_demo.c
+
+umfpack_zi_demo: umfpack_zi_demo.c $(INC) $(UMFPACK)
+	$(C) -o umfpack_zi_demo umfpack_zi_demo.c $(UMFPACK) $(LIB)
+	./umfpack_zi_demo > my_umfpack_zi_demo.out
+	- diff umfpack_zi_demo.out my_umfpack_zi_demo.out
+
+# complex, long verion:
+umfpack_zl_demo.c: umfpack_xx_demo.c umfpack_zl_demo.sed
+	- sed -f umfpack_zl_demo.sed < umfpack_xx_demo.c > umfpack_zl_demo.c
+
+umfpack_zl_demo: umfpack_zl_demo.c $(INC) $(UMFPACK)
+	$(C) -o umfpack_zl_demo umfpack_zl_demo.c $(UMFPACK) $(LIB)
+	./umfpack_zl_demo > my_umfpack_zl_demo.out
+	- diff umfpack_zl_demo.out my_umfpack_zl_demo.out
+
+#-------------------------------------------------------------------------------
+# create a demo program that reads in Harwell/Boeing matrices, and run it
+#-------------------------------------------------------------------------------
+
+# the output of "make hb" is in the file umf4.out
+hb: $(UMFPACK) umf4 readhb readhb_nozeros readhb_size
+	- ./readhb_nozeros < HB/can_24.psa > tmp/A
+	- ./readhb_size    < HB/can_24.psa > tmp/Asize
+	- ./umf4
+	- ./readhb_nozeros < HB/west0067.rua > tmp/A
+	- ./readhb_size    < HB/west0067.rua > tmp/Asize
+	- ./umf4
+	- ./readhb_nozeros < HB/fs_183_6.rua > tmp/A
+	- ./readhb_size    < HB/fs_183_6.rua > tmp/Asize
+	- ./umf4
+	- ./readhb         < HB/fs_183_6.rua > tmp/A
+	- ./readhb_size    < HB/fs_183_6.rua > tmp/Asize
+	- ./umf4
+	- ./readhb         < HB/arc130.rua > tmp/A
+	- ./readhb_size    < HB/arc130.rua > tmp/Asize
+	- ./umf4
+	- ./readhb_nozeros < HB/arc130.rua > tmp/A
+	- ./readhb_size    < HB/arc130.rua > tmp/Asize
+	- ./umf4
+	- ./readhb_nozeros < HB/arc130.rua > tmp/A
+	- ./readhb_size    < HB/arc130.rua > tmp/Asize
+	- ./umf4 a 1e-6
+
+umf4: umf4.c $(UMFPACK)
+	$(C) -o umf4 umf4.c $(UMFPACK) $(LIB)
+
+readhb:  readhb.f
+	$(F77) $(F77FLAGS) -o readhb readhb.f $(F77LIB)
+
+readhb_size:  readhb_size.f
+	$(F77) $(F77FLAGS) -o readhb_size readhb_size.f $(F77LIB)
+
+readhb_nozeros:  readhb_nozeros.f
+	$(F77) $(F77FLAGS) -o readhb_nozeros readhb_nozeros.f $(F77LIB)
+
+#-------------------------------------------------------------------------------
+# compile the FORTRAN interface and demo
+#-------------------------------------------------------------------------------
+
+fortran: $(UMFPACK) umf4hb.f umf4_f77wrapper.o umf4zhb.f umf4_f77zwrapper.o $(UMFPACK)
+	$(F77) $(F77FLAGS) -o umf4hb umf4hb.f umf4_f77wrapper.o \
+	    $(UMFPACK) $(LIB)
+	- ./umf4hb < HB/west0067.rua > my_umf4hb.out
+	- diff my_umf4hb.out umf4hb.out
+	$(F77) $(F77FLAGS) -o umf4zhb umf4zhb.f umf4_f77zwrapper.o \
+	    $(UMFPACK) $(LIB)
+	- ./umf4zhb < HB/qc324.cua > my_umf4zhb.out
+	- diff my_umf4zhb.out umf4zhb.out
+
+fortran64: $(UMFPACK) umf4hb64.f umf4_f77wrapper64.o umf4_f77zwrapper64.o $(UMFPACK)
+	$(F77) $(F77FLAGS) -o umf4hb64 umf4hb64.f umf4_f77wrapper64.o \
+	    $(UMFPACK) $(LIB)
+	- ./umf4hb64 < HB/west0067.rua > my_umf4hb64.out
+	- diff my_umf4hb64.out umf4hb64.out
+
+umf4_f77wrapper.o: umf4_f77wrapper.c $(INC)
+	$(C) -c umf4_f77wrapper.c -o umf4_f77wrapper.o
+
+umf4_f77zwrapper.o: umf4_f77zwrapper.c $(INC)
+	$(C) -c umf4_f77zwrapper.c -o umf4_f77zwrapper.o
+
+umf4_f77wrapper64.o: umf4_f77wrapper.c $(INC)
+	$(C) -DDLONG -c umf4_f77wrapper.c -o umf4_f77wrapper64.o
+
+umf4_f77zwrapper64.o: umf4_f77zwrapper.c $(INC)
+	$(C) -DDLONG -c umf4_f77zwrapper.c -o umf4_f77zwrapper64.o
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) umfpack_simple a.out
+	- $(RM) umfpack_di_demo my_umfpack_di_demo.out
+	- $(RM) umfpack_dl_demo my_umfpack_dl_demo.out
+	- $(RM) umfpack_zi_demo my_umfpack_zi_demo.out
+	- $(RM) umfpack_zl_demo my_umfpack_zl_demo.out
+	- $(RM) umf4hb umf4zhb *.umf my_umf4hb.out
+	- $(RM) umf4hb64 my_umf4hb64.out my_umf4zhb.out
+	- $(RM) umf4 readhb readhb_nozeros readhb_size tmp/*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,115 @@
+c=======================================================================
+c== readhb =============================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c readhb:
+c       read a sparse matrix in the Harwell/Boeing format and
+c       output a matrix in triplet format.
+c
+c usage (for example):
+c
+c       in a Unix shell:
+c       readhb < HB/arc130.rua > tmp/A
+c
+c       Then, in MATLAB, you can do the following:
+c       >> load tmp/A
+c       >> A = spconvert (A) ;
+c       >> spy (A)
+
+        integer nzmax, nmax
+        parameter (nzmax = 10000000, nmax = 250000)
+        integer Ptr (nmax), Index (nzmax), n, nz, totcrd, ptrcrd,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, row, col, p
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        logical sym
+        double precision Value (nzmax), skew
+        character rhstyp*3
+        integer nzrhs, nel
+
+        integer ne, nnz
+
+c-----------------------------------------------------------------------
+
+c       read header information from Harwell/Boeing matrix
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp,nrhs,nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        skew = 0.0
+        if (type (2:2) .eq. 'Z' .or. type (2:2) .eq. 'z') skew = -1.0
+        if (type (2:2) .eq. 'S' .or. type (2:2) .eq. 's') skew =  1.0
+        sym = skew .ne. 0.0
+
+        write (0, 31) key
+31      format ('Matrix key: ', a8)
+
+        n = max (nrow, ncol)
+
+        if (n .ge. nmax .or. nz .gt. nzmax) then
+           write (0, *) 'Matrix too big!'
+           write (0, *) '(recompile readhb.f with larger nzmax, nmax)'
+           stop
+        endif
+
+        read (5, ptrfmt, err = 998) (Ptr (p), p = 1, ncol+1)
+        read (5, indfmt, err = 998) (Index (p), p = 1, nz)
+
+        do 55 col = ncol+2, n+1
+           Ptr (col) = Ptr (ncol+1)
+55      continue
+
+c       read the values
+        if (valcrd .gt. 0) then
+           read (5, valfmt, err = 998) (Value (p), p = 1, nz)
+        else
+           do 50 p = 1, nz
+              Value (p) = 1
+50         continue
+        endif
+
+c  create the triplet form of the input matrix
+
+        ne = 0
+        nnz = 0
+        do 100 col = 1, n
+           do 90 p = Ptr (col), Ptr (col+1) - 1
+              row = Index (p)
+
+              ne = ne + 1
+                  nnz = nnz + 1
+                  write (6, 200) row, col, Value (p)
+
+              if (sym .and. row .ne. col) then
+                 ne = ne + 1
+                 if (Value (p) .ne. 0) then
+                    nnz = nnz + 1
+                    write (6, 200) col, row, skew * Value (p)
+                 endif
+              endif
+
+90            continue
+100        continue
+200     format (2i7, e30.18e3)
+
+c       write (0,*) 'Number of entries: ',ne,' True nonzeros: ', nnz
+        stop
+
+998     write (0,*) 'Read error: Harwell/Boeing matrix'
+        stop
+        end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb_nozeros.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,122 @@
+c=======================================================================
+c== readhb_nozeros =====================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c readhb_nozeros:
+c       read a sparse matrix in the Harwell/Boeing format and
+c       output a matrix in triplet format.
+c       Identical to readhb, except that this version removes explicit
+c       zero entries from the matrix.
+c
+c usage (for example):
+c
+c       in a Unix shell:
+c       readhb_nozeros < HB/arc130.rua > tmp/A
+c
+c       Then, in MATLAB, you can do the following:
+c       >> load tmp/A
+c       >> A = spconvert (A) ;
+c       >> spy (A)
+
+        integer nzmax, nmax
+        parameter (nzmax = 10000000, nmax = 250000)
+        integer Ptr (nmax), Index (nzmax), n, nz, totcrd, ptrcrd,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, row, col, p
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        logical sym
+        double precision Value (nzmax), skew
+        character rhstyp*3
+        integer nzrhs, nel
+
+        integer ne, nnz
+
+c-----------------------------------------------------------------------
+
+c       read header information from Harwell/Boeing matrix
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp,nrhs,nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        skew = 0.0
+        if (type (2:2) .eq. 'Z' .or. type (2:2) .eq. 'z') skew = -1.0
+        if (type (2:2) .eq. 'S' .or. type (2:2) .eq. 's') skew =  1.0
+        sym = skew .ne. 0.0
+
+        write (0, 31) key
+31      format ('Matrix key: ', a8)
+
+        n = max (nrow, ncol)
+
+        if (n .ge. nmax .or. nz .gt. nzmax) then
+           write (0, *) 'Matrix too big!'
+           write (0, *) '(recompile readhb_nozeros.f with larger',
+     $		' nzmax, nmax)'
+           stop
+        endif
+
+        read (5, ptrfmt, err = 998) (Ptr (p), p = 1, ncol+1)
+        read (5, indfmt, err = 998) (Index (p), p = 1, nz)
+
+        do 55 col = ncol+2, n+1
+           Ptr (col) = Ptr (ncol+1)
+55      continue
+
+c       read the values
+        if (valcrd .gt. 0) then
+           read (5, valfmt, err = 998) (Value (p), p = 1, nz)
+        else
+           do 50 p = 1, nz
+              Value (p) = 1
+50         continue
+        endif
+
+c  create the triplet form of the input matrix
+
+        ne = 0
+        nnz = 0
+        do 100 col = 1, n
+           do 90 p = Ptr (col), Ptr (col+1) - 1
+              row = Index (p)
+
+c             remove zeros, to compare fairly with LU in MATLAB
+c             (MATLAB always removes explicit zeros)
+              ne = ne + 1
+              if (Value (p) .ne. 0) then
+                  nnz = nnz + 1
+                  write (6, 200) row, col, Value (p)
+              endif
+
+              if (sym .and. row .ne. col) then
+                 ne = ne + 1
+                 if (Value (p) .ne. 0) then
+                    nnz = nnz + 1
+                    write (6, 200) col, row, skew * Value (p)
+                 endif
+              endif
+
+90            continue
+100        continue
+200     format (2i7, e30.18e3)
+
+c       write (0,*) 'Number of entries: ',ne,' True nonzeros: ', nnz
+        stop
+
+998     write (0,*) 'Read error: Harwell/Boeing matrix'
+        stop
+        end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/readhb_size.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,47 @@
+c=======================================================================
+c== readhb_size ========================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c readhb_size:
+c       read a sparse matrix in the Harwell/Boeing format and output the
+c       size of the matrix (# rows, # columns, and # of entries)
+c
+c usage (for example):
+c
+c       readhb_size < HB/arc130.rua > tmp/Asize
+
+        integer nz, totcrd, ptrcrd,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        character rhstyp*3
+        integer nzrhs, nel
+
+c-----------------------------------------------------------------------
+
+c       read header information from Harwell/Boeing matrix
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp,nrhs,nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        write (6, *) nrow, ncol, nz
+        stop
+998     write (0, *) 'Read error'
+        stop
+        end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/simple_compile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,108 @@
+#!/bin/csh
+
+# This one-line command compiles all of UMFPACK and the double/int demo.
+# It forms a useful prototype for Microsoft Visual Studio, which does not
+# have the flexibility of Unix/Linux "make".  The latter can be configured
+# to compile one file multiple times (as required by UMFPACK).  Here,
+# that requirement is solved with a single file, umf_multicompile.c.
+#
+# No BLAS is used here.
+
+cc -DDINT -DNBLAS \
+    -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source \
+	umfpack_di_demo.c \
+	../Source/umf_multicompile.c \
+	../Source/umf_ltsolve.c \
+	../Source/umf_utsolve.c \
+	../Source/umf_triplet.c \
+	../Source/umf_assemble.c \
+	../Source/umf_store_lu.c \
+	../Source/umfpack_solve.c \
+	../../AMD/Source/amd_1.c \
+	../../AMD/Source/amd_2.c \
+	../../AMD/Source/amd_aat.c \
+	../../AMD/Source/amd_control.c \
+	../../AMD/Source/amd_defaults.c \
+	../../AMD/Source/amd_dump.c \
+	../../AMD/Source/amd_info.c \
+	../../AMD/Source/amd_order.c \
+	../../AMD/Source/amd_post_tree.c \
+	../../AMD/Source/amd_postorder.c \
+	../../AMD/Source/amd_preprocess.c \
+	../../AMD/Source/amd_valid.c \
+	../Source/umf_2by2.c \
+	../Source/umf_analyze.c \
+	../Source/umf_apply_order.c \
+	../Source/umf_blas3_update.c \
+	../Source/umf_build_tuples.c \
+	../Source/umf_colamd.c \
+	../Source/umf_create_element.c \
+	../Source/umf_dump.c \
+	../Source/umf_extend_front.c \
+	../Source/umf_free.c \
+	../Source/umf_fsize.c \
+	../Source/umf_garbage_collection.c \
+	../Source/umf_get_memory.c \
+	../Source/umf_grow_front.c \
+	../Source/umf_init_front.c \
+	../Source/umf_is_permutation.c \
+	../Source/umf_kernel.c \
+	../Source/umf_kernel_init.c \
+	../Source/umf_kernel_wrapup.c \
+	../Source/umf_local_search.c \
+	../Source/umf_lsolve.c \
+	../Source/umf_malloc.c \
+	../Source/umf_mem_alloc_element.c \
+	../Source/umf_mem_alloc_head_block.c \
+	../Source/umf_mem_alloc_tail_block.c \
+	../Source/umf_mem_free_tail_block.c \
+	../Source/umf_mem_init_memoryspace.c \
+	../Source/umf_realloc.c \
+	../Source/umf_report_perm.c \
+	../Source/umf_report_vector.c \
+	../Source/umf_row_search.c \
+	../Source/umf_scale.c \
+	../Source/umf_scale_column.c \
+	../Source/umf_set_stats.c \
+	../Source/umf_singletons.c \
+	../Source/umf_solve.c \
+	../Source/umf_start_front.c \
+	../Source/umf_symbolic_usage.c \
+	../Source/umf_transpose.c \
+	../Source/umf_tuple_lengths.c \
+	../Source/umf_usolve.c \
+	../Source/umf_valid_numeric.c \
+	../Source/umf_valid_symbolic.c \
+	../Source/umfpack_col_to_triplet.c \
+	../Source/umfpack_defaults.c \
+	../Source/umfpack_free_numeric.c \
+	../Source/umfpack_free_symbolic.c \
+	../Source/umfpack_get_determinant.c \
+	../Source/umfpack_get_lunz.c \
+	../Source/umfpack_get_numeric.c \
+	../Source/umfpack_get_symbolic.c \
+	../Source/umfpack_load_numeric.c \
+	../Source/umfpack_load_symbolic.c \
+	../Source/umfpack_numeric.c \
+	../Source/umfpack_qsymbolic.c \
+	../Source/umfpack_report_control.c \
+	../Source/umfpack_report_info.c \
+	../Source/umfpack_report_matrix.c \
+	../Source/umfpack_report_numeric.c \
+	../Source/umfpack_report_perm.c \
+	../Source/umfpack_report_status.c \
+	../Source/umfpack_report_symbolic.c \
+	../Source/umfpack_report_triplet.c \
+	../Source/umfpack_report_vector.c \
+	../Source/umfpack_save_numeric.c \
+	../Source/umfpack_save_symbolic.c \
+	../Source/umfpack_scale.c \
+	../Source/umfpack_symbolic.c \
+	../Source/umfpack_tictoc.c \
+	../Source/umfpack_timer.c \
+	../Source/umfpack_transpose.c \
+	../Source/umfpack_triplet_to_col.c \
+    -lm
+
+# now run the demo
+./a.out
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,649 @@
+/* ========================================================================== */
+/* === umf4 ================================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Demo program for UMFPACK.  Reads in a triplet-form matrix in the
+ * directory tmp/A, whose size and # of nonzeros are in the file tmp/Asize.
+ * Then calls UMFPACK to analyze, factor, and solve the system.
+ *
+ * Syntax:
+ *
+ *	umf4		default "auto" strategy, 1-norm row scaling
+ *	umf4 a		default "auto" strategy, 1-norm row scaling
+ *	umf4 u		unsymmetric strategy, 1-norm row scaling
+ *	umf4 s		symmetric strategy, 1-norm row scaling
+ *	umf4 2		2-by-2 strategy, maxnorm row scaling
+ *	umf4 A		default "auto" strategy, maxnorm row scaling
+ *	umf4 U		unsymmetric strategy, maxnorm row scaling
+ *	umf4 S		symmetric strategy, maxnorm row scaling
+ *	umf4 T		2-by-2 strategy , maxnorm row scaling
+ *
+ * To test a matrix in the Harwell/Boeing format, do the following:
+ *
+ *	readhb < HB/arc130.rua > tmp/A
+ *	readhb_size < HB/arc130.rua > tmp/Asize
+ *	umf4
+ *
+ * The above options do not drop any nonzero entry in L or U.  To compute an
+ * incomplete factorization, you can add a second argument to give the drop
+ * tolerance.  Entries less than or equal to the drop tolerance are then
+ * removed from L and U during factorization, unless dropping those entries
+ * does not save any memory space.  For example:
+ *
+ *	umf4 a 1e-6	default "auto" strategy, 1-norm row scaling,
+ *			drop tolerance of 1e-6.
+ *
+ * Note that adding a drop tolerance can lead to an apparent (but not real)
+ * increase in peak memory usage.  This is illustrated in the arc130.rua
+ * matrix.  With a drop tolerance, garbage collection happens to be avoided
+ * for this matrix.  During garbage collection, both internal and external
+ * fragmentation in the memory space is removed.  Peak memory usage includes
+ * all internal memory fragmentation, even though this can be removed via
+ * garbage collection.
+ *
+ * Control parameters can also be set in the optional tmp/control.umf4 file.
+ * The right-hand-side can be provided in the optional tmp/b file.  The solution
+ * is written to tmp/x, and the output statistics are written to tmp/info.umf4.
+ *
+ * After the matrix is factorized, solved, and the LU factors deallocated,
+ * this program then test the AMD ordering routine.  This call to AMD is NOT
+ * part of the UMFPACK analysis, factorize, or solve steps.  It is just a
+ * separate test of the AMD ordering routine.  If the matrix is unsymmetric,
+ * AMD orders the pattern of A+A'.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "umfpack.h"
+#include "amd.h"
+
+#define SMAX 256
+#define ABS(x) ((x) >= 0 ? (x) : -(x))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+
+#define XTRUE(i,n) (1.0 + ((double) i) / ((double) n))
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* err: compute the relative error, ||x-xtrue||/||xtrue|| */
+/* -------------------------------------------------------------------------- */
+
+static double err
+(
+    int n,
+    double x [ ]
+)
+{
+    int i  ;
+    double enorm, e, abse, absxtrue, xnorm ;
+    enorm = 0 ;
+    xnorm = 0 ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	if (isnan (x [i]))
+	{
+	    enorm = x [i] ;
+	    break ;
+	}
+	e = x [i] - XTRUE (i,n) ;
+	abse = ABS (e) ;
+	enorm = MAX (enorm, abse) ;
+    }
+
+    for (i = 0 ; i < n ; i++)
+    {
+	/* XTRUE is positive, but do this in case XTRUE is redefined */
+	absxtrue = ABS (XTRUE (i,n)) ;
+	xnorm = MAX (xnorm, absxtrue) ;
+    }
+
+    if (xnorm == 0)
+    {
+	xnorm = 1 ;
+    }
+    return (enorm / xnorm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the relative residual, ||Ax-b||/||b|| or ||A'x-b||/||b|| */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    int n,
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ],
+    double x [ ],
+    double r [ ],
+    double b [ ],
+    int transpose
+)
+{
+    int i, j, p ;
+    double rnorm, absr, absb, bnorm ;
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = 0 ;
+    }
+
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [j] += Ax [p] * x [i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+	    }
+	}
+    }
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] -= b [i] ;
+    }
+    rnorm = 0. ;
+    bnorm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	if (isnan (r [i]))
+	{
+	    rnorm = r [i] ;
+	    break ;
+	}
+	absr = ABS (r [i]) ;
+	rnorm = MAX (rnorm, absr) ;
+    }
+    for (i = 0 ; i < n ; i++)
+    {
+	if (isnan (b [i]))
+	{
+	    bnorm = b [i] ;
+	    break ;
+	}
+	absb = ABS (b [i]) ;
+	bnorm = MAX (bnorm, absb) ;
+    }
+    if (bnorm == 0)
+    {
+	bnorm = 1 ;
+    }
+    return (rnorm / bnorm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* Atimesx: compute y = A*x  or A'*x, where x (i) = 1 + i/n */
+/* -------------------------------------------------------------------------- */
+
+static void Atimesx
+(
+    int n,
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ],
+    double y [ ],
+    int transpose
+)
+{
+    int i, j, p ;
+    for (i = 0 ; i < n ; i++)
+    {
+	y [i] = 0 ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		y [j] += Ax [p] * XTRUE (i,n) ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		y [i] += Ax [p] * XTRUE (j,n) ;
+	    }
+	}
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    int i, j, k, n, nz, *Ap, *Ai, *Ti, *Tj, status, *Pamd, nrow, ncol, rhs ;
+    double *Ax, *b, *x, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], aij,
+	*Tx, *r, amd_Control [AMD_CONTROL], amd_Info [AMD_INFO], tamd [2],
+	stats [2], droptol ;
+    void *Symbolic, *Numeric ;
+    FILE *f, *f2 ;
+    char s [SMAX] ;
+
+    /* ---------------------------------------------------------------------- */
+    /* set controls */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\n===========================================================\n"
+	    "=== UMFPACK v4.4 ==========================================\n"
+	    "===========================================================\n") ;
+
+    umfpack_di_defaults (Control) ;
+    Control [UMFPACK_PRL] = 3 ;
+    Control [UMFPACK_BLOCK_SIZE] = 32 ;
+
+    f = fopen ("tmp/control.umf4", "r") ;
+    if (f != (FILE *) NULL)
+    {
+	printf ("Reading control file tmp/control.umf4\n") ;
+	for (i = 0 ; i < UMFPACK_CONTROL ; i++)
+	{
+	    fscanf (f, "%lg\n", & Control [i]) ;
+	}
+	fclose (f) ;
+    }
+
+    if (argc > 1)
+    {
+	char *s = argv [1] ;
+
+	/* get the strategy */
+	if (s [0] == 'u')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	}
+	else if (s [0] == 'a')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_AUTO ;
+	}
+	else if (s [0] == 's')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_SYMMETRIC ;
+	}
+	else if (s [0] == '2')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_2BY2 ;
+	}
+	else if (s [0] == 'U')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	    Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ;
+	}
+	else if (s [0] == 'A')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_AUTO ;
+	    Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ;
+	}
+	else if (s [0] == 'S')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_SYMMETRIC ;
+	    Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ;
+	}
+	else if (s [0] == 'T')
+	{
+	    Control [UMFPACK_STRATEGY] = UMFPACK_STRATEGY_2BY2 ;
+	    Control [UMFPACK_SCALE] = UMFPACK_SCALE_MAX ;
+	}
+	else
+	{
+	    printf ("unrecognized strategy: %s\n", argv [1]) ;
+	}
+
+	if (s [1] == 'n')
+	{
+	    /* no aggressive absorption */
+	    Control [UMFPACK_AGGRESSIVE] = FALSE ;
+	}
+    }
+
+    if (argc > 2)
+    {
+	/* get the drop tolerance */
+	sscanf (argv [2], "%lg", &droptol) ;
+	printf ("droptol %g\n", droptol) ;
+	Control [UMFPACK_DROPTOL] = droptol ;
+    }
+
+    umfpack_di_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* open the matrix file (tmp/A) */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("File: tmp/A\n") ;
+    f = fopen ("tmp/A", "r") ;
+    if (!f)
+    {
+	printf ("Unable to open file\n") ;
+	exit (1) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* get n and nz */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("File: tmp/Asize\n") ;
+    f2 = fopen ("tmp/Asize", "r") ;
+    if (f2)
+    {
+	fscanf (f2, "%d %d %d\n", &nrow, &ncol, &nz) ;
+	fclose (f2) ;
+    }
+    else
+    {
+	nrow = 1 ;
+	ncol = 1 ;
+    }
+    nz = 0 ;
+    while (fgets (s, SMAX, f) != (char *) NULL)
+    {
+	sscanf (s, "%d %d %lg", &i, &j, &aij) ;
+#ifdef ZERO_BASED
+	/* matrix is zero based */
+	i++ ;
+	j++ ;
+#endif
+	nrow = MAX (nrow, i) ;
+	ncol = MAX (ncol, j) ;
+	nz++ ;
+    }
+    fclose (f) ;
+    n = MAX (nrow, ncol) ;
+
+    printf ("n %d nrow %d ncol %d nz %d\n", n, nrow, ncol, nz) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate space for the input triplet form */
+    /* ---------------------------------------------------------------------- */
+
+    Ti = (int *) malloc (nz * sizeof (int)) ;
+    Tj = (int *) malloc (nz * sizeof (int)) ;
+    Tx = (double *) malloc (nz * sizeof (double)) ;
+    if (!Ti || !Tj || !Tx)
+    {
+	printf ("out of memory for input matrix\n") ;
+	exit (1) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* read in the triplet form */
+    /* ---------------------------------------------------------------------- */
+
+    f2 = fopen ("tmp/A", "r") ;
+    if (!f2)
+    {
+	printf ("Unable to open file\n") ;
+	exit (1) ;
+    }
+
+    k = 0 ;
+    while (fgets (s, SMAX, f2) != (char *) NULL)
+    {
+	sscanf (s, "%d %d %lg", &i, &j, &aij) ;
+#ifndef ZERO_BASED
+	i-- ;	/* convert to 0-based */
+	j-- ;
+#endif
+	if (k >= nz)
+	{
+	    printf ("Error!  Matrix size is wrong\n") ;
+	    exit (1) ;
+	}
+	Ti [k] = i ;
+	Tj [k] = j ;
+	Tx [k] = aij ;
+	k++ ;
+    }
+    fclose (f2) ;
+
+    (void) umfpack_di_report_triplet (nrow, ncol, nz, Ti, Tj, Tx, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert to column form */
+    /* ---------------------------------------------------------------------- */
+
+    /* convert to column form */
+    Ap = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ai = (int *) malloc (nz * sizeof (int)) ;
+    Ax = (double *) malloc (nz * sizeof (double)) ;
+    b = (double *) malloc (n * sizeof (double)) ;
+    r = (double *) malloc (n * sizeof (double)) ;
+    x = (double *) malloc (n * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax || !b || !r)
+    {
+	printf ("out of memory") ;
+	exit (1) ;
+    }
+    umfpack_tic (stats) ;
+    status = umfpack_di_triplet_to_col (nrow, ncol, nz, Ti, Tj, Tx, Ap, Ai, Ax,
+	(int *) NULL) ;
+    umfpack_toc (stats) ;
+    printf ("triplet-to-col time: wall %g cpu %g\n", stats [0], stats [1]) ;
+    if (status != UMFPACK_OK)
+    {
+	umfpack_di_report_status (Control, status) ;
+	printf ("umfpack_di_triplet_to_col failed") ;
+	exit (1) ;
+    }
+
+    /* print the column-form of A */
+    (void) umfpack_di_report_matrix (nrow, ncol, Ap, Ai, Ax, 1, Control) ;
+
+    /* b = A * xtrue */
+    rhs = FALSE ;
+    if (nrow == ncol)
+    {
+	f = fopen ("tmp/b", "r") ;
+	if (f != (FILE *) NULL)
+	{
+	    printf ("Reading tmp/b\n") ;
+	    rhs = TRUE ;
+	    for (i = 0 ; i < n ; i++)
+	    {
+		fscanf (f, "%lg\n", &b [i]) ;
+	    }
+	    fclose (f) ;
+	}
+	else
+	{
+	    Atimesx (n, Ap, Ai, Ax, b, FALSE) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the triplet form */
+    /* ---------------------------------------------------------------------- */
+
+    free (Ti) ;
+    free (Tj) ;
+    free (Tx) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_symbolic (nrow, ncol, Ap, Ai, Ax, &Symbolic,
+	    Control, Info) ;
+
+    umfpack_di_report_info (Control, Info) ;
+    if (status != UMFPACK_OK)
+    {
+	umfpack_di_report_status (Control, status) ;
+	printf ("umfpack_di_symbolic failed") ;
+	exit (1) ;
+    }
+
+    /* print the symbolic factorization */
+    (void) umfpack_di_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info);
+    if (status < UMFPACK_OK)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	fprintf (stderr, "umfpack_di_numeric failed: %d\n", status) ;
+	printf ("umfpack_di_numeric failed\n") ;
+	exit (1) ;
+    }
+
+    /* print the numeric factorization */
+    (void) umfpack_di_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    if (nrow == ncol && status == UMFPACK_OK)
+    {
+	status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric,
+		Control, Info) ;
+
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	if (status < UMFPACK_OK)
+	{
+	    printf ("umfpack_di_solve failed\n") ;
+	    exit (1) ;
+	}
+	(void) umfpack_di_report_vector (n, x, Control) ;
+	printf ("relative maxnorm of residual, ||Ax-b||/||b||: %g\n",
+	    resid (n, Ap, Ai, Ax, x, r, b, FALSE)) ;
+	if (!rhs)
+	{
+	    printf ("relative maxnorm of error, ||x-xtrue||/||xtrue||: %g\n\n",
+		err (n, x)) ;
+	}
+
+	f = fopen ("tmp/x", "w") ;
+	if (f != (FILE *) NULL)
+	{
+	    printf ("Writing tmp/x\n") ;
+	    for (i = 0 ; i < n ; i++)
+	    {
+		fprintf (f, "%30.20e\n", x [i]) ;
+	    }
+	    fclose (f) ;
+	}
+	else
+	{
+	    printf ("Unable to write output x!\n") ;
+	    exit (1) ;
+	}
+
+	f = fopen ("tmp/info.umf4", "w") ;
+	if (f != (FILE *) NULL)
+	{
+	    printf ("Writing tmp/info.umf4\n") ;
+	    for (i = 0 ; i < UMFPACK_INFO ; i++)
+	    {
+		fprintf (f, "%30.20e\n", Info [i]) ;
+	    }
+	    fclose (f) ;
+	}
+	else
+	{
+	    printf ("Unable to write output info!\n") ;
+	    exit (1) ;
+	}
+    }
+    else
+    {
+	/* don't solve, just report the results */
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the Symbolic and Numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_di_free_symbolic (&Symbolic) ;
+    umfpack_di_free_numeric (&Numeric) ;
+
+    printf ("umf4 done, strategy: %g\n", Control [UMFPACK_STRATEGY]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* test just AMD ordering (not part of UMFPACK, but a separate test) */
+    /* ---------------------------------------------------------------------- */
+
+    /* first make the matrix square */
+    if (ncol < n)
+    {
+	for (j = ncol+1 ; j <= n ; j++)
+	{
+	    Ap [j] = Ap [ncol] ;
+	}
+    }
+
+    printf (
+	"\n\n===========================================================\n"
+	"=== AMD ===================================================\n"
+	"===========================================================\n") ;
+    printf ("\n\n------- Now trying the AMD ordering.  This not part of\n"
+	"the UMFPACK analysis or factorization, above, but a separate\n"
+	"test of just the AMD ordering routine.\n") ;
+	Pamd = (int *) malloc (n * sizeof (int)) ;
+    if (!Pamd)
+    {
+	printf ("out of memory\n") ;
+	exit (1) ;
+    }
+    amd_defaults (amd_Control) ;
+    amd_control (amd_Control) ;
+    umfpack_tic (tamd) ;
+    status = amd_order (n, Ap, Ai, Pamd, amd_Control, amd_Info) ;
+    umfpack_toc (tamd) ;
+    printf ("AMD ordering time: cpu %10.2f wall %10.2f\n",
+	tamd [1], tamd [0]) ;
+    if (status != AMD_OK)
+    {
+	printf ("amd failed: %d\n", status) ;
+	exit (1) ;
+    }
+    amd_info (amd_Info) ;
+    free (Pamd) ;
+    printf ("AMD test done\n") ;
+
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1970 @@
+cc -O -DNBLAS -I../Include -I../../AMD/Include -o umf4 umf4.c ../Lib/libumfpack.a ../../AMD/Lib/libamd.a -lm
+f77 -O -o readhb readhb.f 
+f77 -O -o readhb_nozeros readhb_nozeros.f 
+f77 -O -o readhb_size readhb_size.f 
+./readhb_nozeros < HB/can_24.psa > tmp/A
+Matrix key: CAN   24
+./readhb_size    < HB/can_24.psa > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 24 nrow 24 ncol 24 nz 160
+triplet-form matrix, n_row = 24, n_col = 24 nz = 160. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 24 n_col 24, nz = 160. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       24
+    number of columns in matrix A:    24
+    entries in matrix A:              160
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               0
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    24
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               136
+        nz on diagonal of matrix S:                24
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.00300e+03
+        est. nz in L+U (incl. diagonal):           218
+        est. largest front (# entries):            64
+        est. max nz in any column of L:            8
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 718
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         124
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                     739                    -      -
+        peak size (Units)                       3244                    -      -
+        final size (Units)                       393                    -      -
+    Numeric final size (Units)                   591                    -      -
+    Numeric final size (MBytes)                  0.0                    -      -
+    peak memory usage (Units)                   3826                    -      -
+    peak memory usage (MBytes)                   0.0                    -      -
+    numeric factorization flops          2.37900e+03                    -      -
+    nz in L (incl diagonal)                      149                    -      -
+    nz in U (incl diagonal)                      208                    -      -
+    nz in L+U (incl diagonal)                    333                    -      -
+    largest front (# entries)                    182                    -      -
+    largest # rows in front                       13                    -      -
+    largest # columns in front                    14                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       24
+    number of columns in matrix A:    24
+    entries in matrix A:              160
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               0
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    24
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               136
+        nz on diagonal of matrix S:                24
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.00300e+03
+        est. nz in L+U (incl. diagonal):           218
+        est. largest front (# entries):            64
+        est. max nz in any column of L:            8
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 718
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         124
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              9.00000e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                     739                  712    96%
+        peak size (Units)                       3244                 2712    84%
+        final size (Units)                       393                  179    46%
+    Numeric final size (Units)                   591                  365    62%
+    Numeric final size (MBytes)                  0.0                  0.0    62%
+    peak memory usage (Units)                   3826                 3294    86%
+    peak memory usage (MBytes)                   0.0                  0.0    86%
+    numeric factorization flops          2.37900e+03          3.32000e+02    14%
+    nz in L (incl diagonal)                      149                   78    52%
+    nz in U (incl diagonal)                      208                   86    41%
+    nz in L+U (incl diagonal)                    333                  140    42%
+    largest front (# entries)                    182                   78    43%
+    largest # rows in front                       13                    7    54%
+    largest # columns in front                    14                   13    93%
+
+    initial allocation ratio used:                 1.2
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 10
+    nz in L (incl diagonal), if none dropped       78
+    nz in U (incl diagonal), if none dropped       86
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     24
+    min abs. value on diagonal of U:               1.11e-01
+    max abs. value on diagonal of U:               2.50e-01
+    estimate of reciprocal of condition number:    4.44e-01
+    indices in compressed pattern:                 92
+    numerical values stored in Numeric object:     140
+    numeric factorization defragmentations:        0
+    numeric factorization reallocations:           0
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.13600e+03
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  1.22e-16
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.46800e+03
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 24. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.2919e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.1716e-15
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  24
+    nz, number of nonzeros in A:                        160
+    symmetry of A:                                      1.0000
+    number of nonzeros on diagonal:                     24
+    nonzeros in pattern of A+A' (excl. diagonal):       136
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              1516
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 97
+    nonzeros in L (including diagonal):                 121
+    # divide operations for LDL' or LU:                 97
+    # multiply-subtract operations for LDL':            275
+    # multiply-subtract operations for LU:              453
+    max nz. in any column of L (incl. diagonal):        8
+
+    chol flop count for real A, sqrt counted as 1 flop: 671
+    LDL' flop count for real A:                         647
+    LDL' flop count for complex A:                      3073
+    LU flop count for real A (with no pivoting):        1003
+    LU flop count for complex A (with no pivoting):     4497
+
+AMD test done
+./readhb_nozeros < HB/west0067.rua > tmp/A
+Matrix key: WEST0067
+./readhb_size    < HB/west0067.rua > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 67 nrow 67 ncol 67 nz 294
+triplet-form matrix, n_row = 67, n_col = 67 nz = 294. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 67 n_col 67, nz = 294. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       67
+    number of columns in matrix A:    67
+    entries in matrix A:              294
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               1
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S not square or diagonal not preserved
+    symbolic factorization defragmentations:       1
+    symbolic memory usage (Units):                 1632
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         245
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    1643                    -      -
+        peak size (Units)                       6115                    -      -
+        final size (Units)                      1628                    -      -
+    Numeric final size (Units)                  2101                    -      -
+    Numeric final size (MBytes)                  0.0                    -      -
+    peak memory usage (Units)                   7462                    -      -
+    peak memory usage (MBytes)                   0.1                    -      -
+    numeric factorization flops          1.41920e+04                    -      -
+    nz in L (incl diagonal)                      542                    -      -
+    nz in U (incl diagonal)                      902                    -      -
+    nz in L+U (incl diagonal)                   1377                    -      -
+    largest front (# entries)                    483                    -      -
+    largest # rows in front                       21                    -      -
+    largest # columns in front                    23                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       67
+    number of columns in matrix A:    67
+    entries in matrix A:              294
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               1
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S not square or diagonal not preserved
+    symbolic factorization defragmentations:       1
+    symbolic memory usage (Units):                 1632
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         245
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.01
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              6.59006e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    1643                 1574    96%
+        peak size (Units)                       6115                 3581    59%
+        final size (Units)                      1628                  685    42%
+    Numeric final size (Units)                  2101                 1125    54%
+    Numeric final size (MBytes)                  0.0                  0.0    54%
+    peak memory usage (Units)                   7462                 4928    66%
+    peak memory usage (MBytes)                   0.1                  0.0    66%
+    numeric factorization flops          1.41920e+04          2.58700e+03    18%
+    nz in L (incl diagonal)                      542                  329    61%
+    nz in U (incl diagonal)                      902                  340    38%
+    nz in L+U (incl diagonal)                   1377                  602    44%
+    largest front (# entries)                    483                   80    17%
+    largest # rows in front                       21                   10    48%
+    largest # columns in front                    23                   11    48%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       329
+    nz in U (incl diagonal), if none dropped       340
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     67
+    min abs. value on diagonal of U:               2.74e-02
+    max abs. value on diagonal of U:               2.28e+00
+    estimate of reciprocal of condition number:    1.20e-02
+    indices in compressed pattern:                 256
+    numerical values stored in Numeric object:     605
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.01
+    symbolic + numeric mflops (wall clock):        0.26
+
+    solve flops:                                   6.19300e+03
+    iterative refinement steps taken:              1
+    iterative refinement steps attempted:          1
+    sparse backward error omega1:                  9.49e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        8.78000e+03
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.01
+    total symbolic+numeric+solve mflops(wallclock) 0.88
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 67. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.83101e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 2.47921e-15
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  67
+    nz, number of nonzeros in A:                        294
+    symmetry of A:                                      0.0342
+    number of nonzeros on diagonal:                     2
+    nonzeros in pattern of A+A' (excl. diagonal):       574
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              5164
+    # of memory compactions:                            1
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 930
+    nonzeros in L (including diagonal):                 997
+    # divide operations for LDL' or LU:                 930
+    # multiply-subtract operations for LDL':            9170
+    # multiply-subtract operations for LU:              17410
+    max nz. in any column of L (incl. diagonal):        33
+
+    chol flop count for real A, sqrt counted as 1 flop: 19337
+    LDL' flop count for real A:                         19270
+    LDL' flop count for complex A:                      81730
+    LU flop count for real A (with no pivoting):        35750
+    LU flop count for complex A (with no pivoting):     147650
+
+AMD test done
+./readhb_nozeros < HB/fs_183_6.rua > tmp/A
+Matrix key: FS 183 6
+./readhb_size    < HB/fs_183_6.rua > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 183 nrow 183 ncol 183 nz 1000
+triplet-form matrix, n_row = 183, n_col = 183 nz = 1000. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 183 n_col 183, nz = 1000. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       183
+    number of columns in matrix A:    183
+    entries in matrix A:              1000
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric 2-by-2
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               36
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    4
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    147
+        symmetry of nonzero pattern:               0.490515
+        nz in S+S' (excl. diagonal):               1114
+        nz on diagonal of matrix S:                147
+        fraction of nz on diagonal:                1.000000
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          7
+        # unmatched:                               7
+        symmetry of P2*S:                          0.490515
+        nz in P2*S+(P2*S)' (excl. diag.):          1114
+        nz on diagonal of P2*S:                    147
+        fraction of nz on diag of P2*S:            1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.02930e+04
+        est. nz in L+U (incl. diagonal):           1625
+        est. largest front (# entries):            196
+        est. max nz in any column of L:            14
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4839
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         756
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4274                    -      -
+        peak size (Units)                      26277                    -      -
+        final size (Units)                     15717                    -      -
+    Numeric final size (Units)                 16944                    -      -
+    Numeric final size (MBytes)                  0.1                    -      -
+    peak memory usage (Units)                  29673                    -      -
+    peak memory usage (MBytes)                   0.2                    -      -
+    numeric factorization flops          2.67903e+05                    -      -
+    nz in L (incl diagonal)                     2122                    -      -
+    nz in U (incl diagonal)                     9931                    -      -
+    nz in L+U (incl diagonal)                  11870                    -      -
+    largest front (# entries)                   2337                    -      -
+    largest # rows in front                       21                    -      -
+    largest # columns in front                   136                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       183
+    number of columns in matrix A:    183
+    entries in matrix A:              1000
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric 2-by-2
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               36
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    4
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    147
+        symmetry of nonzero pattern:               0.490515
+        nz in S+S' (excl. diagonal):               1114
+        nz on diagonal of matrix S:                147
+        fraction of nz on diagonal:                1.000000
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          7
+        # unmatched:                               7
+        symmetry of P2*S:                          0.490515
+        nz in P2*S+(P2*S)' (excl. diag.):          1114
+        nz on diagonal of P2*S:                    147
+        fraction of nz on diag of P2*S:            1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.02930e+04
+        est. nz in L+U (incl. diagonal):           1625
+        est. largest front (# entries):            196
+        est. max nz in any column of L:            14
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4839
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         756
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.84689e-01
+    maximum sum (abs (rows of A)):              8.73139e+08
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4274                 4089    96%
+        peak size (Units)                      26277                 8291    32%
+        final size (Units)                     15717                 1658    11%
+    Numeric final size (Units)                 16944                 2794    16%
+    Numeric final size (MBytes)                  0.1                  0.0    16%
+    peak memory usage (Units)                  29673                11687    39%
+    peak memory usage (MBytes)                   0.2                  0.1    39%
+    numeric factorization flops          2.67903e+05          7.82700e+03     3%
+    nz in L (incl diagonal)                     2122                  838    39%
+    nz in U (incl diagonal)                     9931                  804     8%
+    nz in L+U (incl diagonal)                  11870                 1459    12%
+    largest front (# entries)                   2337                  420    18%
+    largest # rows in front                       21                   14    67%
+    largest # columns in front                   136                   36    26%
+
+    initial allocation ratio used:                 0.265
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 3
+    nz in L (incl diagonal), if none dropped       838
+    nz in U (incl diagonal), if none dropped       804
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     183
+    min abs. value on diagonal of U:               2.30e-09
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.30e-09
+    indices in compressed pattern:                 550
+    numerical values stored in Numeric object:     1396
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.79470e+04
+    iterative refinement steps taken:              1
+    iterative refinement steps attempted:          1
+    sparse backward error omega1:                  1.51e-16
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        2.57740e+04
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 183. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.55669e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.08984e-06
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  183
+    nz, number of nonzeros in A:                        1000
+    symmetry of A:                                      0.4431
+    number of nonzeros on diagonal:                     183
+    nonzeros in pattern of A+A' (excl. diagonal):       1272
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              12692
+    # of memory compactions:                            1
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 882
+    nonzeros in L (including diagonal):                 1065
+    # divide operations for LDL' or LU:                 882
+    # multiply-subtract operations for LDL':            3378
+    # multiply-subtract operations for LU:              5874
+    max nz. in any column of L (incl. diagonal):        15
+
+    chol flop count for real A, sqrt counted as 1 flop: 7821
+    LDL' flop count for real A:                         7638
+    LDL' flop count for complex A:                      34962
+    LU flop count for real A (with no pivoting):        12630
+    LU flop count for complex A (with no pivoting):     54930
+
+AMD test done
+./readhb         < HB/fs_183_6.rua > tmp/A
+Matrix key: FS 183 6
+./readhb_size    < HB/fs_183_6.rua > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 183 nrow 183 ncol 183 nz 1069
+triplet-form matrix, n_row = 183, n_col = 183 nz = 1069. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 183 n_col 183, nz = 1069. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       183
+    number of columns in matrix A:    183
+    entries in matrix A:              1069
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric 2-by-2
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               29
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    4
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    154
+        symmetry of nonzero pattern:               0.446860
+        nz in S+S' (excl. diagonal):               1286
+        nz on diagonal of matrix S:                154
+        fraction of nz on diagonal:                1.000000
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          7
+        # unmatched:                               7
+        symmetry of P2*S:                          0.446860
+        nz in P2*S+(P2*S)' (excl. diag.):          1286
+        nz on diagonal of P2*S:                    154
+        fraction of nz on diag of P2*S:            1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.78450e+04
+        est. nz in L+U (incl. diagonal):           2080
+        est. largest front (# entries):            400
+        est. max nz in any column of L:            20
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4959
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         766
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4558                    -      -
+        peak size (Units)                      26357                    -      -
+        final size (Units)                     17822                    -      -
+    Numeric final size (Units)                 19049                    -      -
+    Numeric final size (MBytes)                  0.1                    -      -
+    peak memory usage (Units)                  29795                    -      -
+    peak memory usage (MBytes)                   0.2                    -      -
+    numeric factorization flops          3.51312e+05                    -      -
+    nz in L (incl diagonal)                     2633                    -      -
+    nz in U (incl diagonal)                    10968                    -      -
+    nz in L+U (incl diagonal)                  13418                    -      -
+    largest front (# entries)                   3220                    -      -
+    largest # rows in front                       25                    -      -
+    largest # columns in front                   140                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       183
+    number of columns in matrix A:    183
+    entries in matrix A:              1069
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric 2-by-2
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               29
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    4
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    154
+        symmetry of nonzero pattern:               0.446860
+        nz in S+S' (excl. diagonal):               1286
+        nz on diagonal of matrix S:                154
+        fraction of nz on diagonal:                1.000000
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          7
+        # unmatched:                               7
+        symmetry of P2*S:                          0.446860
+        nz in P2*S+(P2*S)' (excl. diag.):          1286
+        nz on diagonal of P2*S:                    154
+        fraction of nz on diag of P2*S:            1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.78450e+04
+        est. nz in L+U (incl. diagonal):           2080
+        est. largest front (# entries):            400
+        est. max nz in any column of L:            20
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4959
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         766
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.84689e-01
+    maximum sum (abs (rows of A)):              8.73139e+08
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4558                 4376    96%
+        peak size (Units)                      26357                11140    42%
+        final size (Units)                     17822                 2107    12%
+    Numeric final size (Units)                 19049                 3243    17%
+    Numeric final size (MBytes)                  0.1                  0.0    17%
+    peak memory usage (Units)                  29795                14578    49%
+    peak memory usage (MBytes)                   0.2                  0.1    49%
+    numeric factorization flops          3.51312e+05          1.19670e+04     3%
+    nz in L (incl diagonal)                     2633                 1136    43%
+    nz in U (incl diagonal)                    10968                  870     8%
+    nz in L+U (incl diagonal)                  13418                 1823    14%
+    largest front (# entries)                   3220                  728    23%
+    largest # rows in front                       25                   20    80%
+    largest # columns in front                   140                   58    41%
+
+    initial allocation ratio used:                 0.282
+    # of forced updates due to frontal growth:     2
+    number of off-diagonal pivots:                 3
+    nz in L (incl diagonal), if none dropped       1136
+    nz in U (incl diagonal), if none dropped       870
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     183
+    min abs. value on diagonal of U:               2.30e-09
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.30e-09
+    indices in compressed pattern:                 741
+    numerical values stored in Numeric object:     1781
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    1
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   2.00240e+04
+    iterative refinement steps taken:              1
+    iterative refinement steps attempted:          1
+    sparse backward error omega1:                  2.21e-16
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        3.19910e+04
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 183. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.94586e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.22537e-06
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.01 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  183
+    nz, number of nonzeros in A:                        1069
+    symmetry of A:                                      0.4176
+    number of nonzeros on diagonal:                     183
+    nonzeros in pattern of A+A' (excl. diagonal):       1402
+    # dense rows/columns of A+A':                       0
+    memory used, in bytes:                              13316
+    # of memory compactions:                            1
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 1072
+    nonzeros in L (including diagonal):                 1255
+    # divide operations for LDL' or LU:                 1072
+    # multiply-subtract operations for LDL':            5320
+    # multiply-subtract operations for LU:              9568
+    max nz. in any column of L (incl. diagonal):        21
+
+    chol flop count for real A, sqrt counted as 1 flop: 11895
+    LDL' flop count for real A:                         11712
+    LDL' flop count for complex A:                      52208
+    LU flop count for real A (with no pivoting):        20208
+    LU flop count for complex A (with no pivoting):     86192
+
+AMD test done
+./readhb         < HB/arc130.rua > tmp/A
+Matrix key: ARC130  
+./readhb_size    < HB/arc130.rua > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 130 nrow 130 ncol 130 nz 1282
+triplet-form matrix, n_row = 130, n_col = 130 nz = 1282. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 130 n_col 130, nz = 1282. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1282
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               6
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    7
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    124
+        symmetry of nonzero pattern:               0.841193
+        nz in S+S' (excl. diagonal):               1204
+        nz on diagonal of matrix S:                124
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           8.27000e+03
+        est. nz in L+U (incl. diagonal):           1336
+        est. largest front (# entries):            324
+        est. max nz in any column of L:            18
+        number of "dense" rows/columns in S+S':    2
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4759
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         637
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4599                    -      -
+        peak size (Units)                      25036                    -      -
+        final size (Units)                     12837                    -      -
+    Numeric final size (Units)                 13724                    -      -
+    Numeric final size (MBytes)                  0.1                    -      -
+    peak memory usage (Units)                  27681                    -      -
+    peak memory usage (MBytes)                   0.2                    -      -
+    numeric factorization flops          9.41610e+04                    -      -
+    nz in L (incl diagonal)                     1009                    -      -
+    nz in U (incl diagonal)                     7849                    -      -
+    nz in L+U (incl diagonal)                   8728                    -      -
+    largest front (# entries)                   2337                    -      -
+    largest # rows in front                       19                    -      -
+    largest # columns in front                   123                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1282
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               6
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    7
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    124
+        symmetry of nonzero pattern:               0.841193
+        nz in S+S' (excl. diagonal):               1204
+        nz on diagonal of matrix S:                124
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           8.27000e+03
+        est. nz in L+U (incl. diagonal):           1336
+        est. largest front (# entries):            324
+        est. max nz in any column of L:            18
+        number of "dense" rows/columns in S+S':    2
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4759
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         637
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              7.94859e-01
+    maximum sum (abs (rows of A)):              1.08460e+06
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    4599                 4452    97%
+        peak size (Units)                      25036                 6478    26%
+        final size (Units)                     12837                 1054     8%
+    Numeric final size (Units)                 13724                 1876    14%
+    Numeric final size (MBytes)                  0.1                  0.0    14%
+    peak memory usage (Units)                  27681                 9123    33%
+    peak memory usage (MBytes)                   0.2                  0.1    33%
+    numeric factorization flops          9.41610e+04          4.20900e+03     4%
+    nz in L (incl diagonal)                     1009                  417    41%
+    nz in U (incl diagonal)                     7849                  787    10%
+    nz in L+U (incl diagonal)                   8728                 1074    12%
+    largest front (# entries)                   2337                  270    12%
+    largest # rows in front                       19                   18    95%
+    largest # columns in front                   123                   15    12%
+
+    initial allocation ratio used:                 0.36
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 0
+    nz in L (incl diagonal), if none dropped       417
+    nz in U (incl diagonal), if none dropped       796
+    number of small entries dropped                9
+    nonzeros on diagonal of U:                     130
+    min abs. value on diagonal of U:               9.22e-07
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    9.22e-07
+    indices in compressed pattern:                 79
+    numerical values stored in Numeric object:     977
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.80440e+04
+    iterative refinement steps taken:              1
+    iterative refinement steps attempted:          1
+    sparse backward error omega1:                  8.47e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        2.22530e+04
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 130. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.74277e-10
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  130
+    nz, number of nonzeros in A:                        1282
+    symmetry of A:                                      0.7587
+    number of nonzeros on diagonal:                     130
+    nonzeros in pattern of A+A' (excl. diagonal):       1430
+    # dense rows/columns of A+A':                       2
+    memory used, in bytes:                              11544
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 756
+    nonzeros in L (including diagonal):                 886
+    # divide operations for LDL' or LU:                 756
+    # multiply-subtract operations for LDL':            2959
+    # multiply-subtract operations for LU:              5162
+    max nz. in any column of L (incl. diagonal):        18
+
+    chol flop count for real A, sqrt counted as 1 flop: 6804
+    LDL' flop count for real A:                         6674
+    LDL' flop count for complex A:                      30476
+    LU flop count for real A (with no pivoting):        11080
+    LU flop count for complex A (with no pivoting):     48100
+
+AMD test done
+./readhb_nozeros < HB/arc130.rua > tmp/A
+Matrix key: ARC130  
+./readhb_size    < HB/arc130.rua > tmp/Asize
+./umf4
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 130 nrow 130 ncol 130 nz 1037
+triplet-form matrix, n_row = 130, n_col = 130 nz = 1037. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 130 n_col 130, nz = 1037. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1037
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               54
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    5
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    76
+        symmetry of nonzero pattern:               0.733224
+        nz in S+S' (excl. diagonal):               774
+        nz on diagonal of matrix S:                76
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           5.81700e+03
+        est. nz in L+U (incl. diagonal):           858
+        est. largest front (# entries):            289
+        est. max nz in any column of L:            17
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4111
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         527
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    3196                    -      -
+        peak size (Units)                       9801                    -      -
+        final size (Units)                      4259                    -      -
+    Numeric final size (Units)                  5146                    -      -
+    Numeric final size (MBytes)                  0.0                    -      -
+    peak memory usage (Units)                  12135                    -      -
+    peak memory usage (MBytes)                   0.1                    -      -
+    numeric factorization flops          2.47640e+04                    -      -
+    nz in L (incl diagonal)                      606                    -      -
+    nz in U (incl diagonal)                     2537                    -      -
+    nz in L+U (incl diagonal)                   3013                    -      -
+    largest front (# entries)                    459                    -      -
+    largest # rows in front                       17                    -      -
+    largest # columns in front                    48                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1037
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               54
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    5
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    76
+        symmetry of nonzero pattern:               0.733224
+        nz in S+S' (excl. diagonal):               774
+        nz on diagonal of matrix S:                76
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           5.81700e+03
+        est. nz in L+U (incl. diagonal):           858
+        est. largest front (# entries):            289
+        est. max nz in any column of L:            17
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4111
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         527
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              7.94859e-01
+    maximum sum (abs (rows of A)):              1.08460e+06
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    3196                 3062    96%
+        peak size (Units)                       9801                 6376    65%
+        final size (Units)                      4259                 1141    27%
+    Numeric final size (Units)                  5146                 1963    38%
+    Numeric final size (MBytes)                  0.0                  0.0    38%
+    peak memory usage (Units)                  12135                 8710    72%
+    peak memory usage (MBytes)                   0.1                  0.1    72%
+    numeric factorization flops          2.47640e+04          4.10700e+03    17%
+    nz in L (incl diagonal)                      606                  409    67%
+    nz in U (incl diagonal)                     2537                  792    31%
+    nz in L+U (incl diagonal)                   3013                 1071    36%
+    largest front (# entries)                    459                  240    52%
+    largest # rows in front                       17                   16    94%
+    largest # columns in front                    48                   15    31%
+
+    initial allocation ratio used:                 0.755
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 0
+    nz in L (incl diagonal), if none dropped       409
+    nz in U (incl diagonal), if none dropped       792
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     130
+    min abs. value on diagonal of U:               9.22e-07
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    9.22e-07
+    indices in compressed pattern:                 70
+    numerical values stored in Numeric object:     782
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.58270e+04
+    iterative refinement steps taken:              1
+    iterative refinement steps attempted:          1
+    sparse backward error omega1:                  7.18e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.99340e+04
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 130. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.74255e-10
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  130
+    nz, number of nonzeros in A:                        1037
+    symmetry of A:                                      0.4939
+    number of nonzeros on diagonal:                     130
+    nonzeros in pattern of A+A' (excl. diagonal):       1366
+    # dense rows/columns of A+A':                       2
+    memory used, in bytes:                              11236
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 725
+    nonzeros in L (including diagonal):                 855
+    # divide operations for LDL' or LU:                 725
+    # multiply-subtract operations for LDL':            2742
+    # multiply-subtract operations for LU:              4759
+    max nz. in any column of L (incl. diagonal):        18
+
+    chol flop count for real A, sqrt counted as 1 flop: 6339
+    LDL' flop count for real A:                         6209
+    LDL' flop count for complex A:                      28461
+    LU flop count for real A (with no pivoting):        10243
+    LU flop count for complex A (with no pivoting):     44597
+
+AMD test done
+./readhb_nozeros < HB/arc130.rua > tmp/A
+Matrix key: ARC130  
+./readhb_size    < HB/arc130.rua > tmp/Asize
+./umf4 a 1e-6
+
+===========================================================
+=== UMFPACK v4.4 ==========================================
+===========================================================
+droptol 1e-06
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 3
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 1e-06
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+File: tmp/A
+File: tmp/Asize
+n 130 nrow 130 ncol 130 nz 1037
+triplet-form matrix, n_row = 130, n_col = 130 nz = 1037. OK
+
+triplet-to-col time: wall 0 cpu 0
+column-form matrix, n_row 130 n_col 130, nz = 1037. OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1037
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               54
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    5
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    76
+        symmetry of nonzero pattern:               0.733224
+        nz in S+S' (excl. diagonal):               774
+        nz on diagonal of matrix S:                76
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           5.81700e+03
+        est. nz in L+U (incl. diagonal):           858
+        est. largest front (# entries):            289
+        est. max nz in any column of L:            17
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4111
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         527
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    3196                    -      -
+        peak size (Units)                       9801                    -      -
+        final size (Units)                      4259                    -      -
+    Numeric final size (Units)                  5146                    -      -
+    Numeric final size (MBytes)                  0.0                    -      -
+    peak memory usage (Units)                  12135                    -      -
+    peak memory usage (MBytes)                   0.1                    -      -
+    numeric factorization flops          2.47640e+04                    -      -
+    nz in L (incl diagonal)                      606                    -      -
+    nz in U (incl diagonal)                     2537                    -      -
+    nz in L+U (incl diagonal)                   3013                    -      -
+    largest front (# entries)                    459                    -      -
+    largest # rows in front                       17                    -      -
+    largest # columns in front                    48                    -      -
+
+Symbolic object: OK
+
+Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       130
+    number of columns in matrix A:    130
+    entries in matrix A:              1037
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               54
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    5
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    76
+        symmetry of nonzero pattern:               0.733224
+        nz in S+S' (excl. diagonal):               774
+        nz on diagonal of matrix S:                76
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           5.81700e+03
+        est. nz in L+U (incl. diagonal):           858
+        est. largest front (# entries):            289
+        est. max nz in any column of L:            17
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 4111
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         527
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              7.94859e-01
+    maximum sum (abs (rows of A)):              1.08460e+06
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    3196                 2762    86%
+        peak size (Units)                       9801                 5323    54%
+        final size (Units)                      4259                  457    11%
+    Numeric final size (Units)                  5146                 1279    25%
+    Numeric final size (MBytes)                  0.0                  0.0    25%
+    peak memory usage (Units)                  12135                 7657    63%
+    peak memory usage (MBytes)                   0.1                  0.1    63%
+    numeric factorization flops          2.47640e+04          4.10700e+03    17%
+    nz in L (incl diagonal)                      606                  318    52%
+    nz in U (incl diagonal)                     2537                  285    11%
+    nz in L+U (incl diagonal)                   3013                  473    16%
+    largest front (# entries)                    459                  240    52%
+    largest # rows in front                       17                   16    94%
+    largest # columns in front                    48                   15    31%
+
+    initial allocation ratio used:                 0.755
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 0
+    nz in L (incl diagonal), if none dropped       409
+    nz in U (incl diagonal), if none dropped       792
+    number of small entries dropped                598
+    nonzeros on diagonal of U:                     130
+    min abs. value on diagonal of U:               9.22e-07
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    9.22e-07
+    indices in compressed pattern:                 82
+    numerical values stored in Numeric object:     386
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   2.06060e+04
+    iterative refinement steps taken:              2
+    iterative refinement steps attempted:          2
+    sparse backward error omega1:                  1.30e-16
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        2.47130e+04
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+dense vector, n = 130. OK
+
+relative maxnorm of residual, ||Ax-b||/||b||: 1.37368e-16
+relative maxnorm of error, ||x-xtrue||/||xtrue||: 1.94084e-10
+
+Writing tmp/x
+Writing tmp/info.umf4
+umf4 done, strategy: 0
+
+
+===========================================================
+=== AMD ===================================================
+===========================================================
+
+
+------- Now trying the AMD ordering.  This not part of
+the UMFPACK analysis or factorization, above, but a separate
+test of just the AMD ordering routine.
+
+amd:  approximate minimum degree ordering, parameters:
+    dense row parameter: 10
+    (rows with more than max (10 * sqrt (n), 16) entries are
+    considered "dense", and placed last in output permutation)
+    aggressive absorption:  yes
+
+AMD ordering time: cpu       0.00 wall       0.00
+
+amd:  approximate minimum degree ordering, results:
+    status: OK
+    n, dimension of A:                                  130
+    nz, number of nonzeros in A:                        1037
+    symmetry of A:                                      0.4939
+    number of nonzeros on diagonal:                     130
+    nonzeros in pattern of A+A' (excl. diagonal):       1366
+    # dense rows/columns of A+A':                       2
+    memory used, in bytes:                              11236
+    # of memory compactions:                            0
+
+    The following approximate statistics are for a subsequent
+    factorization of A(P,P) + A(P,P)'.  They are slight upper
+    bounds if there are no dense rows/columns in A+A', and become
+    looser if dense rows/columns exist.
+
+    nonzeros in L (excluding diagonal):                 725
+    nonzeros in L (including diagonal):                 855
+    # divide operations for LDL' or LU:                 725
+    # multiply-subtract operations for LDL':            2742
+    # multiply-subtract operations for LU:              4759
+    max nz. in any column of L (incl. diagonal):        18
+
+    chol flop count for real A, sqrt counted as 1 flop: 6339
+    LDL' flop count for real A:                         6209
+    LDL' flop count for complex A:                      28461
+    LU flop count for real A (with no pivoting):        10243
+    LU flop count for complex A (with no pivoting):     44597
+
+AMD test done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4_f77wrapper.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,505 @@
+/* ========================================================================== */
+/* === umf4_f77wrapper ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* FORTRAN interface for the C-callable UMFPACK library (double / int version
+ * only and double / long versions only).  This is HIGHLY non-portable.  You
+ * will need to modify this depending on how your FORTRAN and C compilers
+ * behave.  This has been tested in Linux, Sun Solaris, SGI IRIX, and IBM AIX,
+ * with various compilers.  It has not been exhaustively tested on all possible
+ * combinations of C and FORTRAN compilers.  The long version works on
+ * Solaris, SGI IRIX, and IBM AIX when the UMFPACK library is compiled in
+ * 64-bit mode.
+ *
+ * Only a subset of UMFPACK's capabilities are provided.  Refer to the UMFPACK
+ * User Guide for details.
+ *
+ * For some C and FORTRAN compilers, the FORTRAN compiler appends a single
+ * underscore ("_") after each routine name.  C doesn't do this, so the
+ * translation is made here.  Other FORTRAN compilers treat underscores
+ * differently.  For example, a FORTRAN call to a_b gets translated to a call
+ * to a_b__ by g77, and to a_b_ by most other FORTRAN compilers.  Thus, the
+ * FORTRAN names here do not use underscores.  The xlf compiler in IBM AIX
+ * doesn't add an underscore.
+ *
+ * The matrix A is passed to UMFPACK in compressed column form, with 0-based
+ * indices.  In FORTRAN, for an m-by-n matrix A with nz entries, the row
+ * indices of the first column (column 1) are in Ai (Ap (1) + 1 ... Ap (2)),
+ * with values in Ax (Ap (1) + 1 ... Ap (2)).  The last column (column n) is
+ * in Ai (Ap (n) + 1 ... Ap (n+1)) and Ax (Ap (n) + 1 ... Ap (n+1)).  The row
+ * indices in Ai are in the range 0 to m-1.  They must be sorted, with no
+ * duplicate entries allowed.  Refer to umfpack_di_triplet_to_col for a more
+ * flexible format for the input matrix.  The following defintions apply
+ * for each of the routines in this file:
+ *
+ *	integer m, n, Ap (n+1), Ai (nz), symbolic, numeric, filenum, status
+ *	double precision Ax (nz), control (20), info (90), x (n), b (n)
+ *
+ * UMFPACK's status is returned in either a status argument, or in info (1).
+ * It is zero if everything is OK, 1 if the matrix is singular (this is a
+ * warning, not an error), and negative if an error occurred.  See umfpack.h
+ * for more details on the contents of the control and info arrays, and the
+ * value of the sys argument.
+ *
+ * For the Numeric and Symbolic handles, it's probably safe to assume that a
+ * FORTRAN integer is sufficient to store a C pointer.  If that doesn't work,
+ * try defining numeric and symbolic as integer arrays of size 2, or as
+ * integer*8, in the FORTRAN routine that calls these wrapper routines.
+ * The latter is required on Solaris, SGI IRIX, and IBM AIX when UMFPACK is
+ * compiled in 64-bit mode.
+ *
+ * If you want to use 64-bit integers, try compiling this file with the -DDLONG
+ * compiler option (via "make fortran64").  First modify your Make/Make.include
+ * and Make/Make.<arch> files to compile UMFPACK in LP64 mode (see the User
+ * Guide for details).  Your FORTRAN code should use integer*8.  See umf4hb64.f
+ * for an example.
+ *
+ * Tested with the following compilers:
+ *	* Solaris with cc and f77 from Sun WorkShop 6 update 1
+ *	    (32-bit and 64-bit modes)
+ *	* SGI Irix with MIPSpro cc and f77 compilers version 7.4
+ *	    (32-bit and 64-bit modes)
+ *	* Linux with GNU gcc and Intel's icc, and GNU g77 and Intel's
+ *	    ifc FORTRAN compiler.  See the comments above about g77 and
+ *	    underscores.  Only supports 32-bit mode.
+ *	* IBM AIX xlc and xlf compilers.
+ *	    (32-bit and 64-bit modes)
+ */
+
+#include "umfpack.h"
+#include <ctype.h>
+#include <stdio.h>
+#ifdef NULL
+#undef NULL
+#endif
+#define NULL 0
+#define LEN 200
+
+/* -------------------------------------------------------------------------- */
+/* integer type: int or long */
+/* -------------------------------------------------------------------------- */
+
+#if defined (DLONG)
+
+#define Int long
+#define UMFPACK_defaults	 umfpack_dl_defaults
+#define UMFPACK_free_numeric	 umfpack_dl_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_dl_free_symbolic
+#define UMFPACK_numeric		 umfpack_dl_numeric
+#define UMFPACK_report_control	 umfpack_dl_report_control
+#define UMFPACK_report_info	 umfpack_dl_report_info
+#define UMFPACK_save_numeric	 umfpack_dl_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_dl_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_dl_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_dl_load_symbolic
+#define UMFPACK_scale		 umfpack_dl_scale
+#define UMFPACK_solve		 umfpack_dl_solve
+#define UMFPACK_symbolic	 umfpack_dl_symbolic
+
+#else
+
+#define Int int
+#define UMFPACK_defaults	 umfpack_di_defaults
+#define UMFPACK_free_numeric	 umfpack_di_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_di_free_symbolic
+#define UMFPACK_numeric		 umfpack_di_numeric
+#define UMFPACK_report_control	 umfpack_di_report_control
+#define UMFPACK_report_info	 umfpack_di_report_info
+#define UMFPACK_save_numeric	 umfpack_di_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_di_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_di_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_di_load_symbolic
+#define UMFPACK_scale		 umfpack_di_scale
+#define UMFPACK_solve		 umfpack_di_solve
+#define UMFPACK_symbolic	 umfpack_di_symbolic
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* construct a file name from a file number (not user-callable) */
+/* -------------------------------------------------------------------------- */
+
+static void make_filename (Int filenum, char *prefix, char *filename)
+{
+    char *psrc, *pdst ;
+#ifdef DLONG
+    sprintf (filename, "%s%ld.umf", prefix, filenum) ;
+#else
+    sprintf (filename, "%s%d.umf", prefix, filenum) ;
+#endif
+    /* remove any spaces in the filename */
+    pdst = filename ;
+    for (psrc = filename ; *psrc ; psrc++)
+    {
+	if (!isspace (*psrc)) *pdst++ = *psrc ;
+    }
+    *pdst = '\0' ;
+}
+
+/* ========================================================================== */
+/* === with underscore ====================================================== */
+/* ========================================================================== */
+
+/* Solaris, Linux, and SGI IRIX.  Probably Compaq Alpha as well. */
+
+/* -------------------------------------------------------------------------- */
+/* umf4def: set default control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4def (control) */
+
+void umf4def_ (double Control [UMFPACK_CONTROL])
+{
+    UMFPACK_defaults (Control) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4pcon: print control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4pcon (control) */
+
+void umf4pcon_ (double Control [UMFPACK_CONTROL])
+{
+    fflush (stdout) ;
+    UMFPACK_report_control (Control) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4sym: pre-ordering and symbolic factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info) */
+
+void umf4sym_ (Int *m, Int *n, Int Ap [ ], Int Ai [ ],
+    double Ax [ ], void **Symbolic,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Symbolic, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4num: numeric factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) */
+
+void umf4num_ (Int Ap [ ], Int Ai [ ], double Ax [ ],
+    void **Symbolic, void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_numeric (Ap, Ai, Ax, *Symbolic, Numeric, Control, Info);
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4solr: solve a linear system with iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) */
+
+void umf4solr_ (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ],
+    double x [ ], double b [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_solve (*sys, Ap, Ai, Ax, x, b, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4sol: solve a linear system without iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4sol (sys, x, b, numeric, control, info) */
+
+void umf4sol_ (Int *sys, double x [ ], double b [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    Control [UMFPACK_IRSTEP] = 0 ;
+    (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,
+	x, b, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4scal: scale a vector using UMFPACK's scale factors */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4scal (x, b, numeric, status) */
+
+void umf4scal_ (double x [ ], double b [ ], void **Numeric, Int *status)
+{
+    *status = UMFPACK_scale (x, b, *Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4pinf: print info */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4pinf (control) */
+
+void umf4pinf_ (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    fflush (stdout) ;
+    UMFPACK_report_info (Control, Info) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4fnum: free the Numeric object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4fnum (numeric) */
+
+void umf4fnum_ (void **Numeric)
+{
+    UMFPACK_free_numeric (Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4fsym: free the Symbolic object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4fsym (symbolic) */
+
+void umf4fsym_ (void **Symbolic)
+{
+    UMFPACK_free_symbolic (Symbolic) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4snum: save the Numeric object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4snum (numeric, filenum, status) */
+
+void umf4snum_ (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_save_numeric (*Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4ssym: save the Symbolic object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4ssym (symbolic, filenum, status) */
+
+void umf4ssym_ (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_save_symbolic (*Symbolic, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4lnum: load the Numeric object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4lnum (numeric, filenum, status) */
+
+void umf4lnum_ (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_load_numeric (Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4lsym: load the Symbolic object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4lsym (symbolic, filenum, status) */
+
+void umf4lsym_ (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_load_symbolic (Symbolic, filename) ;
+}
+
+/* ========================================================================== */
+/* === with no underscore =================================================== */
+/* ========================================================================== */
+
+/* IBM AIX.  Probably Microsoft Windows and HP Unix as well.  */
+
+/* -------------------------------------------------------------------------- */
+/* umf4def: set default control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4def (control) */
+
+void umf4def (double Control [UMFPACK_CONTROL])
+{
+    UMFPACK_defaults (Control) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4pcon: print control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4pcon (control) */
+
+void umf4pcon (double Control [UMFPACK_CONTROL])
+{
+    fflush (stdout) ;
+    UMFPACK_report_control (Control) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4sym: pre-ordering and symbolic factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info) */
+
+void umf4sym (Int *m, Int *n, Int Ap [ ], Int Ai [ ],
+    double Ax [ ], void **Symbolic,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Symbolic, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4num: numeric factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info) */
+
+void umf4num (Int Ap [ ], Int Ai [ ], double Ax [ ],
+    void **Symbolic, void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_numeric (Ap, Ai, Ax, *Symbolic, Numeric, Control, Info);
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4solr: solve a linear system with iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info) */
+
+void umf4solr (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ],
+    double x [ ], double b [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_solve (*sys, Ap, Ai, Ax, x, b, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4sol: solve a linear system without iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4sol (sys, x, b, numeric, control, info) */
+
+void umf4sol (Int *sys, double x [ ], double b [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    Control [UMFPACK_IRSTEP] = 0 ;
+    (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,
+	x, b, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4scal: scale a vector using UMFPACK's scale factors */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4scal (x, b, numeric, status) */
+
+void umf4scal (double x [ ], double b [ ], void **Numeric, Int *status)
+{
+    *status = UMFPACK_scale (x, b, *Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4pinf: print info */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4pinf (control) */
+
+void umf4pinf (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    fflush (stdout) ;
+    UMFPACK_report_info (Control, Info) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4fnum: free the Numeric object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4fnum (numeric) */
+
+void umf4fnum (void **Numeric)
+{
+    UMFPACK_free_numeric (Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4fsym: free the Symbolic object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4fsym (symbolic) */
+
+void umf4fsym (void **Symbolic)
+{
+    UMFPACK_free_symbolic (Symbolic) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4snum: save the Numeric object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4snum (numeric, filenum, status) */
+
+void umf4snum (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_save_numeric (*Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4ssym: save the Symbolic object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4ssym (symbolic, filenum, status) */
+
+void umf4ssym (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_save_symbolic (*Symbolic, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4lnum: load the Numeric object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4lnum (numeric, filenum, status) */
+
+void umf4lnum (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_load_numeric (Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4lsym: load the Symbolic object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4lsym (symbolic, filenum, status) */
+
+void umf4lsym (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_load_symbolic (Symbolic, filename) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4_f77zwrapper.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,462 @@
+/* ========================================================================== */
+/* === umf4_f77zwrapper ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* FORTRAN interface for the C-callable UMFPACK library (complex / int version
+ * only and complex / long versions only).  This is HIGHLY non-portable.  You
+ * will need to modify this depending on how your FORTRAN and C compilers
+ * behave.
+ *
+ * See umf4z_f77wrapper.c for more information.
+ *
+ * The complex values are provided in two separate arrays.  Ax contains the
+ * real part and Az contains the imaginary part.  The solution vector is in
+ * x (the real part) and xz (the imaginary part.  b is the real part of the
+ * right-hand-side and bz is the imaginary part.  Does not support the
+ * packed complex type.
+ */
+
+#include "umfpack.h"
+#include <ctype.h>
+#include <stdio.h>
+#ifdef NULL
+#undef NULL
+#endif
+#define NULL 0
+#define LEN 200
+
+/* -------------------------------------------------------------------------- */
+/* integer type: int or long */
+/* -------------------------------------------------------------------------- */
+
+#if defined (ZLONG)
+
+#define Int long
+#define UMFPACK_defaults	 umfpack_zl_defaults
+#define UMFPACK_free_numeric	 umfpack_zl_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_zl_free_symbolic
+#define UMFPACK_numeric		 umfpack_zl_numeric
+#define UMFPACK_report_control	 umfpack_zl_report_control
+#define UMFPACK_report_info	 umfpack_zl_report_info
+#define UMFPACK_save_numeric	 umfpack_zl_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_zl_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_zl_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_zl_load_symbolic
+#define UMFPACK_scale		 umfpack_zl_scale
+#define UMFPACK_solve		 umfpack_zl_solve
+#define UMFPACK_symbolic	 umfpack_zl_symbolic
+
+#else
+
+#define Int int
+#define UMFPACK_defaults	 umfpack_zi_defaults
+#define UMFPACK_free_numeric	 umfpack_zi_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_zi_free_symbolic
+#define UMFPACK_numeric		 umfpack_zi_numeric
+#define UMFPACK_report_control	 umfpack_zi_report_control
+#define UMFPACK_report_info	 umfpack_zi_report_info
+#define UMFPACK_save_numeric	 umfpack_zi_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_zi_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_zi_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_zi_load_symbolic
+#define UMFPACK_scale		 umfpack_zi_scale
+#define UMFPACK_solve		 umfpack_zi_solve
+#define UMFPACK_symbolic	 umfpack_zi_symbolic
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* construct a file name from a file number (not user-callable) */
+/* -------------------------------------------------------------------------- */
+
+static void make_filename (Int filenum, char *prefix, char *filename)
+{
+    char *psrc, *pdst ;
+#ifdef ZLONG
+    sprintf (filename, "%s%ld.umf", prefix, filenum) ;
+#else
+    sprintf (filename, "%s%d.umf", prefix, filenum) ;
+#endif
+    /* remove any spaces in the filename */
+    pdst = filename ;
+    for (psrc = filename ; *psrc ; psrc++)
+    {
+	if (!isspace (*psrc)) *pdst++ = *psrc ;
+    }
+    *pdst = '\0' ;
+}
+
+/* ========================================================================== */
+/* === with underscore ====================================================== */
+/* ========================================================================== */
+
+/* Solaris, Linux, and SGI IRIX.  Probably Compaq Alpha as well. */
+
+/* -------------------------------------------------------------------------- */
+/* umf4zdef: set default control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zdef (control) */
+
+void umf4zdef_ (double Control [UMFPACK_CONTROL])
+{
+    UMFPACK_defaults (Control) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zpcon: print control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zpcon (control) */
+
+void umf4zpcon_ (double Control [UMFPACK_CONTROL])
+{
+    fflush (stdout) ;
+    UMFPACK_report_control (Control) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsym: pre-ordering and symbolic factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */
+
+void umf4zsym_ (Int *m, Int *n, Int Ap [ ], Int Ai [ ],
+    double Ax [ ], double Az [ ], void **Symbolic,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4znum: numeric factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */
+
+void umf4znum_ (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],
+    void **Symbolic, void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info);
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsolr: solve a linear system with iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */
+
+void umf4zsolr_ (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],
+    double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz,
+	*Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsol: solve a linear system without iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */
+
+void umf4zsol_ (Int *sys, double x [ ], double xz [ ], double b [ ],
+    double bz [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    Control [UMFPACK_IRSTEP] = 0 ;
+    (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,
+	(double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zscal: scale a vector using UMFPACK's scale factors */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zscal (x, xz, b, bz, numeric, status) */
+
+void umf4zscal_ (double x [ ], double xz [ ], double b [ ], double bz [ ],
+    void **Numeric, Int *status)
+{
+    *status = UMFPACK_scale (x, xz, b, bz, *Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zpinf: print info */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zpinf (control) */
+
+void umf4zpinf_ (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    fflush (stdout) ;
+    UMFPACK_report_info (Control, Info) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zfnum: free the Numeric object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zfnum (numeric) */
+
+void umf4zfnum_ (void **Numeric)
+{
+    UMFPACK_free_numeric (Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zfsym: free the Symbolic object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zfsym (symbolic) */
+
+void umf4zfsym_ (void **Symbolic)
+{
+    UMFPACK_free_symbolic (Symbolic) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsnum: save the Numeric object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsnum (numeric, filenum, status) */
+
+void umf4zsnum_ (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_save_numeric (*Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zssym: save the Symbolic object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zssym (symbolic, filenum, status) */
+
+void umf4zssym_ (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_save_symbolic (*Symbolic, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zlnum: load the Numeric object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zlnum (numeric, filenum, status) */
+
+void umf4zlnum_ (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_load_numeric (Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zlsym: load the Symbolic object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zlsym (symbolic, filenum, status) */
+
+void umf4zlsym_ (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_load_symbolic (Symbolic, filename) ;
+}
+
+/* ========================================================================== */
+/* === with no underscore =================================================== */
+/* ========================================================================== */
+
+/* IBM AIX.  Probably Microsoft Windows and HP Unix as well.  */
+
+/* -------------------------------------------------------------------------- */
+/* umf4zdef: set default control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zdef (control) */
+
+void umf4zdef (double Control [UMFPACK_CONTROL])
+{
+    UMFPACK_defaults (Control) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zpcon: print control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zpcon (control) */
+
+void umf4zpcon (double Control [UMFPACK_CONTROL])
+{
+    fflush (stdout) ;
+    UMFPACK_report_control (Control) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsym: pre-ordering and symbolic factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info) */
+
+void umf4zsym (Int *m, Int *n, Int Ap [ ], Int Ai [ ],
+    double Ax [ ], double Az [ ], void **Symbolic,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_symbolic (*m, *n, Ap, Ai, Ax, Az, Symbolic, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4znum: numeric factorization */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info) */
+
+void umf4znum (Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],
+    void **Symbolic, void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_numeric (Ap, Ai, Ax, Az, *Symbolic, Numeric, Control, Info);
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsolr: solve a linear system with iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info) */
+
+void umf4zsolr (Int *sys, Int Ap [ ], Int Ai [ ], double Ax [ ], double Az [ ],
+    double x [ ], double xz [ ], double b [ ], double bz [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    (void) UMFPACK_solve (*sys, Ap, Ai, Ax, Az, x, xz, b, bz,
+	*Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsol: solve a linear system without iterative refinement */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsol (sys, x, xz, b, bz, numeric, control, info) */
+
+void umf4zsol (Int *sys, double x [ ], double xz [ ], double b [ ],
+    double bz [ ], void **Numeric,
+    double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    Control [UMFPACK_IRSTEP] = 0 ;
+    (void) UMFPACK_solve (*sys, (Int *) NULL, (Int *) NULL, (double *) NULL,
+	(double *) NULL, x, xz, b, bz, *Numeric, Control, Info) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zscal: scale a vector using UMFPACK's scale factors */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zscal (x, xz, b, bz, numeric, status) */
+
+void umf4zscal (double x [ ], double xz [ ], double b [ ], double bz [ ],
+    void **Numeric, Int *status)
+{
+    *status = UMFPACK_scale (x, xz, b, bz, *Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zpinf: print info */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zpinf (control) */
+
+void umf4zpinf (double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+    fflush (stdout) ;
+    UMFPACK_report_info (Control, Info) ;
+    fflush (stdout) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zfnum: free the Numeric object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zfnum (numeric) */
+
+void umf4zfnum (void **Numeric)
+{
+    UMFPACK_free_numeric (Numeric) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zfsym: free the Symbolic object */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zfsym (symbolic) */
+
+void umf4zfsym (void **Symbolic)
+{
+    UMFPACK_free_symbolic (Symbolic) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zsnum: save the Numeric object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zsnum (numeric, filenum, status) */
+
+void umf4zsnum (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_save_numeric (*Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zssym: save the Symbolic object to a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zssym (symbolic, filenum, status) */
+
+void umf4zssym (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_save_symbolic (*Symbolic, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zlnum: load the Numeric object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zlnum (numeric, filenum, status) */
+
+void umf4zlnum (void **Numeric, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "n", filename) ;
+    *status = UMFPACK_load_numeric (Numeric, filename) ;
+}
+
+/* -------------------------------------------------------------------------- */
+/* umf4zlsym: load the Symbolic object from a file */
+/* -------------------------------------------------------------------------- */
+
+/* call umf4zlsym (symbolic, filenum, status) */
+
+void umf4zlsym (void **Symbolic, Int *filenum, Int *status)
+{
+    char filename [LEN] ;
+    make_filename (*filenum, "s", filename) ;
+    *status = UMFPACK_load_symbolic (Symbolic, filename) ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,353 @@
+c=======================================================================
+c== umf4hb =============================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c umf4hb:
+c       read a sparse matrix in the Harwell/Boeing format, factorizes
+c       it, and solves Ax=b.  Also saves and loads the factors to/from a
+c       file.  Saving to a file is not required, it's just here to
+c       demonstrate how to use this feature of UMFPACK.  This program
+c       only works on square RUA-type matrices.
+c
+c       This is HIGHLY non-portable.  It may not work with your C and
+c       FORTRAN compilers.  See umf4_f77wrapper.c for more details.
+c
+c usage (for example):
+c
+c       in a Unix shell:
+c       umf4hb < HB/arc130.rua
+
+        integer
+     $          nzmax, nmax
+        parameter (nzmax = 5000000, nmax = 160000)
+        integer
+     $          Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel,
+     $          numeric, symbolic, status, sys, filenum
+
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        double precision Ax (nzmax), x (nmax), b (nmax), aij, xj,
+     $          r (nmax), control (20), info (90)
+        character rhstyp*3
+
+c       ----------------------------------------------------------------
+c       read the Harwell/Boeing matrix
+c       ----------------------------------------------------------------
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp, nrhs, nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        print *, 'Matrix key: ', key
+
+        n = nrow
+        if (type .ne. 'RUA' .or. nrow .ne. ncol) then
+           print *, 'Error: can only handle square RUA matrices'
+           stop
+        endif
+        if (n .ge. nmax .or. nz .gt. nzmax) then
+           print *, ' Matrix too big!'
+           stop
+        endif
+
+c       read the matrix (1-based)
+        read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1)
+        read (5, indfmt, err = 998) (Ai (p), p = 1, nz)
+        read (5, valfmt, err = 998) (Ax (p), p = 1, nz)
+
+c       ----------------------------------------------------------------
+c       create the right-hand-side, assume x (i) = 1 + i/n
+c       ----------------------------------------------------------------
+
+        do 30 i = 1,n
+            b (i) = 0
+30      continue
+c       b = A*x
+        do 50 j = 1,n
+            xj = j
+            xj = 1 + xj / n
+            do 40 p = Ap (j), Ap (j+1)-1
+                i = Ai (p)
+                aij = Ax (p)
+                b (i) = b (i) + aij * xj
+40          continue
+50      continue
+
+c       ----------------------------------------------------------------
+c       convert from 1-based to 0-based
+c       ----------------------------------------------------------------
+
+        do 60 j = 1, n+1
+            Ap (j) = Ap (j) - 1
+60      continue
+        do 70 p = 1, nz
+            Ai (p) = Ai (p) - 1
+70      continue
+
+c       ----------------------------------------------------------------
+c       factor the matrix and save to a file
+c       ----------------------------------------------------------------
+
+c       set default parameters
+        call umf4def (control)
+
+c       print control parameters.  set control (1) to 1 to print
+c       error messages only
+        control (1) = 2
+        call umf4pcon (control)
+
+c       pre-order and symbolic analysis
+        call umf4sym (n, n, Ap, Ai, Ax, symbolic, control, info)
+
+c       print statistics computed so far
+c       call umf4pinf (control, info) could also be done.
+        print 80, info (1), info (16),
+     $      (info (21) * info (4)) / 2**20,
+     $      (info (22) * info (4)) / 2**20,
+     $      info (23), info (24), info (25)
+80      format ('symbolic analysis:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, ' (sec)'/,
+     $      '   estimates (upper bound) for numeric LU:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4sym error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sym: ', info (1)
+            stop
+        endif
+
+c       numeric factorization
+        call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info)
+
+c       print statistics for the numeric factorization
+c       call umf4pinf (control, info) could also be done.
+        print 90, info (1), info (66),
+     $      (info (41) * info (4)) / 2**20,
+     $      (info (42) * info (4)) / 2**20,
+     $      info (43), info (44), info (45)
+90      format ('numeric factorization:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, /,
+     $      '   actual numeric LU statistics:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4num error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4num: ', info (1)
+            stop
+        endif
+
+c       save the symbolic analysis to the file s0.umf
+c       note that this is not needed until another matrix is
+c       factorized, below.
+	filenum = 0
+        call umf4ssym (symbolic, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4ssym: ', status
+            stop
+        endif
+
+c       save the LU factors to the file n0.umf
+        call umf4snum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4snum: ', status
+            stop
+        endif
+
+c       free the symbolic analysis
+        call umf4fsym (symbolic)
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       ----------------------------------------------------------------
+c       load the LU factors back in, and solve the system
+c       ----------------------------------------------------------------
+
+c       At this point the program could terminate and load the LU
+C       factors (numeric) from the n0.umf file, and solve the
+c       system (see below).  Note that the symbolic object is not
+c       required.
+
+c       load the numeric factorization back in (filename: n0.umf)
+        call umf4lnum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4lnum: ', status
+            stop
+        endif
+
+c       solve Ax=b, without iterative refinement
+        sys = 0
+        call umf4sol (sys, x, b, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       print final statistics
+        call umf4pinf (control, info)
+
+c       print the residual.  x (i) should be 1 + i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+c       ----------------------------------------------------------------
+c       load the symbolic analysis back in, and factorize a new matrix
+c       ----------------------------------------------------------------
+
+c       Again, the program could terminate here, recreate the matrix,
+c       and refactorize.  Note that umf4sym is not called.
+
+c       load the symbolic factorization back in (filename: s0.umf)
+        call umf4lsym (symbolic, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4lsym: ', status
+            stop
+        endif
+
+c       arbitrarily change the values of the matrix but not the pattern
+        do 100 p = 1, nz
+            Ax (p) = Ax (p) + 3.14159 / 100.0
+100     continue
+
+c       numeric factorization of the modified matrix
+        call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4num: ', info (1)
+            stop
+        endif
+
+c       free the symbolic analysis
+        call umf4fsym (symbolic)
+
+c       create a new right-hand-side, assume x (i) = 7 - i/n
+        do 110 i = 1,n
+            b (i) = 0
+110     continue
+c       b = A*x, with the modified matrix A (note that A is now 0-based)
+        do 130 j = 1,n
+            xj = j
+            xj = 7 - xj / n
+            do 120 p = Ap (j) + 1, Ap (j+1)
+                i = Ai (p) + 1
+                aij = Ax (p)
+                b (i) = b (i) + aij * xj
+120         continue
+130     continue
+
+c       ----------------------------------------------------------------
+c       solve Ax=b, with iterative refinement
+c       ----------------------------------------------------------------
+
+        sys = 0
+        call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4solr: ', info (1)
+            stop
+        endif
+
+c       print the residual.  x (i) should be 7 - i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+c       ----------------------------------------------------------------
+c       solve Ax=b, without iterative refinement, broken into steps
+c       ----------------------------------------------------------------
+
+c       the factorization is PAQ=LU, PRAQ=LU, or P(R\A)Q=LU.
+
+c       x = R*b (or x=R\b, or x=b, as appropriate)
+        call umf4scal (x, b, numeric, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4scal: ', status
+            stop
+        endif
+
+c       solve P'Lr=x for r (using r as workspace)
+        sys = 3
+        call umf4sol (sys, r, x, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       solve UQ'x=r for x
+        sys = 9
+        call umf4sol (sys, x, r, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       print the residual.  x (i) should be 7 - i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+        stop
+998     print *, 'Read error: Harwell/Boeing matrix'
+        stop
+        end
+
+c=======================================================================
+c== resid ==============================================================
+c=======================================================================
+
+c Compute the residual, r = Ax-b, its max-norm, and print the max-norm
+C Note that A is zero-based.
+
+        subroutine resid (n, nz, Ap, Ai, Ax, x, b, r)
+        integer
+     $      n, nz, Ap (n+1), Ai (n), j, i, p
+        double precision Ax (nz), x (n), b (n), r (n), rmax, aij
+
+        do 10 i = 1, n
+            r (i) = -b (i)
+10      continue
+
+        do 30 j = 1,n
+            do 20 p = Ap (j) + 1, Ap (j+1)
+                i = Ai (p) + 1
+                aij = Ax (p)
+                r (i) = r (i) + aij * x (j)
+20          continue
+30      continue
+
+        rmax = 0
+        do 40 i = 1, n
+            rmax = max (rmax, r (i))
+40      continue
+
+        print *, 'norm (A*x-b): ', rmax
+        return
+        end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,143 @@
+ Matrix key: WEST0067                      
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 2
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+symbolic analysis:
+   status:     0.
+   time:      0.00E+00 (sec)
+   estimates (upper bound) for numeric LU:
+   size of LU:          0.02 (MB)
+   memory needed:       0.06 (MB)
+   flop count:      0.14E+05
+   nnz (L):             542.
+   nnz (U):             902.
+numeric factorization:
+   status:     0.
+   time:      0.00E+00
+   actual numeric LU statistics:
+   size of LU:          0.01 (MB)
+   memory needed:       0.04 (MB)
+   flop count:      0.26E+04
+   nnz (L):             329.
+   nnz (U):             340.
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       67
+    number of columns in matrix A:    67
+    entries in matrix A:              294
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               1
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S not square or diagonal not preserved
+    symbolic factorization defragmentations:       1
+    symbolic memory usage (Units):                 1632
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         245
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              6.59006e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                    1643                 1574    96%
+        peak size (Units)                       6115                 3581    59%
+        final size (Units)                      1628                  685    42%
+    Numeric final size (Units)                  2101                 1125    54%
+    Numeric final size (MBytes)                  0.0                  0.0    54%
+    peak memory usage (Units)                   7462                 4928    66%
+    peak memory usage (MBytes)                   0.1                  0.0    66%
+    numeric factorization flops          1.41920e+04          2.58700e+03    18%
+    nz in L (incl diagonal)                      542                  329    61%
+    nz in U (incl diagonal)                      902                  340    38%
+    nz in L+U (incl diagonal)                   1377                  602    44%
+    largest front (# entries)                    483                   80    17%
+    largest # rows in front                       21                   10    48%
+    largest # columns in front                    23                   11    48%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       329
+    nz in U (incl diagonal), if none dropped       340
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     67
+    min abs. value on diagonal of U:               2.74e-02
+    max abs. value on diagonal of U:               2.28e+00
+    estimate of reciprocal of condition number:    1.20e-02
+    indices in compressed pattern:                 256
+    numerical values stored in Numeric object:     605
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.20400e+03
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        3.79100e+03
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+ norm (A*x-b):   2.22044605E-15
+ norm (A*x-b):   1.05076538E-14
+ norm (A*x-b):   1.05076538E-14
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4hb64.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,353 @@
+c=======================================================================
+c== umf4hb =============================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c umf4hb64:
+c       read a sparse matrix in the Harwell/Boeing format, factorizes
+c       it, and solves Ax=b.  Also saves and loads the factors to/from a
+c       file.  Saving to a file is not required, it's just here to
+c       demonstrate how to use this feature of UMFPACK.  This program
+c       only works on square RUA-type matrices.
+c
+c       This is HIGHLY non-portable.  It may not work with your C and
+c       FORTRAN compilers.  See umf4_f77wrapper.c for more details.
+c
+c usage (for example):
+c
+c       in a Unix shell:
+c       umf4hb64 < HB/arc130.rua
+
+        integer*8
+     $          nzmax, nmax
+        parameter (nzmax = 5000000, nmax = 160000)
+        integer*8
+     $          Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel,
+     $          numeric, symbolic, status, sys, filenum
+
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        double precision Ax (nzmax), x (nmax), b (nmax), aij, xj,
+     $          r (nmax), control (20), info (90)
+        character rhstyp*3
+
+c       ----------------------------------------------------------------
+c       read the Harwell/Boeing matrix
+c       ----------------------------------------------------------------
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp, nrhs, nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        print *, 'Matrix key: ', key
+
+        n = nrow
+        if (type .ne. 'RUA' .or. nrow .ne. ncol) then
+           print *, 'Error: can only handle square RUA matrices'
+           stop
+        endif
+        if (n .ge. nmax .or. nz .gt. nzmax) then
+           print *, ' Matrix too big!'
+           stop
+        endif
+
+c       read the matrix (1-based)
+        read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1)
+        read (5, indfmt, err = 998) (Ai (p), p = 1, nz)
+        read (5, valfmt, err = 998) (Ax (p), p = 1, nz)
+
+c       ----------------------------------------------------------------
+c       create the right-hand-side, assume x (i) = 1 + i/n
+c       ----------------------------------------------------------------
+
+        do 30 i = 1,n
+            b (i) = 0
+30      continue
+c       b = A*x
+        do 50 j = 1,n
+            xj = j
+            xj = 1 + xj / n
+            do 40 p = Ap (j), Ap (j+1)-1
+                i = Ai (p)
+                aij = Ax (p)
+                b (i) = b (i) + aij * xj
+40          continue
+50      continue
+
+c       ----------------------------------------------------------------
+c       convert from 1-based to 0-based
+c       ----------------------------------------------------------------
+
+        do 60 j = 1, n+1
+            Ap (j) = Ap (j) - 1
+60      continue
+        do 70 p = 1, nz
+            Ai (p) = Ai (p) - 1
+70      continue
+
+c       ----------------------------------------------------------------
+c       factor the matrix and save to a file
+c       ----------------------------------------------------------------
+
+c       set default parameters
+        call umf4def (control)
+
+c       print control parameters.  set control (1) to 1 to print
+c       error messages only
+        control (1) = 2
+        call umf4pcon (control)
+
+c       pre-order and symbolic analysis
+        call umf4sym (n, n, Ap, Ai, Ax, symbolic, control, info)
+
+c       print statistics computed so far
+c       call umf4pinf (control, info) could also be done.
+        print 80, info (1), info (16),
+     $      (info (21) * info (4)) / 2**20,
+     $      (info (22) * info (4)) / 2**20,
+     $      info (23), info (24), info (25)
+80      format ('symbolic analysis:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, ' (sec)'/,
+     $      '   estimates (upper bound) for numeric LU:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4sym error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sym: ', info (1)
+            stop
+        endif
+
+c       numeric factorization
+        call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info)
+
+c       print statistics for the numeric factorization
+c       call umf4pinf (control, info) could also be done.
+        print 90, info (1), info (66),
+     $      (info (41) * info (4)) / 2**20,
+     $      (info (42) * info (4)) / 2**20,
+     $      info (43), info (44), info (45)
+90      format ('numeric factorization:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, /,
+     $      '   actual numeric LU statistics:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4num error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4num: ', info (1)
+            stop
+        endif
+
+c       save the symbolic analysis to the file s0.umf
+c       note that this is not needed until another matrix is
+c       factorized, below.
+	filenum = 0
+        call umf4ssym (symbolic, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4ssym: ', status
+            stop
+        endif
+
+c       save the LU factors to the file n0.umf
+        call umf4snum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4snum: ', status
+            stop
+        endif
+
+c       free the symbolic analysis
+        call umf4fsym (symbolic)
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       ----------------------------------------------------------------
+c       load the LU factors back in, and solve the system
+c       ----------------------------------------------------------------
+
+c       At this point the program could terminate and load the LU
+C       factors (numeric) from the n0.umf file, and solve the
+c       system (see below).  Note that the symbolic object is not
+c       required.
+
+c       load the numeric factorization back in (filename: n0.umf)
+        call umf4lnum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4lnum: ', status
+            stop
+        endif
+
+c       solve Ax=b, without iterative refinement
+        sys = 0
+        call umf4sol (sys, x, b, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       print final statistics
+        call umf4pinf (control, info)
+
+c       print the residual.  x (i) should be 1 + i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+c       ----------------------------------------------------------------
+c       load the symbolic analysis back in, and factorize a new matrix
+c       ----------------------------------------------------------------
+
+c       Again, the program could terminate here, recreate the matrix,
+c       and refactorize.  Note that umf4sym is not called.
+
+c       load the symbolic factorization back in (filename: s0.umf)
+        call umf4lsym (symbolic, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4lsym: ', status
+            stop
+        endif
+
+c       arbitrarily change the values of the matrix but not the pattern
+        do 100 p = 1, nz
+            Ax (p) = Ax (p) + 3.14159 / 100.0
+100     continue
+
+c       numeric factorization of the modified matrix
+        call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4num: ', info (1)
+            stop
+        endif
+
+c       free the symbolic analysis
+        call umf4fsym (symbolic)
+
+c       create a new right-hand-side, assume x (i) = 7 - i/n
+        do 110 i = 1,n
+            b (i) = 0
+110     continue
+c       b = A*x, with the modified matrix A (note that A is now 0-based)
+        do 130 j = 1,n
+            xj = j
+            xj = 7 - xj / n
+            do 120 p = Ap (j) + 1, Ap (j+1)
+                i = Ai (p) + 1
+                aij = Ax (p)
+                b (i) = b (i) + aij * xj
+120         continue
+130     continue
+
+c       ----------------------------------------------------------------
+c       solve Ax=b, with iterative refinement
+c       ----------------------------------------------------------------
+
+        sys = 0
+        call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4solr: ', info (1)
+            stop
+        endif
+
+c       print the residual.  x (i) should be 7 - i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+c       ----------------------------------------------------------------
+c       solve Ax=b, without iterative refinement, broken into steps
+c       ----------------------------------------------------------------
+
+c       the factorization is PAQ=LU, PRAQ=LU, or P(R\A)Q=LU.
+
+c       x = R*b (or x=R\b, or x=b, as appropriate)
+        call umf4scal (x, b, numeric, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4scal: ', status
+            stop
+        endif
+
+c       solve P'Lr=x for r (using r as workspace)
+        sys = 3
+        call umf4sol (sys, r, x, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       solve UQ'x=r for x
+        sys = 9
+        call umf4sol (sys, x, r, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4sol: ', info (1)
+            stop
+        endif
+
+c       free the numeric factorization
+        call umf4fnum (numeric)
+
+c       print the residual.  x (i) should be 7 - i/n
+        call resid (n, nz, Ap, Ai, Ax, x, b, r)
+
+        stop
+998     print *, 'Read error: Harwell/Boeing matrix'
+        stop
+        end
+
+c=======================================================================
+c== resid ==============================================================
+c=======================================================================
+
+c Compute the residual, r = Ax-b, its max-norm, and print the max-norm
+C Note that A is zero-based.
+
+        subroutine resid (n, nz, Ap, Ai, Ax, x, b, r)
+        integer*8
+     $      n, nz, Ap (n+1), Ai (n), j, i, p
+        double precision Ax (nz), x (n), b (n), r (n), rmax, aij
+
+        do 10 i = 1, n
+            r (i) = -b (i)
+10      continue
+
+        do 30 j = 1,n
+            do 20 p = Ap (j) + 1, Ap (j+1)
+                i = Ai (p) + 1
+                aij = Ax (p)
+                r (i) = r (i) + aij * x (j)
+20          continue
+30      continue
+
+        rmax = 0
+        do 40 i = 1, n
+            rmax = max (rmax, r (i))
+40      continue
+
+        print *, 'norm (A*x-b): ', rmax
+        return
+        end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.f	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,279 @@
+c=======================================================================
+c== umf4zhb ============================================================
+c=======================================================================
+
+c-----------------------------------------------------------------------
+c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
+c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
+c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
+c-----------------------------------------------------------------------
+
+c umf4zhb:
+c       read a sparse matrix in the Harwell/Boeing format, factorizes
+c       it, and solves Ax=b.  Also saves and loads the factors to/from a
+c       file.  Saving to a file is not required, it's just here to
+c       demonstrate how to use this feature of UMFPACK.  This program
+c       only works on square CUA-type matrices.
+c
+c       This is HIGHLY non-portable.  It may not work with your C and
+c       FORTRAN compilers.  See umf4z_f77wrapper.c for more details.
+c
+c usage (for example):
+c
+c       in a Unix shell:
+c       umf4zhb < HB/arc130.cua
+
+        integer
+     $          nzmax, nmax
+        parameter (nzmax = 5000000, nmax = 160000)
+        integer
+     $          Ap (nmax), Ai (nzmax), n, nz, totcrd, ptrcrd, i, j, p,
+     $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, nzrhs, nel,
+     $          numeric, symbolic, status, sys, filenum
+
+        character title*72, key*30, type*3, ptrfmt*16,
+     $          indfmt*16, valfmt*20, rhsfmt*20
+        double precision Ax (nzmax), x (nmax), b (nmax),
+     $          control (20), info (90)
+	complex*16 AA (nzmax), XX (nmax), BB (nmax), r (nmax), aij, xj
+	double precision Az (nmax), xz (nmax), bz (nmax), xi, xr
+        character rhstyp*3
+
+c       ----------------------------------------------------------------
+c       read the Harwell/Boeing matrix
+c       ----------------------------------------------------------------
+
+        read (5, 10, err = 998)
+     $          title, key,
+     $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
+     $          type, nrow, ncol, nz, nel,
+     $          ptrfmt, indfmt, valfmt, rhsfmt
+        if (rhscrd .gt. 0) then
+c          new Harwell/Boeing format:
+           read (5, 20, err = 998) rhstyp, nrhs, nzrhs
+           endif
+10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
+20      format (a3, 11x, 2i14)
+
+        print *, 'Matrix key: ', key
+
+        n = nrow
+        if (type .ne. 'CUA' .or. nrow .ne. ncol) then
+           print *, 'Error: can only handle square CUA matrices'
+           stop
+        endif
+        if (n .ge. nmax .or. nz .gt. nzmax) then
+           print *, ' Matrix too big!'
+           stop
+        endif
+
+c       read the matrix (1-based)
+        read (5, ptrfmt, err = 998) (Ap (p), p = 1, ncol+1)
+        read (5, indfmt, err = 998) (Ai (p), p = 1, nz)
+        read (5, valfmt, err = 998) (AA (p), p = 1, nz)
+
+	do 15 p = 1, nz
+	    Ax (p) = dble (AA (p))
+	    Az (p) = imag (AA (p))
+15	continue
+
+c       ----------------------------------------------------------------
+c       create the right-hand-side, assume
+c	x (i) = (1 + i/n), (n + i/100)
+c       ----------------------------------------------------------------
+
+        do 30 i = 1,n
+            BB (i) = 0
+30      continue
+c       b = A*x
+        do 50 j = 1,n
+            xr = j
+	    xi = n
+	    xi = xi + xr/100
+	    xr = 1 + xr / n
+            xj = dcmplx (xr, xi)
+            do 40 p = Ap (j), Ap (j+1)-1
+                i = Ai (p)
+                aij = AA (p)
+                BB (i) = BB (i) + aij * xj
+40          continue
+50      continue
+        do 32 i = 1,n
+            b  (i) = dble (BB (i))
+            bz (i) = imag (BB (i))
+32      continue
+
+c       ----------------------------------------------------------------
+c       convert from 1-based to 0-based
+c       ----------------------------------------------------------------
+
+        do 60 j = 1, n+1
+            Ap (j) = Ap (j) - 1
+60      continue
+        do 70 p = 1, nz
+            Ai (p) = Ai (p) - 1
+70      continue
+
+c       ----------------------------------------------------------------
+c       factor the matrix and save to a file
+c       ----------------------------------------------------------------
+
+c       set default parameters
+        call umf4zdef (control)
+
+c       print control parameters.  set control (1) to 1 to print
+c       error messages only
+        control (1) = 2
+        call umf4zpcon (control)
+
+c       pre-order and symbolic analysis
+        call umf4zsym (n, n, Ap, Ai, Ax, Az, symbolic, control, info)
+
+c       print statistics computed so far
+c       call umf4zpinf (control, info) could also be done.
+        print 80, info (1), info (16),
+     $      (info (21) * info (4)) / 2**20,
+     $      (info (22) * info (4)) / 2**20,
+     $      info (23), info (24), info (25)
+80      format ('symbolic analysis:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, ' (sec)'/,
+     $      '   estimates (upper bound) for numeric LU:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4zsym error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4zsym: ', info (1)
+            stop
+        endif
+
+c       numeric factorization
+        call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info)
+
+c       print statistics for the numeric factorization
+c       call umf4zpinf (control, info) could also be done.
+        print 90, info (1), info (66),
+     $      (info (41) * info (4)) / 2**20,
+     $      (info (42) * info (4)) / 2**20,
+     $      info (43), info (44), info (45)
+90      format ('numeric factorization:',/,
+     $      '   status:  ', f5.0, /,
+     $      '   time:    ', e10.2, /,
+     $      '   actual numeric LU statistics:', /,
+     $      '   size of LU:    ', f10.2, ' (MB)', /,
+     $      '   memory needed: ', f10.2, ' (MB)', /,
+     $      '   flop count:    ', e10.2, /
+     $      '   nnz (L):       ', f10.0, /
+     $      '   nnz (U):       ', f10.0)
+
+c       check umf4znum error condition
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4znum: ', info (1)
+            stop
+        endif
+
+c       save the symbolic analysis to the file s42.umf
+c       note that this is not needed until another matrix is
+c       factorized, below.
+	filenum = 42
+        call umf4zssym (symbolic, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4zssym: ', status
+            stop
+        endif
+
+c       save the LU factors to the file n0.umf
+        call umf4zsnum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4zsnum: ', status
+            stop
+        endif
+
+c       free the symbolic analysis
+        call umf4zfsym (symbolic)
+
+c       free the numeric factorization
+        call umf4zfnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       ----------------------------------------------------------------
+c       load the LU factors back in, and solve the system
+c       ----------------------------------------------------------------
+
+c       At this point the program could terminate and load the LU
+C       factors (numeric) from the n0.umf file, and solve the
+c       system (see below).  Note that the symbolic object is not
+c       required.
+
+c       load the numeric factorization back in (filename: n0.umf)
+        call umf4zlnum (numeric, filenum, status)
+        if (status .lt. 0) then
+            print *, 'Error occurred in umf4zlnum: ', status
+            stop
+        endif
+
+c       solve Ax=b, without iterative refinement
+        sys = 0
+        call umf4zsol (sys, x, xz, b, bz, numeric, control, info)
+        if (info (1) .lt. 0) then
+            print *, 'Error occurred in umf4zsol: ', info (1)
+            stop
+        endif
+        do 33 i = 1,n
+            XX (i) = dcmplx (x (i), xz (i))
+33      continue
+
+c       free the numeric factorization
+        call umf4zfnum (numeric)
+
+c       No LU factors (symbolic or numeric) are in memory at this point.
+
+c       print final statistics
+        call umf4zpinf (control, info)
+
+c       print the residual.  x (i) should be 1 + i/n
+        call resid (n, nz, Ap, Ai, AA, XX, BB, r)
+
+        stop
+998     print *, 'Read error: Harwell/Boeing matrix'
+        stop
+        end
+
+c=======================================================================
+c== resid ==============================================================
+c=======================================================================
+
+c Compute the residual, r = Ax-b, its max-norm, and print the max-norm
+C Note that A is zero-based.
+
+        subroutine resid (n, nz, Ap, Ai, A, x, b, r)
+        integer
+     $      n, nz, Ap (n+1), Ai (n), j, i, p
+        complex*16 A (nz), x (n), b (n), r (n), aij
+	double precision rmax
+
+        do 10 i = 1, n
+            r (i) = -b (i)
+10      continue
+
+        do 30 j = 1,n
+            do 20 p = Ap (j) + 1, Ap (j+1)
+                i = Ai (p) + 1
+                aij = A (p)
+                r (i) = r (i) + aij * x (j)
+20          continue
+30      continue
+
+        rmax = 0
+        do 40 i = 1, n
+            rmax = max (rmax, abs (r (i)))
+40      continue
+
+        print *, 'norm (A*x-b): ', rmax
+        return
+        end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umf4zhb.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,160 @@
+ Matrix key: QC324                         
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double complex
+    Int (generic integer) defined as: int
+
+    0: print level: 2
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes)
+
+symbolic analysis:
+   status:     0.
+   time:      0.10E-01 (sec)
+   estimates (upper bound) for numeric LU:
+   size of LU:          1.17 (MB)
+   memory needed:       2.40 (MB)
+   flop count:      0.26E+08
+   nnz (L):           24027.
+   nnz (U):           39609.
+numeric factorization:
+   status:     0.
+   time:      0.10E-01
+   actual numeric LU statistics:
+   size of LU:          0.72 (MB)
+   memory needed:       1.14 (MB)
+   flop count:      0.14E+08
+   nnz (L):           23247.
+   nnz (U):           23247.
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       324
+    number of columns in matrix A:    324
+    entries in matrix A:              26730
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    symmetric
+    ordering used:                    amd on A+A'
+    modify Q during factorization:    no
+    prefer diagonal pivoting:         yes
+    pivots with zero Markowitz cost:               0
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    324
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    324
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               26406
+        nz on diagonal of matrix S:                324
+        fraction of nz on diagonal:                1.000000
+    AMD statistics, for strict diagonal pivoting:
+        est. flops for LU factorization:           1.55342e+07
+        est. nz in L+U (incl. diagonal):           47730
+        est. largest front (# entries):            14641
+        est. max nz in any column of L:            121
+        number of "dense" rows/columns in S+S':    0
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 63466
+    symbolic memory usage (MBytes):                0.5
+    Symbolic size (Units):                         1418
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.01
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              2.55982e-01
+    maximum sum (abs (rows of A)):              1.82217e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                   98017                97692   100%
+        peak size (Units)                     307744               142557    46%
+        final size (Units)                    150384                92058    61%
+    Numeric final size (Units)                153181                94693    62%
+    Numeric final size (MBytes)                  1.2                  0.7    62%
+    peak memory usage (Units)                 314850               149663    48%
+    peak memory usage (MBytes)                   2.4                  1.1    48%
+    numeric factorization flops          2.56313e+07          1.43519e+07    56%
+    nz in L (incl diagonal)                    24027                23247    97%
+    nz in U (incl diagonal)                    39609                23247    59%
+    nz in L+U (incl diagonal)                  63312                46170    73%
+    largest front (# entries)                  19723                 6724    34%
+    largest # rows in front                      121                   82    68%
+    largest # columns in front                   163                   82    50%
+
+    initial allocation ratio used:                 1.2
+    # of forced updates due to frontal growth:     0
+    number of off-diagonal pivots:                 0
+    nz in L (incl diagonal), if none dropped       23247
+    nz in U (incl diagonal), if none dropped       23247
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     324
+    min abs. value on diagonal of U:               5.47e-03
+    max abs. value on diagonal of U:               8.25e-01
+    estimate of reciprocal of condition number:    6.63e-03
+    indices in compressed pattern:                 485
+    numerical values stored in Numeric object:     46170
+    numeric factorization defragmentations:        0
+    numeric factorization reallocations:           0
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.01
+    numeric factorization wallclock time (sec):    0.02
+    numeric factorization mflops (CPU time):       1435.19
+    numeric factorization mflops (wallclock):      717.60
+    symbolic + numeric CPU time (sec):             0.02
+    symbolic + numeric mflops (CPU time):          717.60
+    symbolic + numeric wall clock time (sec):      0.02
+    symbolic + numeric mflops (wall clock):        717.60
+
+    solve flops:                                   3.70332e+05
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.47223e+07
+    total symbolic + numeric + solve CPU time:     0.02
+    total symbolic + numeric + solve mflops (CPU): 736.11
+    total symbolic+numeric+solve wall clock time:  0.02
+    total symbolic+numeric+solve mflops(wallclock) 736.11
+
+ norm (A*x-b):   2.96487174E-13
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,759 @@
+/* ========================================================================== */
+/* === umfpack_di_demo ====================================================== */
+/* ========================================================================== */
+
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+  A demo of UMFPACK:   umfpack_di_* version.
+
+  First, factor and solve a 5-by-5 system, Ax=b, using default parameters.
+  Then solve A'x=b using the factors of A.   Modify one entry (A (1,4) = 0,
+  where the row and column indices range from 0 to 4.  The pattern of A
+  has not changed (it has explicitly zero entry), so a reanalysis with
+  umfpack_di_symbolic does not need to be done.  Refactorize (with
+  umfpack_di_numeric), and solve Ax=b.  Note that the pivot ordering has
+  changed.  Next, change all of the entries in A, but not the pattern.
+
+  Finally, compute C = A', and do the symbolic and numeric factorization of C.
+  Factorizing A' can sometimes be better than factorizing A itself (less work
+  and memory usage).  Solve C'x=b twice; the solution is the same as the
+  solution to Ax=b.
+
+  A note about zero-sized arrays:  UMFPACK uses many user-provided arrays of
+  size n (order of the matrix), and of size nz (the number of nonzeros in a
+  matrix).  n cannot be zero; UMFPACK does not handle zero-dimensioned arrays.
+  However, nz can be zero.  If you attempt to malloc an array of size nz = 0,
+  however, malloc will return a null pointer which UMFPACK will report as a
+  "missing argument."  Thus, nz1 in this code is set to MAX (nz,1), and
+  similarly for lnz and unz.  Lnz can never be zero, however, since L is always
+  unit diagonal.
+*/
+
+/* -------------------------------------------------------------------------- */
+/* definitions */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "umfpack.h"
+
+#define ABS(x) ((x) >= 0 ? (x) : -(x))
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* triplet form of the matrix.  The triplets can be in any order. */
+/* -------------------------------------------------------------------------- */
+
+static int    n = 5, nz = 12 ;
+static int    Arow [ ] = { 0,  4,  1,  1,   2,   2,  0,  1,  2,  3,  4,  4} ;
+static int    Acol [ ] = { 0,  4,  0,  2,   1,   2,  1,  4,  3,  2,  1,  2} ;
+static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ;
+static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ;
+
+
+/* -------------------------------------------------------------------------- */
+/* error: print a message and exit */
+/* -------------------------------------------------------------------------- */
+
+static void error
+(
+    char *message
+)
+{
+    printf ("\n\n====== error: %s =====\n\n", message) ;
+    exit (1) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    int transpose,
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ]
+)
+{
+    int i, j, p ;
+    double norm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = -b [i] ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [j] += Ax [p] * x [i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+	    }
+	}
+    }
+    norm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	norm = MAX (ABS (r [i]), norm) ;
+    }
+    return (norm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux,
+	*W, t [2], *Dx, rnorm, *Rb, *y, *Rs ;
+    int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up,
+	*P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1,
+	status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1,
+	*Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc,
+	nzud, do_recip ;
+    void *Symbolic, *Numeric ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (t) ;
+
+    printf ("\n%s demo: _di_ version\n", UMFPACK_VERSION) ;
+
+    /* get the default control parameters */
+    umfpack_di_defaults (Control) ;
+
+    /* change the default print level for this demo */
+    /* (otherwise, nothing will print) */
+    Control [UMFPACK_PRL] = 6 ;
+
+    /* print the license agreement */
+    umfpack_di_report_status (Control, UMFPACK_OK) ;
+    Control [UMFPACK_PRL] = 5 ;
+
+    /* print the control parameters */
+    umfpack_di_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print A and b, and convert A to column-form */
+    /* ---------------------------------------------------------------------- */
+
+    /* print the right-hand-side */
+    printf ("\nb: ") ;
+    (void) umfpack_di_report_vector (n, b, Control) ;
+
+    /* print the triplet form of the matrix */
+    printf ("\nA: ") ;
+    (void) umfpack_di_report_triplet (n, n, nz, Arow, Acol, Aval,
+	Control) ;
+
+    /* convert to column form */
+    nz1 = MAX (nz,1) ;	/* ensure arrays are not of size zero. */
+    Ap = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ai = (int *) malloc (nz1 * sizeof (int)) ;
+    Ax = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_di_triplet_to_col (n, n, nz, Arow, Acol, Aval,
+	Ap, Ai, Ax, (int *) NULL) ;
+
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_triplet_to_col failed") ;
+    }
+
+    /* print the column-form of A */
+    printf ("\nA: ") ;
+    (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_symbolic failed") ;
+    }
+
+    /* print the symbolic factorization */
+
+    printf ("\nSymbolic factorization of A: ") ;
+    (void) umfpack_di_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_numeric failed") ;
+    }
+
+    /* print the numeric factorization */
+    printf ("\nNumeric factorization of A: ") ;
+    (void) umfpack_di_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_di_report_info (Control, Info) ;
+    umfpack_di_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_di_solve failed") ;
+    }
+    printf ("\nx (solution of Ax=b): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_get_determinant (x, r, Numeric, Info) ;
+    umfpack_di_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_di_get_determinant failed") ;
+    }
+    printf ("determinant: (%g", x [0]) ;
+    printf (") * 10^(%g)\n", r [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, broken down into steps */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rb = R*b */
+    Rb  = (double *) malloc (n * sizeof (double)) ;
+    y   = (double *) malloc (n * sizeof (double)) ;
+    if (!Rb || !y) error ("out of memory") ;
+
+    status = umfpack_di_scale (Rb, b, Numeric) ;
+    if (status < 0) error ("umfpack_di_scale failed") ;
+    /* solve Ly = P*(Rb) */
+    status = umfpack_di_solve (UMFPACK_Pt_L, Ap, Ai, Ax, y, Rb,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_di_solve failed") ;
+    /* solve UQ'x=y */
+    status = umfpack_di_solve (UMFPACK_U_Qt, Ap, Ai, Ax, x, y,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_di_solve failed") ;
+    printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    free (Rb) ;
+    free (y) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve A'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_solve (UMFPACK_At, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_di_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_di_solve failed") ;
+    }
+    printf ("\nx (solution of A'x=b): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify one numerical value in the column-form of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* change A (1,4), look for row index 1 in column 4. */
+    row = 1 ;
+    col = 4 ;
+    for (p = Ap [col] ; p < Ap [col+1] ; p++)
+    {
+	if (row == Ai [p])
+	{
+	    printf ("\nchanging A (%d,%d) to zero\n", row, col) ;
+	    Ax [p] = 0.0 ;
+	    break ;
+	}
+    }
+    printf ("\nmodified A: ") ;
+    (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */
+    /* doesn't have to be redone, no matter how much we change Ax. */
+
+    /* We don't need the Numeric object any more, so free it. */
+    umfpack_di_free_numeric (&Numeric) ;
+
+    /* Note that a memory leak would have occurred if the old Numeric */
+    /* had not been free'd with umfpack_di_free_numeric above. */
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of modified A: ") ;
+    (void) umfpack_di_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_di_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_solve failed") ;
+    }
+    printf ("\nx (with modified A): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify all of the numerical values of A, but not the pattern */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Ap [col] ; p < Ap [col+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    printf ("changing ") ;
+	    printf ("A (%d,%d) from %g", row, col, Ax [p]) ;
+	    Ax [p] = Ax [p] + col*10 - row ;
+	    printf (" to %g\n", Ax [p]) ;
+	}
+    }
+    printf ("\ncompletely modified A (same pattern): ") ;
+    (void) umfpack_di_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Symbolic object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "symbolic.umf" */
+    printf ("\nSaving symbolic object:\n") ;
+    status = umfpack_di_save_symbolic (Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_save_symbolic failed") ;
+    }
+    printf ("\nFreeing symbolic object:\n") ;
+    umfpack_di_free_symbolic (&Symbolic) ;
+    printf ("\nLoading symbolic object:\n") ;
+    status = umfpack_di_load_symbolic (&Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_load_symbolic failed") ;
+    }
+    printf ("\nDone loading symbolic object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_di_free_numeric (&Numeric) ;
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of completely modified A: ") ;
+    (void) umfpack_di_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_di_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_solve failed") ;
+    }
+    printf ("\nx (with completely modified A): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the symbolic and numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_di_free_symbolic (&Symbolic) ;
+    umfpack_di_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = transpose of A */
+    /* ---------------------------------------------------------------------- */
+
+    Cp = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ci = (int *) malloc (nz1 * sizeof (int)) ;
+    Cx = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Cp || !Ci || !Cx)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_di_transpose (n, n, Ap, Ai, Ax,
+	(int *) NULL, (int *) NULL, Cp, Ci, Cx) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_transpose failed: ") ;
+    }
+    printf ("\nC (transpose of A): ") ;
+    (void) umfpack_di_report_matrix (n, n, Cp, Ci, Cx, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_symbolic (n, n, Cp, Ci, Cx, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_info (Control, Info) ;
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_symbolic failed") ;
+    }
+    printf ("\nSymbolic factorization of C: ") ;
+    (void) umfpack_di_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the contents of Symbolic into user arrays print them */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nGet the contents of the Symbolic object for C:\n") ;
+    printf ("(compare with umfpack_di_report_symbolic output, above)\n") ;
+    Pinit = (int *) malloc ((n+1) * sizeof (int)) ;
+    Qinit = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_npivcol = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_1strow = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_leftmostdesc = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_parent = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_start = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_maxrows = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_maxcols = (int *) malloc ((n+1) * sizeof (int)) ;
+    if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start ||
+	!Chain_maxrows || !Chain_maxcols || !Front_1strow ||
+	!Front_leftmostdesc)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_di_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains,
+	Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+    if (status < 0)
+    {
+	error ("symbolic factorization invalid") ;
+    }
+
+    printf ("From the Symbolic object, C is of dimension %d-by-%d\n", nr, nc);
+    printf ("   with nz = %d, number of fronts = %d,\n", nz, nfr) ;
+    printf ("   number of frontal matrix chains = %d\n", nchains) ;
+
+    printf ("\nPivot columns in each front, and parent of each front:\n") ;
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fnpiv = Front_npivcol [i] ;
+	printf ("    Front %d: parent front: %d number of pivot cols: %d\n",
+		i, Front_parent [i], fnpiv) ;
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    col = Qinit [k] ;
+	    printf (
+	    "        %d-th pivot column is column %d in original matrix\n",
+		k, col) ;
+	    k++ ;
+	}
+    }
+
+    printf ("\nNote that the column ordering, above, will be refined\n") ;
+    printf ("in the numeric factorization below.  The assignment of pivot\n") ;
+    printf ("columns to frontal matrices will always remain unchanged.\n") ;
+
+    printf ("\nTotal number of pivot columns in frontal matrices: %d\n", k) ;
+
+    printf ("\nFrontal matrix chains:\n") ;
+    for (j = 0 ; j < nchains ; j++)
+    {
+	printf ("   Frontal matrices %d to %d are factorized in a single\n",
+	    Chain_start [j], Chain_start [j+1] - 1) ;
+	printf ("        working array of size %d-by-%d\n",
+	    Chain_maxrows [j], Chain_maxcols [j]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_numeric (Cp, Ci, Cx, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_di_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of C: ") ;
+    (void) umfpack_di_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extract the LU factors of C and print them */
+    /* ---------------------------------------------------------------------- */
+
+    if (umfpack_di_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0)
+    {
+	error ("umfpack_di_get_lunz failed") ;
+    }
+    /* ensure arrays are not of zero size */
+    lnz1 = MAX (lnz,1) ;
+    unz1 = MAX (unz,1) ;
+    Lp = (int *) malloc ((n+1) * sizeof (int)) ;
+    Lj = (int *) malloc (lnz1 * sizeof (int)) ;
+    Lx = (double *) malloc (lnz1 * sizeof (double)) ;
+    Up = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ui = (int *) malloc (unz1 * sizeof (int)) ;
+    Ux = (double *) malloc (unz1 * sizeof (double)) ;
+    P = (int *) malloc (n * sizeof (int)) ;
+    Q = (int *) malloc (n * sizeof (int)) ;
+    Dx = (double *) NULL ;	/* D vector not requested */
+    Rs  = (double *) malloc (n * sizeof (double)) ;
+    if (!Lp || !Lj || !Lx || !Up || !Ui || !Ux || !P || !Q || !Rs)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux,
+	P, Q, Dx, &do_recip, Rs, Numeric) ;
+    if (status < 0)
+    {
+	error ("umfpack_di_get_numeric failed") ;
+    }
+
+    printf ("\nL (lower triangular factor of C): ") ;
+    (void) umfpack_di_report_matrix (n, n, Lp, Lj, Lx, 0, Control) ;
+    printf ("\nU (upper triangular factor of C): ") ;
+    (void) umfpack_di_report_matrix (n, n, Up, Ui, Ux, 1, Control) ;
+    printf ("\nP: ") ;
+    (void) umfpack_di_report_perm (n, P, Control) ;
+    printf ("\nQ: ") ;
+    (void) umfpack_di_report_perm (n, Q, Control) ;
+    printf ("\nScale factors: row i of A is to be ") ;
+    if (do_recip)
+    {
+	printf ("multiplied by the ith scale factor\n") ;
+    }
+    else
+    {
+	printf ("divided by the ith scale factor\n") ;
+    }
+    for (i = 0 ; i < n ; i++) printf ("%d: %g\n", i, Rs [i]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to triplet form and print it */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that L is in row-form, so it is the row indices that are created */
+    /* by umfpack_di_col_to_triplet. */
+
+    printf ("\nConverting L to triplet form, and printing it:\n") ;
+    Li = (int *) malloc (lnz1 * sizeof (int)) ;
+    if (!Li)
+    {
+	error ("out of memory") ;
+    }
+    if (umfpack_di_col_to_triplet (n, Lp, Li) < 0)
+    {
+	error ("umfpack_di_col_to_triplet failed") ;
+    }
+    printf ("\nL, in triplet form: ") ;
+    (void) umfpack_di_report_triplet (n, n, lnz, Li, Lj, Lx, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Numeric object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "numeric.umf" */
+    printf ("\nSaving numeric object:\n") ;
+    status = umfpack_di_save_numeric (Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_save_numeric failed") ;
+    }
+    printf ("\nFreeing numeric object:\n") ;
+    umfpack_di_free_numeric (&Numeric) ;
+    printf ("\nLoading numeric object:\n") ;
+    status = umfpack_di_load_numeric (&Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_load_numeric failed") ;
+    }
+    printf ("\nDone loading numeric object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_di_solve (UMFPACK_At, Cp, Ci, Cx, x, b,
+	Numeric, Control, Info) ;
+    umfpack_di_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_solve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b again, using umfpack_di_wsolve instead */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nSolving C'x=b again, using umfpack_di_wsolve instead:\n") ;
+    Wi = (int *) malloc (n * sizeof (int)) ;
+    W = (double *) malloc (5*n * sizeof (double)) ;
+    if (!Wi || !W)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_di_wsolve (UMFPACK_At, Cp, Ci, Cx, x, b,
+	Numeric, Control, Info, Wi, W) ;
+    umfpack_di_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_di_report_status (Control, status) ;
+	error ("umfpack_di_wsolve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_di_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free everything */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is not strictly required since the process is exiting and the */
+    /* system will reclaim the memory anyway.  It's useful, though, just as */
+    /* a list of what is currently malloc'ed by this program.  Plus, it's */
+    /* always a good habit to explicitly free whatever you malloc. */
+
+    free (Ap) ;
+    free (Ai) ;
+    free (Ax) ;
+
+    free (Cp) ;
+    free (Ci) ;
+    free (Cx) ;
+
+    free (Pinit) ;
+    free (Qinit) ;
+    free (Front_npivcol) ;
+    free (Front_1strow) ;
+    free (Front_leftmostdesc) ;
+    free (Front_parent) ;
+    free (Chain_start) ;
+    free (Chain_maxrows) ;
+    free (Chain_maxcols) ;
+
+    free (Lp) ;
+    free (Lj) ;
+    free (Lx) ;
+
+    free (Up) ;
+    free (Ui) ;
+    free (Ux) ;
+
+    free (P) ;
+    free (Q) ;
+
+    free (Li) ;
+
+    free (Wi) ;
+    free (W) ;
+
+    umfpack_di_free_symbolic (&Symbolic) ;
+    umfpack_di_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the total time spent in this demo */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (t) ;
+    printf ("\numfpack_di_demo complete.\nTotal time: %5.2f seconds"
+	" (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ;
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1541 @@
+
+UMFPACK V4.4 (Jan. 28, 2005) demo: _di_ version
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+
+UMFPACK License:
+
+   Your use or distribution of UMFPACK or any modified version of
+   UMFPACK implies that you agree to this License.
+
+   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+   Permission is hereby granted to use or copy this program, provided
+   that the Copyright, this License, and the Availability of the original
+   version is retained on all copies.  User documentation of any code that
+   uses UMFPACK or any modified version of UMFPACK code must cite the
+   Copyright, this License, the Availability note, and "Used by permission."
+   Permission to modify the code and to distribute modified code is granted,
+   provided the Copyright, this License, and the Availability note are
+   retained, and a notice that the code was modified is included.  This
+   software was developed with support from the National Science Foundation,
+   and is provided to you free of charge.
+
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: int
+
+    0: print level: 5
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+
+b: dense vector, n = 5. 
+    0 : (8)
+    1 : (45)
+    2 : (-3)
+    3 : (3)
+    4 : (19)
+    dense vector OK
+
+
+A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. 
+    0 : 0 0  (2)
+    1 : 4 4  (1)
+    2 : 1 0  (3)
+    3 : 1 2  (4)
+    4 : 2 1  (-1)
+    5 : 2 2  (-3)
+    6 : 0 1  (3)
+    7 : 1 4  (6)
+    8 : 2 3  (2)
+    9 : 3 2  (1)
+    10 : 4 1  (4)
+    11 : 4 2  (2)
+    triplet-form matrix OK
+
+
+A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (3)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3)
+	row 2 : (-1)
+	row 4 : (4)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4)
+	row 2 : (-3)
+	row 3 : (1)
+	row 4 : (2)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (6)
+	row 4 : (1)
+    column-form matrix OK
+
+
+Symbolic factorization of A: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 74  (MBytes): 0.0
+	estimated peak size (Units):  1301  (MBytes): 0.0
+	estimated final size (Units): 15  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Numeric factorization of A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 80
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.42857e-01
+    max abs. value on diagonal of U:            2.19231e+00
+    reciprocal condition number estimate:       6.52e-02
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.2)
+    1 : (0.0769231)
+    2 : (0.166667)
+    3 : (1)
+    4 : (0.142857)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.307692)
+	row 3 :  (0.285714)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.576923)
+
+    column 3:  length 1.
+	row 4 :  (3.23077)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.571429)
+
+    row 2:  length 1.
+	col 4 : (0.6)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.5)
+	col 4 :  (-0.166667)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.333333)
+    1 : (1)
+    2 : (0.4)
+    3 : (0.142857)
+    4 : (-2.19231)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.43e-01
+    max abs. value on diagonal of U:               2.19e+00
+    estimate of reciprocal of condition number:    6.52e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.19000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  4.67e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.25000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+x (solution of Ax=b): dense vector, n = 5. 
+    0 : (1)
+    1 : (2)
+    2 : (3)
+    3 : (4)
+    4 : (5)
+    dense vector OK
+
+maxnorm of residual: 1.77636e-15
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+determinant: (1.14) * 10^(2)
+
+x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. 
+    0 : (1)
+    1 : (2)
+    2 : (3)
+    3 : (4)
+    4 : (5)
+    dense vector OK
+
+maxnorm of residual: 1.77636e-15
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.43e-01
+    max abs. value on diagonal of U:               2.19e+00
+    estimate of reciprocal of condition number:    6.52e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  5.84e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of A'x=b): dense vector, n = 5. 
+    0 : (1.81579)
+    1 : (1.45614)
+    2 : (1.5)
+    3 : (-24.8509)
+    4 : (10.2632)
+    dense vector OK
+
+maxnorm of residual: 7.10543e-15
+
+
+changing A (1,4) to zero
+
+modified A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (3)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3)
+	row 2 : (-1)
+	row 4 : (4)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4)
+	row 2 : (-3)
+	row 3 : (1)
+	row 4 : (2)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (0)
+	row 4 : (1)
+    column-form matrix OK
+
+
+Numeric factorization of modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              7.00000e+00
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 79
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        3
+    number of entries stored in U (excl diag):  1
+    factorization floating-point operations:    4
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.50000e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.50e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.2)
+    1 : (0.142857)
+    2 : (0.166667)
+    3 : (1)
+    4 : (0.142857)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 1 
+    3 : 4 
+    4 : 0 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 2 :  (0.571429)
+	row 3 :  (0.285714)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.933333)
+
+    column 3:  length 1.
+	row 4 :  (1.05)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.142857)
+
+    row 2:  length 0.  End of Uchain.
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.5)
+	col 3 :  (-0.166667)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.333333)
+    1 : (1)
+    2 : (0.428571)
+    3 : (0.571429)
+    4 : (-0.15)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              7.00000e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   12    80%
+    Numeric final size (Units)                    85                   80    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          4.00000e+00    31%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    8    80%
+    nz in L+U (incl diagonal)                     15                   12    80%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       8
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.50e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.50e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     8
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.17000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  5.92e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.21000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with modified A): dense vector, n = 5. 
+    0 : (11)
+    1 : (-4.66667)
+    2 : (3)
+    3 : (0.666667)
+    4 : (31.6667)
+    dense vector OK
+
+maxnorm of residual: 5.32907e-15
+
+changing A (0,0) from 2 to 2
+changing A (1,0) from 3 to 2
+changing A (0,1) from 3 to 13
+changing A (2,1) from -1 to 7
+changing A (4,1) from 4 to 10
+changing A (1,2) from 4 to 23
+changing A (2,2) from -3 to 15
+changing A (3,2) from 1 to 18
+changing A (4,2) from 2 to 18
+changing A (2,3) from 2 to 30
+changing A (1,4) from 0 to 39
+changing A (4,4) from 1 to 37
+
+completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (2)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (13)
+	row 2 : (7)
+	row 4 : (10)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (23)
+	row 2 : (15)
+	row 3 : (18)
+	row 4 : (18)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (30)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (39)
+	row 4 : (37)
+    column-form matrix OK
+
+
+Saving symbolic object:
+
+Freeing symbolic object:
+
+Loading symbolic object:
+
+Done loading symbolic object
+
+Numeric factorization of completely modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.50000e+01
+    maximum sum (abs (rows of A)):              6.50000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 80
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.33333e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.33e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.0666667)
+    1 : (0.015625)
+    2 : (0.0192308)
+    3 : (0.0555556)
+    4 : (0.0153846)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.359375)
+	row 3 :  (0.276923)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.234375)
+
+    column 3:  length 1.
+	row 4 :  (1.07052)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.153846)
+
+    row 2:  length 1.
+	col 4 : (0.866667)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (0.288462)
+	col 4 :  (0.134615)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.576923)
+    1 : (1)
+    2 : (0.133333)
+    3 : (0.569231)
+    4 : (-0.367821)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.50000e+01
+    maximum sum (abs (rows of A)):              6.50000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.33e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.33e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.19000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  3.70e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.25000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with completely modified A): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 3.33067e-15
+
+
+C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (13)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (2)
+	row 2 : (23)
+	row 4 : (39)
+
+    column 2: start: 5 end: 7 entries: 3
+	row 1 : (7)
+	row 2 : (15)
+	row 3 : (30)
+
+    column 3: start: 8 end: 8 entries: 1
+	row 2 : (18)
+
+    column 4: start: 9 end: 11 entries: 3
+	row 1 : (10)
+	row 2 : (18)
+	row 4 : (37)
+    column-form matrix OK
+
+
+Symbolic factorization of C: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 75  (MBytes): 0.0
+	estimated peak size (Units):  1302  (MBytes): 0.0
+	estimated final size (Units): 16  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Get the contents of the Symbolic object for C:
+(compare with umfpack_di_report_symbolic output, above)
+From the Symbolic object, C is of dimension 5-by-5
+   with nz = 12, number of fronts = 1,
+   number of frontal matrix chains = 1
+
+Pivot columns in each front, and parent of each front:
+    Front 0: parent front: -1 number of pivot cols: 3
+        0-th pivot column is column 3 in original matrix
+        1-th pivot column is column 2 in original matrix
+        2-th pivot column is column 0 in original matrix
+
+Note that the column ordering, above, will be refined
+in the numeric factorization below.  The assignment of pivot
+columns to frontal matrices will always remain unchanged.
+
+Total number of pivot columns in frontal matrices: 3
+
+Frontal matrix chains:
+   Frontal matrices 0 to 0 are factorized in a single
+        working array of size 3-by-3
+
+Numeric factorization of C: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 81
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1293
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        5
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            2.43243e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       2.43e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.25)
+    1 : (0.0333333)
+    2 : (0.0135135)
+    3 : (0.0333333)
+    4 : (0.0131579)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 1.
+	row 4 :  (0.233333)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.866667)
+
+    column 3:  length 1.
+	row 4 :  (0.684685)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.513158)
+
+    row 2:  length 1.
+	col 4 : (0.5)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 3.
+	col 1 :  (0.202703)
+	col 3 :  (0.243243)
+	col 4 :  (0.310811)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.243243)
+    1 : (1)
+    2 : (0.5)
+    3 : (0.486842)
+    4 : (-0.784685)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. 
+
+    row 0: start: 0 end: 0 entries: 1
+	column 0 : (1)
+
+    row 1: start: 1 end: 1 entries: 1
+	column 1 : (1)
+
+    row 2: start: 2 end: 2 entries: 1
+	column 2 : (1)
+
+    row 3: start: 3 end: 3 entries: 1
+	column 3 : (1)
+
+    row 4: start: 4 end: 7 entries: 4
+	column 1 : (0.233333)
+	column 2 : (0.866667)
+	column 3 : (0.684685)
+	column 4 : (1)
+    row-form matrix OK
+
+
+U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. 
+
+    column 0: start: 0 end: 0 entries: 1
+	row 0 : (0.243243)
+
+    column 1: start: 1 end: 2 entries: 2
+	row 0 : (0.202703)
+	row 1 : (1)
+
+    column 2: start: 3 end: 3 entries: 1
+	row 2 : (0.5)
+
+    column 3: start: 4 end: 5 entries: 2
+	row 0 : (0.243243)
+	row 3 : (0.486842)
+
+    column 4: start: 6 end: 9 entries: 4
+	row 0 : (0.310811)
+	row 2 : (0.5)
+	row 3 : (0.513158)
+	row 4 : (-0.784685)
+    column-form matrix OK
+
+
+P: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Scale factors: row i of A is to be multiplied by the ith scale factor
+0: 0.25
+1: 0.0333333
+2: 0.0135135
+3: 0.0333333
+4: 0.0131579
+
+Converting L to triplet form, and printing it:
+
+L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. 
+    0 : 0 0  (1)
+    1 : 1 1  (1)
+    2 : 2 2  (1)
+    3 : 3 3  (1)
+    4 : 4 1  (0.233333)
+    5 : 4 2  (0.866667)
+    6 : 4 3  (0.684685)
+    7 : 4 4  (1)
+    triplet-form matrix OK
+
+
+Saving numeric object:
+
+Freeing numeric object:
+
+Loading numeric object:
+
+Done loading numeric object
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      75                   70    93%
+        peak size (Units)                       1302                 1293    99%
+        final size (Units)                        16                   14    88%
+    Numeric final size (Units)                    86                   82    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1474                 1465    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.43e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.43e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.60e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 4.77396e-15
+
+
+Solving C'x=b again, using umfpack_di_wsolve instead:
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      75                   70    93%
+        peak size (Units)                       1302                 1293    99%
+        final size (Units)                        16                   14    88%
+    Numeric final size (Units)                    86                   82    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1474                 1465    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.43e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.43e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.60e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 4.77396e-15
+
+
+umfpack_di_demo complete.
+Total time:  0.00 seconds (CPU time),  0.00 seconds (wallclock time)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_di_demo.sed	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,78 @@
+/::/d
+1,$s/_xx_/_di_/g
+1,$s/Int/int/g
+1,$s/WSIZE/5/
+1,$s/%ld/%d/g
+/define ABS/ {
+	s/ABS/ABS(x) ((x) >= 0 ? (x) : -(x))/
+	}
+/, rz \[i\]/ {
+	s/, rz \[i\]//
+	}
+/, Avalz/ {
+	s/, Avalz//
+	}
+/, rz/ {
+	s/, rz//
+	}
+/, bz/ {
+	s/, bz//
+	}
+/, xz/ {
+	s/, xz//
+	}
+
+/, Lz/ {
+	s/, Lz//
+	}
+/, Uz/ {
+	s/, Uz//
+	}
+/, Dz/ {
+	s/, Dz//
+	}
+/, Az/ {
+	s/, Az//
+	}
+/, Cz, TRUE/ {
+	s/, Cz, TRUE//
+	}
+/, Cz/ {
+	s/, Cz//
+	}
+/, Rbz/ {
+	s/, Rbz//
+	}
+/, yz/ {
+	s/, yz//
+	}
+
+/ || !Lz/ {
+	s/ || !Lz//
+	}
+/ || !Uz/ {
+	s/ || !Uz//
+	}
+/ || !Dz/ {
+	s/ || !Dz//
+	}
+/ || !Az/ {
+	s/ || !Az//
+	}
+/ || !Cz/ {
+	s/ || !Cz//
+	}
+
+/rz/d
+/Rbz/d
+/yz/d
+/Avalz/d
+/Az/d
+/Cz/d
+/bz/d
+/xz/d
+/Lz/d
+/Uz/d
+/Dz/d
+/complex/d
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,759 @@
+/* ========================================================================== */
+/* === umfpack_dl_demo ====================================================== */
+/* ========================================================================== */
+
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+  A demo of UMFPACK:   umfpack_dl_* version.
+
+  First, factor and solve a 5-by-5 system, Ax=b, using default parameters.
+  Then solve A'x=b using the factors of A.   Modify one entry (A (1,4) = 0,
+  where the row and column indices range from 0 to 4.  The pattern of A
+  has not changed (it has explicitly zero entry), so a reanalysis with
+  umfpack_dl_symbolic does not need to be done.  Refactorize (with
+  umfpack_dl_numeric), and solve Ax=b.  Note that the pivot ordering has
+  changed.  Next, change all of the entries in A, but not the pattern.
+
+  Finally, compute C = A', and do the symbolic and numeric factorization of C.
+  Factorizing A' can sometimes be better than factorizing A itself (less work
+  and memory usage).  Solve C'x=b twice; the solution is the same as the
+  solution to Ax=b.
+
+  A note about zero-sized arrays:  UMFPACK uses many user-provided arrays of
+  size n (order of the matrix), and of size nz (the number of nonzeros in a
+  matrix).  n cannot be zero; UMFPACK does not handle zero-dimensioned arrays.
+  However, nz can be zero.  If you attempt to malloc an array of size nz = 0,
+  however, malloc will return a null pointer which UMFPACK will report as a
+  "missing argument."  Thus, nz1 in this code is set to MAX (nz,1), and
+  similarly for lnz and unz.  Lnz can never be zero, however, since L is always
+  unit diagonal.
+*/
+
+/* -------------------------------------------------------------------------- */
+/* definitions */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "umfpack.h"
+
+#define ABS(x) ((x) >= 0 ? (x) : -(x))
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* triplet form of the matrix.  The triplets can be in any order. */
+/* -------------------------------------------------------------------------- */
+
+static long    n = 5, nz = 12 ;
+static long    Arow [ ] = { 0,  4,  1,  1,   2,   2,  0,  1,  2,  3,  4,  4} ;
+static long    Acol [ ] = { 0,  4,  0,  2,   1,   2,  1,  4,  3,  2,  1,  2} ;
+static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ;
+static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ;
+
+
+/* -------------------------------------------------------------------------- */
+/* error: print a message and exit */
+/* -------------------------------------------------------------------------- */
+
+static void error
+(
+    char *message
+)
+{
+    printf ("\n\n====== error: %s =====\n\n", message) ;
+    exit (1) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    long transpose,
+    long Ap [ ],
+    long Ai [ ],
+    double Ax [ ]
+)
+{
+    long i, j, p ;
+    double norm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = -b [i] ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [j] += Ax [p] * x [i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+	    }
+	}
+    }
+    norm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	norm = MAX (ABS (r [i]), norm) ;
+    }
+    return (norm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux,
+	*W, t [2], *Dx, rnorm, *Rb, *y, *Rs ;
+    long *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up,
+	*P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1,
+	status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1,
+	*Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc,
+	nzud, do_recip ;
+    void *Symbolic, *Numeric ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (t) ;
+
+    printf ("\n%s demo: _dl_ version\n", UMFPACK_VERSION) ;
+
+    /* get the default control parameters */
+    umfpack_dl_defaults (Control) ;
+
+    /* change the default print level for this demo */
+    /* (otherwise, nothing will print) */
+    Control [UMFPACK_PRL] = 6 ;
+
+    /* print the license agreement */
+    umfpack_dl_report_status (Control, UMFPACK_OK) ;
+    Control [UMFPACK_PRL] = 5 ;
+
+    /* print the control parameters */
+    umfpack_dl_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print A and b, and convert A to column-form */
+    /* ---------------------------------------------------------------------- */
+
+    /* print the right-hand-side */
+    printf ("\nb: ") ;
+    (void) umfpack_dl_report_vector (n, b, Control) ;
+
+    /* print the triplet form of the matrix */
+    printf ("\nA: ") ;
+    (void) umfpack_dl_report_triplet (n, n, nz, Arow, Acol, Aval,
+	Control) ;
+
+    /* convert to column form */
+    nz1 = MAX (nz,1) ;	/* ensure arrays are not of size zero. */
+    Ap = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ai = (long *) malloc (nz1 * sizeof (long)) ;
+    Ax = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_dl_triplet_to_col (n, n, nz, Arow, Acol, Aval,
+	Ap, Ai, Ax, (long *) NULL) ;
+
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_triplet_to_col failed") ;
+    }
+
+    /* print the column-form of A */
+    printf ("\nA: ") ;
+    (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_symbolic (n, n, Ap, Ai, Ax, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_info (Control, Info) ;
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_symbolic failed") ;
+    }
+
+    /* print the symbolic factorization */
+
+    printf ("\nSymbolic factorization of A: ") ;
+    (void) umfpack_dl_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_info (Control, Info) ;
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_numeric failed") ;
+    }
+
+    /* print the numeric factorization */
+    printf ("\nNumeric factorization of A: ") ;
+    (void) umfpack_dl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_dl_report_info (Control, Info) ;
+    umfpack_dl_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_dl_solve failed") ;
+    }
+    printf ("\nx (solution of Ax=b): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_get_determinant (x, r, Numeric, Info) ;
+    umfpack_dl_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_dl_get_determinant failed") ;
+    }
+    printf ("determinant: (%g", x [0]) ;
+    printf (") * 10^(%g)\n", r [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, broken down into steps */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rb = R*b */
+    Rb  = (double *) malloc (n * sizeof (double)) ;
+    y   = (double *) malloc (n * sizeof (double)) ;
+    if (!Rb || !y) error ("out of memory") ;
+
+    status = umfpack_dl_scale (Rb, b, Numeric) ;
+    if (status < 0) error ("umfpack_dl_scale failed") ;
+    /* solve Ly = P*(Rb) */
+    status = umfpack_dl_solve (UMFPACK_Pt_L, Ap, Ai, Ax, y, Rb,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_dl_solve failed") ;
+    /* solve UQ'x=y */
+    status = umfpack_dl_solve (UMFPACK_U_Qt, Ap, Ai, Ax, x, y,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_dl_solve failed") ;
+    printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    free (Rb) ;
+    free (y) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve A'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_solve (UMFPACK_At, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_dl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_dl_solve failed") ;
+    }
+    printf ("\nx (solution of A'x=b): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify one numerical value in the column-form of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* change A (1,4), look for row index 1 in column 4. */
+    row = 1 ;
+    col = 4 ;
+    for (p = Ap [col] ; p < Ap [col+1] ; p++)
+    {
+	if (row == Ai [p])
+	{
+	    printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ;
+	    Ax [p] = 0.0 ;
+	    break ;
+	}
+    }
+    printf ("\nmodified A: ") ;
+    (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */
+    /* doesn't have to be redone, no matter how much we change Ax. */
+
+    /* We don't need the Numeric object any more, so free it. */
+    umfpack_dl_free_numeric (&Numeric) ;
+
+    /* Note that a memory leak would have occurred if the old Numeric */
+    /* had not been free'd with umfpack_dl_free_numeric above. */
+    status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_info (Control, Info) ;
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of modified A: ") ;
+    (void) umfpack_dl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_dl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_solve failed") ;
+    }
+    printf ("\nx (with modified A): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify all of the numerical values of A, but not the pattern */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Ap [col] ; p < Ap [col+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    printf ("changing ") ;
+	    printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ;
+	    Ax [p] = Ax [p] + col*10 - row ;
+	    printf (" to %g\n", Ax [p]) ;
+	}
+    }
+    printf ("\ncompletely modified A (same pattern): ") ;
+    (void) umfpack_dl_report_matrix (n, n, Ap, Ai, Ax, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Symbolic object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "symbolic.umf" */
+    printf ("\nSaving symbolic object:\n") ;
+    status = umfpack_dl_save_symbolic (Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_save_symbolic failed") ;
+    }
+    printf ("\nFreeing symbolic object:\n") ;
+    umfpack_dl_free_symbolic (&Symbolic) ;
+    printf ("\nLoading symbolic object:\n") ;
+    status = umfpack_dl_load_symbolic (&Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_load_symbolic failed") ;
+    }
+    printf ("\nDone loading symbolic object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_dl_free_numeric (&Numeric) ;
+    status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_info (Control, Info) ;
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of completely modified A: ") ;
+    (void) umfpack_dl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_solve (UMFPACK_A, Ap, Ai, Ax, x, b,
+	Numeric, Control, Info) ;
+    umfpack_dl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_solve failed") ;
+    }
+    printf ("\nx (with completely modified A): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the symbolic and numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_dl_free_symbolic (&Symbolic) ;
+    umfpack_dl_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = transpose of A */
+    /* ---------------------------------------------------------------------- */
+
+    Cp = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ci = (long *) malloc (nz1 * sizeof (long)) ;
+    Cx = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Cp || !Ci || !Cx)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_dl_transpose (n, n, Ap, Ai, Ax,
+	(long *) NULL, (long *) NULL, Cp, Ci, Cx) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_transpose failed: ") ;
+    }
+    printf ("\nC (transpose of A): ") ;
+    (void) umfpack_dl_report_matrix (n, n, Cp, Ci, Cx, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_symbolic (n, n, Cp, Ci, Cx, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_info (Control, Info) ;
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_symbolic failed") ;
+    }
+    printf ("\nSymbolic factorization of C: ") ;
+    (void) umfpack_dl_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the contents of Symbolic into user arrays print them */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nGet the contents of the Symbolic object for C:\n") ;
+    printf ("(compare with umfpack_dl_report_symbolic output, above)\n") ;
+    Pinit = (long *) malloc ((n+1) * sizeof (long)) ;
+    Qinit = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_npivcol = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_1strow = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_leftmostdesc = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_parent = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_start = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_maxrows = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_maxcols = (long *) malloc ((n+1) * sizeof (long)) ;
+    if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start ||
+	!Chain_maxrows || !Chain_maxcols || !Front_1strow ||
+	!Front_leftmostdesc)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_dl_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains,
+	Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+    if (status < 0)
+    {
+	error ("symbolic factorization invalid") ;
+    }
+
+    printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc);
+    printf ("   with nz = %ld, number of fronts = %ld,\n", nz, nfr) ;
+    printf ("   number of frontal matrix chains = %ld\n", nchains) ;
+
+    printf ("\nPivot columns in each front, and parent of each front:\n") ;
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fnpiv = Front_npivcol [i] ;
+	printf ("    Front %ld: parent front: %ld number of pivot cols: %ld\n",
+		i, Front_parent [i], fnpiv) ;
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    col = Qinit [k] ;
+	    printf (
+	    "        %ld-th pivot column is column %ld in original matrix\n",
+		k, col) ;
+	    k++ ;
+	}
+    }
+
+    printf ("\nNote that the column ordering, above, will be refined\n") ;
+    printf ("in the numeric factorization below.  The assignment of pivot\n") ;
+    printf ("columns to frontal matrices will always remain unchanged.\n") ;
+
+    printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ;
+
+    printf ("\nFrontal matrix chains:\n") ;
+    for (j = 0 ; j < nchains ; j++)
+    {
+	printf ("   Frontal matrices %ld to %ld are factorized in a single\n",
+	    Chain_start [j], Chain_start [j+1] - 1) ;
+	printf ("        working array of size %ld-by-%ld\n",
+	    Chain_maxrows [j], Chain_maxcols [j]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_numeric (Cp, Ci, Cx, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_dl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of C: ") ;
+    (void) umfpack_dl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extract the LU factors of C and print them */
+    /* ---------------------------------------------------------------------- */
+
+    if (umfpack_dl_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0)
+    {
+	error ("umfpack_dl_get_lunz failed") ;
+    }
+    /* ensure arrays are not of zero size */
+    lnz1 = MAX (lnz,1) ;
+    unz1 = MAX (unz,1) ;
+    Lp = (long *) malloc ((n+1) * sizeof (long)) ;
+    Lj = (long *) malloc (lnz1 * sizeof (long)) ;
+    Lx = (double *) malloc (lnz1 * sizeof (double)) ;
+    Up = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ui = (long *) malloc (unz1 * sizeof (long)) ;
+    Ux = (double *) malloc (unz1 * sizeof (double)) ;
+    P = (long *) malloc (n * sizeof (long)) ;
+    Q = (long *) malloc (n * sizeof (long)) ;
+    Dx = (double *) NULL ;	/* D vector not requested */
+    Rs  = (double *) malloc (n * sizeof (double)) ;
+    if (!Lp || !Lj || !Lx || !Up || !Ui || !Ux || !P || !Q || !Rs)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_dl_get_numeric (Lp, Lj, Lx, Up, Ui, Ux,
+	P, Q, Dx, &do_recip, Rs, Numeric) ;
+    if (status < 0)
+    {
+	error ("umfpack_dl_get_numeric failed") ;
+    }
+
+    printf ("\nL (lower triangular factor of C): ") ;
+    (void) umfpack_dl_report_matrix (n, n, Lp, Lj, Lx, 0, Control) ;
+    printf ("\nU (upper triangular factor of C): ") ;
+    (void) umfpack_dl_report_matrix (n, n, Up, Ui, Ux, 1, Control) ;
+    printf ("\nP: ") ;
+    (void) umfpack_dl_report_perm (n, P, Control) ;
+    printf ("\nQ: ") ;
+    (void) umfpack_dl_report_perm (n, Q, Control) ;
+    printf ("\nScale factors: row i of A is to be ") ;
+    if (do_recip)
+    {
+	printf ("multiplied by the ith scale factor\n") ;
+    }
+    else
+    {
+	printf ("divided by the ith scale factor\n") ;
+    }
+    for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to triplet form and print it */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that L is in row-form, so it is the row indices that are created */
+    /* by umfpack_dl_col_to_triplet. */
+
+    printf ("\nConverting L to triplet form, and printing it:\n") ;
+    Li = (long *) malloc (lnz1 * sizeof (long)) ;
+    if (!Li)
+    {
+	error ("out of memory") ;
+    }
+    if (umfpack_dl_col_to_triplet (n, Lp, Li) < 0)
+    {
+	error ("umfpack_dl_col_to_triplet failed") ;
+    }
+    printf ("\nL, in triplet form: ") ;
+    (void) umfpack_dl_report_triplet (n, n, lnz, Li, Lj, Lx, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Numeric object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "numeric.umf" */
+    printf ("\nSaving numeric object:\n") ;
+    status = umfpack_dl_save_numeric (Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_save_numeric failed") ;
+    }
+    printf ("\nFreeing numeric object:\n") ;
+    umfpack_dl_free_numeric (&Numeric) ;
+    printf ("\nLoading numeric object:\n") ;
+    status = umfpack_dl_load_numeric (&Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_load_numeric failed") ;
+    }
+    printf ("\nDone loading numeric object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_dl_solve (UMFPACK_At, Cp, Ci, Cx, x, b,
+	Numeric, Control, Info) ;
+    umfpack_dl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_solve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b again, using umfpack_dl_wsolve instead */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nSolving C'x=b again, using umfpack_dl_wsolve instead:\n") ;
+    Wi = (long *) malloc (n * sizeof (long)) ;
+    W = (double *) malloc (5*n * sizeof (double)) ;
+    if (!Wi || !W)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_dl_wsolve (UMFPACK_At, Cp, Ci, Cx, x, b,
+	Numeric, Control, Info, Wi, W) ;
+    umfpack_dl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_dl_report_status (Control, status) ;
+	error ("umfpack_dl_wsolve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_dl_report_vector (n, x, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free everything */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is not strictly required since the process is exiting and the */
+    /* system will reclaim the memory anyway.  It's useful, though, just as */
+    /* a list of what is currently malloc'ed by this program.  Plus, it's */
+    /* always a good habit to explicitly free whatever you malloc. */
+
+    free (Ap) ;
+    free (Ai) ;
+    free (Ax) ;
+
+    free (Cp) ;
+    free (Ci) ;
+    free (Cx) ;
+
+    free (Pinit) ;
+    free (Qinit) ;
+    free (Front_npivcol) ;
+    free (Front_1strow) ;
+    free (Front_leftmostdesc) ;
+    free (Front_parent) ;
+    free (Chain_start) ;
+    free (Chain_maxrows) ;
+    free (Chain_maxcols) ;
+
+    free (Lp) ;
+    free (Lj) ;
+    free (Lx) ;
+
+    free (Up) ;
+    free (Ui) ;
+    free (Ux) ;
+
+    free (P) ;
+    free (Q) ;
+
+    free (Li) ;
+
+    free (Wi) ;
+    free (W) ;
+
+    umfpack_dl_free_symbolic (&Symbolic) ;
+    umfpack_dl_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the total time spent in this demo */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (t) ;
+    printf ("\numfpack_dl_demo complete.\nTotal time: %5.2f seconds"
+	" (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ;
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1541 @@
+
+UMFPACK V4.4 (Jan. 28, 2005) demo: _dl_ version
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+
+UMFPACK License:
+
+   Your use or distribution of UMFPACK or any modified version of
+   UMFPACK implies that you agree to this License.
+
+   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+   Permission is hereby granted to use or copy this program, provided
+   that the Copyright, this License, and the Availability of the original
+   version is retained on all copies.  User documentation of any code that
+   uses UMFPACK or any modified version of UMFPACK code must cite the
+   Copyright, this License, the Availability note, and "Used by permission."
+   Permission to modify the code and to distribute modified code is granted,
+   provided the Copyright, this License, and the Availability note are
+   retained, and a notice that the code was modified is included.  This
+   software was developed with support from the National Science Foundation,
+   and is provided to you free of charge.
+
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double
+    Int (generic integer) defined as: long
+
+    0: print level: 5
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 8 (in bytes)
+
+
+b: dense vector, n = 5. 
+    0 : (8)
+    1 : (45)
+    2 : (-3)
+    3 : (3)
+    4 : (19)
+    dense vector OK
+
+
+A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. 
+    0 : 0 0  (2)
+    1 : 4 4  (1)
+    2 : 1 0  (3)
+    3 : 1 2  (4)
+    4 : 2 1  (-1)
+    5 : 2 2  (-3)
+    6 : 0 1  (3)
+    7 : 1 4  (6)
+    8 : 2 3  (2)
+    9 : 3 2  (1)
+    10 : 4 1  (4)
+    11 : 4 2  (2)
+    triplet-form matrix OK
+
+
+A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (3)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3)
+	row 2 : (-1)
+	row 4 : (4)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4)
+	row 2 : (-3)
+	row 3 : (1)
+	row 4 : (2)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (6)
+	row 4 : (1)
+    column-form matrix OK
+
+
+Symbolic factorization of A: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 74  (MBytes): 0.0
+	estimated peak size (Units):  1301  (MBytes): 0.0
+	estimated final size (Units): 15  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Numeric factorization of A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 80
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.42857e-01
+    max abs. value on diagonal of U:            2.19231e+00
+    reciprocal condition number estimate:       6.52e-02
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.2)
+    1 : (0.0769231)
+    2 : (0.166667)
+    3 : (1)
+    4 : (0.142857)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.307692)
+	row 3 :  (0.285714)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.576923)
+
+    column 3:  length 1.
+	row 4 :  (3.23077)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.571429)
+
+    row 2:  length 1.
+	col 4 : (0.6)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.5)
+	col 4 :  (-0.166667)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.333333)
+    1 : (1)
+    2 : (0.4)
+    3 : (0.142857)
+    4 : (-2.19231)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.43e-01
+    max abs. value on diagonal of U:               2.19e+00
+    estimate of reciprocal of condition number:    6.52e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.19000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  4.67e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.25000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+x (solution of Ax=b): dense vector, n = 5. 
+    0 : (1)
+    1 : (2)
+    2 : (3)
+    3 : (4)
+    4 : (5)
+    dense vector OK
+
+maxnorm of residual: 1.77636e-15
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+determinant: (1.14) * 10^(2)
+
+x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. 
+    0 : (1)
+    1 : (2)
+    2 : (3)
+    3 : (4)
+    4 : (5)
+    dense vector OK
+
+maxnorm of residual: 1.77636e-15
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.30000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.43e-01
+    max abs. value on diagonal of U:               2.19e+00
+    estimate of reciprocal of condition number:    6.52e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  5.84e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of A'x=b): dense vector, n = 5. 
+    0 : (1.81579)
+    1 : (1.45614)
+    2 : (1.5)
+    3 : (-24.8509)
+    4 : (10.2632)
+    dense vector OK
+
+maxnorm of residual: 7.10543e-15
+
+
+changing A (1,4) to zero
+
+modified A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (3)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3)
+	row 2 : (-1)
+	row 4 : (4)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4)
+	row 2 : (-3)
+	row 3 : (1)
+	row 4 : (2)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (0)
+	row 4 : (1)
+    column-form matrix OK
+
+
+Numeric factorization of modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              7.00000e+00
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 79
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        3
+    number of entries stored in U (excl diag):  1
+    factorization floating-point operations:    4
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.50000e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.50e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.2)
+    1 : (0.142857)
+    2 : (0.166667)
+    3 : (1)
+    4 : (0.142857)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 1 
+    3 : 4 
+    4 : 0 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 2 :  (0.571429)
+	row 3 :  (0.285714)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.933333)
+
+    column 3:  length 1.
+	row 4 :  (1.05)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.142857)
+
+    row 2:  length 0.  End of Uchain.
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.5)
+	col 3 :  (-0.166667)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.333333)
+    1 : (1)
+    2 : (0.428571)
+    3 : (0.571429)
+    4 : (-0.15)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              7.00000e+00
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   12    80%
+    Numeric final size (Units)                    85                   80    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          4.00000e+00    31%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    8    80%
+    nz in L+U (incl diagonal)                     15                   12    80%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       8
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.50e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.50e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     8
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.17000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  5.92e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.21000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with modified A): dense vector, n = 5. 
+    0 : (11)
+    1 : (-4.66667)
+    2 : (3)
+    3 : (0.666667)
+    4 : (31.6667)
+    dense vector OK
+
+maxnorm of residual: 5.32907e-15
+
+changing A (0,0) from 2 to 2
+changing A (1,0) from 3 to 2
+changing A (0,1) from 3 to 13
+changing A (2,1) from -1 to 7
+changing A (4,1) from 4 to 10
+changing A (1,2) from 4 to 23
+changing A (2,2) from -3 to 15
+changing A (3,2) from 1 to 18
+changing A (4,2) from 2 to 18
+changing A (2,3) from 2 to 30
+changing A (1,4) from 0 to 39
+changing A (4,4) from 1 to 37
+
+completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (2)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (13)
+	row 2 : (7)
+	row 4 : (10)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (23)
+	row 2 : (15)
+	row 3 : (18)
+	row 4 : (18)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (30)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (39)
+	row 4 : (37)
+    column-form matrix OK
+
+
+Saving symbolic object:
+
+Freeing symbolic object:
+
+Loading symbolic object:
+
+Done loading symbolic object
+
+Numeric factorization of completely modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.50000e+01
+    maximum sum (abs (rows of A)):              6.50000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 80
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1292
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.33333e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.33e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.0666667)
+    1 : (0.015625)
+    2 : (0.0192308)
+    3 : (0.0555556)
+    4 : (0.0153846)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.359375)
+	row 3 :  (0.276923)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.234375)
+
+    column 3:  length 1.
+	row 4 :  (1.07052)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.153846)
+
+    row 2:  length 1.
+	col 4 : (0.866667)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (0.288462)
+	col 4 :  (0.134615)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.576923)
+    1 : (1)
+    2 : (0.133333)
+    3 : (0.569231)
+    4 : (-0.367821)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.50000e+01
+    maximum sum (abs (rows of A)):              6.50000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      74                   69    93%
+        peak size (Units)                       1301                 1292    99%
+        final size (Units)                        15                   13    87%
+    Numeric final size (Units)                    85                   81    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1473                 1464    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.33e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.33e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.19000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  3.70e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.25000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with completely modified A): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 3.33067e-15
+
+
+C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2)
+	row 1 : (13)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (2)
+	row 2 : (23)
+	row 4 : (39)
+
+    column 2: start: 5 end: 7 entries: 3
+	row 1 : (7)
+	row 2 : (15)
+	row 3 : (30)
+
+    column 3: start: 8 end: 8 entries: 1
+	row 2 : (18)
+
+    column 4: start: 9 end: 11 entries: 3
+	row 1 : (10)
+	row 2 : (18)
+	row 4 : (37)
+    column-form matrix OK
+
+
+Symbolic factorization of C: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 75  (MBytes): 0.0
+	estimated peak size (Units):  1302  (MBytes): 0.0
+	estimated final size (Units): 16  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Get the contents of the Symbolic object for C:
+(compare with umfpack_dl_report_symbolic output, above)
+From the Symbolic object, C is of dimension 5-by-5
+   with nz = 12, number of fronts = 1,
+   number of frontal matrix chains = 1
+
+Pivot columns in each front, and parent of each front:
+    Front 0: parent front: -1 number of pivot cols: 3
+        0-th pivot column is column 3 in original matrix
+        1-th pivot column is column 2 in original matrix
+        2-th pivot column is column 0 in original matrix
+
+Note that the column ordering, above, will be refined
+in the numeric factorization below.  The assignment of pivot
+columns to frontal matrices will always remain unchanged.
+
+Total number of pivot columns in frontal matrices: 3
+
+Frontal matrix chains:
+   Frontal matrices 0 to 0 are factorized in a single
+        working array of size 3-by-3
+
+Numeric factorization of C: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 81
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    1293
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        5
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    6
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            2.43243e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       2.43e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.25)
+    1 : (0.0333333)
+    2 : (0.0135135)
+    3 : (0.0333333)
+    4 : (0.0131579)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 1.
+	row 4 :  (0.233333)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.866667)
+
+    column 3:  length 1.
+	row 4 :  (0.684685)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.513158)
+
+    row 2:  length 1.
+	col 4 : (0.5)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 3.
+	col 1 :  (0.202703)
+	col 3 :  (0.243243)
+	col 4 :  (0.310811)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.243243)
+    1 : (1)
+    2 : (0.5)
+    3 : (0.486842)
+    4 : (-0.784685)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. 
+
+    row 0: start: 0 end: 0 entries: 1
+	column 0 : (1)
+
+    row 1: start: 1 end: 1 entries: 1
+	column 1 : (1)
+
+    row 2: start: 2 end: 2 entries: 1
+	column 2 : (1)
+
+    row 3: start: 3 end: 3 entries: 1
+	column 3 : (1)
+
+    row 4: start: 4 end: 7 entries: 4
+	column 1 : (0.233333)
+	column 2 : (0.866667)
+	column 3 : (0.684685)
+	column 4 : (1)
+    row-form matrix OK
+
+
+U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. 
+
+    column 0: start: 0 end: 0 entries: 1
+	row 0 : (0.243243)
+
+    column 1: start: 1 end: 2 entries: 2
+	row 0 : (0.202703)
+	row 1 : (1)
+
+    column 2: start: 3 end: 3 entries: 1
+	row 2 : (0.5)
+
+    column 3: start: 4 end: 5 entries: 2
+	row 0 : (0.243243)
+	row 3 : (0.486842)
+
+    column 4: start: 6 end: 9 entries: 4
+	row 0 : (0.310811)
+	row 2 : (0.5)
+	row 3 : (0.513158)
+	row 4 : (-0.784685)
+    column-form matrix OK
+
+
+P: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Scale factors: row i of A is to be multiplied by the ith scale factor
+0: 0.25
+1: 0.0333333
+2: 0.0135135
+3: 0.0333333
+4: 0.0131579
+
+Converting L to triplet form, and printing it:
+
+L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. 
+    0 : 0 0  (1)
+    1 : 1 1  (1)
+    2 : 2 2  (1)
+    3 : 3 3  (1)
+    4 : 4 1  (0.233333)
+    5 : 4 2  (0.866667)
+    6 : 4 3  (0.684685)
+    7 : 4 4  (1)
+    triplet-form matrix OK
+
+
+Saving numeric object:
+
+Freeing numeric object:
+
+Loading numeric object:
+
+Done loading numeric object
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      75                   70    93%
+        peak size (Units)                       1302                 1293    99%
+        final size (Units)                        16                   14    88%
+    Numeric final size (Units)                    86                   82    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1474                 1465    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.43e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.43e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.60e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 4.77396e-15
+
+
+Solving C'x=b again, using umfpack_dl_wsolve instead:
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          8 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              4.00000e+00
+    maximum sum (abs (rows of A)):              7.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      75                   70    93%
+        peak size (Units)                       1302                 1293    99%
+        final size (Units)                        16                   14    88%
+    Numeric final size (Units)                    86                   82    95%
+    Numeric final size (MBytes)                  0.0                  0.0    95%
+    peak memory usage (Units)                   1474                 1465    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          1.30000e+01          6.00000e+00    46%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.43e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    2.43e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   1.11000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.60e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        1.17000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (8.50124)
+    1 : (-0.692499)
+    2 : (0.166667)
+    3 : (-0.0217502)
+    4 : (0.619594)
+    dense vector OK
+
+maxnorm of residual: 4.77396e-15
+
+
+umfpack_dl_demo complete.
+Total time:  0.00 seconds (CPU time),  0.00 seconds (wallclock time)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_dl_demo.sed	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,77 @@
+/::/d
+1,$s/_xx_/_dl_/g
+1,$s/Int/long/g
+1,$s/WSIZE/5/
+/define ABS/ {
+	s/ABS/ABS(x) ((x) >= 0 ? (x) : -(x))/
+	}
+/, rz \[i\]/ {
+	s/, rz \[i\]//
+	}
+/, Avalz/ {
+	s/, Avalz//
+	}
+/, rz/ {
+	s/, rz//
+	}
+/, bz/ {
+	s/, bz//
+	}
+/, xz/ {
+	s/, xz//
+	}
+
+/, Lz/ {
+	s/, Lz//
+	}
+/, Uz/ {
+	s/, Uz//
+	}
+/, Dz/ {
+	s/, Dz//
+	}
+/, Az/ {
+	s/, Az//
+	}
+/, Cz, TRUE/ {
+	s/, Cz, TRUE//
+	}
+/, Cz/ {
+	s/, Cz//
+	}
+/, Rbz/ {
+	s/, Rbz//
+	}
+/, yz/ {
+	s/, yz//
+	}
+
+/ || !Lz/ {
+	s/ || !Lz//
+	}
+/ || !Uz/ {
+	s/ || !Uz//
+	}
+/ || !Dz/ {
+	s/ || !Dz//
+	}
+/ || !Az/ {
+	s/ || !Az//
+	}
+/ || !Cz/ {
+	s/ || !Cz//
+	}
+
+/rz/d
+/Rbz/d
+/yz/d
+/Avalz/d
+/Az/d
+/Cz/d
+/bz/d
+/xz/d
+/Lz/d
+/Uz/d
+/Dz/d
+/complex/d
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_simple.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,30 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include "umfpack.h"
+
+int    n = 5 ;
+int    Ap [ ] = {0, 2, 5, 9, 10, 12} ;
+int    Ai [ ] = { 0,  1,  0,   2,  4,  1,  2,  3,   4,  2,  1,  4} ;
+double Ax [ ] = {2., 3., 3., -1., 4., 4., -3., 1., 2., 2., 6., 1.} ;
+double b [ ] = {8., 45., -3., 3., 19.} ;
+double x [5] ;
+
+int main (void)
+{
+    double *null = (double *) NULL ;
+    int i ;
+    void *Symbolic, *Numeric ;
+    (void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ;
+    (void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ;
+    umfpack_di_free_symbolic (&Symbolic) ;
+    (void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ;
+    umfpack_di_free_numeric (&Numeric) ;
+    for (i = 0 ; i < n ; i++) printf ("x [%d] = %g\n", i, x [i]) ;
+    return (0) ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_xx_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,810 @@
+/* ========================================================================== */
+/* === umfpack_xx_demo ====================================================== */
+/* ========================================================================== */
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:: Do not attempt to compile this file!  It is processed via sed scripts into
+:: four different C demo programs:
+::
+:: umfpack_di_demo.c:  double precision, int integers
+:: umfpack_dl_demo.c:  double precision, long integers
+:: umfpack_zi_demo.c:  complex double precision, int integers
+:: umfpack_zl_demo.c:  complex double precision, long integers
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+  A demo of UMFPACK:   umfpack_xx_* version.
+
+  First, factor and solve a 5-by-5 system, Ax=b, using default parameters.
+  Then solve A'x=b using the factors of A.   Modify one entry (A (1,4) = 0,
+  where the row and column indices range from 0 to 4.  The pattern of A
+  has not changed (it has explicitly zero entry), so a reanalysis with
+  umfpack_xx_symbolic does not need to be done.  Refactorize (with
+  umfpack_xx_numeric), and solve Ax=b.  Note that the pivot ordering has
+  changed.  Next, change all of the entries in A, but not the pattern.
+
+  Finally, compute C = A', and do the symbolic and numeric factorization of C.
+  Factorizing A' can sometimes be better than factorizing A itself (less work
+  and memory usage).  Solve C'x=b twice; the solution is the same as the
+  solution to Ax=b.
+
+  A note about zero-sized arrays:  UMFPACK uses many user-provided arrays of
+  size n (order of the matrix), and of size nz (the number of nonzeros in a
+  matrix).  n cannot be zero; UMFPACK does not handle zero-dimensioned arrays.
+  However, nz can be zero.  If you attempt to malloc an array of size nz = 0,
+  however, malloc will return a null pointer which UMFPACK will report as a
+  "missing argument."  Thus, nz1 in this code is set to MAX (nz,1), and
+  similarly for lnz and unz.  Lnz can never be zero, however, since L is always
+  unit diagonal.
+*/
+
+/* -------------------------------------------------------------------------- */
+/* definitions */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "umfpack.h"
+
+/* use a cheap approximate absolute value for complex numbers: */
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:: ABS is |xreal|+|ximag| for the complex case, and |x| for the real case.
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+#define ABS
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* triplet form of the matrix.  The triplets can be in any order. */
+/* -------------------------------------------------------------------------- */
+
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:: Int is either int or long:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+static Int    n = 5, nz = 12 ;
+static Int    Arow [ ] = { 0,  4,  1,  1,   2,   2,  0,  1,  2,  3,  4,  4} ;
+static Int    Acol [ ] = { 0,  4,  0,  2,   1,   2,  1,  4,  3,  2,  1,  2} ;
+static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ;
+static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ;
+static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ;
+static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ;
+
+/* Avalz, bz:  imaginary part of A and b */
+
+/* -------------------------------------------------------------------------- */
+/* error: print a message and exit */
+/* -------------------------------------------------------------------------- */
+
+static void error
+(
+    char *message
+)
+{
+    printf ("\n\n====== error: %s =====\n\n", message) ;
+    exit (1) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */
+/* A' is the complex conjugate transpose, not the array transpose */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    Int transpose,
+    Int Ap [ ],
+    Int Ai [ ],
+    double Ax [ ]
+    , double Az [ ]
+)
+{
+    Int i, j, p ;
+    double norm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = -b [i] ;
+	rz[i] = -bz[i] ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		/* complex: r(j) += conj (Aij) * x (i) */
+		r [j] += Ax [p] * x [i] ;
+		r [j] += Az [p] * xz[i] ;
+		rz[j] -= Az [p] * x [i] ;
+		rz[j] += Ax [p] * xz[i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+		r [i] -= Az [p] * xz[j] ;
+		rz[i] += Az [p] * x [j] ;
+		rz[i] += Ax [p] * xz[j] ;
+	    }
+	}
+    }
+    norm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	norm = MAX (ABS (r [i], rz [i]), norm) ;
+    }
+    return (norm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux,
+	*W, t [2], *Dx, rnorm, *Rb, *y, *Rs ;
+    double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ;
+    Int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up,
+	*P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1,
+	status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1,
+	*Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc,
+	nzud, do_recip ;
+    void *Symbolic, *Numeric ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (t) ;
+
+    printf ("\n%s demo: _xx_ version\n", UMFPACK_VERSION) ;
+
+    /* get the default control parameters */
+    umfpack_xx_defaults (Control) ;
+
+    /* change the default print level for this demo */
+    /* (otherwise, nothing will print) */
+    Control [UMFPACK_PRL] = 6 ;
+
+    /* print the license agreement */
+    umfpack_xx_report_status (Control, UMFPACK_OK) ;
+    Control [UMFPACK_PRL] = 5 ;
+
+    /* print the control parameters */
+    umfpack_xx_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print A and b, and convert A to column-form */
+    /* ---------------------------------------------------------------------- */
+
+    /* print the right-hand-side */
+    printf ("\nb: ") ;
+    (void) umfpack_xx_report_vector (n, b, bz, Control) ;
+
+    /* print the triplet form of the matrix */
+    printf ("\nA: ") ;
+    (void) umfpack_xx_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz,
+	Control) ;
+
+    /* convert to column form */
+    nz1 = MAX (nz,1) ;	/* ensure arrays are not of size zero. */
+    Ap = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Ai = (Int *) malloc (nz1 * sizeof (Int)) ;
+    Ax = (double *) malloc (nz1 * sizeof (double)) ;
+    Az = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax || !Az)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_xx_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz,
+	Ap, Ai, Ax, Az, (Int *) NULL) ;
+
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_triplet_to_col failed") ;
+    }
+
+    /* print the column-form of A */
+    printf ("\nA: ") ;
+    (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_info (Control, Info) ;
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_symbolic failed") ;
+    }
+
+    /* print the symbolic factorization */
+
+    printf ("\nSymbolic factorization of A: ") ;
+    (void) umfpack_xx_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_info (Control, Info) ;
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_numeric failed") ;
+    }
+
+    /* print the numeric factorization */
+    printf ("\nNumeric factorization of A: ") ;
+    (void) umfpack_xx_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_xx_report_info (Control, Info) ;
+    umfpack_xx_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_xx_solve failed") ;
+    }
+    printf ("\nx (solution of Ax=b): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_get_determinant (x, xz, r, Numeric, Info) ;
+    umfpack_xx_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_xx_get_determinant failed") ;
+    }
+    printf ("determinant: (%g", x [0]) ;
+    printf ("+ (%g)i", xz [0]) ; /* complex */
+    printf (") * 10^(%g)\n", r [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, broken down into steps */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rb = R*b */
+    Rb  = (double *) malloc (n * sizeof (double)) ;
+    Rbz = (double *) malloc (n * sizeof (double)) ;
+    y   = (double *) malloc (n * sizeof (double)) ;
+    yz  = (double *) malloc (n * sizeof (double)) ;
+    if (!Rb || !y) error ("out of memory") ;
+    if (!Rbz || !yz) error ("out of memory") ;
+
+    status = umfpack_xx_scale (Rb, Rbz, b, bz, Numeric) ;
+    if (status < 0) error ("umfpack_xx_scale failed") ;
+    /* solve Ly = P*(Rb) */
+    status = umfpack_xx_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_xx_solve failed") ;
+    /* solve UQ'x=y */
+    status = umfpack_xx_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_xx_solve failed") ;
+    printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    free (Rb) ;
+    free (Rbz) ;
+    free (y) ;
+    free (yz) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve A'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    /* note that this is the complex conjugate transpose, A' */
+    status = umfpack_xx_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_xx_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_xx_solve failed") ;
+    }
+    printf ("\nx (solution of A'x=b): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify one numerical value in the column-form of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* change A (1,4), look for row index 1 in column 4. */
+    row = 1 ;
+    col = 4 ;
+    for (p = Ap [col] ; p < Ap [col+1] ; p++)
+    {
+	if (row == Ai [p])
+	{
+	    printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ;
+	    Ax [p] = 0.0 ;
+	    Az [p] = 0.0 ;
+	    break ;
+	}
+    }
+    printf ("\nmodified A: ") ;
+    (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */
+    /* doesn't have to be redone, no matter how much we change Ax. */
+
+    /* We don't need the Numeric object any more, so free it. */
+    umfpack_xx_free_numeric (&Numeric) ;
+
+    /* Note that a memory leak would have occurred if the old Numeric */
+    /* had not been free'd with umfpack_xx_free_numeric above. */
+    status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_info (Control, Info) ;
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of modified A: ") ;
+    (void) umfpack_xx_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_xx_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_solve failed") ;
+    }
+    printf ("\nx (with modified A): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify all of the numerical values of A, but not the pattern */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Ap [col] ; p < Ap [col+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    printf ("changing ") ;
+	    /* complex: */ printf ("real part of ") ;
+	    printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ;
+	    Ax [p] = Ax [p] + col*10 - row ;
+	    printf (" to %g\n", Ax [p]) ;
+	}
+    }
+    printf ("\ncompletely modified A (same pattern): ") ;
+    (void) umfpack_xx_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Symbolic object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "symbolic.umf" */
+    printf ("\nSaving symbolic object:\n") ;
+    status = umfpack_xx_save_symbolic (Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_save_symbolic failed") ;
+    }
+    printf ("\nFreeing symbolic object:\n") ;
+    umfpack_xx_free_symbolic (&Symbolic) ;
+    printf ("\nLoading symbolic object:\n") ;
+    status = umfpack_xx_load_symbolic (&Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_load_symbolic failed") ;
+    }
+    printf ("\nDone loading symbolic object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_xx_free_numeric (&Numeric) ;
+    status = umfpack_xx_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_info (Control, Info) ;
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of completely modified A: ") ;
+    (void) umfpack_xx_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_xx_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_solve failed") ;
+    }
+    printf ("\nx (with completely modified A): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the symbolic and numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_xx_free_symbolic (&Symbolic) ;
+    umfpack_xx_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = transpose of A */
+    /* ---------------------------------------------------------------------- */
+
+    Cp = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Ci = (Int *) malloc (nz1 * sizeof (Int)) ;
+    Cx = (double *) malloc (nz1 * sizeof (double)) ;
+    Cz = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Cp || !Ci || !Cx || !Cz)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_xx_transpose (n, n, Ap, Ai, Ax, Az,
+	(Int *) NULL, (Int *) NULL, Cp, Ci, Cx, Cz, TRUE) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_transpose failed: ") ;
+    }
+    printf ("\nC (transpose of A): ") ;
+    (void) umfpack_xx_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_info (Control, Info) ;
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_symbolic failed") ;
+    }
+    printf ("\nSymbolic factorization of C: ") ;
+    (void) umfpack_xx_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the contents of Symbolic into user arrays print them */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nGet the contents of the Symbolic object for C:\n") ;
+    printf ("(compare with umfpack_xx_report_symbolic output, above)\n") ;
+    Pinit = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Qinit = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Front_npivcol = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Front_1strow = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Front_leftmostdesc = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Front_parent = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Chain_start = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Chain_maxrows = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Chain_maxcols = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start ||
+	!Chain_maxrows || !Chain_maxcols || !Front_1strow ||
+	!Front_leftmostdesc)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_xx_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains,
+	Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+    if (status < 0)
+    {
+	error ("symbolic factorization invalid") ;
+    }
+
+    printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc);
+    printf ("   with nz = %ld, number of fronts = %ld,\n", nz, nfr) ;
+    printf ("   number of frontal matrix chains = %ld\n", nchains) ;
+
+    printf ("\nPivot columns in each front, and parent of each front:\n") ;
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fnpiv = Front_npivcol [i] ;
+	printf ("    Front %ld: parent front: %ld number of pivot cols: %ld\n",
+		i, Front_parent [i], fnpiv) ;
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    col = Qinit [k] ;
+	    printf (
+	    "        %ld-th pivot column is column %ld in original matrix\n",
+		k, col) ;
+	    k++ ;
+	}
+    }
+
+    printf ("\nNote that the column ordering, above, will be refined\n") ;
+    printf ("in the numeric factorization below.  The assignment of pivot\n") ;
+    printf ("columns to frontal matrices will always remain unchanged.\n") ;
+
+    printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ;
+
+    printf ("\nFrontal matrix chains:\n") ;
+    for (j = 0 ; j < nchains ; j++)
+    {
+	printf ("   Frontal matrices %ld to %ld are factorized in a single\n",
+	    Chain_start [j], Chain_start [j+1] - 1) ;
+	printf ("        working array of size %ld-by-%ld\n",
+	    Chain_maxrows [j], Chain_maxcols [j]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_xx_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of C: ") ;
+    (void) umfpack_xx_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extract the LU factors of C and print them */
+    /* ---------------------------------------------------------------------- */
+
+    if (umfpack_xx_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0)
+    {
+	error ("umfpack_xx_get_lunz failed") ;
+    }
+    /* ensure arrays are not of zero size */
+    lnz1 = MAX (lnz,1) ;
+    unz1 = MAX (unz,1) ;
+    Lp = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Lj = (Int *) malloc (lnz1 * sizeof (Int)) ;
+    Lx = (double *) malloc (lnz1 * sizeof (double)) ;
+    Lz = (double *) malloc (lnz1 * sizeof (double)) ;
+    Up = (Int *) malloc ((n+1) * sizeof (Int)) ;
+    Ui = (Int *) malloc (unz1 * sizeof (Int)) ;
+    Ux = (double *) malloc (unz1 * sizeof (double)) ;
+    Uz = (double *) malloc (unz1 * sizeof (double)) ;
+    P = (Int *) malloc (n * sizeof (Int)) ;
+    Q = (Int *) malloc (n * sizeof (Int)) ;
+    Dx = (double *) NULL ;	/* D vector not requested */
+    Dz = (double *) NULL ;
+    Rs  = (double *) malloc (n * sizeof (double)) ;
+    if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_xx_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz,
+	P, Q, Dx, Dz, &do_recip, Rs, Numeric) ;
+    if (status < 0)
+    {
+	error ("umfpack_xx_get_numeric failed") ;
+    }
+
+    printf ("\nL (lower triangular factor of C): ") ;
+    (void) umfpack_xx_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ;
+    printf ("\nU (upper triangular factor of C): ") ;
+    (void) umfpack_xx_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ;
+    printf ("\nP: ") ;
+    (void) umfpack_xx_report_perm (n, P, Control) ;
+    printf ("\nQ: ") ;
+    (void) umfpack_xx_report_perm (n, Q, Control) ;
+    printf ("\nScale factors: row i of A is to be ") ;
+    if (do_recip)
+    {
+	printf ("multiplied by the ith scale factor\n") ;
+    }
+    else
+    {
+	printf ("divided by the ith scale factor\n") ;
+    }
+    for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to triplet form and print it */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that L is in row-form, so it is the row indices that are created */
+    /* by umfpack_xx_col_to_triplet. */
+
+    printf ("\nConverting L to triplet form, and printing it:\n") ;
+    Li = (Int *) malloc (lnz1 * sizeof (Int)) ;
+    if (!Li)
+    {
+	error ("out of memory") ;
+    }
+    if (umfpack_xx_col_to_triplet (n, Lp, Li) < 0)
+    {
+	error ("umfpack_xx_col_to_triplet failed") ;
+    }
+    printf ("\nL, in triplet form: ") ;
+    (void) umfpack_xx_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Numeric object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "numeric.umf" */
+    printf ("\nSaving numeric object:\n") ;
+    status = umfpack_xx_save_numeric (Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_save_numeric failed") ;
+    }
+    printf ("\nFreeing numeric object:\n") ;
+    umfpack_xx_free_numeric (&Numeric) ;
+    printf ("\nLoading numeric object:\n") ;
+    status = umfpack_xx_load_numeric (&Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_load_numeric failed") ;
+    }
+    printf ("\nDone loading numeric object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_xx_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_xx_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_solve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b again, using umfpack_xx_wsolve instead */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nSolving C'x=b again, using umfpack_xx_wsolve instead:\n") ;
+    Wi = (Int *) malloc (n * sizeof (Int)) ;
+    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+    :: WSIZE is 5 for the real case, 10 for complex.
+    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+    W = (double *) malloc (WSIZE*n * sizeof (double)) ;
+    if (!Wi || !W)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_xx_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info, Wi, W) ;
+    umfpack_xx_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_xx_report_status (Control, status) ;
+	error ("umfpack_xx_wsolve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_xx_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free everything */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is not strictly required since the process is exiting and the */
+    /* system will reclaim the memory anyway.  It's useful, though, just as */
+    /* a list of what is currently malloc'ed by this program.  Plus, it's */
+    /* always a good habit to explicitly free whatever you malloc. */
+
+    free (Ap) ;
+    free (Ai) ;
+    free (Ax) ;
+    free (Az) ;
+
+    free (Cp) ;
+    free (Ci) ;
+    free (Cx) ;
+    free (Cz) ;
+
+    free (Pinit) ;
+    free (Qinit) ;
+    free (Front_npivcol) ;
+    free (Front_1strow) ;
+    free (Front_leftmostdesc) ;
+    free (Front_parent) ;
+    free (Chain_start) ;
+    free (Chain_maxrows) ;
+    free (Chain_maxcols) ;
+
+    free (Lp) ;
+    free (Lj) ;
+    free (Lx) ;
+    free (Lz) ;
+
+    free (Up) ;
+    free (Ui) ;
+    free (Ux) ;
+    free (Uz) ;
+
+    free (P) ;
+    free (Q) ;
+
+    free (Li) ;
+
+    free (Wi) ;
+    free (W) ;
+
+    umfpack_xx_free_symbolic (&Symbolic) ;
+    umfpack_xx_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the total time spent in this demo */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (t) ;
+    printf ("\numfpack_xx_demo complete.\nTotal time: %5.2f seconds"
+	" (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ;
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,791 @@
+/* ========================================================================== */
+/* === umfpack_zi_demo ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+  A demo of UMFPACK:   umfpack_zi_* version.
+
+  First, factor and solve a 5-by-5 system, Ax=b, using default parameters.
+  Then solve A'x=b using the factors of A.   Modify one entry (A (1,4) = 0,
+  where the row and column indices range from 0 to 4.  The pattern of A
+  has not changed (it has explicitly zero entry), so a reanalysis with
+  umfpack_zi_symbolic does not need to be done.  Refactorize (with
+  umfpack_zi_numeric), and solve Ax=b.  Note that the pivot ordering has
+  changed.  Next, change all of the entries in A, but not the pattern.
+
+  Finally, compute C = A', and do the symbolic and numeric factorization of C.
+  Factorizing A' can sometimes be better than factorizing A itself (less work
+  and memory usage).  Solve C'x=b twice; the solution is the same as the
+  solution to Ax=b.
+
+  A note about zero-sized arrays:  UMFPACK uses many user-provided arrays of
+  size n (order of the matrix), and of size nz (the number of nonzeros in a
+  matrix).  n cannot be zero; UMFPACK does not handle zero-dimensioned arrays.
+  However, nz can be zero.  If you attempt to malloc an array of size nz = 0,
+  however, malloc will return a null pointer which UMFPACK will report as a
+  "missing argument."  Thus, nz1 in this code is set to MAX (nz,1), and
+  similarly for lnz and unz.  Lnz can never be zero, however, since L is always
+  unit diagonal.
+*/
+
+/* -------------------------------------------------------------------------- */
+/* definitions */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "umfpack.h"
+
+/* use a cheap approximate absolute value for complex numbers: */
+#define ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* triplet form of the matrix.  The triplets can be in any order. */
+/* -------------------------------------------------------------------------- */
+
+static int    n = 5, nz = 12 ;
+static int    Arow [ ] = { 0,  4,  1,  1,   2,   2,  0,  1,  2,  3,  4,  4} ;
+static int    Acol [ ] = { 0,  4,  0,  2,   1,   2,  1,  4,  3,  2,  1,  2} ;
+static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ;
+static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ;
+static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ;
+static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ;
+
+/* Avalz, bz:  imaginary part of A and b */
+
+/* -------------------------------------------------------------------------- */
+/* error: print a message and exit */
+/* -------------------------------------------------------------------------- */
+
+static void error
+(
+    char *message
+)
+{
+    printf ("\n\n====== error: %s =====\n\n", message) ;
+    exit (1) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */
+/* A' is the complex conjugate transpose, not the array transpose */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    int transpose,
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ]
+    , double Az [ ]
+)
+{
+    int i, j, p ;
+    double norm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = -b [i] ;
+	rz[i] = -bz[i] ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		/* complex: r(j) += conj (Aij) * x (i) */
+		r [j] += Ax [p] * x [i] ;
+		r [j] += Az [p] * xz[i] ;
+		rz[j] -= Az [p] * x [i] ;
+		rz[j] += Ax [p] * xz[i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+		r [i] -= Az [p] * xz[j] ;
+		rz[i] += Az [p] * x [j] ;
+		rz[i] += Ax [p] * xz[j] ;
+	    }
+	}
+    }
+    norm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	norm = MAX (ABS (r [i], rz [i]), norm) ;
+    }
+    return (norm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux,
+	*W, t [2], *Dx, rnorm, *Rb, *y, *Rs ;
+    double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ;
+    int *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up,
+	*P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1,
+	status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1,
+	*Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc,
+	nzud, do_recip ;
+    void *Symbolic, *Numeric ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (t) ;
+
+    printf ("\n%s demo: _zi_ version\n", UMFPACK_VERSION) ;
+
+    /* get the default control parameters */
+    umfpack_zi_defaults (Control) ;
+
+    /* change the default print level for this demo */
+    /* (otherwise, nothing will print) */
+    Control [UMFPACK_PRL] = 6 ;
+
+    /* print the license agreement */
+    umfpack_zi_report_status (Control, UMFPACK_OK) ;
+    Control [UMFPACK_PRL] = 5 ;
+
+    /* print the control parameters */
+    umfpack_zi_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print A and b, and convert A to column-form */
+    /* ---------------------------------------------------------------------- */
+
+    /* print the right-hand-side */
+    printf ("\nb: ") ;
+    (void) umfpack_zi_report_vector (n, b, bz, Control) ;
+
+    /* print the triplet form of the matrix */
+    printf ("\nA: ") ;
+    (void) umfpack_zi_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz,
+	Control) ;
+
+    /* convert to column form */
+    nz1 = MAX (nz,1) ;	/* ensure arrays are not of size zero. */
+    Ap = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ai = (int *) malloc (nz1 * sizeof (int)) ;
+    Ax = (double *) malloc (nz1 * sizeof (double)) ;
+    Az = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax || !Az)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zi_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz,
+	Ap, Ai, Ax, Az, (int *) NULL) ;
+
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_triplet_to_col failed") ;
+    }
+
+    /* print the column-form of A */
+    printf ("\nA: ") ;
+    (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_symbolic failed") ;
+    }
+
+    /* print the symbolic factorization */
+
+    printf ("\nSymbolic factorization of A: ") ;
+    (void) umfpack_zi_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_numeric failed") ;
+    }
+
+    /* print the numeric factorization */
+    printf ("\nNumeric factorization of A: ") ;
+    (void) umfpack_zi_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zi_report_info (Control, Info) ;
+    umfpack_zi_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_zi_solve failed") ;
+    }
+    printf ("\nx (solution of Ax=b): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_get_determinant (x, xz, r, Numeric, Info) ;
+    umfpack_zi_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_zi_get_determinant failed") ;
+    }
+    printf ("determinant: (%g", x [0]) ;
+    printf ("+ (%g)i", xz [0]) ; /* complex */
+    printf (") * 10^(%g)\n", r [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, broken down into steps */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rb = R*b */
+    Rb  = (double *) malloc (n * sizeof (double)) ;
+    Rbz = (double *) malloc (n * sizeof (double)) ;
+    y   = (double *) malloc (n * sizeof (double)) ;
+    yz  = (double *) malloc (n * sizeof (double)) ;
+    if (!Rb || !y) error ("out of memory") ;
+    if (!Rbz || !yz) error ("out of memory") ;
+
+    status = umfpack_zi_scale (Rb, Rbz, b, bz, Numeric) ;
+    if (status < 0) error ("umfpack_zi_scale failed") ;
+    /* solve Ly = P*(Rb) */
+    status = umfpack_zi_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_zi_solve failed") ;
+    /* solve UQ'x=y */
+    status = umfpack_zi_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_zi_solve failed") ;
+    printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    free (Rb) ;
+    free (Rbz) ;
+    free (y) ;
+    free (yz) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve A'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    /* note that this is the complex conjugate transpose, A' */
+    status = umfpack_zi_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zi_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_zi_solve failed") ;
+    }
+    printf ("\nx (solution of A'x=b): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify one numerical value in the column-form of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* change A (1,4), look for row index 1 in column 4. */
+    row = 1 ;
+    col = 4 ;
+    for (p = Ap [col] ; p < Ap [col+1] ; p++)
+    {
+	if (row == Ai [p])
+	{
+	    printf ("\nchanging A (%d,%d) to zero\n", row, col) ;
+	    Ax [p] = 0.0 ;
+	    Az [p] = 0.0 ;
+	    break ;
+	}
+    }
+    printf ("\nmodified A: ") ;
+    (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */
+    /* doesn't have to be redone, no matter how much we change Ax. */
+
+    /* We don't need the Numeric object any more, so free it. */
+    umfpack_zi_free_numeric (&Numeric) ;
+
+    /* Note that a memory leak would have occurred if the old Numeric */
+    /* had not been free'd with umfpack_zi_free_numeric above. */
+    status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of modified A: ") ;
+    (void) umfpack_zi_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zi_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_solve failed") ;
+    }
+    printf ("\nx (with modified A): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify all of the numerical values of A, but not the pattern */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Ap [col] ; p < Ap [col+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    printf ("changing ") ;
+	    /* complex: */ printf ("real part of ") ;
+	    printf ("A (%d,%d) from %g", row, col, Ax [p]) ;
+	    Ax [p] = Ax [p] + col*10 - row ;
+	    printf (" to %g\n", Ax [p]) ;
+	}
+    }
+    printf ("\ncompletely modified A (same pattern): ") ;
+    (void) umfpack_zi_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Symbolic object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "symbolic.umf" */
+    printf ("\nSaving symbolic object:\n") ;
+    status = umfpack_zi_save_symbolic (Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_save_symbolic failed") ;
+    }
+    printf ("\nFreeing symbolic object:\n") ;
+    umfpack_zi_free_symbolic (&Symbolic) ;
+    printf ("\nLoading symbolic object:\n") ;
+    status = umfpack_zi_load_symbolic (&Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_load_symbolic failed") ;
+    }
+    printf ("\nDone loading symbolic object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_zi_free_numeric (&Numeric) ;
+    status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of completely modified A: ") ;
+    (void) umfpack_zi_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zi_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_solve failed") ;
+    }
+    printf ("\nx (with completely modified A): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the symbolic and numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_zi_free_symbolic (&Symbolic) ;
+    umfpack_zi_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = transpose of A */
+    /* ---------------------------------------------------------------------- */
+
+    Cp = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ci = (int *) malloc (nz1 * sizeof (int)) ;
+    Cx = (double *) malloc (nz1 * sizeof (double)) ;
+    Cz = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Cp || !Ci || !Cx || !Cz)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_zi_transpose (n, n, Ap, Ai, Ax, Az,
+	(int *) NULL, (int *) NULL, Cp, Ci, Cx, Cz, TRUE) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_transpose failed: ") ;
+    }
+    printf ("\nC (transpose of A): ") ;
+    (void) umfpack_zi_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_symbolic failed") ;
+    }
+    printf ("\nSymbolic factorization of C: ") ;
+    (void) umfpack_zi_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the contents of Symbolic into user arrays print them */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nGet the contents of the Symbolic object for C:\n") ;
+    printf ("(compare with umfpack_zi_report_symbolic output, above)\n") ;
+    Pinit = (int *) malloc ((n+1) * sizeof (int)) ;
+    Qinit = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_npivcol = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_1strow = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_leftmostdesc = (int *) malloc ((n+1) * sizeof (int)) ;
+    Front_parent = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_start = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_maxrows = (int *) malloc ((n+1) * sizeof (int)) ;
+    Chain_maxcols = (int *) malloc ((n+1) * sizeof (int)) ;
+    if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start ||
+	!Chain_maxrows || !Chain_maxcols || !Front_1strow ||
+	!Front_leftmostdesc)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zi_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains,
+	Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+    if (status < 0)
+    {
+	error ("symbolic factorization invalid") ;
+    }
+
+    printf ("From the Symbolic object, C is of dimension %d-by-%d\n", nr, nc);
+    printf ("   with nz = %d, number of fronts = %d,\n", nz, nfr) ;
+    printf ("   number of frontal matrix chains = %d\n", nchains) ;
+
+    printf ("\nPivot columns in each front, and parent of each front:\n") ;
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fnpiv = Front_npivcol [i] ;
+	printf ("    Front %d: parent front: %d number of pivot cols: %d\n",
+		i, Front_parent [i], fnpiv) ;
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    col = Qinit [k] ;
+	    printf (
+	    "        %d-th pivot column is column %d in original matrix\n",
+		k, col) ;
+	    k++ ;
+	}
+    }
+
+    printf ("\nNote that the column ordering, above, will be refined\n") ;
+    printf ("in the numeric factorization below.  The assignment of pivot\n") ;
+    printf ("columns to frontal matrices will always remain unchanged.\n") ;
+
+    printf ("\nTotal number of pivot columns in frontal matrices: %d\n", k) ;
+
+    printf ("\nFrontal matrix chains:\n") ;
+    for (j = 0 ; j < nchains ; j++)
+    {
+	printf ("   Frontal matrices %d to %d are factorized in a single\n",
+	    Chain_start [j], Chain_start [j+1] - 1) ;
+	printf ("        working array of size %d-by-%d\n",
+	    Chain_maxrows [j], Chain_maxcols [j]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_zi_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of C: ") ;
+    (void) umfpack_zi_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extract the LU factors of C and print them */
+    /* ---------------------------------------------------------------------- */
+
+    if (umfpack_zi_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0)
+    {
+	error ("umfpack_zi_get_lunz failed") ;
+    }
+    /* ensure arrays are not of zero size */
+    lnz1 = MAX (lnz,1) ;
+    unz1 = MAX (unz,1) ;
+    Lp = (int *) malloc ((n+1) * sizeof (int)) ;
+    Lj = (int *) malloc (lnz1 * sizeof (int)) ;
+    Lx = (double *) malloc (lnz1 * sizeof (double)) ;
+    Lz = (double *) malloc (lnz1 * sizeof (double)) ;
+    Up = (int *) malloc ((n+1) * sizeof (int)) ;
+    Ui = (int *) malloc (unz1 * sizeof (int)) ;
+    Ux = (double *) malloc (unz1 * sizeof (double)) ;
+    Uz = (double *) malloc (unz1 * sizeof (double)) ;
+    P = (int *) malloc (n * sizeof (int)) ;
+    Q = (int *) malloc (n * sizeof (int)) ;
+    Dx = (double *) NULL ;	/* D vector not requested */
+    Dz = (double *) NULL ;
+    Rs  = (double *) malloc (n * sizeof (double)) ;
+    if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz,
+	P, Q, Dx, Dz, &do_recip, Rs, Numeric) ;
+    if (status < 0)
+    {
+	error ("umfpack_zi_get_numeric failed") ;
+    }
+
+    printf ("\nL (lower triangular factor of C): ") ;
+    (void) umfpack_zi_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ;
+    printf ("\nU (upper triangular factor of C): ") ;
+    (void) umfpack_zi_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ;
+    printf ("\nP: ") ;
+    (void) umfpack_zi_report_perm (n, P, Control) ;
+    printf ("\nQ: ") ;
+    (void) umfpack_zi_report_perm (n, Q, Control) ;
+    printf ("\nScale factors: row i of A is to be ") ;
+    if (do_recip)
+    {
+	printf ("multiplied by the ith scale factor\n") ;
+    }
+    else
+    {
+	printf ("divided by the ith scale factor\n") ;
+    }
+    for (i = 0 ; i < n ; i++) printf ("%d: %g\n", i, Rs [i]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to triplet form and print it */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that L is in row-form, so it is the row indices that are created */
+    /* by umfpack_zi_col_to_triplet. */
+
+    printf ("\nConverting L to triplet form, and printing it:\n") ;
+    Li = (int *) malloc (lnz1 * sizeof (int)) ;
+    if (!Li)
+    {
+	error ("out of memory") ;
+    }
+    if (umfpack_zi_col_to_triplet (n, Lp, Li) < 0)
+    {
+	error ("umfpack_zi_col_to_triplet failed") ;
+    }
+    printf ("\nL, in triplet form: ") ;
+    (void) umfpack_zi_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Numeric object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "numeric.umf" */
+    printf ("\nSaving numeric object:\n") ;
+    status = umfpack_zi_save_numeric (Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_save_numeric failed") ;
+    }
+    printf ("\nFreeing numeric object:\n") ;
+    umfpack_zi_free_numeric (&Numeric) ;
+    printf ("\nLoading numeric object:\n") ;
+    status = umfpack_zi_load_numeric (&Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_load_numeric failed") ;
+    }
+    printf ("\nDone loading numeric object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zi_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zi_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_solve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b again, using umfpack_zi_wsolve instead */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nSolving C'x=b again, using umfpack_zi_wsolve instead:\n") ;
+    Wi = (int *) malloc (n * sizeof (int)) ;
+    W = (double *) malloc (10*n * sizeof (double)) ;
+    if (!Wi || !W)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zi_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info, Wi, W) ;
+    umfpack_zi_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	error ("umfpack_zi_wsolve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_zi_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free everything */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is not strictly required since the process is exiting and the */
+    /* system will reclaim the memory anyway.  It's useful, though, just as */
+    /* a list of what is currently malloc'ed by this program.  Plus, it's */
+    /* always a good habit to explicitly free whatever you malloc. */
+
+    free (Ap) ;
+    free (Ai) ;
+    free (Ax) ;
+    free (Az) ;
+
+    free (Cp) ;
+    free (Ci) ;
+    free (Cx) ;
+    free (Cz) ;
+
+    free (Pinit) ;
+    free (Qinit) ;
+    free (Front_npivcol) ;
+    free (Front_1strow) ;
+    free (Front_leftmostdesc) ;
+    free (Front_parent) ;
+    free (Chain_start) ;
+    free (Chain_maxrows) ;
+    free (Chain_maxcols) ;
+
+    free (Lp) ;
+    free (Lj) ;
+    free (Lx) ;
+    free (Lz) ;
+
+    free (Up) ;
+    free (Ui) ;
+    free (Ux) ;
+    free (Uz) ;
+
+    free (P) ;
+    free (Q) ;
+
+    free (Li) ;
+
+    free (Wi) ;
+    free (W) ;
+
+    umfpack_zi_free_symbolic (&Symbolic) ;
+    umfpack_zi_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the total time spent in this demo */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (t) ;
+    printf ("\numfpack_zi_demo complete.\nTotal time: %5.2f seconds"
+	" (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ;
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1542 @@
+
+UMFPACK V4.4 (Jan. 28, 2005) demo: _zi_ version
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+
+UMFPACK License:
+
+   Your use or distribution of UMFPACK or any modified version of
+   UMFPACK implies that you agree to this License.
+
+   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+   Permission is hereby granted to use or copy this program, provided
+   that the Copyright, this License, and the Availability of the original
+   version is retained on all copies.  User documentation of any code that
+   uses UMFPACK or any modified version of UMFPACK code must cite the
+   Copyright, this License, the Availability note, and "Used by permission."
+   Permission to modify the code and to distribute modified code is granted,
+   provided the Copyright, this License, and the Availability note are
+   retained, and a notice that the code was modified is included.  This
+   software was developed with support from the National Science Foundation,
+   and is provided to you free of charge.
+
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double complex
+    Int (generic integer) defined as: int
+
+    0: print level: 5
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes)
+
+
+b: dense vector, n = 5. 
+    0 : (8 + 1i)
+    1 : (45 - 5i)
+    2 : (-3 - 2i)
+    3 : (3 + 0i)
+    4 : (19 + 2.2i)
+    dense vector OK
+
+
+A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. 
+    0 : 0 0  (2 + 1i)
+    1 : 4 4  (1 + 0.4i)
+    2 : 1 0  (3 + 0.1i)
+    3 : 1 2  (4 + 0.2i)
+    4 : 2 1  (-1 - 1i)
+    5 : 2 2  (-3 - 0.2i)
+    6 : 0 1  (3 + 0i)
+    7 : 1 4  (6 + 6i)
+    8 : 2 3  (2 + 3i)
+    9 : 3 2  (1 + 0i)
+    10 : 4 1  (4 + 0.3i)
+    11 : 4 2  (2 + 0.3i)
+    triplet-form matrix OK
+
+
+A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (3 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3 + 0i)
+	row 2 : (-1 - 1i)
+	row 4 : (4 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4 + 0.2i)
+	row 2 : (-3 - 0.2i)
+	row 3 : (1 + 0i)
+	row 4 : (2 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (6 + 6i)
+	row 4 : (1 + 0.4i)
+    column-form matrix OK
+
+
+Symbolic factorization of A: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 84  (MBytes): 0.0
+	estimated peak size (Units):  2542  (MBytes): 0.0
+	estimated final size (Units): 25  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Numeric factorization of A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 99
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.34629e-01
+    max abs. value on diagonal of U:            1.77313e+00
+    reciprocal condition number estimate:       7.59e-02
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.166667)
+    1 : (0.0518135)
+    2 : (0.0980392)
+    3 : (1)
+    4 : (0.125)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.207254 + 0.0103627i)
+	row 3 :  (0.25 + 0.0375i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.379275 - 0.174093i)
+
+    column 3:  length 1.
+	row 4 :  (3.00161 + 1.2864i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.5 + 0.0375i)
+
+    row 2:  length 1.
+	col 4 : (0.5 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.294118 - 0.0196078i)
+	col 4 :  (-0.0980392 - 0.0980392i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.196078 + 0.294118i)
+    1 : (1 + 0i)
+    2 : (0.333333 + 0.166667i)
+    3 : (0.125 + 0.05i)
+    4 : (-1.6422 - 0.668715i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.77e+00
+    estimate of reciprocal of condition number:    7.59e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.23000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.87e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.57000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+x (solution of Ax=b): dense vector, n = 5. 
+    0 : (0.121188 - 0.561001i)
+    1 : (2.39887 + 0.666938i)
+    2 : (3 + 0i)
+    3 : (1.57395 - 1.52801i)
+    4 : (2.3876 - 3.04245i)
+    dense vector OK
+
+maxnorm of residual: 6.21725e-15
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+determinant: (-1.7814+ (2.3784)i) * 10^(2)
+
+x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. 
+    0 : (0.121188 - 0.561001i)
+    1 : (2.39887 + 0.666938i)
+    2 : (3 + 0i)
+    3 : (1.57395 - 1.52801i)
+    4 : (2.3876 - 3.04245i)
+    dense vector OK
+
+maxnorm of residual: 6.21725e-15
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.77e+00
+    estimate of reciprocal of condition number:    7.59e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  6.06e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of A'x=b): dense vector, n = 5. 
+    0 : (3.39246 + 0.13257i)
+    1 : (0.31463 + 1.38626i)
+    2 : (0.461538 + 0.692308i)
+    3 : (-20.9089 - 1.55801i)
+    4 : (9.04015 - 0.613724i)
+    dense vector OK
+
+maxnorm of residual: 7.68703e-15
+
+
+changing A (1,4) to zero
+
+modified A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (3 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3 + 0i)
+	row 2 : (-1 - 1i)
+	row 4 : (4 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4 + 0.2i)
+	row 2 : (-3 - 0.2i)
+	row 3 : (1 + 0i)
+	row 4 : (2 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (0 + 0i)
+	row 4 : (1 + 0.4i)
+    column-form matrix OK
+
+
+Numeric factorization of modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.02000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 97
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  1
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    17
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.34629e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.35e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.166667)
+    1 : (0.136986)
+    2 : (0.0980392)
+    3 : (1)
+    4 : (0.125)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.547945 + 0.0273973i)
+	row 3 :  (0.25 + 0.0375i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (1.00274 - 0.460274i)
+
+    column 3:  length 0.  Start of Lchain.
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.5 + 0.0375i)
+
+    row 2:  length 1.
+	col 4 : (0.5 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.294118 - 0.0196078i)
+	col 4 :  (-0.0980392 - 0.0980392i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.196078 + 0.294118i)
+    1 : (1 + 0i)
+    2 : (0.333333 + 0.166667i)
+    3 : (0.125 + 0.05i)
+    4 : (-0.50137 + 0.230137i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.02000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   19    76%
+    Numeric final size (Units)                   106                   98    92%
+    Numeric final size (MBytes)                  0.0                  0.0    92%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          1.70000e+01    25%
+    nz in L (incl diagonal)                       10                    8    80%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   12    80%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.35e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     8
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.15000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.33e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.01
+    solve mflops (wall clock time):                0.05
+
+    total symbolic + numeric + solve flops:        5.32000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with modified A): dense vector, n = 5. 
+    0 : (10.9256 - 2.23085i)
+    1 : (-5.36071 - 1.82131i)
+    2 : (3 + 0i)
+    3 : (-1.60191 - 1.88814i)
+    4 : (32.7361 - 2.90097i)
+    dense vector OK
+
+maxnorm of residual: 3.9968e-15
+
+changing real part of A (0,0) from 2 to 2
+changing real part of A (1,0) from 3 to 2
+changing real part of A (0,1) from 3 to 13
+changing real part of A (2,1) from -1 to 7
+changing real part of A (4,1) from 4 to 10
+changing real part of A (1,2) from 4 to 23
+changing real part of A (2,2) from -3 to 15
+changing real part of A (3,2) from 1 to 18
+changing real part of A (4,2) from 2 to 18
+changing real part of A (2,3) from 2 to 30
+changing real part of A (1,4) from 0 to 39
+changing real part of A (4,4) from 1 to 37
+
+completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (2 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (13 + 0i)
+	row 2 : (7 - 1i)
+	row 4 : (10 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (23 + 0.2i)
+	row 2 : (15 - 0.2i)
+	row 3 : (18 + 0i)
+	row 4 : (18 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (30 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (39 + 0i)
+	row 4 : (37 + 0.4i)
+    column-form matrix OK
+
+
+Saving symbolic object:
+
+Freeing symbolic object:
+
+Loading symbolic object:
+
+Done loading symbolic object
+
+Numeric factorization of completely modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.60000e+01
+    maximum sum (abs (rows of A)):              6.60000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 99
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.39754e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.40e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.0625)
+    1 : (0.0155521)
+    2 : (0.0177936)
+    3 : (0.0555556)
+    4 : (0.0151515)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.357698 + 0.00311042i)
+	row 3 :  (0.272727 + 0.00454545i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.204044 - 0.0895801i)
+
+    column 3:  length 1.
+	row 4 :  (1.0818 - 0.0116951i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.151515 + 0.00454545i)
+
+    row 2:  length 1.
+	col 4 : (0.8125 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (0.266904 - 0.00355872i)
+	col 4 :  (0.124555 - 0.0177936i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.533808 + 0.0533808i)
+    1 : (1 + 0i)
+    2 : (0.125 + 0.0625i)
+    3 : (0.560606 + 0.00606061i)
+    4 : (-0.329747 + 0.0696386i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.60000e+01
+    maximum sum (abs (rows of A)):              6.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.40e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.40e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.23000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  4.75e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.57000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with completely modified A): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.92582e-15
+
+
+C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 - 1i)
+	row 1 : (13 + 0i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (2 - 0.1i)
+	row 2 : (23 - 0.2i)
+	row 4 : (39 + 0i)
+
+    column 2: start: 5 end: 7 entries: 3
+	row 1 : (7 + 1i)
+	row 2 : (15 + 0.2i)
+	row 3 : (30 - 3i)
+
+    column 3: start: 8 end: 8 entries: 1
+	row 2 : (18 + 0i)
+
+    column 4: start: 9 end: 11 entries: 3
+	row 1 : (10 - 0.3i)
+	row 2 : (18 - 0.3i)
+	row 4 : (37 - 0.4i)
+    column-form matrix OK
+
+
+Symbolic factorization of C: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 85  (MBytes): 0.0
+	estimated peak size (Units):  2543  (MBytes): 0.0
+	estimated final size (Units): 26  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Get the contents of the Symbolic object for C:
+(compare with umfpack_zi_report_symbolic output, above)
+From the Symbolic object, C is of dimension 5-by-5
+   with nz = 12, number of fronts = 1,
+   number of frontal matrix chains = 1
+
+Pivot columns in each front, and parent of each front:
+    Front 0: parent front: -1 number of pivot cols: 3
+        0-th pivot column is column 3 in original matrix
+        1-th pivot column is column 2 in original matrix
+        2-th pivot column is column 0 in original matrix
+
+Note that the column ordering, above, will be refined
+in the numeric factorization below.  The assignment of pivot
+columns to frontal matrices will always remain unchanged.
+
+Total number of pivot columns in frontal matrices: 3
+
+Frontal matrix chains:
+   Frontal matrices 0 to 0 are factorized in a single
+        working array of size 3-by-3
+
+Numeric factorization of C: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 100
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2528
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        5
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            2.40964e-01
+    max abs. value on diagonal of U:            9.13625e-01
+    reciprocal condition number estimate:       2.64e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.196078)
+    1 : (0.0319489)
+    2 : (0.0133869)
+    3 : (0.030303)
+    4 : (0.013089)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 1.
+	row 4 :  (0.240091 + 0.0591529i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.847284 + 0.423642i)
+
+    column 3:  length 1.
+	row 4 :  (0.659838 - 0.0126577i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.510471 + 0i)
+
+    row 2:  length 1.
+	col 4 : (0.392157 - 0.0196078i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 3.
+	col 1 :  (0.200803 + 0.00267738i)
+	col 3 :  (0.240964 - 0.00401606i)
+	col 4 :  (0.307898 - 0.00267738i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.240964 + 0i)
+    1 : (0.909091 - 0.0909091i)
+    2 : (0.392157 - 0.196078i)
+    3 : (0.484293 - 0.0052356i)
+    4 : (-0.677403 - 0.143059i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. 
+
+    row 0: start: 0 end: 0 entries: 1
+	column 0 : (1 + 0i)
+
+    row 1: start: 1 end: 1 entries: 1
+	column 1 : (1 + 0i)
+
+    row 2: start: 2 end: 2 entries: 1
+	column 2 : (1 + 0i)
+
+    row 3: start: 3 end: 3 entries: 1
+	column 3 : (1 + 0i)
+
+    row 4: start: 4 end: 7 entries: 4
+	column 1 : (0.240091 + 0.0591529i)
+	column 2 : (0.847284 + 0.423642i)
+	column 3 : (0.659838 - 0.0126577i)
+	column 4 : (1 + 0i)
+    row-form matrix OK
+
+
+U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. 
+
+    column 0: start: 0 end: 0 entries: 1
+	row 0 : (0.240964 + 0i)
+
+    column 1: start: 1 end: 2 entries: 2
+	row 0 : (0.200803 + 0.00267738i)
+	row 1 : (0.909091 - 0.0909091i)
+
+    column 2: start: 3 end: 3 entries: 1
+	row 2 : (0.392157 - 0.196078i)
+
+    column 3: start: 4 end: 5 entries: 2
+	row 0 : (0.240964 - 0.00401606i)
+	row 3 : (0.484293 - 0.0052356i)
+
+    column 4: start: 6 end: 9 entries: 4
+	row 0 : (0.307898 - 0.00267738i)
+	row 2 : (0.392157 - 0.0196078i)
+	row 3 : (0.510471 + 0i)
+	row 4 : (-0.677403 - 0.143059i)
+    column-form matrix OK
+
+
+P: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Scale factors: row i of A is to be multiplied by the ith scale factor
+0: 0.196078
+1: 0.0319489
+2: 0.0133869
+3: 0.030303
+4: 0.013089
+
+Converting L to triplet form, and printing it:
+
+L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. 
+    0 : 0 0  (1 + 0i)
+    1 : 1 1  (1 + 0i)
+    2 : 2 2  (1 + 0i)
+    3 : 3 3  (1 + 0i)
+    4 : 4 1  (0.240091 + 0.0591529i)
+    5 : 4 2  (0.847284 + 0.423642i)
+    6 : 4 3  (0.659838 - 0.0126577i)
+    7 : 4 4  (1 + 0i)
+    triplet-form matrix OK
+
+
+Saving numeric object:
+
+Freeing numeric object:
+
+Loading numeric object:
+
+Done loading numeric object
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      85                   80    94%
+        peak size (Units)                       2543                 2528    99%
+        final size (Units)                        26                   22    85%
+    Numeric final size (Units)                   107                  101    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2738                 2723    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.41e-01
+    max abs. value on diagonal of U:               9.14e-01
+    estimate of reciprocal of condition number:    2.64e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  8.89e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.6552e-15
+
+
+Solving C'x=b again, using umfpack_zi_wsolve instead:
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: int
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      85                   80    94%
+        peak size (Units)                       2543                 2528    99%
+        final size (Units)                        26                   22    85%
+    Numeric final size (Units)                   107                  101    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2738                 2723    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.41e-01
+    max abs. value on diagonal of U:               9.14e-01
+    estimate of reciprocal of condition number:    2.64e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  8.89e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.6552e-15
+
+
+umfpack_zi_demo complete.
+Total time:  0.00 seconds (CPU time),  0.01 seconds (wallclock time)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zi_demo.sed	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,8 @@
+/::/d
+1,$s/_xx_/_zi_/g
+1,$s/Int/int/g
+1,$s/WSIZE/10/
+1,$s/%ld/%d/g
+/define ABS/ {
+	s/ABS/ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))/
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,791 @@
+/* ========================================================================== */
+/* === umfpack_zl_demo ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+  A demo of UMFPACK:   umfpack_zl_* version.
+
+  First, factor and solve a 5-by-5 system, Ax=b, using default parameters.
+  Then solve A'x=b using the factors of A.   Modify one entry (A (1,4) = 0,
+  where the row and column indices range from 0 to 4.  The pattern of A
+  has not changed (it has explicitly zero entry), so a reanalysis with
+  umfpack_zl_symbolic does not need to be done.  Refactorize (with
+  umfpack_zl_numeric), and solve Ax=b.  Note that the pivot ordering has
+  changed.  Next, change all of the entries in A, but not the pattern.
+
+  Finally, compute C = A', and do the symbolic and numeric factorization of C.
+  Factorizing A' can sometimes be better than factorizing A itself (less work
+  and memory usage).  Solve C'x=b twice; the solution is the same as the
+  solution to Ax=b.
+
+  A note about zero-sized arrays:  UMFPACK uses many user-provided arrays of
+  size n (order of the matrix), and of size nz (the number of nonzeros in a
+  matrix).  n cannot be zero; UMFPACK does not handle zero-dimensioned arrays.
+  However, nz can be zero.  If you attempt to malloc an array of size nz = 0,
+  however, malloc will return a null pointer which UMFPACK will report as a
+  "missing argument."  Thus, nz1 in this code is set to MAX (nz,1), and
+  similarly for lnz and unz.  Lnz can never be zero, however, since L is always
+  unit diagonal.
+*/
+
+/* -------------------------------------------------------------------------- */
+/* definitions */
+/* -------------------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "umfpack.h"
+
+/* use a cheap approximate absolute value for complex numbers: */
+#define ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))
+
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* triplet form of the matrix.  The triplets can be in any order. */
+/* -------------------------------------------------------------------------- */
+
+static long    n = 5, nz = 12 ;
+static long    Arow [ ] = { 0,  4,  1,  1,   2,   2,  0,  1,  2,  3,  4,  4} ;
+static long    Acol [ ] = { 0,  4,  0,  2,   1,   2,  1,  4,  3,  2,  1,  2} ;
+static double Aval [ ] = {2., 1., 3., 4., -1., -3., 3., 6., 2., 1., 4., 2.} ;
+static double Avalz[ ] = {1., .4, .1, .2, -1., -.2, 0., 6., 3., 0., .3, .3} ;
+static double b [ ] = {8., 45., -3., 3., 19.}, x [5], r [5] ;
+static double bz[ ] = {1., -5., -2., 0., 2.2}, xz[5], rz[5] ;
+
+/* Avalz, bz:  imaginary part of A and b */
+
+/* -------------------------------------------------------------------------- */
+/* error: print a message and exit */
+/* -------------------------------------------------------------------------- */
+
+static void error
+(
+    char *message
+)
+{
+    printf ("\n\n====== error: %s =====\n\n", message) ;
+    exit (1) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* resid: compute the residual, r = Ax-b or r = A'x=b and return maxnorm (r) */
+/* A' is the complex conjugate transpose, not the array transpose */
+/* -------------------------------------------------------------------------- */
+
+static double resid
+(
+    long transpose,
+    long Ap [ ],
+    long Ai [ ],
+    double Ax [ ]
+    , double Az [ ]
+)
+{
+    long i, j, p ;
+    double norm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	r [i] = -b [i] ;
+	rz[i] = -bz[i] ;
+    }
+    if (transpose)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		/* complex: r(j) += conj (Aij) * x (i) */
+		r [j] += Ax [p] * x [i] ;
+		r [j] += Az [p] * xz[i] ;
+		rz[j] -= Az [p] * x [i] ;
+		rz[j] += Ax [p] * xz[i] ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		r [i] += Ax [p] * x [j] ;
+		r [i] -= Az [p] * xz[j] ;
+		rz[i] += Az [p] * x [j] ;
+		rz[i] += Ax [p] * xz[j] ;
+	    }
+	}
+    }
+    norm = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	norm = MAX (ABS (r [i], rz [i]), norm) ;
+    }
+    return (norm) ;
+}
+
+
+/* -------------------------------------------------------------------------- */
+/* main program */
+/* -------------------------------------------------------------------------- */
+
+int main (int argc, char **argv)
+{
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], *Ax, *Cx, *Lx, *Ux,
+	*W, t [2], *Dx, rnorm, *Rb, *y, *Rs ;
+    double *Az, *Lz, *Uz, *Dz, *Cz, *Rbz, *yz ;
+    long *Ap, *Ai, *Cp, *Ci, row, col, p, lnz, unz, nr, nc, *Lp, *Li, *Ui, *Up,
+	*P, *Q, *Lj, i, j, k, anz, nfr, nchains, *Qinit, fnpiv, lnz1, unz1, nz1,
+	status, *Front_npivcol, *Front_parent, *Chain_start, *Wi, *Pinit, n1,
+	*Chain_maxrows, *Chain_maxcols, *Front_1strow, *Front_leftmostdesc,
+	nzud, do_recip ;
+    void *Symbolic, *Numeric ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (t) ;
+
+    printf ("\n%s demo: _zl_ version\n", UMFPACK_VERSION) ;
+
+    /* get the default control parameters */
+    umfpack_zl_defaults (Control) ;
+
+    /* change the default print level for this demo */
+    /* (otherwise, nothing will print) */
+    Control [UMFPACK_PRL] = 6 ;
+
+    /* print the license agreement */
+    umfpack_zl_report_status (Control, UMFPACK_OK) ;
+    Control [UMFPACK_PRL] = 5 ;
+
+    /* print the control parameters */
+    umfpack_zl_report_control (Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print A and b, and convert A to column-form */
+    /* ---------------------------------------------------------------------- */
+
+    /* print the right-hand-side */
+    printf ("\nb: ") ;
+    (void) umfpack_zl_report_vector (n, b, bz, Control) ;
+
+    /* print the triplet form of the matrix */
+    printf ("\nA: ") ;
+    (void) umfpack_zl_report_triplet (n, n, nz, Arow, Acol, Aval, Avalz,
+	Control) ;
+
+    /* convert to column form */
+    nz1 = MAX (nz,1) ;	/* ensure arrays are not of size zero. */
+    Ap = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ai = (long *) malloc (nz1 * sizeof (long)) ;
+    Ax = (double *) malloc (nz1 * sizeof (double)) ;
+    Az = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Ap || !Ai || !Ax || !Az)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zl_triplet_to_col (n, n, nz, Arow, Acol, Aval, Avalz,
+	Ap, Ai, Ax, Az, (long *) NULL) ;
+
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_triplet_to_col failed") ;
+    }
+
+    /* print the column-form of A */
+    printf ("\nA: ") ;
+    (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_symbolic (n, n, Ap, Ai, Ax, Az, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_info (Control, Info) ;
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_symbolic failed") ;
+    }
+
+    /* print the symbolic factorization */
+
+    printf ("\nSymbolic factorization of A: ") ;
+    (void) umfpack_zl_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_info (Control, Info) ;
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_numeric failed") ;
+    }
+
+    /* print the numeric factorization */
+    printf ("\nNumeric factorization of A: ") ;
+    (void) umfpack_zl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zl_report_info (Control, Info) ;
+    umfpack_zl_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_zl_solve failed") ;
+    }
+    printf ("\nx (solution of Ax=b): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_get_determinant (x, xz, r, Numeric, Info) ;
+    umfpack_zl_report_status (Control, status) ;
+    if (status < 0)
+    {
+	error ("umfpack_zl_get_determinant failed") ;
+    }
+    printf ("determinant: (%g", x [0]) ;
+    printf ("+ (%g)i", xz [0]) ; /* complex */
+    printf (") * 10^(%g)\n", r [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, broken down into steps */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rb = R*b */
+    Rb  = (double *) malloc (n * sizeof (double)) ;
+    Rbz = (double *) malloc (n * sizeof (double)) ;
+    y   = (double *) malloc (n * sizeof (double)) ;
+    yz  = (double *) malloc (n * sizeof (double)) ;
+    if (!Rb || !y) error ("out of memory") ;
+    if (!Rbz || !yz) error ("out of memory") ;
+
+    status = umfpack_zl_scale (Rb, Rbz, b, bz, Numeric) ;
+    if (status < 0) error ("umfpack_zl_scale failed") ;
+    /* solve Ly = P*(Rb) */
+    status = umfpack_zl_solve (UMFPACK_Pt_L, Ap, Ai, Ax, Az, y, yz, Rb, Rbz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_zl_solve failed") ;
+    /* solve UQ'x=y */
+    status = umfpack_zl_solve (UMFPACK_U_Qt, Ap, Ai, Ax, Az, x, xz, y, yz,
+	Numeric, Control, Info) ;
+    if (status < 0) error ("umfpack_zl_solve failed") ;
+    printf ("\nx (solution of Ax=b, solve is split into 3 steps): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    free (Rb) ;
+    free (Rbz) ;
+    free (y) ;
+    free (yz) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve A'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    /* note that this is the complex conjugate transpose, A' */
+    status = umfpack_zl_solve (UMFPACK_At, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_zl_solve failed") ;
+    }
+    printf ("\nx (solution of A'x=b): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify one numerical value in the column-form of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* change A (1,4), look for row index 1 in column 4. */
+    row = 1 ;
+    col = 4 ;
+    for (p = Ap [col] ; p < Ap [col+1] ; p++)
+    {
+	if (row == Ai [p])
+	{
+	    printf ("\nchanging A (%ld,%ld) to zero\n", row, col) ;
+	    Ax [p] = 0.0 ;
+	    Az [p] = 0.0 ;
+	    break ;
+	}
+    }
+    printf ("\nmodified A: ") ;
+    (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* The pattern (Ap and Ai) hasn't changed, so the symbolic factorization */
+    /* doesn't have to be redone, no matter how much we change Ax. */
+
+    /* We don't need the Numeric object any more, so free it. */
+    umfpack_zl_free_numeric (&Numeric) ;
+
+    /* Note that a memory leak would have occurred if the old Numeric */
+    /* had not been free'd with umfpack_zl_free_numeric above. */
+    status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_info (Control, Info) ;
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of modified A: ") ;
+    (void) umfpack_zl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_solve failed") ;
+    }
+    printf ("\nx (with modified A): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* modify all of the numerical values of A, but not the pattern */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Ap [col] ; p < Ap [col+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    printf ("changing ") ;
+	    /* complex: */ printf ("real part of ") ;
+	    printf ("A (%ld,%ld) from %g", row, col, Ax [p]) ;
+	    Ax [p] = Ax [p] + col*10 - row ;
+	    printf (" to %g\n", Ax [p]) ;
+	}
+    }
+    printf ("\ncompletely modified A (same pattern): ") ;
+    (void) umfpack_zl_report_matrix (n, n, Ap, Ai, Ax, Az, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Symbolic object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "symbolic.umf" */
+    printf ("\nSaving symbolic object:\n") ;
+    status = umfpack_zl_save_symbolic (Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_save_symbolic failed") ;
+    }
+    printf ("\nFreeing symbolic object:\n") ;
+    umfpack_zl_free_symbolic (&Symbolic) ;
+    printf ("\nLoading symbolic object:\n") ;
+    status = umfpack_zl_load_symbolic (&Symbolic, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_load_symbolic failed") ;
+    }
+    printf ("\nDone loading symbolic object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* redo the numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_zl_free_numeric (&Numeric) ;
+    status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_info (Control, Info) ;
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of completely modified A: ") ;
+    (void) umfpack_zl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve Ax=b, with the modified A */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_solve (UMFPACK_A, Ap, Ai, Ax, Az, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_solve failed") ;
+    }
+    printf ("\nx (with completely modified A): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (FALSE, Ap, Ai, Ax, Az) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the symbolic and numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_zl_free_symbolic (&Symbolic) ;
+    umfpack_zl_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = transpose of A */
+    /* ---------------------------------------------------------------------- */
+
+    Cp = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ci = (long *) malloc (nz1 * sizeof (long)) ;
+    Cx = (double *) malloc (nz1 * sizeof (double)) ;
+    Cz = (double *) malloc (nz1 * sizeof (double)) ;
+    if (!Cp || !Ci || !Cx || !Cz)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_zl_transpose (n, n, Ap, Ai, Ax, Az,
+	(long *) NULL, (long *) NULL, Cp, Ci, Cx, Cz, TRUE) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_transpose failed: ") ;
+    }
+    printf ("\nC (transpose of A): ") ;
+    (void) umfpack_zl_report_matrix (n, n, Cp, Ci, Cx, Cz, 1, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_symbolic (n, n, Cp, Ci, Cx, Cz, &Symbolic,
+	Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_info (Control, Info) ;
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_symbolic failed") ;
+    }
+    printf ("\nSymbolic factorization of C: ") ;
+    (void) umfpack_zl_report_symbolic (Symbolic, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the contents of Symbolic into user arrays print them */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nGet the contents of the Symbolic object for C:\n") ;
+    printf ("(compare with umfpack_zl_report_symbolic output, above)\n") ;
+    Pinit = (long *) malloc ((n+1) * sizeof (long)) ;
+    Qinit = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_npivcol = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_1strow = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_leftmostdesc = (long *) malloc ((n+1) * sizeof (long)) ;
+    Front_parent = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_start = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_maxrows = (long *) malloc ((n+1) * sizeof (long)) ;
+    Chain_maxcols = (long *) malloc ((n+1) * sizeof (long)) ;
+    if (!Pinit || !Qinit || !Front_npivcol || !Front_parent || !Chain_start ||
+	!Chain_maxrows || !Chain_maxcols || !Front_1strow ||
+	!Front_leftmostdesc)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zl_get_symbolic (&nr, &nc, &n1, &anz, &nfr, &nchains,
+	Pinit, Qinit, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+    if (status < 0)
+    {
+	error ("symbolic factorization invalid") ;
+    }
+
+    printf ("From the Symbolic object, C is of dimension %ld-by-%ld\n", nr, nc);
+    printf ("   with nz = %ld, number of fronts = %ld,\n", nz, nfr) ;
+    printf ("   number of frontal matrix chains = %ld\n", nchains) ;
+
+    printf ("\nPivot columns in each front, and parent of each front:\n") ;
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fnpiv = Front_npivcol [i] ;
+	printf ("    Front %ld: parent front: %ld number of pivot cols: %ld\n",
+		i, Front_parent [i], fnpiv) ;
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    col = Qinit [k] ;
+	    printf (
+	    "        %ld-th pivot column is column %ld in original matrix\n",
+		k, col) ;
+	    k++ ;
+	}
+    }
+
+    printf ("\nNote that the column ordering, above, will be refined\n") ;
+    printf ("in the numeric factorization below.  The assignment of pivot\n") ;
+    printf ("columns to frontal matrices will always remain unchanged.\n") ;
+
+    printf ("\nTotal number of pivot columns in frontal matrices: %ld\n", k) ;
+
+    printf ("\nFrontal matrix chains:\n") ;
+    for (j = 0 ; j < nchains ; j++)
+    {
+	printf ("   Frontal matrices %ld to %ld are factorized in a single\n",
+	    Chain_start [j], Chain_start [j+1] - 1) ;
+	printf ("        working array of size %ld-by-%ld\n",
+	    Chain_maxrows [j], Chain_maxcols [j]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization of C */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_numeric (Cp, Ci, Cx, Cz, Symbolic, &Numeric,
+	Control, Info) ;
+    if (status < 0)
+    {
+	error ("umfpack_zl_numeric failed") ;
+    }
+    printf ("\nNumeric factorization of C: ") ;
+    (void) umfpack_zl_report_numeric (Numeric, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extract the LU factors of C and print them */
+    /* ---------------------------------------------------------------------- */
+
+    if (umfpack_zl_get_lunz (&lnz, &unz, &nr, &nc, &nzud, Numeric) < 0)
+    {
+	error ("umfpack_zl_get_lunz failed") ;
+    }
+    /* ensure arrays are not of zero size */
+    lnz1 = MAX (lnz,1) ;
+    unz1 = MAX (unz,1) ;
+    Lp = (long *) malloc ((n+1) * sizeof (long)) ;
+    Lj = (long *) malloc (lnz1 * sizeof (long)) ;
+    Lx = (double *) malloc (lnz1 * sizeof (double)) ;
+    Lz = (double *) malloc (lnz1 * sizeof (double)) ;
+    Up = (long *) malloc ((n+1) * sizeof (long)) ;
+    Ui = (long *) malloc (unz1 * sizeof (long)) ;
+    Ux = (double *) malloc (unz1 * sizeof (double)) ;
+    Uz = (double *) malloc (unz1 * sizeof (double)) ;
+    P = (long *) malloc (n * sizeof (long)) ;
+    Q = (long *) malloc (n * sizeof (long)) ;
+    Dx = (double *) NULL ;	/* D vector not requested */
+    Dz = (double *) NULL ;
+    Rs  = (double *) malloc (n * sizeof (double)) ;
+    if (!Lp || !Lj || !Lx || !Lz || !Up || !Ui || !Ux || !Uz || !P || !Q || !Rs)
+    {
+	error ("out of memory") ;
+    }
+    status = umfpack_zl_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz,
+	P, Q, Dx, Dz, &do_recip, Rs, Numeric) ;
+    if (status < 0)
+    {
+	error ("umfpack_zl_get_numeric failed") ;
+    }
+
+    printf ("\nL (lower triangular factor of C): ") ;
+    (void) umfpack_zl_report_matrix (n, n, Lp, Lj, Lx, Lz, 0, Control) ;
+    printf ("\nU (upper triangular factor of C): ") ;
+    (void) umfpack_zl_report_matrix (n, n, Up, Ui, Ux, Uz, 1, Control) ;
+    printf ("\nP: ") ;
+    (void) umfpack_zl_report_perm (n, P, Control) ;
+    printf ("\nQ: ") ;
+    (void) umfpack_zl_report_perm (n, Q, Control) ;
+    printf ("\nScale factors: row i of A is to be ") ;
+    if (do_recip)
+    {
+	printf ("multiplied by the ith scale factor\n") ;
+    }
+    else
+    {
+	printf ("divided by the ith scale factor\n") ;
+    }
+    for (i = 0 ; i < n ; i++) printf ("%ld: %g\n", i, Rs [i]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to triplet form and print it */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that L is in row-form, so it is the row indices that are created */
+    /* by umfpack_zl_col_to_triplet. */
+
+    printf ("\nConverting L to triplet form, and printing it:\n") ;
+    Li = (long *) malloc (lnz1 * sizeof (long)) ;
+    if (!Li)
+    {
+	error ("out of memory") ;
+    }
+    if (umfpack_zl_col_to_triplet (n, Lp, Li) < 0)
+    {
+	error ("umfpack_zl_col_to_triplet failed") ;
+    }
+    printf ("\nL, in triplet form: ") ;
+    (void) umfpack_zl_report_triplet (n, n, lnz, Li, Lj, Lx, Lz, Control) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* save the Numeric object to file, free it, and load it back in */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the default filename, "numeric.umf" */
+    printf ("\nSaving numeric object:\n") ;
+    status = umfpack_zl_save_numeric (Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_save_numeric failed") ;
+    }
+    printf ("\nFreeing numeric object:\n") ;
+    umfpack_zl_free_numeric (&Numeric) ;
+    printf ("\nLoading numeric object:\n") ;
+    status = umfpack_zl_load_numeric (&Numeric, (char *) NULL) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_load_numeric failed") ;
+    }
+    printf ("\nDone loading numeric object\n") ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b */
+    /* ---------------------------------------------------------------------- */
+
+    status = umfpack_zl_solve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info) ;
+    umfpack_zl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_solve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* solve C'x=b again, using umfpack_zl_wsolve instead */
+    /* ---------------------------------------------------------------------- */
+
+    printf ("\nSolving C'x=b again, using umfpack_zl_wsolve instead:\n") ;
+    Wi = (long *) malloc (n * sizeof (long)) ;
+    W = (double *) malloc (10*n * sizeof (double)) ;
+    if (!Wi || !W)
+    {
+	error ("out of memory") ;
+    }
+
+    status = umfpack_zl_wsolve (UMFPACK_At, Cp, Ci, Cx, Cz, x, xz, b, bz,
+	Numeric, Control, Info, Wi, W) ;
+    umfpack_zl_report_info (Control, Info) ;
+    if (status < 0)
+    {
+	umfpack_zl_report_status (Control, status) ;
+	error ("umfpack_zl_wsolve failed") ;
+    }
+    printf ("\nx (solution of C'x=b): ") ;
+    (void) umfpack_zl_report_vector (n, x, xz, Control) ;
+    rnorm = resid (TRUE, Cp, Ci, Cx, Cz) ;
+    printf ("maxnorm of residual: %g\n\n", rnorm) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free everything */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is not strictly required since the process is exiting and the */
+    /* system will reclaim the memory anyway.  It's useful, though, just as */
+    /* a list of what is currently malloc'ed by this program.  Plus, it's */
+    /* always a good habit to explicitly free whatever you malloc. */
+
+    free (Ap) ;
+    free (Ai) ;
+    free (Ax) ;
+    free (Az) ;
+
+    free (Cp) ;
+    free (Ci) ;
+    free (Cx) ;
+    free (Cz) ;
+
+    free (Pinit) ;
+    free (Qinit) ;
+    free (Front_npivcol) ;
+    free (Front_1strow) ;
+    free (Front_leftmostdesc) ;
+    free (Front_parent) ;
+    free (Chain_start) ;
+    free (Chain_maxrows) ;
+    free (Chain_maxcols) ;
+
+    free (Lp) ;
+    free (Lj) ;
+    free (Lx) ;
+    free (Lz) ;
+
+    free (Up) ;
+    free (Ui) ;
+    free (Ux) ;
+    free (Uz) ;
+
+    free (P) ;
+    free (Q) ;
+
+    free (Li) ;
+
+    free (Wi) ;
+    free (W) ;
+
+    umfpack_zl_free_symbolic (&Symbolic) ;
+    umfpack_zl_free_numeric (&Numeric) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the total time spent in this demo */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (t) ;
+    printf ("\numfpack_zl_demo complete.\nTotal time: %5.2f seconds"
+	" (CPU time), %5.2f seconds (wallclock time)\n", t [1], t [0]) ;
+    return (0) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1541 @@
+
+UMFPACK V4.4 (Jan. 28, 2005) demo: _zl_ version
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+
+UMFPACK License:
+
+   Your use or distribution of UMFPACK or any modified version of
+   UMFPACK implies that you agree to this License.
+
+   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+   Permission is hereby granted to use or copy this program, provided
+   that the Copyright, this License, and the Availability of the original
+   version is retained on all copies.  User documentation of any code that
+   uses UMFPACK or any modified version of UMFPACK code must cite the
+   Copyright, this License, the Availability note, and "Used by permission."
+   Permission to modify the code and to distribute modified code is granted,
+   provided the Copyright, this License, and the Availability note are
+   retained, and a notice that the code was modified is included.  This
+   software was developed with support from the National Science Foundation,
+   and is provided to you free of charge.
+
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Control:
+
+    Matrix entry defined as: double complex
+    Int (generic integer) defined as: long
+
+    0: print level: 5
+    1: dense row parameter:    0.2
+        "dense" rows have    > max (16, (0.2)*16*sqrt(n_col) entries)
+    2: dense column parameter: 0.2
+        "dense" columns have > max (16, (0.2)*16*sqrt(n_row) entries)
+    3: pivot tolerance: 0.1
+    4: block size for dense matrix kernels: 32
+    5: strategy: 0 (auto)
+    6: initial allocation ratio: 0.7
+    7: max iterative refinement steps: 2
+    12: 2-by-2 pivot tolerance: 0.01
+    13: Q fixed during numerical factorization: 0 (auto)
+    14: AMD dense row/col parameter:    10
+       "dense" rows/columns have > max (16, (10)*sqrt(n)) entries
+        Only used if the AMD ordering is used.
+    15: diagonal pivot tolerance: 0.001
+        Only used if diagonal pivoting is attempted.
+    16: scaling: 1 (divide each row by sum of abs. values in each row)
+    17: frontal matrix allocation ratio: 0.5
+    18: drop tolerance: 0
+    19: AMD and COLAMD aggressive absorption: 1 (yes)
+
+    The following options can only be changed at compile-time:
+    8: BLAS library used:  none.  UMFPACK will be slow.
+    9: compiled for ANSI C (uses malloc, free, realloc, and printf)
+    10: CPU timer is POSIX times ( ) routine.
+    11: compiled for normal operation (debugging disabled)
+    computer/operating system: Linux
+    size of int: 4 long: 4 Int: 4 pointer: 4 double: 8 Entry: 16 (in bytes)
+
+
+b: dense vector, n = 5. 
+    0 : (8 + 1i)
+    1 : (45 - 5i)
+    2 : (-3 - 2i)
+    3 : (3 + 0i)
+    4 : (19 + 2.2i)
+    dense vector OK
+
+
+A: triplet-form matrix, n_row = 5, n_col = 5 nz = 12. 
+    0 : 0 0  (2 + 1i)
+    1 : 4 4  (1 + 0.4i)
+    2 : 1 0  (3 + 0.1i)
+    3 : 1 2  (4 + 0.2i)
+    4 : 2 1  (-1 - 1i)
+    5 : 2 2  (-3 - 0.2i)
+    6 : 0 1  (3 + 0i)
+    7 : 1 4  (6 + 6i)
+    8 : 2 3  (2 + 3i)
+    9 : 3 2  (1 + 0i)
+    10 : 4 1  (4 + 0.3i)
+    11 : 4 2  (2 + 0.3i)
+    triplet-form matrix OK
+
+
+A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (3 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3 + 0i)
+	row 2 : (-1 - 1i)
+	row 4 : (4 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4 + 0.2i)
+	row 2 : (-3 - 0.2i)
+	row 3 : (1 + 0i)
+	row 4 : (2 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (6 + 6i)
+	row 4 : (1 + 0.4i)
+    column-form matrix OK
+
+
+Symbolic factorization of A: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 84  (MBytes): 0.0
+	estimated peak size (Units):  2542  (MBytes): 0.0
+	estimated final size (Units): 25  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Numeric factorization of A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 99
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.34629e-01
+    max abs. value on diagonal of U:            1.77313e+00
+    reciprocal condition number estimate:       7.59e-02
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.166667)
+    1 : (0.0518135)
+    2 : (0.0980392)
+    3 : (1)
+    4 : (0.125)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.207254 + 0.0103627i)
+	row 3 :  (0.25 + 0.0375i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.379275 - 0.174093i)
+
+    column 3:  length 1.
+	row 4 :  (3.00161 + 1.2864i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.5 + 0.0375i)
+
+    row 2:  length 1.
+	col 4 : (0.5 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.294118 - 0.0196078i)
+	col 4 :  (-0.0980392 - 0.0980392i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.196078 + 0.294118i)
+    1 : (1 + 0i)
+    2 : (0.333333 + 0.166667i)
+    3 : (0.125 + 0.05i)
+    4 : (-1.6422 - 0.668715i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.77e+00
+    estimate of reciprocal of condition number:    7.59e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.23000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.87e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.57000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+
+x (solution of Ax=b): dense vector, n = 5. 
+    0 : (0.121188 - 0.561001i)
+    1 : (2.39887 + 0.666938i)
+    2 : (3 + 0i)
+    3 : (1.57395 - 1.52801i)
+    4 : (2.3876 - 3.04245i)
+    dense vector OK
+
+maxnorm of residual: 6.21725e-15
+
+
+UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+UMFPACK V4.4 (Jan. 28, 2005): OK
+
+determinant: (-1.7814+ (2.3784)i) * 10^(2)
+
+x (solution of Ax=b, solve is split into 3 steps): dense vector, n = 5. 
+    0 : (0.121188 - 0.561001i)
+    1 : (2.39887 + 0.666938i)
+    2 : (3 + 0i)
+    3 : (1.57395 - 1.52801i)
+    4 : (2.3876 - 3.04245i)
+    dense vector OK
+
+maxnorm of residual: 6.21725e-15
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.93000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.77e+00
+    estimate of reciprocal of condition number:    7.59e-02
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  6.06e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of A'x=b): dense vector, n = 5. 
+    0 : (3.39246 + 0.13257i)
+    1 : (0.31463 + 1.38626i)
+    2 : (0.461538 + 0.692308i)
+    3 : (-20.9089 - 1.55801i)
+    4 : (9.04015 - 0.613724i)
+    dense vector OK
+
+maxnorm of residual: 7.68703e-15
+
+
+changing A (1,4) to zero
+
+modified A: column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (3 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (3 + 0i)
+	row 2 : (-1 - 1i)
+	row 4 : (4 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (4 + 0.2i)
+	row 2 : (-3 - 0.2i)
+	row 3 : (1 + 0i)
+	row 4 : (2 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (2 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (0 + 0i)
+	row 4 : (1 + 0.4i)
+    column-form matrix OK
+
+
+Numeric factorization of modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.02000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 97
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  1
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    17
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.34629e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.35e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.166667)
+    1 : (0.136986)
+    2 : (0.0980392)
+    3 : (1)
+    4 : (0.125)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.547945 + 0.0273973i)
+	row 3 :  (0.25 + 0.0375i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (1.00274 - 0.460274i)
+
+    column 3:  length 0.  Start of Lchain.
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.5 + 0.0375i)
+
+    row 2:  length 1.
+	col 4 : (0.5 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (-0.294118 - 0.0196078i)
+	col 4 :  (-0.0980392 - 0.0980392i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.196078 + 0.294118i)
+    1 : (1 + 0i)
+    2 : (0.333333 + 0.166667i)
+    3 : (0.125 + 0.05i)
+    4 : (-0.50137 + 0.230137i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.00000e+00
+    maximum sum (abs (rows of A)):              1.02000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   19    76%
+    Numeric final size (Units)                   106                   98    92%
+    Numeric final size (MBytes)                  0.0                  0.0    92%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          1.70000e+01    25%
+    nz in L (incl diagonal)                       10                    8    80%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   12    80%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.35e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.35e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     8
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.15000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  7.33e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.32000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with modified A): dense vector, n = 5. 
+    0 : (10.9256 - 2.23085i)
+    1 : (-5.36071 - 1.82131i)
+    2 : (3 + 0i)
+    3 : (-1.60191 - 1.88814i)
+    4 : (32.7361 - 2.90097i)
+    dense vector OK
+
+maxnorm of residual: 3.9968e-15
+
+changing real part of A (0,0) from 2 to 2
+changing real part of A (1,0) from 3 to 2
+changing real part of A (0,1) from 3 to 13
+changing real part of A (2,1) from -1 to 7
+changing real part of A (4,1) from 4 to 10
+changing real part of A (1,2) from 4 to 23
+changing real part of A (2,2) from -3 to 15
+changing real part of A (3,2) from 1 to 18
+changing real part of A (4,2) from 2 to 18
+changing real part of A (2,3) from 2 to 30
+changing real part of A (1,4) from 0 to 39
+changing real part of A (4,4) from 1 to 37
+
+completely modified A (same pattern): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 + 1i)
+	row 1 : (2 + 0.1i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (13 + 0i)
+	row 2 : (7 - 1i)
+	row 4 : (10 + 0.3i)
+
+    column 2: start: 5 end: 8 entries: 4
+	row 1 : (23 + 0.2i)
+	row 2 : (15 - 0.2i)
+	row 3 : (18 + 0i)
+	row 4 : (18 + 0.3i)
+
+    column 3: start: 9 end: 9 entries: 1
+	row 2 : (30 + 3i)
+
+    column 4: start: 10 end: 11 entries: 2
+	row 1 : (39 + 0i)
+	row 4 : (37 + 0.4i)
+    column-form matrix OK
+
+
+Saving symbolic object:
+
+Freeing symbolic object:
+
+Loading symbolic object:
+
+Done loading symbolic object
+
+Numeric factorization of completely modified A: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              1.60000e+01
+    maximum sum (abs (rows of A)):              6.60000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 99
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2527
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        4
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        4
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            1.39754e-01
+    max abs. value on diagonal of U:            1.00000e+00
+    reciprocal condition number estimate:       1.40e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.0625)
+    1 : (0.0155521)
+    2 : (0.0177936)
+    3 : (0.0555556)
+    4 : (0.0151515)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 2.
+	row 4 :  (0.357698 + 0.00311042i)
+	row 3 :  (0.272727 + 0.00454545i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.204044 - 0.0895801i)
+
+    column 3:  length 1.
+	row 4 :  (1.0818 - 0.0116951i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.151515 + 0.00454545i)
+
+    row 2:  length 1.
+	col 4 : (0.8125 + 0i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 2.
+	col 1 :  (0.266904 - 0.00355872i)
+	col 4 :  (0.124555 - 0.0177936i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.533808 + 0.0533808i)
+    1 : (1 + 0i)
+    2 : (0.125 + 0.0625i)
+    3 : (0.560606 + 0.00606061i)
+    4 : (-0.329747 + 0.0696386i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              1.60000e+01
+    maximum sum (abs (rows of A)):              6.60000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      84                   79    94%
+        peak size (Units)                       2542                 2527    99%
+        final size (Units)                        25                   21    84%
+    Numeric final size (Units)                   106                  100    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2737                 2722    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                       10                    9    90%
+    nz in U (incl diagonal)                       10                    9    90%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       9
+    nz in U (incl diagonal), if none dropped       9
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               1.40e-01
+    max abs. value on diagonal of U:               1.00e+00
+    estimate of reciprocal of condition number:    1.40e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   5.23000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  4.75e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.57000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (with completely modified A): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.92582e-15
+
+
+C (transpose of A): column-form matrix, n_row 5 n_col 5, nz = 12. 
+
+    column 0: start: 0 end: 1 entries: 2
+	row 0 : (2 - 1i)
+	row 1 : (13 + 0i)
+
+    column 1: start: 2 end: 4 entries: 3
+	row 0 : (2 - 0.1i)
+	row 2 : (23 - 0.2i)
+	row 4 : (39 + 0i)
+
+    column 2: start: 5 end: 7 entries: 3
+	row 1 : (7 + 1i)
+	row 2 : (15 + 0.2i)
+	row 3 : (30 - 3i)
+
+    column 3: start: 8 end: 8 entries: 1
+	row 2 : (18 + 0i)
+
+    column 4: start: 9 end: 11 entries: 3
+	row 1 : (10 - 0.3i)
+	row 2 : (18 - 0.3i)
+	row 4 : (37 - 0.4i)
+    column-form matrix OK
+
+
+Symbolic factorization of C: Symbolic object: 
+    matrix to be factorized:
+	n_row: 5 n_col: 5
+	number of entries: 12
+    block size used for dense matrix kernels:   32
+    strategy used:                              unsymmetric
+    ordering used:                              colamd on A
+
+    performn column etree postorder:            yes
+    prefer diagonal pivoting (attempt P=Q):     no
+    variable-size part of Numeric object:
+	minimum initial size (Units): 85  (MBytes): 0.0
+	estimated peak size (Units):  2543  (MBytes): 0.0
+	estimated final size (Units): 26  (MBytes): 0.0
+    symbolic factorization memory usage (Units): 144  (MBytes): 0.0
+    frontal matrices / supercolumns:
+	number of frontal chains: 1
+	number of frontal matrices: 1
+	largest frontal matrix row dimension: 3
+	largest frontal matrix column dimension: 3
+
+    Frontal chain: 0.  Frontal matrices 0 to 0
+	Largest frontal matrix in Frontal chain: 3-by-3
+	Front: 0  pivot cols: 3 (pivot columns 0 to 2)
+	    pivot row candidates: 2 to 4
+	    leftmost descendant: 0
+	    1st new candidate row : 2
+	    parent: (none)
+
+Initial column permutation, Q1: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Initial row permutation, P1: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 1 
+    4 : 4 
+    permutation vector OK
+
+    Symbolic object:  OK
+
+
+Get the contents of the Symbolic object for C:
+(compare with umfpack_zl_report_symbolic output, above)
+From the Symbolic object, C is of dimension 5-by-5
+   with nz = 12, number of fronts = 1,
+   number of frontal matrix chains = 1
+
+Pivot columns in each front, and parent of each front:
+    Front 0: parent front: -1 number of pivot cols: 3
+        0-th pivot column is column 3 in original matrix
+        1-th pivot column is column 2 in original matrix
+        2-th pivot column is column 0 in original matrix
+
+Note that the column ordering, above, will be refined
+in the numeric factorization below.  The assignment of pivot
+columns to frontal matrices will always remain unchanged.
+
+Total number of pivot columns in frontal matrices: 3
+
+Frontal matrix chains:
+   Frontal matrices 0 to 0 are factorized in a single
+        working array of size 3-by-3
+
+Numeric factorization of C: Numeric object:  
+    n_row: 5  n_col: 5
+    relative pivot tolerance used:              0.1
+    relative symmetric pivot tolerance used:    0.001
+    matrix scaled: yes (divided each row by sum abs value in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+    initial allocation parameter used:          0.7
+    frontal matrix allocation parameter used:   0.5
+    final total size of Numeric object (Units): 100
+    final total size of Numeric object (MBytes): 0.0
+    peak size of variable-size part (Units):    2528
+    peak size of variable-size part (MBytes):   0.0
+    largest actual frontal matrix size:         4
+    memory defragmentations:                    1
+    memory reallocations:                       1
+    costly memory reallocations:                0
+    entries in compressed pattern (L and U):    2
+    number of nonzeros in L (excl diag):        3
+    number of entries stored in L (excl diag):  2
+    number of nonzeros in U (excl diag):        5
+    number of entries stored in U (excl diag):  2
+    factorization floating-point operations:    34
+    number of nonzeros on diagonal of U:        5
+    min abs. value on diagonal of U:            2.40964e-01
+    max abs. value on diagonal of U:            9.13625e-01
+    reciprocal condition number estimate:       2.64e-01
+
+Scale factors applied via multiplication
+Scale factors, Rs: dense vector, n = 5. 
+    0 : (0.196078)
+    1 : (0.0319489)
+    2 : (0.0133869)
+    3 : (0.030303)
+    4 : (0.013089)
+    dense vector OK
+
+
+P: row permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: column permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+L in Numeric object, in column-oriented compressed-pattern form:
+    Diagonal entries are all equal to 1.0 (not stored)
+
+    column 0:  length 0.
+
+    column 1:  length 1.
+	row 4 :  (0.240091 + 0.0591529i)
+
+    column 2:  add 1 entries.  length 1.  Start of Lchain.
+	row 4 :  (0.847284 + 0.423642i)
+
+    column 3:  length 1.
+	row 4 :  (0.659838 - 0.0126577i)
+
+    column 4:  length 0.  Start of Lchain.
+
+
+U in Numeric object, in row-oriented compressed-pattern form:
+    Diagonal is stored separately.
+
+    row 4:  length 0.  End of Uchain.
+
+    row 3:  length 1.  End of Uchain.
+	col 4 : (0.510471 + 0i)
+
+    row 2:  length 1.
+	col 4 : (0.392157 - 0.0196078i)
+
+    row 1:  length 0.  End of Uchain.
+
+    row 1:  length 0.
+
+    row 0:  length 3.
+	col 1 :  (0.200803 + 0.00267738i)
+	col 3 :  (0.240964 - 0.00401606i)
+	col 4 :  (0.307898 - 0.00267738i)
+
+
+diagonal of U: dense vector, n = 5. 
+    0 : (0.240964 + 0i)
+    1 : (0.909091 - 0.0909091i)
+    2 : (0.392157 - 0.196078i)
+    3 : (0.484293 - 0.0052356i)
+    4 : (-0.677403 - 0.143059i)
+    dense vector OK
+
+    Numeric object:  OK
+
+
+L (lower triangular factor of C): row-form matrix, n_row 5 n_col 5, nz = 8. 
+
+    row 0: start: 0 end: 0 entries: 1
+	column 0 : (1 + 0i)
+
+    row 1: start: 1 end: 1 entries: 1
+	column 1 : (1 + 0i)
+
+    row 2: start: 2 end: 2 entries: 1
+	column 2 : (1 + 0i)
+
+    row 3: start: 3 end: 3 entries: 1
+	column 3 : (1 + 0i)
+
+    row 4: start: 4 end: 7 entries: 4
+	column 1 : (0.240091 + 0.0591529i)
+	column 2 : (0.847284 + 0.423642i)
+	column 3 : (0.659838 - 0.0126577i)
+	column 4 : (1 + 0i)
+    row-form matrix OK
+
+
+U (upper triangular factor of C): column-form matrix, n_row 5 n_col 5, nz = 10. 
+
+    column 0: start: 0 end: 0 entries: 1
+	row 0 : (0.240964 + 0i)
+
+    column 1: start: 1 end: 2 entries: 2
+	row 0 : (0.200803 + 0.00267738i)
+	row 1 : (0.909091 - 0.0909091i)
+
+    column 2: start: 3 end: 3 entries: 1
+	row 2 : (0.392157 - 0.196078i)
+
+    column 3: start: 4 end: 5 entries: 2
+	row 0 : (0.240964 - 0.00401606i)
+	row 3 : (0.484293 - 0.0052356i)
+
+    column 4: start: 6 end: 9 entries: 4
+	row 0 : (0.307898 - 0.00267738i)
+	row 2 : (0.392157 - 0.0196078i)
+	row 3 : (0.510471 + 0i)
+	row 4 : (-0.677403 - 0.143059i)
+    column-form matrix OK
+
+
+P: permutation vector, n = 5. 
+    0 : 2 
+    1 : 3 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Q: permutation vector, n = 5. 
+    0 : 3 
+    1 : 2 
+    2 : 0 
+    3 : 4 
+    4 : 1 
+    permutation vector OK
+
+
+Scale factors: row i of A is to be multiplied by the ith scale factor
+0: 0.196078
+1: 0.0319489
+2: 0.0133869
+3: 0.030303
+4: 0.013089
+
+Converting L to triplet form, and printing it:
+
+L, in triplet form: triplet-form matrix, n_row = 5, n_col = 5 nz = 8. 
+    0 : 0 0  (1 + 0i)
+    1 : 1 1  (1 + 0i)
+    2 : 2 2  (1 + 0i)
+    3 : 3 3  (1 + 0i)
+    4 : 4 1  (0.240091 + 0.0591529i)
+    5 : 4 2  (0.847284 + 0.423642i)
+    6 : 4 3  (0.659838 - 0.0126577i)
+    7 : 4 4  (1 + 0i)
+    triplet-form matrix OK
+
+
+Saving numeric object:
+
+Freeing numeric object:
+
+Loading numeric object:
+
+Done loading numeric object
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      85                   80    94%
+        peak size (Units)                       2543                 2528    99%
+        final size (Units)                        26                   22    85%
+    Numeric final size (Units)                   107                  101    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2738                 2723    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.41e-01
+    max abs. value on diagonal of U:               9.14e-01
+    estimate of reciprocal of condition number:    2.64e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  8.89e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.6552e-15
+
+
+Solving C'x=b again, using umfpack_zl_wsolve instead:
+
+UMFPACK V4.4 (Jan. 28, 2005), Info:
+    matrix entry defined as:          double complex
+    Int (generic integer) defined as: long
+    BLAS library used:                none.  UMFPACK will be slow.
+    MATLAB:                           no.
+    CPU timer:                        POSIX times ( ) routine.
+    number of rows in matrix A:       5
+    number of columns in matrix A:    5
+    entries in matrix A:              12
+    memory usage reported in:         8-byte Units
+    size of int:                      4 bytes
+    size of long:                     4 bytes
+    size of pointer:                  4 bytes
+    size of numerical entry:          16 bytes
+
+    strategy used:                    unsymmetric
+    ordering used:                    colamd on A
+    modify Q during factorization:    yes
+    prefer diagonal pivoting:         no
+    pivots with zero Markowitz cost:               2
+    submatrix S after removing zero-cost pivots:
+        number of "dense" rows:                    0
+        number of "dense" columns:                 0
+        number of empty rows:                      0
+        number of empty columns                    0
+        submatrix S square and diagonal preserved
+    pattern of square submatrix S:
+        number rows and columns                    3
+        symmetry of nonzero pattern:               1.000000
+        nz in S+S' (excl. diagonal):               4
+        nz on diagonal of matrix S:                2
+        fraction of nz on diagonal:                0.666667
+    2-by-2 pivoting to place large entries on diagonal:
+        # of small diagonal entries of S:          1
+        # unmatched:                               0
+        symmetry of P2*S:                          0.000000
+        nz in P2*S+(P2*S)' (excl. diag.):          6
+        nz on diagonal of P2*S:                    3
+        fraction of nz on diag of P2*S:            1.000000
+    symbolic factorization defragmentations:       0
+    symbolic memory usage (Units):                 144
+    symbolic memory usage (MBytes):                0.0
+    Symbolic size (Units):                         45
+    Symbolic size (MBytes):                        0
+    symbolic factorization CPU time (sec):         0.00
+    symbolic factorization wallclock time(sec):    0.00
+
+    matrix scaled: yes (divided each row by sum of abs values in each row)
+    minimum sum (abs (rows of A)):              5.10000e+00
+    maximum sum (abs (rows of A)):              7.64000e+01
+
+    symbolic/numeric factorization:      upper bound               actual      %
+    variable-sized part of Numeric object:
+        initial size (Units)                      85                   80    94%
+        peak size (Units)                       2543                 2528    99%
+        final size (Units)                        26                   22    85%
+    Numeric final size (Units)                   107                  101    94%
+    Numeric final size (MBytes)                  0.0                  0.0    94%
+    peak memory usage (Units)                   2738                 2723    99%
+    peak memory usage (MBytes)                   0.0                  0.0    99%
+    numeric factorization flops          6.70000e+01          3.40000e+01    51%
+    nz in L (incl diagonal)                        9                    8    89%
+    nz in U (incl diagonal)                       11                   10    91%
+    nz in L+U (incl diagonal)                     15                   13    87%
+    largest front (# entries)                      9                    4    44%
+    largest # rows in front                        3                    2    67%
+    largest # columns in front                     3                    2    67%
+
+    initial allocation ratio used:                 0.7
+    # of forced updates due to frontal growth:     0
+    nz in L (incl diagonal), if none dropped       8
+    nz in U (incl diagonal), if none dropped       10
+    number of small entries dropped                0
+    nonzeros on diagonal of U:                     5
+    min abs. value on diagonal of U:               2.41e-01
+    max abs. value on diagonal of U:               9.14e-01
+    estimate of reciprocal of condition number:    2.64e-01
+    indices in compressed pattern:                 2
+    numerical values stored in Numeric object:     9
+    numeric factorization defragmentations:        1
+    numeric factorization reallocations:           1
+    costly numeric factorization reallocations:    0
+    numeric factorization CPU time (sec):          0.00
+    numeric factorization wallclock time (sec):    0.00
+    symbolic + numeric CPU time (sec):             0.00
+    symbolic + numeric wall clock time (sec):      0.00
+
+    solve flops:                                   4.80000e+02
+    iterative refinement steps taken:              0
+    iterative refinement steps attempted:          0
+    sparse backward error omega1:                  8.89e-17
+    sparse backward error omega2:                  0.00e+00
+    solve CPU time (sec):                          0.00
+    solve wall clock time (sec):                   0.00
+
+    total symbolic + numeric + solve flops:        5.14000e+02
+    total symbolic + numeric + solve CPU time:     0.00
+    total symbolic+numeric+solve wall clock time:  0.00
+
+
+x (solution of C'x=b): dense vector, n = 5. 
+    0 : (7.56307 - 3.68974i)
+    1 : (-0.831991 + 0.0627998i)
+    2 : (0.166667 + 0i)
+    3 : (-0.00206892 - 0.107735i)
+    4 : (0.658245 + 0.0407649i)
+    dense vector OK
+
+maxnorm of residual: 5.6552e-15
+
+
+umfpack_zl_demo complete.
+Total time:  0.00 seconds (CPU time),  0.01 seconds (wallclock time)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Demo/umfpack_zl_demo.sed	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,7 @@
+/::/d
+1,$s/_xx_/_zl_/g
+1,$s/Int/long/g
+1,$s/WSIZE/10/
+/define ABS/ {
+	s/ABS/ABS(x,z) ((x) >= 0 ? (x) : -(x)) + ((z) >= 0 ? (z) : -(z))/
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,385 @@
+Jan. 28, 2005: v4.4 released
+
+    * bug fix:  when Qinit is provided to umfpack_*_qsymbolic,
+	only the symmetric and unsymmetric strategies are now permitted.
+	The auto and 2-by-2 strategies are not allowed.  In v4.3 and
+	earlier, providing Qinit and requesting the symmetric strategy
+	did not always work (you got the unsymmetric strategy instead).
+	This does not affect umfpack_*_symbolic, which computes its own
+	ordering and can use all 4 strategies (auto, symmetric, unsymmetric,
+	and 2-by-2).
+
+    * umfpack_get_determinant added.
+
+    * packed complex case added for all routines (previously only used in
+	umfpack_report_vector).  This allows arrays of ANSI C/C++ complex
+	type to be passed directly to UMFPACK.
+
+    * added umf_multicomple.c to assist in the compilation of UMFPACK
+	in Microsoft Visual Studio, which does not have the required
+	flexibility of the Unix "make" command.
+
+    * local variable declarations reordered to encourage double-word
+	alignment of double's and Entry's, for better performance.
+
+    * note that with the exception of the behavior when a user-provided
+	ordering is passed to umfpack_*_qsymbolic, versions 4.1 through 4.4
+	have comparable performance (ordering quality, memory usage,
+	and run time).  v4.1 is much better than v4.0 in performance.
+
+Jan. 11, 2005: v4.3.1 released
+
+    * bug fix in umf_solve.  This bug is only the 4th one found in the C
+	versions of UMFPACK to date (Version 3.0 to 4.3.1, from March 2001 to
+	Jan. 2005, excluding workarounds for quirky compilers).  No bugs have
+	been reported in the last Fortran version of UMFPACK (MA38, or UMFPACK
+	V2.2.1) since its release in Jan. 1998.
+
+	In Version 4.3, a bug in umf_solve caused iterative refinement
+	to be disabled when solving A'x=b or A.'x=b after factorizing A.
+	Modified the umfpack mexFunction to factorize A and then solve A'x=b
+	when performing the operation x=b/A (as "umfpack(b,'/',A).  Note that
+	this has no effect on the use of UMFPACK in MATLAB itself, since MATLAB
+	does not use the umfpack mexFunction for x=b/A.  When computing x=b/A,
+	MATLAB factorizes A' and computes x=(A'\b')' instead. The following
+	source code files changed:
+
+	    UMFPACK/MATLAB/umfpackmex.c	 (see above)
+	    UMFPACK/Source/umf_solve.c	 (see source code: 2 lines changed)
+	    UMFPACK/Include/umfpack.h    (version and date changed)
+	    UMFPACK/MATLAB/umfpack_test.m   (new file)
+
+Jan. 16, 2004: v4.3 released.
+
+    * user interface of v4.3 is upwardly-compatible with v4.2 and v4.1.
+	No bugs found in v4.1 (except for one workaround for an old compiler).
+	These changes add features only.
+
+    * Note that v4.0 has a bug in umf_scale_column.c.  The bug was patched
+	in that version on Jan. 12, 2004.  The bug does not appear in v4.1
+	and later.  The bug is thus present in MATLAB 6.5, but it occurs
+	very rarely, fortunately.  It can occur when dividing a nonzero entry
+	in the pivot column by the pivot value results in an underflow.
+
+    * <float.h> added to umfpackmex.c, for DBL_EPSILON.  Some non-standard
+	compilers (Microsoft Visual C++) require this.
+
+    * #pragma added to umf_analyze.c, as a workaround around a bug in an
+	old Intel compiler.
+
+    * mexFunction interface to MATLAB modified.  Call to mexCallMATLAB removed,
+	which can be slow.  In V4.1 it was used only to get MATLAB's
+	spparms ('spumoni') value.
+
+    * The AMD mexFunction was also modified in the same way (v1.1), with
+	the call to mexCallMATLAB removed.  Note that UMFPACK v4.1 through
+	v4.3 can use either AMD v1.0 or AMD v1.1.
+
+    * -DNO_DIVIDE_BY_ZERO option added.  If this non-default option is enabled
+	at compile time, and if the pivot value is zero, then no division
+	occurs (zeros on the diagonal of U are treated as if they were equal
+	to one).  By default, the division by zero does occur.
+
+    * -DNO_TIMER option added.  If this non-default option is enabled at
+	compile time, then no timers (times ( ), clock ( ), getrusage ( ))
+	are used.
+
+V4.2:  A special release for COMSOL, Inc., only (FEMLAB)
+
+    * drop tolerance added.  A few new parameters in the Control array are used,
+	and a few new Info entries.
+
+May 6, 2003:  V4.1 released.
+
+    * No bugs were found in the prior version, Version 4.0.  New features
+	added only.  Major changes throughout the code.  User interface
+	nearly unchanged, however.
+
+    * Version 4.1 is upward-compatible with Version 4.0.  The calling
+	sequence of some user-callable routines in Version 4.0 have changed
+	in this version.  The routines umfpack_*_symbolic, umfpack_*_qsymbolic,
+	umfpack_*_get_symbolic, and umfpack_*_get_numeric have new arguments
+	added to them.  The new arguments are optional.  If you want to use
+	a calling sequence similar to v4.0, simply pass NULL pointers in
+	place of the new arguments.  There are two new timing routines,
+	umfpack_tic and umfpack_toc.  A new user-callable routine, 
+	umfpack_*_scale, has been added.
+
+    *	"auto", "unsymmetric", "symmetric", and "2-by-2" strategies added.
+	The symmetric strategy uses AMD on A+A' as the column preordering,
+	followed by a postorder of the assembly tree of A+A'.  Column ordering
+	refinement is turned off, and diagonal entries are prefered as pivots.
+	V4.0 only had the unsymmetric strategy.  The 2-by-2 strategy does row
+	permutations and attempts to find a zero-free diagonal while at the
+	same time maintaining structural symmetry, and then uses the 
+	symmetric strategy on the permuted matrix.
+
+    * row-scaling added.  The default is to divide each row by the sum of
+	the absolute values of each row.  Other options are no scaling,
+	and to divide each row by the max abs value in each row.
+
+    * Matrices with upper bound memory usage greater than the maximum integer
+	(2GB for 32-bit int's) can now be factorized (assuming the actual
+	memory usage is still less than the maximum integer).  With this change,
+	the UMFPACK_ERROR_problem_too_large error code is no longer returned.
+
+    * The current frontal matrix (Work->Fx) is no longer allocated as a
+	static size, via malloc.  It can grow and shrink, and is allocated
+	from Numeric->Memory.
+
+    * The AMD (Version 1.0) package is now required.  It is available
+	separately.  To compile UMFPACK, it must appear as ../AMD if you are
+	in the main UMFPACK directory.
+
+    * The UMFPACK mexFunction now uses the internal utMalloc, utRealloc,
+	and utFree routines, by default (except on Windows).
+
+    * Three control parameters for modifying relaxed amalgamation removed.
+	These values are now fixed at compile-time.
+
+    * Many new statistics added to Info, and new control parameters added.
+
+    * The umfpack mexFunction now returns permutation matrices for P and Q,
+	not permutation vectors.  It also returns the scale factors as a
+	diagonal matrix.  The factorization is now L*U = P*(R\A)*Q.
+
+    * Option added for controlling the initial allocation of the workspace for
+	the current frontal matrix.
+
+    * pivot tolerance of zero treated differently.  symmetric pivot tolerance
+	added.
+
+    * Makefile and GNUmakefile changed.  umf_* routines with no double or
+	complex values are now compiled just twice (int and long versions)
+	rather than 4 times.
+
+    * New routines added to save and load the Numeric and Symbolic objects
+	to/from binary files.
+
+    * Simple Fortran interface added.
+
+Apr 11, 2002:
+
+    * Version 4.0 released.
+
+    * bug fix:  the Microsoft compiler doesn't handle NaN's properly.
+	utIsNaN, and other ut* routines, added for MathWorks version
+	to handle this properly.
+
+Apr 1, 2002:
+
+    * bug fix:  if a column was all NaN's, then UMFPACK would fail
+	to find a pivot row.  umf_row_search.c and umf_internal.h
+	modified to fix this problem.
+
+Mar 9, 2002:  V4.0beta released
+
+    * Map argument added to umfpack_*_triplet_to_col.  New files
+	(umf_triplet.[ch]) added.
+    * minor changes made so that UMFPACK can be compiled with g++ 
+    * additional error checking added to umfpack_*_numeric, for
+	detecting more changes in pattern (Ap, Ai) since last
+	call to umfpack_*_symbolic
+
+Feb 21, 2002:
+
+    * User Guide explains the Makefile vs. GNUmakefile
+
+    * umf_config.h modified, so that the complex SCSL C-BLAS uses
+	(void *) arguments instead of (scsl_zomplex *).  gcc generates
+	some spurious warnings (cc doesn't complain).  Affects the SGI
+	IRIX only.
+
+    * ported to Compaq Alpha
+
+Feb 20, 2002: V4.0 (alpha) released.
+
+    * V4.0 not yet ported to the Compaq Alpha (V3.2 was ported).
+
+Feb 6 to Feb 19, 2002:
+
+    * Relaxed restrictions on sizes of arrays for umfpack_*_transpose and
+	umfpack_*_triplet_to_col.  Size of "max(n,nz)" now just size nz.
+
+    * workspace for umfpack_*_wsolve increased in size.
+
+    * two user arrays for umfpack_*_get_symbolic increased in size,
+	by 1 (Chain_maxrows, Chain_maxcols).
+
+    * lu_normest.m added.
+
+Jan 18 to Feb 5, 2002:
+
+    * The matrix A can be complex, singular, and/or rectangular.
+	The solve step that uses the LU factors can only handle
+	matrices that are complex or real, singuluar or non-singular, 
+	and *** square ***, however.
+
+    * Estimate of the condition number computed:
+	(min (abs (diag (U))) / (max (abs (diag (U)))))
+
+    * Forward/backsolves can solve with A.' as well as A'.
+
+    * char * arguments removed from user-callable routines to make it
+	easier for Fortran to call UMFPACK.  No Fortran interface is (yet)
+	provided, however.
+
+	The solve codes for umfpack_*_*solve changed to #define'd
+	integers:
+
+	    UMFPACK_A       Ax=b
+	    UMFPACK_At      A'x=b
+	    UMFPACK_Aat     A.'x=b
+	    UMFPACK_Pt_L    P'Lx=b
+	    UMFPACK_L       Lx=b
+	    UMFPACK_Lt_P    L'Px=b
+	    UMFPACK_Lat_P   L.'Px=b
+	    UMFPACK_Lt      L'x=b
+	    UMFPACK_U_Qt    UQ'x=b
+	    UMFPACK_U       Ux=b
+	    UMFPACK_Q_Ut    QU'x=b
+	    UMFPACK_Q_Uat   QU.'x=b
+	    UMFPACK_Ut      U'x=b
+	    UMFPACK_Uat     U.'x=b
+
+	All arguments are now either int, long scalars (pass by value),
+	or int, long, double arrays (pass by reference), or void * pointers
+	(pass by value or reference).  A void * pointer is of size 32 or 64
+	bits on most machines.  There is no need for the caller (C or Fortran)
+	to dereference the void * pointers, so these can be treated as
+	integer*4 or integer*8 in Fortran.  A Fortran interface would have to
+	have all arguments passed by reference.
+
+    * All user-callable routine names changed.  The four sets are now:
+	umfpack_di_*	real (double precision), int's as integers
+	umfpack_dl_*	real (double precision), longs's as integers
+	umfpack_zi_*	real (double precision), int's as integers
+	umfpack_zl_*	real (double precision), longs's as integers
+
+    * Ptree (row preordering) and info on pivotal rows for each front
+	added to Symbolic object (extracted by umfpack_*_get_symbolic).
+	Ptree added as output argument to "umfpack (A, 'symbolic')"
+	mexFunction.
+
+    * umfpack_*_transpose can do A' or A.'
+
+    * umfpack_wsolve.c file removed (now generated from umfpack_solve.c).
+
+    * Can now extract just the diagonal of U with umfpack_*_get_numeric,
+	without having to extract the entire matrix U.
+
+    * UMFPACK_ERROR_singular_matrix (-2) removed.
+
+    * UMFPACK_WARNING_singular_matrix (1) added.
+
+    * Control [UMFPACK_PIVOT_OPTION] removed.  No longer any symmetric
+	pivot option (conflicts with the handling of singular and
+	rectangular matrices).
+
+    * Iterative refinement can do Ax=b, A'x=b, or A.'x=b.
+
+    * Most floating-point operations done in macros, to support the complex
+	versions.
+
+    * Info [UMFPACK_N] is now Info [UMFPACK_NROW]
+
+    * Info [UMFPACK_NCOL], Info [UMFPACK_UDIAG_NZ], Info [UMFPACK_UDIAG_NZ]
+	added.
+
+    * umfpack_* routines with "n" as input now use two arguments,
+	n_row and n_col.
+
+    * umfpack mexFunction now explicitly transposes A for b/A.  It computes
+	it using the array transpose as (A.'\b.').'
+
+January 1, 2002:  UMFPACK Version 3.2 released.  Submitted to ACM Trans.
+	on Mathematical Software.
+
+    * The umfpack mexFunction now returns the Info array when the matrix
+	is singular.  Returned an empty array prior to this change.
+
+    * Renamed variable that conflicted with system library routines
+    	(system and j1).
+
+    * Added a #ifdef MATHWORKS definition, so the built-in UMFPACK routine
+	(in a future release of MATLAB) can use the internal ut* memory
+	allocation routines, ut* assertion routine, and utPrintf.
+
+    * MAX and MIN are not defined if they are already defined.
+
+    * A bug fix in umf_kernel_init (a variable was not properly initialized).
+
+    * Removed unused variables.
+
+October 8, 2001:  UMFPACK Version 3.1 released.
+
+August-October, 2001:
+
+    * added umfpack_btf M-file.
+
+    * modified the BLAS update in the frontal matrix.  If there are only
+	a few pivots in remaining in the current front, then the BLAS3 update
+	is delayed to include pivots in the next front.
+
+    * Removed the special-case handling of dense columns from the numerical
+	factorization (kept it in the colamd preordering).  This improves the
+	performance of UMFPACK on dense matrices by a factor of 5 or so, and
+	simplifies the code.
+
+    * Added a symmetric-preference pivoting option.  The option slightly
+	(but uniformly) improves the ordering when factorizing matrices with
+	symmetric nonzero pattern.  That class of matrix is better handled by
+	the symmetric-pattern multifrontal method (MA41 in the Harwell
+	Subroutine Library), however.
+
+    * Fixed the detection of integer overflow.  The 32-bit version cannot
+	make use of more than 2GB of main memory (use the 64-bit version
+	in that case, instead).  The 32-bit version did not correctly detect
+	when it was trying to factorize too large of a matrix.
+
+May 4, 2001:
+
+    * SGI port extended.  It can now call the SCSL Scientific Library, with
+	64-bit BLAS.  Make.sgi and umf_config.h modified.
+
+April 30, 2001:  UMFPACK Version 3.0 released.  Changes since 3.0Beta release:
+
+    * Long integer version added (umfpack_l_* user-callable routines).
+
+    * Peak memory usage in the numerical factorization reduced by a total of
+	12n integers (8n temporary workspace used during numerical factorization,
+	and 4n for the permanent LU factors which was allocated
+	at the beginning of factorization).
+
+    * Ported to the IBM RS 6000 and Compaq Alpha, with help from Anshul Gupta
+	and Friedrich Grund, respectively.
+
+    * 64-bit version added.  Uses dgemm_64, dgemv_64, and dger_64 in the Sun
+	Performance Library.  64-bit versions with the BLAS might not work on
+	any other platform, because they take int's as their integer input
+	arguments instead of long's.  Unfortunately, the proposed ANSI
+	definition of the C-BLAS also uses int's as input integer arguments.
+	It ought to use long's, or include a version that uses long's, just
+	like the Sun Performance Library BLAS.
+
+    * Additional statistics returned in Info:
+	Info [UMFPACK_SIZE_OF_INT]	sizeof (int)
+	Info [UMFPACK_SIZE_OF_LONG]	sizeof (long)
+	Info [UMFPACK_SIZE_OF_POINTER]	sizeof (void *)
+	Info [UMFPACK_SIZE_OF_ENTRY]	(was Info [UMFPACK_WORD])
+	Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE]	est. front matrix size
+	Info [UMFPACK_MAX_FRONT_SIZE]	actual max frontal matrix size.
+	Contents of Info rearranged.
+
+    * UMFPACK_ERROR_bad_configurution error code replaced with
+	UMFPACK_ERROR_problem_too_large error code.  The "bad configuration"
+	error occured when sizeof (int) < sizeof (size_t).  Now, the int
+	version of UMFPACK can use 32-bit int's and 64-bit pointers, and the
+	long version can use 64-bit long's and 64-bit pointers.  Both versions
+	check to see if the array sizes allocated are larger than what can be
+	accessed by an integer index variable (int or long, depending on the
+	version), and returns UMFPACK_ERROR_problem_too_large if they become
+	too large.
+
+March 15, 2001:  UMFPACK Version 3.0Beta released.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/License	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,53 @@
+UMFPACK Version 4.4 (Jan. 28, 2005), Copyright (c) 2005 by Timothy A.
+Davis.  All Rights Reserved.
+
+UMFPACK License:
+
+    Your use or distribution of UMFPACK or any modified version of
+    UMFPACK implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses UMFPACK or any modified version of UMFPACK code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability:
+
+    http://www.cise.ufl.edu/research/sparse/umfpack
+
+--------------------------------------------------------------------------------
+
+AMD Version 1.1 (Jan. 10, 2004),  Copyright (c) 2004 by Timothy A.
+Davis, Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
+
+AMD License:
+
+    Your use or distribution of AMD or any modified version of
+    AMD implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses AMD or any modified version of AMD code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability:
+
+    http://www.cise.ufl.edu/research/sparse/amd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,56 @@
+#-------------------------------------------------------------------------------
+# UMFPACK Makefile for compiling on Unix systems (for GNU or original make)
+#-------------------------------------------------------------------------------
+
+# UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+# All Rights Reserved.  See ../Doc/License for License.
+
+all: dist
+
+include ../Make/Make.include
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+# Note that UserGuide.tex is created from UserGuide.stex, the files in 
+# the ../Include directory, and the ../Demo/umfpack_simple.c file.
+purge: clean
+	- $(RM) *.aux *.bbl *.blg *.log *.toc
+	- $(RM) UserGuide.tex
+
+#-------------------------------------------------------------------------------
+# Create the User Guide and Quick Start Guide
+#-------------------------------------------------------------------------------
+
+UMFPACK = umfpack_col_to_triplet umfpack_defaults umfpack_free_numeric \
+	umfpack_free_symbolic umfpack_get_numeric umfpack_get_lunz \
+	umfpack_get_determinant \
+	umfpack_get_symbolic 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
+
+UMFPACKW = umfpack_wsolve
+
+USER = $(UMFPACKW) $(UMFPACK)
+
+SRC = $(addprefix ../Include/, $(addsuffix .h,$(USER))) ../Demo/umfpack_simple.c
+
+UserGuide.pdf:  UserGuide.stex UserGuide.sed1 UserGuide.sed2 $(SRC)
+	sed -f UserGuide.sed1 < UserGuide.stex | sed -f UserGuide.sed2 \
+	    | expand -8 > UserGuide.tex
+	pdflatex UserGuide
+	bibtex UserGuide
+	pdflatex UserGuide
+	pdflatex UserGuide
+
+QuickStart.pdf: QuickStart.tex
+	pdflatex QuickStart
+	pdflatex QuickStart
+
+dist:  QuickStart.pdf UserGuide.pdf
+	- $(RM) *.aux *.bbl *.blg *.log *.toc
+	- $(RM) UserGuide.tex
Binary file liboctave/UMFPACK/UMFPACK/Doc/QuickStart.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/QuickStart.tex	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1029 @@
+%-------------------------------------------------------------------------------
+% The QuickStart.tex file.
+%-------------------------------------------------------------------------------
+
+\documentclass[11pt]{article}
+
+\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
+\newcommand{\tr}{^{\sf T}}          % transpose
+
+\topmargin 0in
+\textheight 9in
+\oddsidemargin 0pt
+\evensidemargin 0pt
+\textwidth 6.5in
+
+\begin{document}
+
+\author{Timothy A. Davis \\
+Dept. of Computer and Information Science and Engineering \\
+Univ. of Florida, Gainesville, FL}
+\title{UMFPACK Version 4.4 Quick Start Guide}
+\date{Jan. 28, 2005}
+\maketitle
+
+%-------------------------------------------------------------------------------
+\begin{abstract}
+    UMFPACK is a set of routines for solving unsymmetric sparse linear
+    systems, $\m{Ax}=\m{b}$, using the Unsymmetric-pattern MultiFrontal method
+    and direct sparse LU factorization.  It is written in ANSI/ISO C, with a
+    MATLAB interface.  UMFPACK relies on the Level-3
+    Basic Linear Algebra Subprograms (dense matrix multiply) for its
+    performance.  This code works on Windows and many versions of Unix (Sun
+    Solaris, Red Hat Linux, IBM AIX, SGI IRIX, and Compaq Alpha).
+    This is a ``quick start'' guide for Unix users of the C interface.
+\end{abstract}
+%-------------------------------------------------------------------------------
+
+UMFPACK Version 4.4 (Jan. 28, 2005), Copyright\copyright 2005 by Timothy A.
+Davis.  All Rights Reserved.  Refer to the UMFPACK User Guide
+for the License. See \newline
+http://www.cise.ufl.edu/research/sparse/umfpack
+for the code and full documentation.
+
+%-------------------------------------------------------------------------------
+\section{Overview}
+%-------------------------------------------------------------------------------
+
+UMFPACK is a set of routines for solving systems of linear
+equations, $\m{Ax}=\m{b}$, when $\m{A}$ is sparse and unsymmetric.
+The sparse matrix $\m{A}$ can be square or rectangular, singular
+or non-singular, and real or complex (or any combination).  Only square
+matrices $\m{A}$ can be used to solve $\m{Ax}=\m{b}$ or related systems.
+Rectangular matrices can only be factorized.
+
+UMFPACK Version 4.3 is a built-in routine in MATLAB 7.1, used by the forward and
+backslash operator, and the {\tt lu} routine.  MATLAB 6.5 used Version 4.0.
+The following is a short
+introduction to Unix users of the C interface of UMFPACK.
+
+%-------------------------------------------------------------------------------
+
+The C-callable UMFPACK library consists of 32 user-callable routines and one
+include file.  Twenty-eight of the routines come in four versions, with
+different sizes of integers and for real or complex floating-point numbers.
+This Quick Start Guide assumes you are working with real matrices
+(not complex) and with {\tt int}'s as integers (not {\tt long}'s).
+Refer to the User Guide for information about the complex and
+long integer versions.  The include file {\tt umfpack.h}
+must be included in any C program that uses UMFPACK.
+
+For more details, see:
+{\em A column pre-ordering strategy for the unsymmetric-pattern multifrontal method},
+Davis, T. A.,
+ACM Trans. Math. Software, vol 30. no 2, 2004, pp. 165-195, and
+{\em Algorithm 832:  {UMFPACK}, an unsymmetric-pattern multifrontal method},
+same issue, pp. 196-199.
+
+%-------------------------------------------------------------------------------
+\section{Primary routines, and a simple example}
+%-------------------------------------------------------------------------------
+
+Five primary UMFPACK routines are required to factorize $\m{A}$ or
+solve $\m{Ax}=\m{b}$.  An overview of the primary features of the routines
+is given in Section~\ref{Primary}.
+Additional routines are available for passing a different column ordering
+to UMFPACK, changing default parameters, manipulating sparse matrices,
+getting the LU factors, save and loading the LU factors from a file,
+computing the determinant,
+and reporting results.  See the User Guide for more information.
+
+\begin{itemize}
+\item {\tt umfpack\_di\_symbolic}:
+
+    Pre-orders the columns of $\m{A}$ to reduce fill-in and performs a
+    symbolic analysis.
+    Returns an opaque {\tt Symbolic} object as a {\tt void *}
+    pointer.  The object contains the symbolic analysis and is needed for the
+    numerical factorization.
+
+\item {\tt umfpack\_di\_numeric}:
+
+    Numerically scales and then factorizes a sparse matrix
+    $\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$,
+    where
+    $\m{P}$ and $\m{Q}$ are permutation matrices, $\m{R}$ is a diagonal
+    matrix of scale factors, $\m{L}$ is lower triangular with unit diagonal,
+    and $\m{U}$ is upper triangular.  Requires the
+    symbolic ordering and analysis computed by {\tt umfpack\_di\_symbolic}.
+    Returns an opaque {\tt Numeric} object as a
+    {\tt void *} pointer.  The object contains the numerical factorization and
+    is used by {\tt umfpack\_di\_solve}.
+
+\item {\tt umfpack\_di\_solve}:
+
+    Solves a sparse linear system ($\m{Ax}=\m{b}$, $\m{A}\tr\m{x}=\m{b}$, or
+    systems involving just $\m{L}$ or $\m{U}$), using the numeric factorization
+    computed by {\tt umfpack\_di\_numeric}.
+
+\item {\tt umfpack\_di\_free\_symbolic}:
+
+    Frees the {\tt Symbolic} object created by {\tt umfpack\_di\_symbolic}.
+
+\item {\tt umfpack\_di\_free\_numeric}:
+
+    Frees the {\tt Numeric} object created by {\tt umfpack\_di\_numeric}.
+
+\end{itemize}
+
+The matrix $\m{A}$ is represented in compressed column form, which is
+identical to the sparse matrix representation used by MATLAB.  It consists
+of three arrays, where the matrix is {\tt m}-by-{\tt n},
+with {\tt nz} entries:
+
+{\footnotesize
+\begin{verbatim}
+     int Ap [n+1] ;
+     int Ai [nz] ;
+     double Ax [nz] ;
+\end{verbatim}
+}
+
+All nonzeros are entries, but an entry may be numerically zero.  The row indices
+of entries in column {\tt j} are stored in
+    {\tt Ai[Ap[j]} ... {\tt Ap[j+1]-1]}.
+The corresponding numerical values are stored in
+    {\tt Ax[Ap[j]} ... {\tt Ap[j+1]-1]}.
+
+No duplicate row indices may be present, and the row indices in any given
+column must be sorted in ascending order.  The first entry {\tt Ap[0]} must be
+zero.  The total number of entries in the matrix is thus {\tt nz = Ap[n]}.
+Except for the fact that extra zero entries can be included, there is thus a
+unique compressed column representation of any given matrix $\m{A}$.
+
+Here is a simple main program, {\tt umfpack\_simple.c}, that illustrates the
+basic usage of UMFPACK.
+
+{\footnotesize
+\begin{verbatim}
+    #include <stdio.h>
+    #include "umfpack.h"
+
+    int    n = 5 ;
+    int    Ap [ ] = {0, 2, 5, 9, 10, 12} ;
+    int    Ai [ ] = { 0,  1,  0,   2,  4,  1,  2,  3,   4,  2,  1,  4} ;
+    double Ax [ ] = {2., 3., 3., -1., 4., 4., -3., 1., 2., 2., 6., 1.} ;
+    double b [ ] = {8., 45., -3., 3., 19.} ;
+    double x [5] ;
+
+    int main (void)
+    {
+        double *null = (double *) NULL ;
+        int i ;
+        void *Symbolic, *Numeric ;
+        (void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ;
+        (void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ;
+        umfpack_di_free_symbolic (&Symbolic) ;
+        (void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ;
+        umfpack_di_free_numeric (&Numeric) ;
+        for (i = 0 ; i < n ; i++) printf ("x [%d] = %g\n", i, x [i]) ;
+        return (0) ;
+    }
+\end{verbatim}
+}
+
+The {\tt Ap}, {\tt Ai}, and {\tt Ax} arrays represent the matrix
+\[
+\m{A} = \left[
+\begin{array}{rrrrr}
+ 2 &  3 &  0 &  0 &  0 \\
+ 3 &  0 &  4 &  0 &  6 \\
+ 0 & -1 & -3 &  2 &  0 \\
+ 0 &  0 &  1 &  0 &  0 \\
+ 0 &  4 &  2 &  0 &  1 \\
+\end{array}
+\right].
+\]
+and the solution is $\m{x} = [1 \, 2 \, 3 \, 4 \, 5]\tr$.  The program uses
+default control settings and does not return any statistics about the ordering,
+factorization, or solution ({\tt Control} and {\tt Info} are both
+{\tt (double *) NULL}).
+
+For routines to manipulate a simpler ``triplet-form'' data structure for your
+sparse matrix $\m{A}$, refer to the UMFPACK User Guide.
+
+%-------------------------------------------------------------------------------
+\section{Synopsis of primary C-callable routines}
+\label{Synopsis}
+%-------------------------------------------------------------------------------
+
+The matrix $\m{A}$ is {\tt m}-by-{\tt n} with {\tt nz} entries.
+The optional {\tt umfpack\_di\_defaults} routine loads the default control
+parameters into the {\tt Control} array.  The settings can then be modified
+before passing the array to the other routines.  Refer to Section~\ref{Primary}
+for more details.
+
+{\footnotesize
+\begin{verbatim}
+    #include "umfpack.h"
+    int status, sys, n, m, nz, Ap [n+1], Ai [nz] ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], Ax [nz], X [n], B [n] ;
+    void *Symbolic, *Numeric ;
+
+    status = umfpack_di_symbolic (m, n, Ap, Ai, Ax, &Symbolic, Control, Info) ;
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info) ;
+    status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ;
+    umfpack_di_free_symbolic (&Symbolic) ;
+    umfpack_di_free_numeric (&Numeric) ;
+    umfpack_di_defaults (Control) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\section{Installation}
+\label{Install}
+%-------------------------------------------------------------------------------
+
+You will need to install both UMFPACK v4.4 and AMD v1.1 (or AMD v1.0) to use UMFPACK.
+The {\tt UMFPACK} and {\tt AMD} subdirectories must be placed side-by-side
+within the same parent directory.  AMD is a stand-alone package that
+is required by UMFPACK.  UMFPACK can be compiled without the
+BLAS but your performance will be much less than what it should be.
+
+System-dependent configurations are in the {\tt AMD/Make}
+and {\tt UMFPACK/Make} directories
+(Note that {\tt UMFPACK/Make} is a symbolic link to {\tt AMD/Make}).
+You can edit the {\tt Make.include}
+file in those directories to customize the compilation.  The default
+settings will work on most systems, except that UMFPACK will be compiled so
+that it does not use the BLAS.  Sample configuration files are provided
+for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha.
+
+To compile and install both packages,
+go to the UMFPACK directory and type {\tt make}.  This will compile the
+libraries ({\tt AMD/Lib/libamd.a} and {\tt UMFPACK/Lib/libumfpack.a}).
+A demo of the AMD ordering routine will be compiled and tested in
+the {\tt AMD/Demo} directory, and five demo programs will then be
+compiled and tested in the {\tt UMFPACK/Demo} directory.
+The outputs of these demo programs will then be compared with output
+files in the distribution.  Expect to see a few differences, such as
+residual norms, compile-time control settings, and perhaps memory usage
+differences.  The AMD and MATLAB mexFunctions for
+use in MATLAB will also be compiled.  If you do not have MATLAB,
+type {\tt make lib} instead.
+
+If you compile UMFPACK and AMD and then later change the {\tt Make.include}
+file or your system-specific configuration file such as {\tt Make.linux},
+then you should type {\tt make purge} and then {\tt make} to recompile.
+
+Here are the various parameters that you can control in your
+{\tt Make.include} file:
+
+\begin{itemize}
+\item {\tt CC = } your C compiler, such as {\tt cc}.
+\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed.
+\item {\tt CFLAGS = } optimization flags, such as {\tt -O}.
+\item {\tt CONFIG = } configuration settings, for the BLAS, memory allocation
+    routines, and timing routines.
+\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}.
+\item {\tt RM =} the command to delete a file.
+\item {\tt MV =} the command to rename a file.
+\item {\tt MEX =} the command to compile a MATLAB mexFunction.
+\item {\tt F77 =} the command to compile a Fortran program (optional).
+\item {\tt F77FLAGS =} the Fortran compiler flags (optional).
+\item {\tt F77LIB =} the Fortran libraries (optional).
+\end{itemize}
+
+The {\tt CONFIG} string can include combinations of the following;
+most deal with how the BLAS are called:
+\begin{itemize}
+\item {\tt -DNBLAS} if you do not have any BLAS at all.
+\item {\tt -DCBLAS} if you have the C-BLAS.
+\item {\tt -DNSUNPERF} if you are on Solaris but do not have the Sun
+    Performance Library.
+\item {\tt -DNSCSL} if you on SGI IRIX but do not have the SCSL BLAS library.
+\item {\tt -DLONGBLAS} if your BLAS can take {\tt long} integer input
+    arguments.
+\item Options for controlling how C calls the Fortran BLAS:
+    {\tt -DBLAS\_BY\_VALUE}, {\tt -DBLAS\_NO\_UNDERSCORE},
+    and {\tt -DBLAS\_CHAR\_ARG}.  These are set automatically for Windows,
+    Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and
+    AIX (the IBM RS 6000).
+\item {\tt -DGETRUSAGE} if you have the {\tt getrusage} function.
+\item {\tt -DLP64} if you are compiling in the LP64 model (32 bit {\tt int}'s,
+    64 bit {\tt long}'s, and 64 bit pointers).
+\item {\tt -DNUTIL} if you wish to compile the MATLAB-callable
+    UMFPACK mexFunction with the {\tt mxMalloc}, {\tt mxRealloc}
+    and {\tt mxFree} routines, instead of the undocumented (but
+    superior) {\tt utMalloc}, {\tt utRealloc}, and {\tt utFree}
+    routines.
+\item {\tt -DNPOSIX} if you do not have the POSIX-compliant
+    {\tt sysconf} and {\tt times} routines.
+\item {\tt -DNRECIPROCAL} controls a trade-off between speed and accuracy.
+    This is off by default (speed preferred over accuracy) except when
+    compiling for MATLAB.
+\end{itemize}
+
+When you compile your program that uses the C-callable UMFPACK library,
+you need to add the both {\tt UMFPACK/Lib/libumfpack.a} and
+{\tt AMD/Lib/libamd.a}
+libraries, and you need to tell your compiler to look in the
+directories {\tt UMFPACK/Include} and {\tt AMD/Include} for include
+files.  See {\tt UMFPACK/Demo/Makefile} for an example.
+You do not need to directly include any AMD include files in your
+program, unless you directly call AMD routines.  You only need the
+\begin{verbatim}
+#include "umfpack.h"
+\end{verbatim}
+statement, as described in Section~\ref{Synopsis}.
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{The primary UMFPACK routines}
+\label{Primary}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_di\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+int umfpack_di_symbolic
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+Purpose:
+
+    Given nonzero pattern of a sparse matrix A in column-oriented form,
+    umfpack_di_symbolic performs a column pre-ordering to reduce fill-in
+    (using COLAMD or AMD) and a symbolic factorization.  This is required
+    before the matrix can be numerically factorized with umfpack_di_numeric.
+
+    For the following discussion, let S be the submatrix of A obtained after
+    eliminating all pivots of zero Markowitz cost.  S has dimension
+    (n_row-n1-nempty_row) -by- (n_col-n1-nempty_col), where
+    n1 = Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS],
+    nempty_row = Info [UMFPACK_NEMPTY_ROW] and
+    nempty_col = Info [UMFPACK_NEMPTY_COL].
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int n_row ;         Input argument, not modified.
+    Int n_col ;         Input argument, not modified.
+
+        A is an n_row-by-n_col matrix.  Restriction: n_row > 0 and n_col > 0.
+
+    Int Ap [n_col+1] ;  Input argument, not modified.
+
+        Ap is an integer array of size n_col+1.  On input, it holds the
+        "pointers" for the column form of the sparse matrix A.  Column j of
+        the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)].  The first
+        entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold for all
+        j in the range 0 to n_col-1.  The value nz = Ap [n_col] is thus the
+        total number of entries in the pattern of the matrix A.  nz must be
+        greater than or equal to zero.
+
+    Int Ai [nz] ;       Input argument, not modified, of size nz = Ap [n_col].
+
+        The nonzero pattern (row indices) for column j is stored in
+        Ai [(Ap [j]) ... (Ap [j+1]-1)].  The row indices in a given column j
+        must be in ascending order, and no duplicate row indices may be present.
+        Row indices must be in the range 0 to n_row-1 (the matrix is 0-based).
+
+    double Ax [nz] ;    Optional input argument, not modified.
+
+        The numerical values of the sparse matrix A.  The nonzero pattern (row
+        indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and
+        the corresponding numerical values are stored in
+        Ax [(Ap [j]) ... (Ap [j+1]-1)].  Used only by the 2-by-2 strategy to
+        determine whether entries are "large" or "small".  You do not have to
+        pass the same numerical values to umfpack_di_numeric.  If Ax is not
+        present (a (double *) NULL pointer), then any entry in A is assumed to
+        be "large".
+
+    void **Symbolic ;   Output argument.
+
+        **Symbolic is the address of a (void *) pointer variable in the user's
+        calling routine (see Syntax, above).  On input, the contents of this
+        variable are not defined.  On output, this variable holds a (void *)
+        pointer to the Symbolic object (if successful), or (void *) NULL if
+        a failure occurred.
+
+    double Control [UMFPACK_CONTROL] ;  Input argument, not modified.
+
+        If a (double *) NULL pointer is passed, then the default control
+        settings are used.  Only the primary parameters are listed below:
+
+        Control [UMFPACK_STRATEGY]:  This is the most important control
+            parameter.  It determines what kind of ordering and pivoting
+            strategy that UMFPACK should use.  It is new to Version 4.1
+            There are 4 options:
+
+            UMFPACK_STRATEGY_AUTO:  This is the default.  The input matrix is
+                analyzed to determine how symmetric the nonzero pattern is, and
+                how many entries there are on the diagonal.  It then selects one
+                of the following strategies.  Refer to the User Guide for a
+                description of how the strategy is automatically selected.
+
+            UMFPACK_STRATEGY_UNSYMMETRIC:  Use the unsymmetric strategy.  COLAMD
+                is used to order the columns of A, followed by a postorder of
+                the column elimination tree.  No attempt is made to perform
+                diagonal pivoting.  The column ordering is refined during
+                factorization.  This strategy was the only one provided with
+                UMFPACK V4.0.
+
+                In the numerical factorization, the
+                Control [UMFPACK_SYM_PIVOT_TOLERANCE] parameter is ignored.  A
+                pivot is selected if its magnitude is >=
+                Control [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the
+                largest entry in its column.
+
+            UMFPACK_STRATEGY_SYMMETRIC:  Use the symmetric strategy (new to
+                Version 4.1).  In this method, the approximate minimum degree
+                ordering (AMD) is applied to A+A', followed by a postorder of
+                the elimination tree of A+A'.  UMFPACK attempts to perform
+                diagonal pivoting during numerical factorization.  No refinement
+                of the column preordering is performed during factorization.
+
+                In the numerical factorization, a nonzero entry on the diagonal
+                is selected as the pivot if its magnitude is >= Control
+                [UMFPACK_SYM_PIVOT_TOLERANCE] (default 0.001) times the largest
+                entry in its column.  If this is not acceptable, then an
+                off-diagonal pivot is selected with magnitude >= Control
+                [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the largest entry
+                in its column.
+
+            UMFPACK_STRATEGY_2BY2:  a row permutation P2 is found that places
+                large entries on the diagonal.  The matrix P2*A is then
+                factorized using the symmetric strategy, described above.
+                Refer to the User Guide for more information.
+
+        Control [UMFPACK_2BY2_TOLERANCE]:  a diagonal entry S (k,k) is
+            considered "small" if it is < tol * max (abs (S (:,k))), where S a
+            submatrix of the scaled input matrix, with pivots of zero Markowitz
+            cost removed.
+
+        Control [UMFPACK_SCALE]:  This parameter is new to V4.1.  See
+            umfpack_numeric.h for a description.  Only affects the 2-by-2
+            strategy.  Default: UMFPACK_SCALE_SUM.
+
+    double Info [UMFPACK_INFO] ;        Output argument, not defined on input.
+
+        Contains statistics about the symbolic analysis.  If a (double *) NULL
+        pointer is passed, then no statistics are returned in Info (this is not
+        an error condition).  The entire Info array is cleared (all entries set
+        to -1) and then the following statistics are computed (only the
+        primary statistics are listed):
+
+        Info [UMFPACK_STATUS]: status code.  This is also the return value,
+            whether or not Info is present.
+
+            UMFPACK_OK
+
+                Each column of the input matrix contained row indices
+                in increasing order, with no duplicates.  Only in this case
+                does umfpack_di_symbolic compute a valid symbolic factorization.
+                For the other cases below, no Symbolic object is created
+                (*Symbolic is (void *) NULL).
+
+            UMFPACK_ERROR_n_nonpositive
+
+                n is less than or equal to zero.
+
+            UMFPACK_ERROR_invalid_matrix
+
+                Number of entries in the matrix is negative, Ap [0] is nonzero,
+                a column has a negative number of entries, a row index is out of
+                bounds, or the columns of input matrix were jumbled (unsorted
+                columns or duplicate entries).
+
+            UMFPACK_ERROR_out_of_memory
+
+                Insufficient memory to perform the symbolic analysis.  If the
+                analysis requires more than 2GB of memory and you are using
+                the 32-bit ("int") version of UMFPACK, then you are guaranteed
+                to run out of memory.  Try using the 64-bit version of UMFPACK.
+
+            UMFPACK_ERROR_argument_missing
+
+                One or more required arguments is missing.
+
+            UMFPACK_ERROR_internal_error
+
+                Something very serious went wrong.  This is a bug.
+                Please contact the author (davis@cise.ufl.edu).
+
+        Info [UMFPACK_SIZE_OF_UNIT]:  the number of bytes in a Unit,
+            for memory usage statistics below.
+
+        Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]:  the amount of memory (in Units)
+            required for umfpack_di_symbolic to complete.  This count includes
+            the size of the Symbolic object itself, which is also reported in
+            Info [UMFPACK_SYMBOLIC_SIZE].
+
+        Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]:  an estimate of the final size (in
+            Units) of the entire Numeric object (both fixed-size and variable-
+            sized parts), which holds the LU factorization (including the L, U,
+            P and Q matrices).
+
+        Info [UMFPACK_PEAK_MEMORY_ESTIMATE]:  an estimate of the total amount of
+            memory (in Units) required by umfpack_di_symbolic and
+            umfpack_di_numeric to perform both the symbolic and numeric
+            factorization.  This is the larger of the amount of memory needed
+            in umfpack_di_numeric itself, and the amount of memory needed in
+            umfpack_di_symbolic (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]).  The
+            count includes the size of both the Symbolic and Numeric objects
+            themselves.  It can be a very loose upper bound, particularly when
+            the symmetric or 2-by-2 strategies are used.
+
+        Info [UMFPACK_FLOPS_ESTIMATE]:  an estimate of the total floating-point
+            operations required to factorize the matrix.  This is a "true"
+            theoretical estimate of the number of flops that would be performed
+            by a flop-parsimonious sparse LU algorithm.  It assumes that no
+            extra flops are performed except for what is strictly required to
+            compute the LU factorization.  It ignores, for example, the flops
+            performed by umfpack_di_numeric to add contribution blocks of
+            frontal matrices together.  If L and U are the upper bound on the
+            pattern of the factors, then this flop count estimate can be
+            represented in MATLAB (for real matrices, not complex) as:
+
+                Lnz = full (sum (spones (L))) - 1 ;     % nz in each col of L
+                Unz = full (sum (spones (U')))' - 1 ;   % nz in each row of U
+                flops = 2*Lnz*Unz + sum (Lnz) ;
+
+            The actual "true flop" count found by umfpack_di_numeric will be
+            less than this estimate.
+
+        Info [UMFPACK_LNZ_ESTIMATE]:  an estimate of the number of nonzeros in
+            L, including the diagonal.  Since L is unit-diagonal, the diagonal
+            of L is not stored.  This estimate is a strict upper bound on the
+            actual nonzeros in L to be computed by umfpack_di_numeric.
+
+        Info [UMFPACK_UNZ_ESTIMATE]:  an estimate of the number of nonzeros in
+            U, including the diagonal.  This estimate is a strict upper bound on
+            the actual nonzeros in U to be computed by umfpack_di_numeric.
+
+        Info [UMFPACK_SYMBOLIC_TIME]:  The CPU time taken, in seconds.
+
+        Info [UMFPACK_STRATEGY_USED]: The ordering strategy used:
+            UMFPACK_STRATEGY_SYMMETRIC, UMFPACK_STRATEGY_UNSYMMETRIC, or
+            UMFPACK_STRATEGY_2BY2.
+\end{verbatim}
+}
+
+
+%-------------------------------------------------------------------------------
+\newpage
+\subsection{umfpack\_di\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+int umfpack_di_numeric
+(
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    void *Symbolic,
+    void **Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+Purpose:
+
+    Given a sparse matrix A in column-oriented form, and a symbolic analysis
+    computed by umfpack_di_symbolic, the umfpack_di_numeric routine performs the
+    numerical factorization, PAQ=LU, PRAQ=LU, or P(R\A)Q=LU, where P and Q are
+    permutation matrices (represented as permutation vectors), R is the row
+    scaling, L is unit-lower triangular, and U is upper triangular.  This is
+    required before the system Ax=b (or other related linear systems) can be
+    solved.  umfpack_di_numeric can be called multiple times for each call to
+    umfpack_di_symbolic, to factorize a sequence of matrices with identical
+    nonzero pattern.  Simply compute the Symbolic object once, with
+    umfpack_di_symbolic, and reuse it for subsequent matrices.
+    umfpack_di_numeric safely detects if the pattern changes, and sets an
+    appropriate error code.
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int Ap [n_col+1] ;  Input argument, not modified.
+
+        This must be identical to the Ap array passed to umfpack_di_symbolic.
+        The value of n_col is what was passed to umfpack_di_symbolic (this is
+        held in the Symbolic object).
+
+    Int Ai [nz] ;       Input argument, not modified, of size nz = Ap [n_col].
+
+        This must be identical to the Ai array passed to umfpack_di_symbolic.
+
+    double Ax [nz] ;    Input argument, not modified, of size nz = Ap [n_col].
+
+        The numerical values of the sparse matrix A.  The nonzero pattern (row
+        indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and
+        the corresponding numerical values are stored in
+        Ax [(Ap [j]) ... (Ap [j+1]-1)].
+
+    void *Symbolic ;    Input argument, not modified.
+
+        The Symbolic object, which holds the symbolic factorization computed by
+        umfpack_di_symbolic.  The Symbolic object is not modified by
+        umfpack_di_numeric.
+
+    void **Numeric ;    Output argument.
+
+        **Numeric is the address of a (void *) pointer variable in the user's
+        calling routine (see Syntax, above).  On input, the contents of this
+        variable are not defined.  On output, this variable holds a (void *)
+        pointer to the Numeric object (if successful), or (void *) NULL if
+        a failure occurred.
+
+    double Control [UMFPACK_CONTROL] ;   Input argument, not modified.
+
+        If a (double *) NULL pointer is passed, then the default control
+        settings are used.  Only the primary parameters are listed below:
+
+        Control [UMFPACK_PIVOT_TOLERANCE]:  relative pivot tolerance for
+            threshold partial pivoting with row interchanges.  In any given
+            column, an entry is numerically acceptable if its absolute value is
+            greater than or equal to Control [UMFPACK_PIVOT_TOLERANCE] times
+            the largest absolute value in the column.  A value of 1.0 gives true
+            partial pivoting.  If less than or equal to zero, then any nonzero
+            entry is numerically acceptable as a pivot (this is changed from
+            Version 4.0).  Default: 0.1.
+
+            Smaller values tend to lead to sparser LU factors, but the solution
+            to the linear system can become inaccurate.  Larger values can lead
+            to a more accurate solution (but not always), and usually an
+            increase in the total work.
+
+        Control [UMFPACK_SYM_PIVOT_TOLERANCE]:  This parameter is new to V4.1.
+            If diagonal pivoting is attempted (the symmetric or symmetric-2by2
+            strategies are used) then this parameter is used to control when the
+            diagonal entry is selected in a given pivot column.  The absolute
+            value of the entry must be >= Control [UMFPACK_SYM_PIVOT_TOLERANCE]
+            times the largest absolute value in the column.  A value of zero
+            will ensure that no off-diagonal pivoting is performed, except that
+            zero diagonal entries are not selected if there are any off-diagonal
+            nonzero entries.
+
+            If an off-diagonal pivot is selected, an attempt is made to restore
+            symmetry later on.  Suppose A (i,j) is selected, where i != j.
+            If column i has not yet been selected as a pivot column, then
+            the entry A (j,i) is redefined as a "diagonal" entry, except that
+            the tighter tolerance (Control [UMFPACK_PIVOT_TOLERANCE]) is
+            applied.  This strategy has an effect similar to 2-by-2 pivoting
+            for symmetric indefinite matrices.  If a 2-by-2 block pivot with
+            nonzero structure
+
+                       i j
+                    i: 0 x
+                    j: x 0
+
+            is selected in a symmetric indefinite factorization method, the
+            2-by-2 block is inverted and a rank-2 update is applied.  In
+            UMFPACK, this 2-by-2 block would be reordered as
+
+                       j i
+                    i: x 0
+                    j: 0 x
+
+            In both cases, the symmetry of the Schur complement is preserved.
+
+        Control [UMFPACK_SCALE]:  This parameter is new to V4.1.  Version 4.0
+            did not scale the matrix.  Note that the user's input matrix is
+            never modified, only an internal copy is scaled.
+
+            There are three valid settings for this parameter.  If any other
+            value is provided, the default is used.
+
+            UMFPACK_SCALE_NONE:  no scaling is performed.
+
+            UMFPACK_SCALE_SUM:  each row of the input matrix A is divided by
+                the sum of the absolute values of the entries in that row.
+                The scaled matrix has an infinity norm of 1.
+
+            UMFPACK_SCALE_MAX:  each row of the input matrix A is divided by
+                the maximum the absolute values of the entries in that row.
+                In the scaled matrix the largest entry in each row has
+                a magnitude exactly equal to 1.
+
+            Scaling is very important for the "symmetric" strategy when
+            diagonal pivoting is attempted.  It also improves the performance
+            of the "unsymmetric" strategy.
+
+            Default: UMFPACK_SCALE_SUM.
+
+    double Info [UMFPACK_INFO] ;        Output argument.
+
+        Contains statistics about the numeric factorization.  If a
+        (double *) NULL pointer is passed, then no statistics are returned in
+        Info (this is not an error condition).  The following statistics are
+        computed in umfpack_di_numeric (only the primary statistics are listed):
+
+        Info [UMFPACK_STATUS]: status code.  This is also the return value,
+            whether or not Info is present.
+
+            UMFPACK_OK
+
+                Numeric factorization was successful.  umfpack_di_numeric
+                computed a valid numeric factorization.
+
+            UMFPACK_WARNING_singular_matrix
+
+                Numeric factorization was successful, but the matrix is
+                singular.  umfpack_di_numeric computed a valid numeric
+                factorization, but you will get a divide by zero in
+                umfpack_di_solve.  For the other cases below, no Numeric object
+                is created (*Numeric is (void *) NULL).
+
+            UMFPACK_ERROR_out_of_memory
+
+                Insufficient memory to complete the numeric factorization.
+
+            UMFPACK_ERROR_argument_missing
+
+                One or more required arguments are missing.
+
+            UMFPACK_ERROR_invalid_Symbolic_object
+
+                Symbolic object provided as input is invalid.
+
+            UMFPACK_ERROR_different_pattern
+
+                The pattern (Ap and/or Ai) has changed since the call to
+                umfpack_di_symbolic which produced the Symbolic object.
+
+        Info [UMFPACK_NUMERIC_SIZE]:  the actual final size (in Units) of the
+            entire Numeric object, including the final size of the variable
+            part of the object.  Info [UMFPACK_NUMERIC_SIZE_ESTIMATE],
+            an estimate, was computed by umfpack_di_symbolic.  The estimate is
+            normally an upper bound on the actual final size, but this is not
+            guaranteed.
+
+        Info [UMFPACK_PEAK_MEMORY]:  the actual peak memory usage (in Units) of
+            both umfpack_di_symbolic and umfpack_di_numeric.  An estimate,
+            Info [UMFPACK_PEAK_MEMORY_ESTIMATE], was computed by
+            umfpack_di_symbolic.  The estimate is normally an upper bound on the
+            actual peak usage, but this is not guaranteed.  With testing on
+            hundreds of matrix arising in real applications, I have never
+            observed a matrix where this estimate or the Numeric size estimate
+            was less than the actual result, but this is theoretically possible.
+            Please send me one if you find such a matrix.
+
+        Info [UMFPACK_FLOPS]:  the actual count of the (useful) floating-point
+            operations performed.  An estimate, Info [UMFPACK_FLOPS_ESTIMATE],
+            was computed by umfpack_di_symbolic.  The estimate is guaranteed to
+            be an upper bound on this flop count.  The flop count excludes
+            "useless" flops on zero values, flops performed during the pivot
+            search (for tentative updates and assembly of candidate columns),
+            and flops performed to add frontal matrices together.
+
+        Info [UMFPACK_LNZ]: the actual nonzero entries in final factor L,
+            including the diagonal.  This excludes any zero entries in L,
+            although some of these are stored in the Numeric object.  The
+            Info [UMFPACK_LU_ENTRIES] statistic does account for all
+            explicitly stored zeros, however.  Info [UMFPACK_LNZ_ESTIMATE],
+            an estimate, was computed by umfpack_di_symbolic.  The estimate is
+            guaranteed to be an upper bound on Info [UMFPACK_LNZ].
+
+        Info [UMFPACK_UNZ]: the actual nonzero entries in final factor U,
+            including the diagonal.  This excludes any zero entries in U,
+            although some of these are stored in the Numeric object.  The
+            Info [UMFPACK_LU_ENTRIES] statistic does account for all
+            explicitly stored zeros, however.  Info [UMFPACK_UNZ_ESTIMATE],
+            an estimate, was computed by umfpack_di_symbolic.  The estimate is
+            guaranteed to be an upper bound on Info [UMFPACK_UNZ].
+
+        Info [UMFPACK_NUMERIC_TIME]:  The CPU time taken, in seconds.
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\subsection{umfpack\_di\_solve}
+
+{\footnotesize
+\begin{verbatim}
+int umfpack_di_solve
+(
+    int sys,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    double X [ ],
+    const double B [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+Purpose:
+
+    Given LU factors computed by umfpack_di_numeric (PAQ=LU, PRAQ=LU, or
+    P(R\A)Q=LU) and the right-hand-side, B, solve a linear system for the
+    solution X.  Iterative refinement is optionally performed.  Only square
+    systems are handled.  Singular matrices result in a divide-by-zero for all
+    systems except those involving just the matrix L.  Iterative refinement is
+    not performed for singular matrices.
+
+    In the discussion below, n is equal to n_row and n_col, because only
+    square systems are handled.
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int sys ;           Input argument, not modified.
+
+        Defines which system to solve.  (') is the linear algebraic transpose.
+
+            sys value       system solved
+
+            UMFPACK_A       Ax=b
+            UMFPACK_At      A'x=b
+            UMFPACK_Pt_L    P'Lx=b
+            UMFPACK_L       Lx=b
+            UMFPACK_Lt_P    L'Px=b
+            UMFPACK_Lt      L'x=b
+            UMFPACK_U_Qt    UQ'x=b
+            UMFPACK_U       Ux=b
+            UMFPACK_Q_Ut    QU'x=b
+            UMFPACK_Ut      U'x=b
+
+        Iterative refinement can be optionally performed when sys is any of
+        the following:
+
+            UMFPACK_A       Ax=b
+            UMFPACK_At      A'x=b
+
+        For the other values of the sys argument, iterative refinement is not
+        performed (Control [UMFPACK_IRSTEP], Ap, Ai, and Ax are ignored).
+
+    Int Ap [n+1] ;      Input argument, not modified.
+    Int Ai [nz] ;       Input argument, not modified.
+    double Ax [nz] ;    Input argument, not modified.
+
+        If iterative refinement is requested (Control [UMFPACK_IRSTEP] >= 1,
+        Ax=b or A'x=b is being solved, and A is nonsingular), then
+        these arrays must be identical to the same ones passed to
+        umfpack_di_numeric.  The umfpack_di_solve routine does not check the
+        contents of these arguments, so the results are undefined if Ap, Ai, Ax,
+        are modified between the calls the umfpack_di_numeric and
+        umfpack_di_solve.  These three arrays do not need to be present (NULL
+        pointers can be passed) if Control [UMFPACK_IRSTEP] is zero, or if a
+        system other than Ax=b or A'x=b is being solved, or if A is
+        singular, since in each of these cases A is not accessed.
+
+    double X [n] ;      Output argument.
+
+        The solution to the linear system, where n = n_row = n_col is the
+        dimension of the matrices A, L, and U.
+
+    double B [n] ;      Input argument, not modified.
+
+        The right-hand side vector, b, stored as a conventional array of size n
+        (or two arrays of size n for complex versions).  This routine does not
+        solve for multiple right-hand-sides, nor does it allow b to be stored in
+        a sparse-column form.
+
+    void *Numeric ;             Input argument, not modified.
+
+        Numeric must point to a valid Numeric object, computed by
+        umfpack_di_numeric.
+
+    double Control [UMFPACK_CONTROL] ;  Input argument, not modified.
+
+        If a (double *) NULL pointer is passed, then the default control
+        settings are used.
+
+        Control [UMFPACK_IRSTEP]:  The maximum number of iterative refinement
+            steps to attempt.  A value less than zero is treated as zero.  If
+            less than 1, or if Ax=b or A'x=b is not being solved, or
+            if A is singular, then the Ap, Ai, and Ax arguments are not
+            accessed.  Default: 2.
+
+    double Info [UMFPACK_INFO] ;        Output argument.
+
+        Contains statistics about the solution factorization.  If a
+        (double *) NULL pointer is passed, then no statistics are returned in
+        Info (this is not an error condition).  The following statistics are
+        computed in umfpack_di_solve (only the primary statistics are listed):
+
+        Info [UMFPACK_STATUS]: status code.  This is also the return value,
+            whether or not Info is present.
+
+            UMFPACK_OK
+
+                The linear system was successfully solved.
+
+            UMFPACK_WARNING_singular_matrix
+
+                A divide-by-zero occurred.  Your solution will contain Inf's
+                and/or NaN's.  Some parts of the solution may be valid.  For
+                example, solving Ax=b with
+
+                A = [2 0]  b = [ 1 ]  returns x = [ 0.5 ]
+                    [0 0]      [ 0 ]              [ Inf ]
+
+            UMFPACK_ERROR_out_of_memory
+
+                Insufficient memory to solve the linear system.
+
+            UMFPACK_ERROR_argument_missing
+
+                One or more required arguments are missing.  The B and X
+                arguments are always required.  Info and Control are not
+                required.  Ap, Ai and Ax are required if Ax=b or
+                A'x=b is to be solved, the (default) iterative
+                refinement is requested, and the matrix A is nonsingular.
+
+            UMFPACK_ERROR_invalid_system
+
+                The sys argument is not valid, or the matrix A is not square.
+
+            UMFPACK_ERROR_invalid_Numeric_object
+
+                The Numeric object is not valid.
+
+        Info [UMFPACK_SOLVE_FLOPS]:  the number of floating point operations
+            performed to solve the linear system.  This includes the work
+            taken for all iterative refinement steps, including the backtrack
+            (if any).
+
+        Info [UMFPACK_SOLVE_TIME]:  The time taken, in seconds.
+\end{verbatim}
+}
+
+
+%-------------------------------------------------------------------------------
+\newpage
+
+\subsection{umfpack\_di\_free\_symbolic}
+{\footnotesize
+\begin{verbatim}
+void umfpack_di_free_symbolic
+(
+    void **Symbolic
+) ;
+
+Purpose:
+
+    Deallocates the Symbolic object and sets the Symbolic handle to NULL.
+
+Arguments:
+
+    void **Symbolic ;           Input argument, deallocated and Symbolic is
+                                set to (void *) NULL on output.
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{umfpack\_di\_free\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+void umfpack_di_free_numeric
+(
+    void **Numeric
+) ;
+
+Purpose:
+
+    Deallocates the Numeric object and sets the Numeric handle to NULL.
+
+Arguments:
+
+    void **Numeric ;            Input argument, deallocated and Numeric is
+                                set to (void *) NULL on output.
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{umfpack\_di\_defaults}
+
+{\footnotesize
+\begin{verbatim}
+void umfpack_di_defaults
+(
+    double Control [UMFPACK_CONTROL]
+) ;
+
+Purpose:
+
+    Sets the default control parameter settings.
+
+Arguments:
+
+    double Control [UMFPACK_CONTROL] ;  Output argument.
+
+        Control is set to the default control parameter settings.
+\end{verbatim}
+}
+\end{document}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.bib	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,322 @@
+@string{TOMS = "ACM Trans. Math. Softw."}
+@string{SIMAX = "SIAM J. Matrix Anal. Applic."}
+@string{SINUM = "SIAM J. Numer. Anal."}
+@string{SIAMJSC = "SIAM J. Sci. Comput."}
+@string{SIAMJSSC = "SIAM J. Sci. Statist. Comput."}
+@string{IJNME = "Internat. J. Numer. Methods Eng."}
+@string{SIAMJADM = "SIAM J. Alg. Disc. Meth."}
+
+@article{AmestoyDavisDuff96,
+	author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.},
+	title={An approximate minimum degree ordering algorithm},
+	journal=SIMAX,
+	year={1996}
+	,volume={17}
+	,number={4}
+	,pages={886-905}}
+
+@article{AmestoyDavisDuff03,
+	author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.},
+	title={Algorithm 837: {AMD}, an approximate minimum degree ordering algorithm},
+	journal=TOMS,
+	year={2004}
+	,volume={30}
+	,number={3}
+	,pages={381-388}}
+
+@techreport{AmestoyDavisDuff03_user,
+	author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.},
+	title={{AMD} Version 1.0 User Guide},
+	institution={CISE Dept., Univ. of Florida},
+	year={2003}
+	,number={TR-03-011}
+	,address={Gainesville, FL}
+	,note={www.cise.ufl.edu/tech-reports.}
+	}
+
+@article{Davis03,
+	author={Davis, T. A.},
+	title={A column pre-ordering strategy for the unsymmetric-pattern multifrontal method},
+	journal=TOMS,
+	year={2004}
+	,volume={30}
+	,number={2}
+	,pages={165-195}}
+
+@article{Davis03_algo,
+	author={Davis, T. A.},
+	title={Algorithm 832:  {UMFPACK}, an unsymmetric-pattern multifrontal method},
+	journal=TOMS,
+	year={2004}
+	,volume={30}
+	,number={2}
+	,pages={196-199}}
+
+@techreport{Davis03_umf,
+	author={Davis, T. A.},
+	title={{UMFPACK} Version 4.4 User Guide},
+	institution={Univ. of Florida, CISE Dept.},
+	year={2004}
+	,number={TR-04-003}
+	,address={Gainesville, FL}
+	,note={(www.cise.ufl.edu/tech-reports)}
+	}
+
+@techreport{Davis03_umfquick,
+	author={Davis, T. A.},
+	title={{UMFPACK} Version 4.4 Quick Start Guide},
+	institution={Univ. of Florida, CISE Dept.},
+	year={2004}
+	,number={TR-04-005}
+	,address={Gainesville, FL}
+	,note={(www.cise.ufl.edu/tech-reports)}
+	}
+
+@article{DavisDuff97,
+	author={Davis, T. A. and Duff, I. S.},
+	title={An unsymmetric-pattern multifrontal method for sparse {LU} factorization},
+	journal=SIMAX,
+	year={1997}
+	,volume={18}
+	,number={1}
+	,pages={140-158}}
+
+@article{DavisDuff99,
+	author={Davis, T. A. and Duff, I. S.},
+	title={A combined unifrontal/multifrontal method for unsymmetric sparse matrices},
+	journal=TOMS,
+	volume={25},
+	number={1},
+	pages={1-19},
+	year={1999}}
+
+@article{SuperLU99,
+	author={Demmel, J. W. and Eisenstat, S. C. and Gilbert, J. R. and Li, X. S. and Liu, J. W. H.},
+	title={A supernodal approach to sparse partial pivoting},
+	journal=SIMAX,
+	year={1999}
+	,volume={20}
+	,number={3}
+	,pages={720-755}
+	,note={www.netlib.org}
+	}
+
+@article{ACM679a,
+	author={Dongarra, J. J. and Du Croz, J. and Duff, I. S. and Hammarling, S.},
+	title={A set of level-3 basic linear algebra subprograms},
+	journal=TOMS,
+	year={1990}
+	,volume={16}
+	,number={1}
+	,pages={1--17}}
+
+@article{netlib,
+	author={Dongarra, J. J. and Grosse, E.},
+	title={Distribution of mathematical software via electronic mail},
+	journal={Comm. ACM},
+	year={1987}
+	,volume={30}
+	,pages={403-407}
+	,note={www.netlib.org}
+	}
+
+@article{Duff78b,
+	author={Duff, I. S. and Reid, J. K.},
+	year={1978},
+	title={Algorithm 529: Permutations to Block Triangular Form},
+	journal=TOMS,
+	volume={4},
+	annote={f},
+	number={2},
+	pages={189-192},
+	keywords={102 ordering block triangular form}}
+
+@article{Duff81b,
+	author={Duff, I. S.},
+	year={1981},
+	title={Algorithm 575: Permutations for a Zero-Free Diagonal},
+	journal=TOMS,
+	annote={f},
+	volume={7},
+	pages={387-390},
+	keywords={ordering, zero-free diagonal}}
+
+@techreport{GotoVandeGeijn02,
+	author = {Goto, K. and van de Geijn, R.},
+	title = {On Reducing {TLB} Misses in Matrix Multiplication, {FLAME} Working Note 9},
+	institution={The University of Texas at Austin, Department of Computer Sciences},
+	number={TR-2002-55},
+	month={Nov.},
+	year={2002}}
+
+@article{GeorgeNg85,
+	author={George, A. and Ng, E. G.},
+	year={1985},
+	title={An Implementation of {G}aussian Elimination with
+		Partial Pivoting for Sparse Systems},
+	journal=SIAMJSSC,
+	volume={6},
+	number={2},
+	pages={390-409}}
+
+@article{GeorgeNg87,
+	author={George, A. and Ng, E. G.},
+	year={1987},
+	title={Symbolic Factorization for Sparse {G}aussian Elimination
+		with Partial Pivoting},
+	journal={SIAM J. Sci. Statist. Comput.},
+	volume={8},
+	number={6},
+	pages={877-898}}
+
+@article{GilbertMolerSchreiber,
+	author={Gilbert, J. R. and Moler, C. and Schreiber, R.},
+	title={Sparse matrices in {MATLAB}:  design and implementation},
+	journal=SIMAX,
+	year={1992}
+	,volume={13}
+	,number={1}
+	,pages={333-356}}
+
+@article{GilbertPeierls88,
+	author={Gilbert, J. R. and Peierls, T.},
+	year={1988},
+	title={Sparse Partial Pivoting in Time Proportional to Arithmetic Operations},
+	journal={SIAM J. Sci. Statist. Comput.},
+	volume={9},
+	pages={862-874}}
+
+@article{Gustavson78,
+	author={Gustavson, F. G.},
+	year={1978},
+	title={Two Fast Algorithms for Sparse Matrices: Multiplication and Permuted Transposition},
+	journal=TOMS,
+	volume={4},
+	number={3},
+	pages={250-269}}
+
+@techreport{Larimore98,
+	author={Larimore, S. I.},
+	title={An approximate minimum degree column ordering algorithm},
+	institution={Univ. of Florida, CISE Dept.},
+	year={1998}
+	,number={TR-98-016}
+	,address={Gainesville, FL}
+	,note={www.cise.ufl.edu/tech-reports}}
+
+@article{DavisGilbertLarimoreNg00,
+	author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.},
+	title={A column approximate minimum degree ordering algorithm},
+	journal=TOMS,
+	year={2004}
+	,volume={30}
+	,number={3}
+	,pages={353-376}}
+
+@article{DavisGilbertLarimoreNg00_algo,
+	author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.},
+	title={Algorithm 836:  {COLAMD}, a column approximate minimum degree ordering algorithm},
+	journal=TOMS,
+	year={2004}
+	,volume={30}
+	,number={3}
+	,pages={377-380}}
+
+@INCOLLECTION{GilbertNg93,
+  author = {J. R. Gilbert and E. G. Ng},
+  editor = {A. George and J. R. Gilbert and J. W.H. Liu},
+  year = 1993,
+  title = {Predicting Structure in Nonsymmetric Sparse Matrix Factorizations},
+  booktitle = {Graph Theory and Sparse Matrix Computation},
+  series = {Volume 56 of the {IMA} Volumes in Mathematics and its Applications},
+  pages = {107-139},
+  publisher = {Springer-Verlag}
+}
+
+
+@techreport{ATLAS,
+	author={Whaley, R. C and Petitet, A. and Dongarra, J. J.},
+	title={Automated Emperical Optimization of Software and the {ATLAS} Project},
+	institution={Computer Science Department, The University of Tennessee},
+	year={2000}
+	,number={LAPACK Working Note 147}
+	,month={September}
+	,note={www.netlib.org/atlas}
+	}
+
+@article{DaydeDuff99,
+	author = "M. J. Dayd\'{e} and I. S. Duff",
+	title = "The {RISC} {BLAS}: A Blocked Implementation of Level 3 {BLAS} for {RISC} Processors",
+	journal = TOMS,
+	volume = "25",
+	number = "3",
+	month = {Sept.},
+	year ="1999"
+	}
+
+
+@article{ardd:89,
+   author = {M. Arioli and J. W. Demmel and I. S. Duff},
+   year = "1989",
+   title = {Solving sparse linear systems with sparse backward error},
+   journal = SIMAX,
+   volume  = {10},
+   pages   = {165-190}
+}
+
+
+@article{DavisHager99,
+	author={Davis, T. A. and Hager, W. W.},
+	title={Modifying a sparse {C}holesky factorization},
+	journal=SIMAX,
+	year={1999}
+	,volume={20}
+	,number={3}
+	,pages={606-627}
+	}
+
+
+@article{dusc:96,
+	author = {I. S. Duff and J. A. Scott},
+	title = {The design of a new frontal code for solving sparse unsymmetric systems},
+	journal = TOMS,
+	year = "1996",
+	volume = "22",
+	number = "1",
+	pages = "30-45"
+	}
+
+
+@article{Duff78a,
+	author={Duff, I. S. and Reid, J. K.},
+	year={1978},
+	title={An Implementation of {T}arjan's Algorithm for the Block Triangularization of a Matrix},
+	journal=TOMS,
+	volume={4},
+	number={2},
+	pages={137-147}
+	}
+
+@book{GeorgeLiu,
+	author={George, A. and Liu, J. W. H.},
+	year={1981},
+	title={Computer Solution of Large Sparse Positive Definite Systems},
+	publisher={Englewood Cliffs, New Jersey:  Prentice-Hall}
+	}
+
+@article{GilbertNgPeyton94,
+	author={Gilbert, J. R. and Ng, E. G. and Peyton, B. W.},
+	title={An efficient algorithm to compute row and column counts for sparse {C}holesky factorization},
+	journal=SIMAX,
+	year={1994}
+	,volume={15}
+	,number={4}
+	,pages={1075-1091}
+	}
+
+@techreport{DuffGrimesLewis87b,
+	author={Duff, I. S. and Grimes, R. G. and Lewis, J. G.},
+	year={1987},
+	title={Users' Guide for the Harwell-Boeing Sparse Matrix Test Collection},
+	institution={AERE Harwell Laboratory, United Kingdom Atomic Energy Authority}}
+
Binary file liboctave/UMFPACK/UMFPACK/Doc/UserGuide.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed1	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,33 @@
+/INCLUDE umfpack_col_to_triplet.h/r ../Include/umfpack_col_to_triplet.h
+/INCLUDE umfpack_defaults.h/r ../Include/umfpack_defaults.h
+/INCLUDE umfpack_free_numeric.h/r ../Include/umfpack_free_numeric.h
+/INCLUDE umfpack_free_symbolic.h/r ../Include/umfpack_free_symbolic.h
+/INCLUDE umfpack_get_lunz.h/r ../Include/umfpack_get_lunz.h
+/INCLUDE umfpack_get_numeric.h/r ../Include/umfpack_get_numeric.h
+/INCLUDE umfpack_get_symbolic.h/r ../Include/umfpack_get_symbolic.h
+/INCLUDE umfpack_get_scale.h/r ../Include/umfpack_get_scale.h
+/INCLUDE umfpack_numeric.h/r ../Include/umfpack_numeric.h
+/INCLUDE umfpack_qsymbolic.h/r ../Include/umfpack_qsymbolic.h
+/INCLUDE umfpack_report_control.h/r ../Include/umfpack_report_control.h
+/INCLUDE umfpack_report_info.h/r ../Include/umfpack_report_info.h
+/INCLUDE umfpack_report_matrix.h/r ../Include/umfpack_report_matrix.h
+/INCLUDE umfpack_report_numeric.h/r ../Include/umfpack_report_numeric.h
+/INCLUDE umfpack_report_perm.h/r ../Include/umfpack_report_perm.h
+/INCLUDE umfpack_report_status.h/r ../Include/umfpack_report_status.h
+/INCLUDE umfpack_report_symbolic.h/r ../Include/umfpack_report_symbolic.h
+/INCLUDE umfpack_report_triplet.h/r ../Include/umfpack_report_triplet.h
+/INCLUDE umfpack_report_vector.h/r ../Include/umfpack_report_vector.h
+/INCLUDE umfpack_simple.c/r ../Demo/umfpack_simple.c
+/INCLUDE umfpack_solve.h/r ../Include/umfpack_solve.h
+/INCLUDE umfpack_scale.h/r ../Include/umfpack_scale.h
+/INCLUDE umfpack_symbolic.h/r ../Include/umfpack_symbolic.h
+/INCLUDE umfpack_timer.h/r ../Include/umfpack_timer.h
+/INCLUDE umfpack_tictoc.h/r ../Include/umfpack_tictoc.h
+/INCLUDE umfpack_transpose.h/r ../Include/umfpack_transpose.h
+/INCLUDE umfpack_triplet_to_col.h/r ../Include/umfpack_triplet_to_col.h
+/INCLUDE umfpack_wsolve.h/r ../Include/umfpack_wsolve.h
+/INCLUDE umfpack_load_numeric.h/r ../Include/umfpack_load_numeric.h
+/INCLUDE umfpack_load_symbolic.h/r ../Include/umfpack_load_symbolic.h
+/INCLUDE umfpack_save_numeric.h/r ../Include/umfpack_save_numeric.h
+/INCLUDE umfpack_save_symbolic.h/r ../Include/umfpack_save_symbolic.h
+/INCLUDE umfpack_get_determinant.h/r ../Include/umfpack_get_determinant.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.sed2	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,3 @@
+/[/][*]/d
+/[*][/]/d
+/INCLUDE umfpack/d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Doc/UserGuide.stex	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,2673 @@
+%-------------------------------------------------------------------------------
+% The UserGuide.stex file.  Processed into UserGuide.tex via sed.
+%-------------------------------------------------------------------------------
+
+\documentclass[11pt]{article}
+
+\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
+\newcommand{\tr}{^{\sf T}}          % transpose
+\newcommand{\he}{^{\sf H}}          % complex conjugate transpose
+\newcommand{\implies}{\rightarrow}
+
+\topmargin 0in
+\textheight 9in
+\oddsidemargin 0pt
+\evensidemargin 0pt
+\textwidth 6.5in
+
+\begin{document}
+
+\author{Timothy A. Davis \\
+Dept. of Computer and Information Science and Engineering \\
+Univ. of Florida, Gainesville, FL}
+\title{UMFPACK Version 4.4 User Guide}
+\date{Jan. 28, 2005}
+\maketitle
+
+%-------------------------------------------------------------------------------
+\begin{abstract}
+    UMFPACK is a set of routines for solving unsymmetric sparse linear
+    systems, $\m{Ax}=\m{b}$, using the Unsymmetric MultiFrontal method
+    and direct sparse LU factorization.  It is written in ANSI/ISO C, with a
+    MATLAB interface.  UMFPACK relies on the Level-3 Basic
+    Linear Algebra Subprograms (dense matrix multiply) for its performance.
+    This code works on Windows and many versions of Unix (Sun Solaris,
+    Red Hat Linux, IBM AIX, SGI IRIX, and Compaq Alpha).
+\end{abstract}
+%-------------------------------------------------------------------------------
+
+Technical Report TR-04-003 (revised)
+
+UMFPACK Version 4.4 (Jan. 28, 2005), Copyright\copyright 2005 by Timothy A.
+Davis.  All Rights Reserved.
+
+{\bf UMFPACK License:}
+    Your use or distribution of UMFPACK or any modified version of
+    UMFPACK implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses UMFPACK or any modified version of UMFPACK code must cite the
+    Copyright, this License, the Availability note, and ``Used by permission.''
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+{\bf Availability:}
+    http://www.cise.ufl.edu/research/sparse/umfpack
+
+{\bf Acknowledgments:}
+
+    This work was supported by the National Science Foundation, under
+    grants DMS-9504974, DMS-9803599, and CCR-0203270.
+    The upgrade to Version 4.1 and the inclusion of the
+    symmetric and 2-by-2 pivoting strategies
+    were done while the author was on sabbatical at
+    Stanford University and Lawrence Berkeley National Laboratory.
+
+%-------------------------------------------------------------------------------
+\newpage
+%-------------------------------------------------------------------------------
+
+\tableofcontents
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Overview}
+%-------------------------------------------------------------------------------
+
+UMFPACK\footnote{Pronounced with two syllables: umph-pack}
+Version 4.4 is a set of routines for solving systems of linear
+equations, $\m{Ax}=\m{b}$, when $\m{A}$ is sparse and unsymmetric.  It is based
+on the Unsymmetric-pattern MultiFrontal method \cite{DavisDuff97,DavisDuff99}.
+UMFPACK factorizes
+$\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$,
+where $\m{L}$ and $\m{U}$
+are lower and upper triangular, respectively, $\m{P}$ and $\m{Q}$ are
+permutation matrices, and $\m{R}$ is a diagonal matrix of row scaling factors
+(or $\m{R}=\m{I}$ if row-scaling is not used).  Both $\m{P}$ and $\m{Q}$ are
+chosen to reduce fill-in (new nonzeros in $\m{L}$ and $\m{U}$ that are not
+present in $\m{A}$).  The permutation $\m{P}$ has the dual role of reducing
+fill-in and maintaining numerical accuracy (via relaxed partial pivoting
+and row interchanges).
+
+The sparse matrix $\m{A}$ can be square or rectangular, singular
+or non-singular, and real or complex (or any combination).  Only square
+matrices $\m{A}$ can be used to solve $\m{Ax}=\m{b}$ or related systems.
+Rectangular matrices can only be factorized.
+
+UMFPACK first finds a column pre-ordering that reduces fill-in, without regard
+to numerical values.  It scales and analyzes the matrix, and then automatically
+selects one of three strategies for pre-ordering the rows and columns:
+{\em unsymmetric},
+{\em 2-by-2}, and
+{\em symmetric}.  These strategies are described below.
+
+First, all pivots with zero Markowitz cost are eliminated and placed in the
+LU factors.  The remaining submatrix $\m{S}$ is then analyzed.
+The following rules are applied, and the first one that matches defines
+the strategy.
+
+\begin{itemize}
+\item Rule 1: $\m{A}$ rectangular $\implies$ unsymmetric.
+\item Rule 2:
+    If the zero-Markowitz elimination results in a rectangular $\m{S}$,
+    or an $\m{S}$ whose diagonal has not been preserved, the
+    unsymmetric strategy is used.
+\item The symmetry $\sigma_1$ of $\m{S}$ is computed.  It is defined as
+    the number of {\em matched} off-diagonal entries, divided by the
+    total number of off-diagonal entries.  An entry $s_{ij}$ is matched
+    if $s_{ji}$ is also an entry.  They need not be numerically equal.
+    An {\em entry} is a value in $\m{A}$ which is present
+    in the input data structure.  All nonzeros are entries, but some entries
+    may be numerically zero.
+    Rule 3: $\sigma_1 < 0.1 \implies$ unsymmetric.
+    The matrix is very unsymmetric.
+\item Let $d$ be the number of nonzero entries on the diagonal of $\m{S}$.
+    Let $\m{S}$ be $\nu$-by-$\nu$.
+    Rule 4: $(\sigma_1 \ge 0.7) \:\wedge\: (d = \nu) \implies$ symmetric.
+    The matrix has a nearly symmetric nonzero pattern, and a zero-free
+    diagonal.
+\end{itemize}
+
+If the strategy has not yet been determined,
+the 2-by-2 strategy is attempted.  A row permutation $\m{P}_2$
+is found which attempts to reduce the number of small
+diagonal entries of $\m{P}_2 \m{S}$.
+An entry $s_{ij}$ is determined to be small if
+$|s_{ij}| < 0.01 \max |s_{*j}|$, or large otherwise.
+If $s_{ii}$ is numerically small, the method attempts to swap
+two rows $i$ and $j$, such that both $s_{ij}$ and $s_{ji}$ are large.
+Once these rows are swapped,
+they remain in place.  Let $\sigma_2$ be the symmetry of $\m{P}_2 \m{S}$,
+and let $d_2$ be the number of nonzero entries (either small or large)
+on the diagonal of $\m{P}_2 \m{S}$.
+
+\begin{itemize}
+\item Rule 5:
+    ($\sigma_2 > 1.1 \sigma_1) \:\wedge\: (d_2 > 0.9 \nu) \implies$ 2-by-2.
+    The 2-by-2 permutation has made the matrix significantly more symmetric.
+\item Rule 6: $\sigma_2 < 0.7 \sigma_1 \implies$ unsymmetric.
+    The 2-by-2 strategy has significantly deteriorated the symmetry,
+\item Rule 7: $\sigma_2 < 0.25 \implies$ unsymmetric.
+    The matrix is still very unsymmetric.
+\item Rule 8: $\sigma_2 \ge 0.51 \implies$ 2-by-2.
+    The matrix is roughly symmetric.
+\item Rule 9: $\sigma_2 \ge 0.999 \sigma_1 \implies$ 2-by-2.
+    The 2-by-2 permutation has preserved symmetry, or made it only
+    slightly worse.
+\item Rule 10: if no rule has yet triggered, use the unsymmetric strategy.
+\end{itemize}
+
+Each strategy is described below:
+\begin{itemize}
+\item {\em unsymmetric}:
+The column pre-ordering of $\m{S}$ is computed by a modified version of COLAMD
+\cite{DavisGilbertLarimoreNg00_algo,DavisGilbertLarimoreNg00,Larimore98}.
+The method finds a symmetric permutation $\m{Q}$ of the matrix $\m{S}\tr\m{S}$
+(without forming $\m{S}\tr\m{S}$ explicitly).  This is a good choice for
+$\m{Q}$, since the Cholesky factors of $\m{(SQ)\tr(SQ)}$ are an upper bound (in
+terms of nonzero pattern) of the factor $\m{U}$ for the unsymmetric LU
+factorization ($\m{PSQ}=\m{LU}$) regardless of the choice of $\m{P}$
+\cite{GeorgeNg85,GeorgeNg87,GilbertNg93}.  This modified version of
+COLAMD also computes the column elimination tree and post-orders the
+tree.  It finds the upper bound on the number of nonzeros in L and U.
+It also has a different threshold for determining dense rows and columns.
+During factorization, the column pre-ordering can be modified.
+Columns within a single super-column can be reshuffled, to reduce fill-in.
+Threshold partial pivoting is used with no preference given to the diagonal
+entry.  Within a given pivot column $j$, an entry $a_{ij}$ can be chosen if
+$|a_{ij}| \ge 0.1 \max |a_{*j}|$.  Among those numerically acceptable
+entries, the sparsest row $i$ is chosen as the pivot row.
+
+\item {\em 2-by-2}:
+The symmetric strategy (see below) is applied to the matrix $\m{P}_2 \m{S}$,
+rather than $\m{S}$.
+
+\item {\em symmetric}:
+The column ordering is computed from AMD
+\cite{AmestoyDavisDuff96,AmestoyDavisDuff03},
+applied to the pattern of $\m{S}+\m{S}\tr$
+followed by a post-ordering of the supernodal elimination
+tree of $\m{S}+\m{S}\tr$.
+No modification of the column pre-ordering is made during numerical
+factorization.  Threshold partial pivoting is used, with a strong
+preference given to the diagonal entry.  The diagonal entry is chosen if
+$a_{jj} \ge 0.001 \max |a_{*j}|$.  Otherwise, a sparse row is selected,
+using the same method used by the unsymmetric strategy.
+
+\end{itemize}
+
+The symmetric and 2-by-2 strategies, and their automatic selection,
+are new to Version 4.1.  Version 4.0 only used the unsymmetric strategy.
+
+Once the strategy is selected,
+the factorization of the matrix $\m{A}$ is broken down into the factorization
+of a sequence of dense rectangular frontal matrices.  The frontal matrices are
+related to each other by a supernodal column elimination tree, in which each
+node in the tree represents one frontal matrix.  This analysis phase also
+determines upper bounds on the memory usage, the floating-point operation count,
+and the number of nonzeros in the LU factors.
+
+UMFPACK factorizes each {\em chain} of frontal matrices in a single working
+array, similar to how the unifrontal method \cite{dusc:96} factorizes the whole
+matrix.  A chain of frontal matrices is a sequence of fronts where the parent
+of front $i$ is $i$+1 in the supernodal column elimination tree.  For the
+nonsingular matrices factorized with the unsymmetric strategy, there are
+exactly the same number of chains as there are leaves in the supernodal
+column elimination tree.  UMFPACK is an
+outer-product based, right-looking method.  At the $k$-th step of Gaussian
+elimination, it represents the updated submatrix $\m{A}_k$ as an implicit
+summation of a set of dense sub-matrices (referred to as {\em elements},
+borrowing a phrase from finite-element methods) that arise when the frontal
+matrices are factorized and their pivot rows and columns eliminated.
+
+Each frontal matrix represents the elimination of one or more columns;
+each column of $\m{A}$ will be eliminated in a specific frontal matrix,
+and which frontal matrix will be used for which column is determined by
+the pre-analysis phase.  The pre-analysis phase also determines the worst-case
+size of each frontal matrix so that they can hold any candidate pivot column
+and any candidate pivot row.  From the perspective of the analysis phase, any
+candidate pivot column in the frontal matrix is identical (in terms of nonzero
+pattern), and so is any row.  However, the numeric factorization phase has
+more information than the analysis phase.  It uses this information to reorder
+the columns within each frontal matrix to reduce fill-in.  Similarly, since
+the number of nonzeros in each row and column are maintained (more precisely,
+COLMMD-style approximate degrees \cite{GilbertMolerSchreiber}), a pivot row can
+be selected based on sparsity-preserving criteria (low degree) as well as
+numerical considerations (relaxed threshold partial pivoting).
+
+When the symmetric or 2-by-2 strategies are used,
+the column preordering is not refined during numeric factorization.
+Row pivoting for sparsity and numerical accuracy is performed if the
+diagonal entry is too small.
+
+More details of the method, including experimental results, are
+described in \cite{Davis03,Davis03_algo}, available at
+http://www.cise.ufl.edu/tech-reports.
+
+%-------------------------------------------------------------------------------
+\section{Availability}
+%-------------------------------------------------------------------------------
+
+In addition to appearing as a Collected Algorithm of the ACM,
+UMFPACK Version 4.4 is available at http://www.cise.ufl.edu/research/sparse.
+Version 4.3 is included as a built-in routine in MATLAB
+7.1.  Version 4.0 (in MATLAB 6.5)
+does not have the symmetric or 2-by-2 strategies and it takes
+less advantage of the level-3
+BLAS \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02}.
+Version 4.4 (and v4.3 through v4.1) tend to be much faster than Version 4.0,
+particularly on unsymmetric matrices with mostly symmetric
+nonzero pattern (such as finite element and circuit simulation matrices).
+Version 3.0 and following make
+use of a modified version of COLAMD V2.0 by Timothy A.~Davis, Stefan
+Larimore, John Gilbert, and Esmond Ng.  The original COLAMD V2.1 is available in
+as a built-in routine in MATLAB V6.0 (or later), and at
+http://www.cise.ufl.edu/research/sparse.
+These codes are also available in Netlib \cite{netlib} at
+http://www.netlib.org.
+UMFPACK Versions 2.2.1 and earlier, co-authored with Iain Duff,
+are available at http://www.cise.ufl.edu/research/sparse and as
+MA38 (functionally equivalent to Version 2.2.1) in the Harwell
+Subroutine Library.
+
+%-------------------------------------------------------------------------------
+\section{Primary changes from prior versions}
+%-------------------------------------------------------------------------------
+
+A detailed list of changes is in the {\tt ChangeLog} file.
+
+%-------------------------------------------------------------------------------
+\subsection{Version 4.4}
+%-------------------------------------------------------------------------------
+
+Bug fix in strategy selection in {\tt umfpack\_*\_qsymbolic}.
+Added packed complex case for all complex input/output arguments.
+Added {\tt umfpack\_get\_determinant}.
+Added minimal support for Microsoft Visual Studio
+(the {\tt umf\_multicompile.c} file).
+
+%-------------------------------------------------------------------------------
+\subsection{Version 4.3.1}
+%-------------------------------------------------------------------------------
+
+Minor bug fix in the forward/backsolve.  This bug had the effect of turning
+off iterative refinement when solving $\m{A}\tr\m{x}=\m{b}$ after factorizing
+$\m{A}$.  UMFPACK mexFunction now factorizes $\m{A}\tr$ in its forward-slash
+operation.
+
+%-------------------------------------------------------------------------------
+\subsection{Version 4.3}
+%-------------------------------------------------------------------------------
+
+No changes are visible to the C or MATLAB user, except the presence of
+one new control parameter in the {\tt Control} array,
+and three new statistics in the {\tt Info} array.
+The primary change is the addition of an (optional) drop tolerance.
+
+%-------------------------------------------------------------------------------
+\subsection{Version 4.1}
+%-------------------------------------------------------------------------------
+
+The following is a summary of the main changes that are visible to the C
+or MATLAB user:
+
+\begin{enumerate}
+
+\item New ordering strategies added.  No changes are required in user code
+    (either C or MATLAB) to use the new default strategy, which is an automatic
+    selection of the unsymmetric, symmetric, or 2-by-2 strategies.
+
+\item Row scaling added.  This is only visible to the MATLAB caller when using
+    the form {\tt [L,U,P,Q,R] = umfpack (A)}, to retrieve the LU factors.
+    Likewise, it is only visible to the C caller when the LU factors are
+    retrieved, or when solving systems with just $\m{L}$ or $\m{U}$.
+    New C-callable and MATLAB-callable routines are included to get and to
+    apply the scale factors computed by UMFPACK.  Row scaling is enabled by
+    default, but can be disabled.  Row scaling usually leads to a better
+    factorization, particularly when the symmetric strategy is used.
+
+\item Error code {\tt UMFPACK\_ERROR\_problem\_to\_large} removed.
+    Version 4.0 would generate this error when the upper bound memory usage
+    exceeded 2GB (for the {\tt int} version), even when the actual memory
+    usage was less than this.  The new version properly handles this case,
+    and can successfully factorize the matrix if sufficient memory is
+    available.
+
+\item New control parameters and statistics provided.
+
+\item The AMD symmetric approximate minimum degree ordering routine added
+    \cite{AmestoyDavisDuff96,AmestoyDavisDuff03}.
+    It is used by UMFPACK, and can also be called independently from C or
+    MATLAB.
+
+\item The {\tt umfpack} mexFunction now returns permutation matrices, not
+    permutation vectors, when using the form {\tt [L,U,P,Q] = umfpack (A)}
+    or the new form {\tt [L,U,P,Q,R] = umfpack (A)}.
+
+\item New arguments added to the user-callable routines
+    {\tt umfpack\_*\_symbolic},
+    {\tt umfpack\_*\_qsymbolic},
+    {\tt umfpack\_*\_get\_numeric}, and
+    {\tt umfpack\_*\_get\_symbolic}.
+    The symbolic analysis now makes use of the numerical values of the matrix
+    $\m{A}$, to guide the 2-by-2 strategy.  The subsequent matrix passed to
+    the numeric factorization step does not have to have the same numerical
+    values.  All of the new arguments are optional.  If you do not wish to
+    include them, simply pass {\tt NULL} pointers instead.  The 2-by-2 strategy
+    will assume all entries are numerically large, for example.
+
+\item New routines added to save and load the {\tt Numeric} and {\tt Symbolic}
+    objects to and from a binary file.
+
+\item A Fortran interface added.  It provides access to a subset of
+    UMFPACK's features.
+
+\item You can compute an incomplete LU factorization, by dropping small
+    entries from $\m{L}$ and $\m{U}$.  By default, no nonzero entry is
+    dropped, no matter how small in absolute value.  This feature is new
+    to Version 4.3.
+
+\end{enumerate}
+
+%-------------------------------------------------------------------------------
+\section{Using UMFPACK in MATLAB}
+%-------------------------------------------------------------------------------
+
+The easiest way to use UMFPACK is within MATLAB.  Version 4.3 is a built-in
+routine in MATLAB 7.1, and is used in {\tt x = A}$\backslash${\tt b} when
+{\tt A} is sparse, square, unsymmetric (or symmetric but not positive definite),
+and with nonzero entries that are not confined in a narrow band.
+It is also used for the {\tt [L,U,P,Q] = lu (A)} usage of {\tt lu}.
+Type {\tt help lu} in MATLAB 6.5 or later for more details.
+
+To use the UMFPACK mexFunction, you must download and compile it,
+since the mexFunction itself is not part of MATLAB.
+The following discussion assumes that
+you have MATLAB Version 6.0 or later (which includes the BLAS, and the
+{\tt colamd} ordering routine).  To compile both the UMFPACK and AMD
+mexFunctions, just type {\tt make} in the Unix system shell,
+while in the {\tt UMFPACK} directory.
+You can also type {\tt umfpack\_make} in MATLAB, if you are in the
+{\tt UMFPACK/MATLAB} directory, or if that directory is in your MATLAB path.
+This works on any system with MATLAB, including Windows.
+See Section~\ref{Install} for more details on how to install UMFPACK.
+Once installed, the UMFPACK mexFunction can analyze, factor, and solve linear
+systems.  Table~\ref{matlab} summarizes some of the more common uses
+of the UMFPACK mexFunction within MATLAB.
+
+An optional input argument can be used to modify the control parameters for
+UMFPACK, and an optional output argument provides statistics on the 
+factorization.
+
+Refer to the AMD User Guide for more details about the AMD mexFunction.
+
+\begin{table}
+\caption{Using UMFPACK's MATLAB interface}
+\label{matlab}
+\vspace{0.1in}
+{\footnotesize
+\begin{tabular}{l|l|l}
+\hline
+Function & Using UMFPACK & MATLAB 6.0 equivalent \\
+\hline
+ & & \\
+\begin{minipage}[t]{1.5in}
+Solve $\m{Ax}=\m{b}$.
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+x = umfpack (A,'\',b) ;
+\end{verbatim}
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+x = A \ b ;
+\end{verbatim}
+\end{minipage}
+ \\
+ & & \\
+\hline
+ & & \\
+\begin{minipage}[t]{1.5in}
+Solve $\m{Ax}=\m{b}$ using a different row and column pre-ordering
+(symmetric ordering).
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+S = spones (A) ;
+Q = symamd (S+S') ;
+Control = umfpack ;
+Control (6) = 3 ;
+x = umfpack (A,Q,'\',b,Control) ;
+\end{verbatim}
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+spparms ('autommd',0) ;
+S = spones (A) ;
+Q = symamd (S+S') ;
+x = A (Q,Q) \ b (Q) ;
+x (Q) = x ;
+spparms ('autommd',1) ;
+\end{verbatim}
+\end{minipage}
+ \\
+ & & \\
+\hline
+ & & \\
+\begin{minipage}[t]{1.5in}
+Solve $\m{A}\tr\m{x}\tr = \m{b}\tr$.
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+x = umfpack (b,'/',A) ;
+\end{verbatim}
+Note: $\m{A}$ is factorized.
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+x = b / A ;
+\end{verbatim}
+Note: $\m{A}\tr$ is factorized.
+\end{minipage}
+ \\
+ & & \\
+\hline
+ & & \\
+\begin{minipage}[t]{1.5in}
+Scale and factorize $\m{A}$, then solve $\m{Ax}=\m{b}$.
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+[L,U,P,Q,R] = umfpack (A) ;
+c = P * (R \ b) ;
+x = Q * (U \ (L \ c)) ;
+\end{verbatim}
+\end{minipage}
+&
+\begin{minipage}[t]{2.2in}
+\begin{verbatim}
+[m n] = size (A) ;
+r = full (sum (abs (A), 2)) ;
+r (find (r == 0)) = 1 ;
+R = spdiags (r, 0, m, m) ;
+I = speye (n) ;
+Q = I (:, colamd (A)) ;
+[L,U,P] = lu ((R\A)*Q) ;
+c = P * (R \ b) ;
+x = Q * (U \ (L \ c)) ;
+\end{verbatim}
+\end{minipage}
+ \\
+ & & \\
+\hline
+\end{tabular}
+}
+\end{table}
+
+Note: in MATLAB 6.5 or later, use {\tt spparms ('autoamd',0)} in addition to
+{\tt spparms ('autommd',0)}, in Table~\ref{matlab}, to turn off MATLAB's
+default reordering.
+
+UMFPACK requires
+{\tt b} to be a dense vector (real or complex) of the appropriate dimension.
+This is more restrictive than what you can do with MATLAB's
+backslash or forward slash.  See {\tt umfpack\_solve} for an M-file that
+removes this restriction.
+This restriction does not apply to the built-in backslash operator
+in MATLAB 6.5 or later, which uses UMFPACK to factorize the matrix.
+You can do this yourself in MATLAB:
+
+{\footnotesize
+\begin{verbatim}
+    [L,U,P,Q,R] = umfpack (A) ;
+    x = Q * (U \ (L \ (P * (R \ b)))) ;
+\end{verbatim}
+}
+
+or, with no row scaling:
+
+{\footnotesize
+\begin{verbatim}
+    [L,U,P,Q] = umfpack (A) ;
+    x = Q * (U \ (L \ (P * b))) ;
+\end{verbatim}
+}
+
+The above examples do not make use of the iterative refinement
+that is built into
+{\tt x = }{\tt umfpack (A,'}$\backslash${\tt ',b)}
+however.
+
+MATLAB's {\tt [L,U,P] = lu(A)} returns a lower triangular {\tt L}, an upper
+triangular {\tt U}, and a permutation matrix {\tt P} such that {\tt P*A} is
+equal to {\tt L*U}.  UMFPACK behaves differently.  By default, it scales
+the rows of {\tt A} and reorders the columns of {\tt A} prior to
+factorization, so that {\tt L*U} is equal to {\tt P*(R}$\backslash${\tt A)*Q},
+where {\tt R} is a diagonal sparse matrix of scale factors for the rows
+of {\tt A}.  The scale factors {\tt R} are applied to {\tt A} via the MATLAB
+expression {\tt R}$\backslash${\tt A} to avoid multiplying by
+the reciprocal, which can be numerically inaccurate.
+
+There are more options; you can provide your own column pre-ordering (in which
+case UMFPACK does not call COLAMD or AMD), you can modify other control settings
+(similar to the {\tt spparms} in MATLAB), and you can get various statistics on
+the analysis, factorization, and solution of the linear system.  Type
+{\tt umfpack\_details} and {\tt umfpack\_report} in MATLAB for more
+information.  Two demo M-files are provided.   Just type {\tt umfpack\_simple}
+and {\tt umfpack\_demo} to run them.
+The output of these two programs should be about the same
+as the files {\tt umfpack\_simple.m.out} and {\tt umfpack\_demo.m.out}
+that are provided.
+
+Factorizing {\tt A'} (or {\tt A.'}) and using the transposed factors can
+sometimes be faster than factorizing {\tt A}.  It can also be preferable to
+factorize {\tt A'} if {\tt A} is rectangular.  UMFPACK pre-orders the columns
+to maintain sparsity; the row ordering is not determined until the matrix
+is factorized.  Thus, if {\tt A} is {\tt m} by {\tt n} with rank {\tt m}
+and {\tt m} $<$ {\tt n}, then {\tt umfpack} might not find a factor
+{\tt U} with a zero-free diagonal.  Unless the matrix ill-conditioned or
+poorly scaled, factorizing {\tt A'} in this case will guarantee that both
+factors will have zero-free diagonals.  Here's how you can factorize {\tt A'}
+and get the factors of {\tt A} instead:
+
+\begin{verbatim}
+    [l,u,p,q] = umfpack (A') ;
+    L = u' ;
+    U = l' ;
+    P = q ;
+    Q = p ;
+    clear l u p q
+\end{verbatim}
+
+This is an alternative to {\tt [L,U,P,Q]=umfpack(A)}.
+
+A simple M-file ({\tt umfpack\_btf}) is provided that first permutes the matrix
+to upper block triangular form, using MATLAB's {\tt dmperm} routine, and then
+solves each block.  The LU factors are not returned.  Its usage is simple:
+{\tt x = umfpack\_btf(A,b)}.  Type {\tt help umfpack\_btf} for more options.
+An estimate of the 1-norm of {\tt L*U-P*A*Q} can be computed in MATLAB
+as {\tt lu\_normest(P*A*Q,L,U)}, using the {\tt lu\_normest.m} M-file
+by Hager and Davis \cite{DavisHager99} that is included with the
+UMFPACK distribution.  With row scaling enabled, use
+{\tt lu\_normest(P*(R}$\backslash${\tt A)*Q,L,U)} instead.
+
+One issue you may encounter is how UMFPACK allocates its memory when being used
+in a mexFunction.  One part of its working space is of variable size.   The
+symbolic analysis phase determines an upper bound on the size of this memory,
+but not all of this memory will typically be used in the numerical
+factorization.  UMFPACK tries to allocate a decent amount of working space.
+This is 70\% of the upper bound, by default, for the unsymmetric strategy.
+For the symmetric strategy, the fraction of the upper bound is computed
+automatically (assuming a best-case scenario with no numerical pivoting
+required during numeric factorization).
+If this initial allocation fails, it reduces its request
+and uses less memory.   If the space is not large enough during factorization,
+it is increased via {\tt mxRealloc}.
+
+However, {\tt mxMalloc} and {\tt mxRealloc} abort the {\tt umfpack} mexFunction
+if they fail, so this strategy does not work in MATLAB.  The strategy works fine
+when {\tt malloc} or the internal memory allocator {\tt utMalloc} are used
+instead, since those routines return {\tt NULL} on failure, and do not terminate
+the mexFunction.  The {\tt umfpack} mexFunction can be compiled to use
+{\tt utMalloc}, but this is an internal undocumented utility routine in MATLAB,
+and thus using {\tt utMalloc} might not always be successful.
+To use the documented {\tt mxMalloc} routine instead, compile the
+mexFunction with the {\tt -DNUTIL} flag enabled.
+
+To compute the determinant with UMFPACK:
+
+\begin{verbatim}
+    d = umfpack (A, 'det') ;
+    [d e] = umfpack (A, 'det') ;
+\end{verbatim}
+
+The first case is identical to MATLAB's {\tt det}.
+The second case returns the determinant in the form
+$d \times 10^e$, which avoids overflow if $e$ is large.
+
+%-------------------------------------------------------------------------------
+\section{Using UMFPACK in a C program}
+\label{C}
+%-------------------------------------------------------------------------------
+
+The C-callable UMFPACK library consists of 32 user-callable routines and one
+include file.  All but three of the routines come in four versions, with
+different sizes of integers and for real or complex floating-point numbers:
+\begin{enumerate}
+\item {\tt umfpack\_di\_*}: real double precision, {\tt int} integers.
+\item {\tt umfpack\_dl\_*}: real double precision, {\tt long} integers.
+\item {\tt umfpack\_zi\_*}: complex double precision, {\tt int} integers.
+\item {\tt umfpack\_zl\_*}: complex double precision, {\tt long} integers.
+\end{enumerate}
+where {\tt *} denotes the specific name of one of the routines.
+Routine names beginning with {\tt umf\_} are internal to the package,
+and should not be called by the user.  The include file {\tt umfpack.h}
+must be included in any C program that uses UMFPACK.
+The other three routines are the same for all four versions.
+
+In addition, the C-callable AMD library distributed with UMFPACK
+includes 4 user-callable routines (in two versions with {\tt int} and
+{\tt long} integers) and one include file.  Refer to the AMD documentation
+for more details.
+
+Use only one version for any one problem; do not attempt to use one version
+to analyze the matrix and another version to factorize the matrix, for example.
+
+The notation {\tt umfpack\_di\_*} refers to all user-callable routines
+for the real double precision and {\tt int} integer case.  The notation
+{\tt umfpack\_*\_numeric}, for example, refers all four versions
+(real/complex, int/long) of a single operation
+(in this case numeric factorization).
+
+%-------------------------------------------------------------------------------
+\subsection{The size of an integer}
+%-------------------------------------------------------------------------------
+
+The {\tt umfpack\_di\_*} and {\tt umfpack\_zi\_*} routines use {\tt int} integer
+arguments; those starting with {\tt umfpack\_dl\_} or {\tt umfpack\_zl\_}
+use {\tt long} integer arguments.  If you compile UMFPACK in the standard
+ILP32 mode (32-bit {\tt int}'s, {\tt long}'s, and pointers) then the versions
+are essentially identical.  You will be able to solve problems using up to 2GB
+of memory.  If you compile UMFPACK in the standard LP64 mode, the size of an
+{\tt int} remains 32-bits, but the size of a {\tt long} and a pointer both get
+promoted to 64-bits.  In the LP64 mode, the {\tt umfpack\_dl\_*}
+and {\tt umfpack\_zl\_*} routines can solve huge
+problems (not limited to 2GB), limited of course by the amount of available
+memory.  The only drawback to the 64-bit mode is that not all BLAS libraries
+support 64-bit integers.  This limits the performance you will obtain.
+Those that do support 64-bit integers are specific to particular
+architectures, and are not portable.  UMFPACK and AMD should be compiled
+in the same mode.
+If you compile UMFPACK and AMD in the LP64 mode,
+be sure to add {\tt -DLP64} to the compilation command.  See the examples in
+{\tt Make.alpha}, {\tt Make.sgi}, and {\tt Make.solaris}.
+
+%-------------------------------------------------------------------------------
+\subsection{Real and complex floating-point}
+%-------------------------------------------------------------------------------
+
+The {\tt umfpack\_di\_*} and {\tt umfpack\_dl\_*} routines take (real) double
+precision arguments, and return double precision arguments.  In the
+{\tt umfpack\_zi\_*} and {\tt umfpack\_zl\_*} routines, these same arguments
+hold the real part of the matrices; and second double precision arrays hold
+the imaginary part of the input and output matrices.  Internally, complex
+numbers are stored in arrays with their real and imaginary parts interleaved,
+as required by the BLAS (``packed'' complex form).
+
+New to Version 4.4 is the option of providing input/output arguments
+in packed complex form.
+
+%-------------------------------------------------------------------------------
+\subsection{Primary routines, and a simple example}
+%-------------------------------------------------------------------------------
+
+Five primary UMFPACK routines are required to factorize $\m{A}$ or
+solve $\m{Ax}=\m{b}$.  They are fully described in Section~\ref{Primary}:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_symbolic}:
+
+    Pre-orders the columns of $\m{A}$ to reduce fill-in.
+    Returns an opaque {\tt Symbolic} object as a {\tt void *}
+    pointer.  The object contains the symbolic analysis and is needed for the
+    numeric factorization.  This routine requires only $O(|\m{A}|)$ space,
+    where $|\m{A}|$ is the number of nonzero entries in the matrix.  It computes
+    upper bounds on the nonzeros in $\m{L}$ and $\m{U}$, the floating-point
+    operations required, and the memory usage of {\tt umfpack\_*\_numeric}.  The
+    {\tt Symbolic} object is small; it contains just the column pre-ordering,
+    the supernodal column elimination tree, and information about each frontal
+    matrix. It is no larger than about $13n$ integers if $\m{A}$ is
+    $n$-by-$n$.
+
+\item {\tt umfpack\_*\_numeric}:
+
+    Numerically scales and then factorizes a sparse matrix into
+    $\m{PAQ}$, $\m{PRAQ}$, or $\m{PR}^{-1}\m{AQ}$ into the product $\m{LU}$,
+    where
+    $\m{P}$ and $\m{Q}$ are permutation matrices, $\m{R}$ is a diagonal
+    matrix of scale factors, $\m{L}$ is lower triangular with unit diagonal,
+    and $\m{U}$ is upper triangular.  Requires the
+    symbolic ordering and analysis computed by {\tt umfpack\_*\_symbolic}
+    or {\tt umfpack\_*\_qsymbolic}.
+    Returns an opaque {\tt Numeric} object as a
+    {\tt void *} pointer.  The object contains the numerical factorization and
+    is used by {\tt umfpack\_*\_solve}.  You can factorize a new matrix with a
+    different values (but identical pattern) as the matrix analyzed by
+    {\tt umfpack\_*\_symbolic} or {\tt umfpack\_*\_qsymbolic} by re-using the
+    {\tt Symbolic} object (this feature is available when using UMFPACK in a
+    C or Fortran program, but not in MATLAB).
+    The matrix
+    $\m{U}$ will have zeros on the diagonal if $\m{A}$ is singular; this
+    produces a warning, but the factorization is still valid.
+
+\item {\tt umfpack\_*\_solve}:
+
+    Solves a sparse linear system ($\m{Ax}=\m{b}$, $\m{A}\tr\m{x}=\m{b}$, or
+    systems involving just $\m{L}$ or $\m{U}$), using the numeric factorization
+    computed by {\tt umfpack\_*\_numeric}.  Iterative refinement with sparse
+    backward error \cite{ardd:89} is used by default.  The matrix $\m{A}$ must
+    be square.  If it is singular, then a divide-by-zero will occur, and your
+    solution with contain IEEE Inf's or NaN's in the appropriate places.
+
+\item {\tt umfpack\_*\_free\_symbolic}:
+
+    Frees the {\tt Symbolic} object created by {\tt umfpack\_*\_symbolic}
+    or {\tt umfpack\_*\_qsymbolic}.
+
+\item {\tt umfpack\_*\_free\_numeric}:
+
+    Frees the {\tt Numeric} object created by {\tt umfpack\_*\_numeric}.
+
+\end{itemize}
+
+Be careful not to free a {\tt Symbolic} object with
+{\tt umfpack\_*\_free\_numeric}.  Nor should you attempt to free a {\tt Numeric}
+object with {\tt umfpack\_*\_free\_symbolic}.
+Failure to free these objects will lead to memory leaks.
+
+The matrix $\m{A}$ is represented in compressed column form, which is
+identical to the sparse matrix representation used by MATLAB.  It consists
+of three or four arrays, where the matrix is {\tt m}-by-{\tt n},
+with {\tt nz} entries.  For the {\tt int} version of UMFPACK:
+
+{\footnotesize
+\begin{verbatim}
+     int Ap [n+1] ;
+     int Ai [nz] ;
+     double Ax [nz] ;
+\end{verbatim}
+}
+
+For the {\tt long} version of UMFPACK:
+
+{\footnotesize
+\begin{verbatim}
+     long Ap [n+1] ;
+     long Ai [nz] ;
+     double Ax [nz] ;
+\end{verbatim}
+}
+
+The complex versions add another array for the imaginary part:
+
+{\footnotesize
+\begin{verbatim}
+     double Az [nz] ;
+\end{verbatim}
+}
+
+Alternatively, if {\tt Az} is {\tt NULL},
+the real part of the $k$th entry is located in
+{\tt Ax[2*k]} and the imaginary part is located in
+{\tt Ax[2*k+1]}, and the {\tt Ax} array is of size {\tt 2*nz}.
+
+All nonzeros are entries, but an entry may be numerically zero.  The row indices
+of entries in column {\tt j} are stored in
+    {\tt Ai[Ap[j]} \ldots {\tt Ap[j+1]-1]}.
+The corresponding numerical values are stored in
+    {\tt Ax[Ap[j]} \ldots {\tt Ap[j+1]-1]}.
+The imaginary part, for the complex versions, is stored in
+    {\tt Az[Ap[j]} \ldots {\tt Ap[j+1]-1]}
+    (see above for the packed complex case).
+
+No duplicate row indices may be present, and the row indices in any given
+column must be sorted in ascending order.  The first entry {\tt Ap[0]} must be
+zero.  The total number of entries in the matrix is thus {\tt nz = Ap[n]}.
+Except for the fact that extra zero entries can be included, there is thus a
+unique compressed column representation of any given matrix $\m{A}$.
+For a more flexible method for providing an input matrix to UMFPACK,
+see Section~\ref{triplet}.
+
+Here is a simple main program, {\tt umfpack\_simple.c}, that illustrates the
+basic usage of UMFPACK.  See Section~\ref{Synopsis} for a short description
+of each calling sequence, including a list of options for the first
+argument of {\tt umfpack\_di\_solve}.
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_simple.c via sed
+\end{verbatim}
+}
+
+The {\tt Ap}, {\tt Ai}, and {\tt Ax} arrays represent the matrix
+\[
+\m{A} = \left[
+\begin{array}{rrrrr}
+ 2 &  3 &  0 &  0 &  0 \\
+ 3 &  0 &  4 &  0 &  6 \\
+ 0 & -1 & -3 &  2 &  0 \\
+ 0 &  0 &  1 &  0 &  0 \\
+ 0 &  4 &  2 &  0 &  1 \\
+\end{array}
+\right].
+\]
+and the solution to $\m{Ax}=\m{b}$ is $\m{x} = [1 \, 2 \, 3 \, 4 \, 5]\tr$.
+The program uses default control settings and does not return any statistics
+about the ordering, factorization, or solution ({\tt Control} and {\tt Info}
+are both {\tt (double *) NULL}).  It also ignores the status value returned by
+most user-callable UMFPACK routines.
+
+%-------------------------------------------------------------------------------
+\subsection{A note about zero-sized arrays}
+%-------------------------------------------------------------------------------
+
+UMFPACK uses many user-provided arrays of
+size {\tt m} or {\tt n} (the order of the matrix), and of size
+{\tt nz} (the number of nonzeros in a matrix).  UMFPACK does not handle
+zero-dimensioned arrays;
+it returns an error code if {\tt m} or {\tt n}
+are zero.  However, {\tt nz} can be zero, since all singular matrices are
+handled correctly.  If you attempt to {\tt malloc} an array of size {\tt nz}
+= 0, however, {\tt malloc} will return a null pointer which UMFPACK will report
+as a missing argument.  If you {\tt malloc} an array of
+size {\tt nz} to pass to UMFPACK, make sure that you handle the {\tt nz} = 0
+case correctly (use a size equal to the maximum of {\tt nz} and 1, or use a
+size of {\tt nz+1}).
+
+%-------------------------------------------------------------------------------
+\subsection{Alternative routines}
+%-------------------------------------------------------------------------------
+
+Three alternative routines are provided that modify UMFPACK's default
+behavior.  They are fully described in Section~\ref{Alternative}:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_defaults}:
+
+    Sets the default control parameters in the {\tt Control} array.  These can
+    then be modified as desired before passing the array to the other UMFPACK
+    routines.  Control parameters are summarized in Section~\ref{control_param}.
+    Three particular parameters deserve special notice.
+    UMFPACK uses relaxed partial pivoting, where a candidate pivot entry is
+    numerically acceptable if its magnitude is greater than or equal to a
+    tolerance parameter times the magnitude of the largest entry in the same
+    column.  The parameter {\tt Control [UMFPACK\_PIVOT\_TOLERANCE]} has a
+    default value of 0.1, and is used for the unsymmetric strategy.
+    For complex matrices, a cheap approximation of the absolute value is
+    used for the threshold pivoting test
+    ($|a| \approx |a_{\mbox{real}}|+|a_{\mbox{imag}}|$).
+
+    For the symmetric strategy, a second tolerance is used for diagonal
+    entries: \newline {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]}, with
+    a default value of 0.001.  The first parameter (with a default of 0.1)
+    is used for any off-diagonal candidate pivot entries.
+
+    These two parameters may be too small for some matrices, particularly for
+    ill-conditioned or poorly scaled ones.  With the default pivot tolerances
+    and default iterative refinement,
+        {\tt x = umfpack (A,'}$\backslash${\tt ',b)}
+    is just as accurate as (or more accurate) than
+        {\tt x = A}$\backslash${\tt b}
+    in MATLAB 6.1 for nearly all matrices.
+
+    If {\tt Control [UMFPACK\_PIVOT\_TOLERANCE]} is zero, than any
+    nonzero entry is acceptable as a pivot (this is changed from Version 4.0,
+    which treated a value of 0.0 the same as 1.0).  If the symmetric strategy is
+    used, and {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]} is zero, then any
+    nonzero entry on the diagonal is accepted as a pivot.  Off-diagonal pivoting
+    will still occur if the diagonal entry is exactly zero.  The
+    {\tt Control [UMFPACK\_SYM\_PIVOT\_TOLERANCE]} parameter is new to Version
+    4.1.  It is similar in function to the pivot tolerance for left-looking
+    methods (the MATLAB {\tt THRESH} option in {\tt [L,U,P] = lu (A, THRESH)},
+    and the pivot tolerance parameter in SuperLU).
+
+    The parameter {\tt Control [UMFPACK\_STRATEGY]} can be used to bypass
+    UMFPACK's automatic strategy selection.  The automatic strategy nearly
+    always selects the best method.  When it does not, the different methods
+    nearly always give about the same quality of results.  There may be
+    cases where the automatic strategy fails to pick a good strategy. Also,
+    you can save some computing time if you know the right strategy for your
+    set of matrix problems.
+
+\item {\tt umfpack\_*\_qsymbolic}:
+
+    An alternative to {\tt umfpack\_*\_symbolic}.  Allows the user to specify
+    his or her own column pre-ordering, rather than using the default COLAMD
+    or AMD pre-orderings.  For example, a graph partitioning-based order
+    of $\m{A}\tr\m{A}$ would be suitable for UMFPACK's unsymmetric strategy.
+    A partitioning of $\m{A}+\m{A}\tr$ would be suitable for UMFPACK's
+    symmetric or 2-by-2 strategies.
+
+\item {\tt umfpack\_*\_wsolve}:
+
+    An alternative to {\tt umfpack\_*\_solve} which does not dynamically
+    allocate any memory.  Requires the user to pass two additional work
+    arrays.
+
+\end{itemize}
+
+%-------------------------------------------------------------------------------
+\subsection{Matrix manipulation routines}
+\label{triplet}
+%-------------------------------------------------------------------------------
+
+The compressed column data structure is compact, and simplifies the UMFPACK
+routines that operate on the sparse matrix $\m{A}$.  However, it can be
+inconvenient for the user to generate.  Section~\ref{Manipulate} presents the
+details of routines for manipulating sparse matrices in {\em triplet} form,
+compressed column form, and compressed row form (the transpose of the
+compressed column form).  The triplet form of a matrix consists of three or
+four arrays.  For the {\tt int} version of UMFPACK:
+
+{\footnotesize
+\begin{verbatim}
+     int Ti [nz] ;
+     int Tj [nz] ;
+     double Tx [nz] ;
+\end{verbatim}
+}
+
+For the {\tt long} version:
+
+{\footnotesize
+\begin{verbatim}
+     long Ti [nz] ;
+     long Tj [nz] ;
+     double Tx [nz] ;
+\end{verbatim}
+}
+
+The complex versions use another array to hold the imaginary part:
+
+{\footnotesize
+\begin{verbatim}
+     double Tz [nz] ;
+\end{verbatim}
+}
+
+The {\tt k}-th triplet is $(i,j,a_{ij})$, where $i =$ {\tt Ti[k]},
+$j =$ {\tt Tj[k]}, and $a_{ij} =$ {\tt Tx[k]}.  For the complex versions,
+{\tt Tx[k]} is the real part of $a_{ij}$ and
+{\tt Tz[k]} is the imaginary part.
+The triplets can be in any
+order in the {\tt Ti}, {\tt Tj}, and {\tt Tx} arrays (and {\tt Tz} for
+the complex versions), and duplicate entries may
+exist.  
+If {\tt Tz} is NULL, then the array {\tt Tx} becomes of size {\tt 2*nz},
+and the real and imaginary parts of the
+{\tt k}-th triplet are located in {\tt Tx[2*k]} and {\tt Tx[2*k+1]},
+respectively.
+Any duplicate entries are summed when the triplet form is converted to
+compressed column form.  This is a convenient way to create a matrix arising in
+finite-element methods, for example.
+
+Four routines are provided for manipulating sparse matrices:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_triplet\_to\_col}:
+
+    Converts a triplet form of a matrix to compressed column form (ready for
+    input to \newline
+    {\tt umfpack\_*\_symbolic}, {\tt umfpack\_*\_qsymbolic}, and
+    {\tt umfpack\_*\_numeric}).  Identical to {\tt A = spconvert(i,j,x)} in
+    MATLAB, except that zero entries are not removed, so that the pattern of
+    entries in the compressed column form of $\m{A}$ are fully under user
+    control.  This is important if you want to factorize a new matrix with the
+    {\tt Symbolic} object from a prior matrix with the same pattern as the new
+    one.
+
+\item {\tt umfpack\_*\_col\_to\_triplet}:
+
+    The opposite of {\tt umfpack\_*\_triplet\_to\_col}.  Identical to
+    {\tt [i,j,x] = find(A)} in MATLAB, except that numerically zero entries
+    may be included.
+
+\item {\tt umfpack\_*\_transpose}:
+
+    Transposes and optionally permutes a column form matrix \cite{Gustavson78}.
+    Identical to
+    {\tt R = A(P,Q)'} (linear algebraic transpose, using the complex conjugate)
+    or {\tt R = A(P,Q).'} (the array transpose)
+    in MATLAB, except for the presence of numerically zero entries.
+
+    Factorizing $\m{A}\tr$ and then solving $\m{Ax}=\m{b}$ with the transposed
+    factors can sometimes be much faster or much slower than factorizing
+    $\m{A}$.  It is highly dependent on your particular matrix.
+
+\item {\tt umfpack\_*\_scale}:
+
+    Applies the row scale factors to a user-provided vector.  This is not
+    required to solve the sparse linear system $\m{Ax}=\m{b}$ or
+    $\m{A}\tr\m{x}=\m{b}$, since {\tt umfpack\_*\_solve} applies the scale
+    factors for those systems.
+
+\end{itemize}
+
+It is quite easy to add matrices in triplet form, subtract them, transpose
+them, permute them, construct a submatrix, and multiply a triplet-form matrix
+times a vector.  UMFPACK does not provide code for these basic operations,
+however.  Refer to the discussion of
+{\tt umfpack\_*\_triplet\_to\_col} in Section~\ref{Manipulate} for more details
+on how to compute these operations in your own code.
+The only primary matrix operation not provided by UMFPACK is the
+multiplication of two sparse matrices \cite{Gustavson78}.
+A future package under development (as of Jan. 2005), CHOLMOD,
+will provide many of these matrix operations, which
+can then be used in conjunction with UMFPACK.
+Watch my web page for details.
+
+%-------------------------------------------------------------------------------
+\subsection{Getting the contents of opaque objects}
+%-------------------------------------------------------------------------------
+
+There are cases where you may wish to do more with the LU factorization
+of a matrix than solve a linear system.  The opaque {\tt Symbolic} and
+{\tt Numeric} objects are just that - opaque.  You cannot do anything with them
+except to pass them back to subsequent calls to UMFPACK.  Three routines
+are provided for copying their contents into user-provided arrays using simpler
+data structures.  Four routines are provided for saving and loading the
+{\tt Numeric} and {\tt Symbolic} objects to/from binary files.
+An additional routine is provided that computes the determinant.
+They are fully described in Section~\ref{Get}:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_get\_lunz}:
+
+    Returns the number of nonzeros in $\m{L}$ and $\m{U}$.
+
+\item {\tt umfpack\_*\_get\_numeric}:
+
+    Copies $\m{L}$, $\m{U}$, $\m{P}$, $\m{Q}$, and $\m{R}$
+    from the {\tt Numeric} object
+    into arrays provided by the user.  The matrix $\m{L}$ is returned in
+    compressed row form (with the column indices in each row sorted in ascending
+    order).  The matrix $\m{U}$ is returned in compressed column form (with
+    sorted columns).  There are no explicit zero entries in $\m{L}$ and $\m{U}$,
+    but such entries may exist in the {\tt Numeric} object.  The permutations
+    $\m{P}$ and $\m{Q}$ are represented as permutation vectors, where
+    {\tt P[k] = i} means that row {\tt i} of the original matrix is the
+    the {\tt k}-th row of $\m{PAQ}$, and where
+    {\tt Q[k] = j} means that column {\tt j} of the original matrix is the
+    {\tt k}-th column of $\m{PAQ}$.  This is identical to how MATLAB uses
+    permutation vectors (type {\tt help colamd} in MATLAB 6.1 or later).
+
+\item {\tt umfpack\_*\_get\_symbolic}:
+
+    Copies the contents of the {\tt Symbolic} object (the initial row and column
+    preordering, supernodal column elimination tree, and information
+    about each frontal matrix) into arrays provided by the user.
+
+\item {\tt umfpack\_*\_get\_determinant}:
+
+    Computes the determinant from the diagonal of $\m{U}$ and the permutations
+    $\m{P}$ and $\m{Q}$.  This is mostly of theoretical interest.
+    It is not a good test to determine if your matrix is singular or not.
+
+\item {\tt umfpack\_*\_save\_numeric}:
+
+    Saves a copy of the {\tt Numeric} object to a file, in binary format.
+
+\item {\tt umfpack\_*\_load\_numeric}:
+
+    Creates a {\tt Numeric} object by loading it from a file created
+    by {\tt umfpack\_*\_save\_numeric}.
+
+\item {\tt umfpack\_*\_save\_symbolic}:
+
+    Saves a copy of the {\tt Symbolic} object to a file, in binary format.
+
+\item {\tt umfpack\_*\_load\_symbolic}:
+
+    Creates a {\tt Symbolic} object by loading it from a file created
+    by {\tt umfpack\_*\_save\_symbolic}.
+
+\end{itemize}
+
+UMFPACK itself does not make use of these routines;
+they are provided solely for returning the contents of the opaque
+{\tt Symbolic} and {\tt Numeric} objects to the user, and saving/loading
+them to/from a binary file.  None of them do any computation, except for
+{\tt umfpack\_*\_get\_determinant}.
+
+%-------------------------------------------------------------------------------
+\subsection{Reporting routines}
+\label{Reporting}
+%-------------------------------------------------------------------------------
+
+None of the UMFPACK routines discussed so far prints anything, even when an
+error occurs.  UMFPACK provides you with nine routines for printing the input
+and output arguments (including the {\tt Control} settings and {\tt Info}
+statistics) of UMFPACK routines discussed above.  They are fully described in
+Section~\ref{Report}:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_report\_status}:
+
+    Prints the status (return value) of other {\tt umfpack\_*} routines.
+
+\item {\tt umfpack\_*\_report\_info}:
+
+    Prints the statistics returned in the {\tt Info} array by
+    {\tt umfpack\_*\_*symbolic},
+    {\tt umfpack\_*\_numeric}, and {\tt umfpack\_*\_*solve}.
+
+\item {\tt umfpack\_*\_report\_control}:
+
+    Prints the {\tt Control} settings.
+
+\item {\tt umfpack\_*\_report\_matrix}:
+
+    Verifies and prints a compressed column-form or compressed row-form sparse
+    matrix.
+
+\item {\tt umfpack\_*\_report\_triplet}:
+
+    Verifies and prints a matrix in triplet form.
+
+\item {\tt umfpack\_*\_report\_symbolic}:
+
+    Verifies and prints a {\tt Symbolic} object.
+
+\item {\tt umfpack\_*\_report\_numeric}:
+
+    Verifies and prints a {\tt Numeric} object.
+
+\item {\tt umfpack\_*\_report\_perm}:
+
+    Verifies and prints a permutation vector.
+
+\item {\tt umfpack\_*\_report\_vector}:
+
+    Verifies and prints a real or complex vector.
+
+\end{itemize}
+
+The {\tt umfpack\_*\_report\_*} routines behave slightly differently when
+compiled
+into the C-callable UMFPACK library than when used in the MATLAB mexFunction.
+MATLAB stores its sparse matrices using the same compressed column data
+structure discussed above, where row and column indices of an $m$-by-$n$
+matrix are in the range 0 to $m-1$ or $n-1$, respectively\footnote{Complex
+matrices in MATLAB use the split array form, with one {\tt double} array
+for the real part and another array for the imaginary part.  UMFPACK
+supports that format, as well as the packed complex format (new to Version 4.4).}
+It prints them as if they are in the range 1 to $m$ or $n$.
+The UMFPACK mexFunction behaves the same way.
+
+You can control how much the {\tt umfpack\_*\_report\_*} routines print by
+modifying the {\tt Control [UMFPACK\_PRL]} parameter.  Its default value is 1.
+Here is a summary of how the routines use this print level parameter:
+
+\begin{itemize}
+\item {\tt umfpack\_*\_report\_status}:
+
+    No output if the print level is 0 or less, even when an error occurs.
+    If 1, then error messages are printed, and nothing is printed if
+    the status is {\tt UMFPACK\_OK}.  A warning message is printed if
+    the matrix is singular.  If 2 or more, then the status is always
+    printed.  If 4 or more, then the UMFPACK Copyright is printed.
+    If 6 or more, then the UMFPACK License is printed.  See also the first page
+    of this User Guide for the Copyright and License.
+
+\item {\tt umfpack\_*\_report\_control}:
+
+    No output if the print level is 1 or less.  If 2 or more, all of
+    {\tt Control} is printed.
+
+\item {\tt umfpack\_*\_report\_info}:
+
+    No output if the print level is 1 or less.  If 2 or more, all of
+    {\tt Info} is printed.
+
+\item all other {\tt umfpack\_*\_report\_*} routines:
+
+    If the print level is 2 or less, then these routines return silently without
+    checking their inputs.  If 3 or more, the inputs are fully verified and a
+    short status summary is printed.  If 4, then the first few entries of the
+    input arguments are printed.  If 5, then all of the input arguments are
+    printed.
+
+\end{itemize}
+
+This print level parameter has an additional effect on the MATLAB mexFunction.
+If zero, then no warnings of singular or nearly singular matrices are
+printed (similar to the MATLAB commands
+{\tt warning off MATLAB:singularMatrix} and
+{\tt warning off MATLAB:nearlySingularMatrix}).
+
+%-------------------------------------------------------------------------------
+\subsection{Utility routines}
+%-------------------------------------------------------------------------------
+
+UMFPACK v4.0 included a routine that returns the time used by the process,
+{\tt umfpack\_timer}.  The routine uses either {\tt getrusage} (which is
+preferred), or the ANSI C {\tt clock} routine if that is not available.
+It is fully described in Section~\ref{Utility}.  It is still available in
+UMFPACK v4.1 and following, but not used internally.
+Two new timing routines are provided in UMFPACK Version 4.1 and following,
+{\tt umfpack\_tic} and {\tt umfpack\_toc}.  They use POSIX-compliant
+{\tt sysconf} and {\tt times} routines to find both the CPU time
+and wallclock time.
+These three routines are the only user-callable
+routine that is identical in all four {\tt int}/{\tt long}, real/complex
+versions (there is no {\tt umfpack\_di\_timer} routine, for example).
+
+%-------------------------------------------------------------------------------
+\subsection{Control parameters}
+\label{control_param}
+%-------------------------------------------------------------------------------
+
+UMFPACK uses an optional {\tt double} array (currently of size 20)
+to modify its control parameters.  If you pass {\tt (double *) NULL} instead
+of a {\tt Control} array, then defaults are used.  These defaults provide
+nearly optimal performance (both speed, memory usage, and numerical accuracy)
+for a wide range of matrices from real applications.
+
+This array will almost certainly grow in size in future releases,
+so be sure to dimension your {\tt Control} array to be of size
+{\tt UMFPACK\_CONTROL}.  That constant is currently defined to be 20,
+but may increase in future versions, since all 20 entries are in use.
+
+The contents of this array may be modified by the user
+(see {\tt umfpack\_*\_defaults}).  Each
+user-callable routine includes a complete description of how each control
+setting modifies its behavior.  Table~\ref{control} summarizes the entire
+contents of the {\tt Control} array.
+Note that ANSI C uses 0-based indexing, while MATLAB uses 1-based
+indexing.  Thus, {\tt Control(1)} in MATLAB is the same as
+{\tt Control[0]} or {\tt Control[UMFPACK\_PRL]} in ANSI C.
+
+\begin{table}
+\caption{UMFPACK Control parameters}
+\label{control}
+{\footnotesize
+\begin{tabular}{llll}
+\hline
+
+MATLAB & ANSI C & default & description \\
+\hline
+{\tt Control(1)}  & {\tt Control[UMFPACK\_PRL]} & 1 & printing level \\
+{\tt Control(2)}  & {\tt Control[UMFPACK\_DENSE\_ROW]} & 0.2 & dense row parameter \\
+{\tt Control(3)}  & {\tt Control[UMFPACK\_DENSE\_COL]} & 0.2 & dense column parameter \\
+{\tt Control(4)}  & {\tt Control[UMFPACK\_PIVOT\_TOLERANCE]} & 0.1 & partial pivoting tolerance \\
+{\tt Control(5)}  & {\tt Control[UMFPACK\_BLOCK\_SIZE]} & 32 & BLAS block size \\
+{\tt Control(6)}  & {\tt Control[UMFPACK\_STRATEGY]} & 0 (auto) & select strategy \\
+{\tt Control(7)}  & {\tt Control[UMFPACK\_ALLOC\_INIT]} & 0.7 & initial memory allocation  \\
+{\tt Control(8)}  & {\tt Control[UMFPACK\_IRSTEP]} & 2 & max iter. refinement steps \\
+{\tt Control(13)} & {\tt Control[UMFPACK\_2BY2\_TOLERANCE]} & 0.01 & defines ``large'' entries \\
+{\tt Control(14)} & {\tt Control[UMFPACK\_FIXQ]} & 0 (auto) & fix or modify Q \\
+{\tt Control(15)} & {\tt Control[UMFPACK\_AMD\_DENSE]} & 10 & AMD dense row/column parameter \\
+{\tt Control(16)} & {\tt Control[UMFPACK\_SYM\_PIVOT\_TOLERANCE]} & 0.001 & for diagonal entries \\
+{\tt Control(17)} & {\tt Control[UMFPACK\_SCALE]} & 1 (sum) & row scaling (none, sum, or max) \\
+{\tt Control(18)} & {\tt Control[UMFPACK\_FRONT\_ALLOC\_INIT]} & 0.5 & frontal matrix allocation ratio \\
+{\tt Control(19)} & {\tt Control[UMFPACK\_DROPTOL]} & 0 & drop tolerance \\
+{\tt Control(20)} & {\tt Control[UMFPACK\_AGGRESSIVE]} & 1 (yes) & aggressive absorption \\
+ & & & in AMD and COLAMD \\
+%
+\hline
+\multicolumn{4}{l}{Can only be changed at compile time:} \\
+{\tt Control(9)}  & {\tt Control[UMFPACK\_COMPILED\_WITH\_BLAS]} & - & true if BLAS is used \\
+{\tt Control(10)} & {\tt Control[UMFPACK\_COMPILED\_FOR\_MATLAB]} & - & true for mexFunction \\
+{\tt Control(11)} & {\tt Control[UMFPACK\_COMPILED\_WITH\_GETRUSAGE]} & - & 1 if {\tt getrusage} used \\
+{\tt Control(12)} & {\tt Control[UMFPACK\_COMPILED\_IN\_DEBUG\_MODE]} & - & true if debug mode enabled \\
+\hline
+\end{tabular}
+}
+\end{table}
+
+Let $\alpha_r = ${\tt Control [UMFPACK\_DENSE\_ROW]},
+    $\alpha_c = ${\tt Control [UMFPACK\_DENSE\_COL]}, and
+    $\alpha = ${\tt Control [UMFPACK\_AMD\_DENSE]}.
+Suppose the submatrix $\m{S}$, obtained after eliminating pivots with
+zero Markowitz cost, is $m$-by-$n$.
+Then a row is considered ``dense'' if it has more than
+$\max (16, 16 \alpha_r \sqrt{n})$ entries.
+A column is considered ``dense'' if it has more than
+$\max (16, 16 \alpha_c \sqrt{m})$ entries.
+These rows and columns are treated different in COLAMD and during numerical
+factorization.   In COLAMD, dense columns are placed last in their natural
+order, and dense rows are ignored.  During numerical factorization, dense
+rows are stored differently.
+In AMD, a row/column of the square matrix $\m{S}+\m{S}\tr$ is
+considered ``dense'' if it has more than $\max (16, \alpha \sqrt{n})$ entries.
+These rows/columns are placed last in AMD's output ordering.
+For more details on the control parameters, refer to the documentation of
+{\tt umfpack\_*\_qsymbolic}, {\tt umfpack\_*\_numeric}, {\tt umfpack\_*\_solve},
+and the {\tt umfpack\_*\_report\_*} routines,
+in Sections~\ref{Primary}~through~\ref{Report}, below.
+
+%-------------------------------------------------------------------------------
+\subsection{Error codes}
+\label{error_codes}
+%-------------------------------------------------------------------------------
+
+Many of the routines return a {\tt status} value.
+This is also returned as the first entry in the {\tt Info} array, for
+those routines with that argument.  The following list summarizes
+all of the error codes in UMFPACK.  Each error code is given a
+specific name in the {\tt umfpack.h} include file, so you can use
+those constants instead of hard-coded values in your program.
+Future versions may report additional error codes.
+
+A value of zero means everything was successful, and the matrix is
+non-singular.  A value greater than zero means the routine was successful,
+but a warning occurred.
+A negative value means the routine was not successful.
+In this case, no {\tt Symbolic} or {\tt Numeric} object was created.
+
+\begin{itemize}
+\item {\tt UMFPACK\_OK},  (0):  UMFPACK was successful.
+
+\item {\tt UMFPACK\_WARNING\_singular\_matrix},  (1):  Matrix is singular.
+    There are exact zeros on the diagonal of $\m{U}$.
+
+\item {\tt UMFPACK\_WARNING\_determinant\_underflow}, (2):
+    The determinant is nonzero, but smaller in magnitude than
+    the smallest positive floating-point number.
+
+\item {\tt UMFPACK\_WARNING\_determinant\_overflow}, (3):
+    The determinant is larger in magnitude than
+    the largest positive floating-point number (IEEE Inf).
+
+\item {\tt UMFPACK\_ERROR\_out\_of\_memory},  (-1):  Not enough memory.
+    The ANSI C {\tt malloc} or {\tt realloc} routine failed.
+
+\item {\tt UMFPACK\_ERROR\_invalid\_Numeric\_object},  (-3):  
+    Routines that take a {\tt Numeric} object as input (or load it
+    from a file) check this object and return this error code if it is
+    invalid.  This can be caused by a memory leak or overrun in your
+    program, which can overwrite part of the Numeric object.  It can also
+    be caused by passing a Symbolic object by mistake, or some other pointer.
+    If you try to factorize a matrix using one version of UMFPACK and
+    then use the factors in another version, this error code will trigger as
+    well.  You cannot factor your matrix using
+    version 4.0 and then solve with version 4.1, for example.\footnote{
+    Exception: v4.3, v4.3.1, and v4.4 use identical data structures
+    for the {\tt Numeric} and {\tt Symbolic} objects}.
+    You cannot use different precisions of the same version
+    (real and complex, for example).
+    It is possible for the {\tt Numeric} object to be corrupted by your
+    program in subtle ways that are not detectable by this quick check.
+    In this case, you may see an
+    {\tt UMFPACK\_ERROR\_different\_pattern} error code, or even an
+    {\tt UMFPACK\_ERROR\_internal\_error}.
+
+\item {\tt UMFPACK\_ERROR\_invalid\_Symbolic\_object},  (-4):  
+    Routines that take a {\tt Symbolic} object as input (or load it
+    from a file) check this object and return this error code if it is
+    invalid.  The causes of this error are analogous to the
+    {\tt UMFPACK\_ERROR\_invalid\_Numeric\_object} error described above.
+
+\item {\tt UMFPACK\_ERROR\_argument\_missing},  (-5):  
+    Some arguments of some are optional (you can pass a {\tt NULL} pointer
+    instead of an array).  This error code occurs if you pass a {\tt NULL}
+    pointer when that argument is required to be present.
+
+\item {\tt UMFPACK\_ERROR\_n\_nonpositive}  (-6):  
+    The number of rows or columns of the matrix must be greater than zero.
+
+\item {\tt UMFPACK\_ERROR\_invalid\_matrix}  (-8):  
+    The matrix is invalid.  For the column-oriented input, this error
+    code will occur if the contents of {\tt Ap} and/or {\tt Ai} are invalid.
+
+    {\tt Ap} is an integer array of size {\tt n\_col+1}.
+    On input, it holds the
+    ``pointers'' for the column form of the sparse matrix $\m{A}$.
+    Column {\tt j} of
+    the matrix A is held in {\tt Ai [(Ap [j])} \ldots {\tt (Ap [j+1]-1)]}.
+    The first entry, {\tt Ap [0]}, must be zero,
+    and {\tt Ap [j]} $\le$ {\tt Ap [j+1]} must hold for all
+    {\tt j} in the range 0 to {\tt n\_col-1}.
+    The value {\tt nz = Ap [n\_col]} is thus the
+    total number of entries in the pattern of the matrix A.
+    {\tt nz} must be greater than or equal to zero.
+
+    The nonzero pattern (row indices) for column {\tt j} is stored in
+    {\tt Ai [(Ap [j])} \ldots {\tt (Ap [j+1]-1)]}.  The row indices in a given
+    column {\tt j}
+    must be in ascending order, and no duplicate row indices may be present.
+    Row indices must be in the range 0 to {\tt n\_row-1}
+    (the matrix is 0-based).
+
+    Some routines take a triplet-form input, with arguments
+    {\tt nz}, {\tt Ti}, and {\tt Tj}.  This error code is returned
+    if {\tt nz} is less than zero,
+    if any row    index in {\tt Ti} is outside the range 0 to {\tt n\_col-1}, or
+    if any column index in {\tt Tj} is outside the range 0 to {\tt n\_row-1}.
+
+\item {\tt UMFPACK\_ERROR\_different\_pattern},  (-11):  
+    The most common cause of this error is that the pattern of the
+    matrix has changed between the symbolic and numeric factorization.
+    It can also occur if the {\tt Numeric} or {\tt Symbolic} object has
+    been subtly corrupted by your program.
+
+\item {\tt UMFPACK\_ERROR\_invalid\_system},  (-13):  
+    The {\tt sys} argument provided to one of the solve routines is invalid.
+
+\item {\tt UMFPACK\_ERROR\_invalid\_permutation},  (-15):  
+    The permutation vector provided as input is invalid.
+
+\item {\tt UMFPACK\_ERROR\_file\_IO},  (-17):  
+    This error code is returned by the routines that save and load
+    the {\tt Numeric} or {\tt Symbolic} objects to/from a file, if a
+    file I/O error has occurred.  The file may not exist or may not be readable,
+    you may be trying to create a file that you don't have permission to create,
+    or you may be out of disk space.  The file you are trying to read might
+    be the wrong one, and an earlier end-of-file condition would then result
+    in this error.
+
+\item {\tt UMFPACK\_ERROR\_internal\_error},  (-911):  
+    An internal error has occurred, of unknown cause.  This is either a bug
+    in UMFPACK, or the result of a memory overrun from your program.
+    Try modifying the file {\tt AMD/Source/amd\_internal.h} and adding
+    the statement {\tt \#undef NDEBUG}, to enable the debugging mode.
+    Recompile UMFPACK and rerun your program.
+    A failed assertion might occur which
+    can give you a better indication as to what is going wrong.  Be aware that
+    UMFPACK will be extraordinarily slow when running in debug mode.
+    If all else fails, contact the developer (davis@cise.ufl.edu) with
+    as many details as possible.
+
+\end{itemize}
+
+%-------------------------------------------------------------------------------
+\subsection{Larger examples}
+%-------------------------------------------------------------------------------
+
+Full examples of all user-callable UMFPACK routines
+are available in four stand-alone C main programs, {\tt umfpack\_*\_demo.c}.
+Another example is
+the UMFPACK mexFunction, {\tt umfpackmex.c}.  The mexFunction accesses only the
+user-callable C interface to UMFPACK.  The only features that it does not use
+are the support for the triplet form (MATLAB's sparse arrays are already in the
+compressed column form) and the ability to reuse the {\tt Symbolic} object to
+numerically factorize a matrix whose pattern is the same as a prior matrix
+analyzed by {\tt umfpack\_*\_symbolic} or {\tt umfpack\_*\_qsymbolic}.  The
+latter is an important feature, but the mexFunction does not return its opaque
+{\tt Symbolic} and {\tt Numeric} objects to MATLAB.  Instead, it gets the
+contents of these objects after extracting them via the {\tt umfpack\_*\_get\_*}
+routines, and returns them as MATLAB sparse matrices.
+
+The {\tt umf4.c} program for reading matrices in Harwell/Boeing format
+\cite{DuffGrimesLewis87b} is provided.  It requires three Fortran 77 programs
+({\tt readhb.f}, {\tt readhb\_nozeros.f}, and {\tt readhb\_size.f})
+for reading in the sample Harwell/Boeing files in the {\tt UMFPACK/Demo/HB}
+directory.  More matrices are available at
+http://www.cise.ufl.edu/research/sparse/matrices.
+Type {\tt make hb} in the {\tt UMFPACK/Demo/HB} directory
+to compile and run this demo.  This program was used for the experimental
+results in \cite{Davis03}.
+
+%-------------------------------------------------------------------------------
+\section{Synopsis of C-callable routines}
+\label{Synopsis}
+%-------------------------------------------------------------------------------
+
+Each subsection, below, summarizes the input variables, output variables, return
+values, and calling sequences of the routines in one category.  Variables with
+the same name as those already listed in a prior category have the same size
+and type.
+
+The real, {\tt long} integer {\tt umfpack\_dl\_*} routines are
+identical to the real, {\tt int} routines, except that {\tt \_di\_} is replaced
+with {\tt \_dl\_} in the name, and all {\tt int} arguments become {\tt long}.
+Similarly, the complex, {\tt long} integer {\tt umfpack\_zl\_*} routines are
+identical to the complex, {\tt int} routines, except that {\tt \_zi\_} is
+replaced
+with {\tt \_zl\_} in the name, and all {\tt int} arguments become {\tt long}.
+Only the real and complex {\tt int} versions are listed in the synopsis below.
+
+The matrix $\m{A}$ is {\tt m}-by-{\tt n} with {\tt nz} entries.
+
+The {\tt sys} argument of {\tt umfpack\_*\_solve}
+is an integer in the range 0 to 14 which defines which linear system is
+to be solved.
+\footnote{Integer values for {\tt sys} are used instead of strings (as in LINPACK
+and LAPACK) to avoid C-to-Fortran portability issues.}
+Valid values are listed in Table~\ref{sys}.
+The notation $\m{A}\he$ refers to the matrix transpose, which is the
+complex conjugate transpose for complex matrices ({\tt A'} in MATLAB).
+The array transpose is $\m{A}\tr$, which is {\tt A.'} in MATLAB.
+
+\begin{table}
+\begin{center}
+\caption{UMFPACK {\tt sys} parameter}
+\label{sys}
+{\footnotesize
+\begin{tabular}{ll|l}
+\hline
+Value & & system \\
+\hline
+& & \\
+{\tt UMFPACK\_A}      &  (0) & $\m{Ax}=\m{b}$ \\
+{\tt UMFPACK\_At}     &  (1) & $\m{A}\he\m{x}=\m{b}$ \\
+{\tt UMFPACK\_Aat}    &  (2) & $\m{A}\tr\m{x}=\m{b}$ \\
+& & \\
+\hline
+& & \\
+{\tt UMFPACK\_Pt\_L}  &  (3) & $\m{P}\tr\m{Lx}=\m{b}$ \\
+{\tt UMFPACK\_L}      &  (4) & $\m{Lx}=\m{b}$ \\
+{\tt UMFPACK\_Lt\_P}  &  (5) & $\m{L}\he\m{Px}=\m{b}$ \\
+{\tt UMFPACK\_Lat\_P} &  (6) & $\m{L}\tr\m{Px}=\m{b}$ \\
+{\tt UMFPACK\_Lt}     &  (7) & $\m{L}\he\m{x}=\m{b}$ \\
+{\tt UMFPACK\_Lat}    &  (8) & $\m{L}\tr\m{x}=\m{b}$ \\
+& & \\
+\hline
+& & \\
+{\tt UMFPACK\_U\_Qt}  &  (9) & $\m{UQ}\tr\m{x}=\m{b}$ \\
+{\tt UMFPACK\_U}      & (10) & $\m{Ux}=\m{b}$ \\
+{\tt UMFPACK\_Q\_Ut}  & (11) & $\m{QU}\he\m{x}=\m{b}$ \\
+{\tt UMFPACK\_Q\_Uat} & (12) & $\m{QU}\tr\m{x}=\m{b}$ \\
+{\tt UMFPACK\_Ut}     & (13) & $\m{U}\he\m{x}=\m{b}$ \\
+{\tt UMFPACK\_Uat}    & (14) & $\m{U}\tr\m{x}=\m{b}$ \\
+& & \\
+\hline
+\end{tabular}
+}
+\end{center}
+\end{table}
+
+%-------------------------------------------------------------------------------
+\subsection{Primary routines: real/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+#include "umfpack.h"
+int status, sys, n, m, nz, Ap [n+1], Ai [nz] ;
+double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], Ax [nz], X [n], B [n] ;
+void *Symbolic, *Numeric ;
+
+status = umfpack_di_symbolic (m, n, Ap, Ai, Ax, &Symbolic, Control, Info) ;
+status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info) ;
+status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ;
+umfpack_di_free_symbolic (&Symbolic) ;
+umfpack_di_free_numeric (&Numeric) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{Alternative routines: real/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+int Qinit [n], Wi [n] ;
+double W [5*n] ;
+
+umfpack_di_defaults (Control) ;
+status = umfpack_di_qsymbolic (m, n, Ap, Ai, Ax, Qinit, &Symbolic, Control, Info) ;
+status = umfpack_di_wsolve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info, Wi, W) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{Matrix manipulation routines: real/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+int Ti [nz], Tj [nz], P [m], Q [n], Rp [m+1], Ri [nz], Map [nz] ;
+double Tx [nz], Rx [nz], Y [m], Z [m] ;
+
+status = umfpack_di_col_to_triplet (n, Ap, Tj) ;
+status = umfpack_di_triplet_to_col (m, n, nz, Ti, Tj, Tx, Ap, Ai, Ax, Map) ;
+status = umfpack_di_transpose (m, n, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ;
+status = umfpack_di_scale (Y, Z, Numeric) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{Getting the contents of opaque objects: real/{\tt int}}
+%-------------------------------------------------------------------------------
+
+The {\tt filename} string should be large enough to hold the name of a file.
+
+{\footnotesize
+\begin{verbatim}
+int lnz, unz, Lp [m+1], Lj [lnz], Up [n+1], Ui [unz], do_recip ;
+double Lx [lnz], Ux [unz], D [min (m,n)], Rs [m], Mx [1], Ex [1] ;
+int nfr, nchains, P1 [m], Q1 [n], Front_npivcol [n+1], Front_parent [n+1], Front_1strow [n+1],
+    Front_leftmostdesc [n+1], Chain_start [n+1], Chain_maxrows [n+1], Chain_maxcols [n+1] ;
+char filename [100] ;
+
+status = umfpack_di_get_lunz (&lnz, &unz, &m, &n, &nz_udiag, Numeric) ;
+status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, D,
+    &do_recip, Rs, Numeric) ;
+status = umfpack_di_get_symbolic (&m, &n, &n1, &nz, &nfr, &nchains, P1, Q1,
+    Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc,
+    Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ;
+status = umfpack_di_load_numeric (&Numeric, filename) ;
+status = umfpack_di_save_numeric (Numeric, filename) ;
+status = umfpack_di_load_symbolic (&Symbolic, filename) ;
+status = umfpack_di_save_symbolic (Symbolic, filename) ;
+status = umfapck_di_get_determinant (Mx, Ex, Numeric, Info) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{Reporting routines: real/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+
+umfpack_di_report_status (Control, status) ;
+umfpack_di_report_control (Control) ;
+umfpack_di_report_info (Control, Info) ;
+status = umfpack_di_report_matrix (m, n, Ap, Ai, Ax, 1, Control) ;
+status = umfpack_di_report_matrix (m, n, Rp, Ri, Rx, 0, Control) ;
+status = umfpack_di_report_numeric (Numeric, Control) ;
+status = umfpack_di_report_perm (m, P, Control) ;
+status = umfpack_di_report_perm (n, Q, Control) ;
+status = umfpack_di_report_symbolic (Symbolic, Control) ;
+status = umfpack_di_report_triplet (m, n, nz, Ti, Tj, Tx, Control) ;
+status = umfpack_di_report_vector (n, X, Control) ;
+\end{verbatim}
+}
+
+
+
+
+
+
+%-------------------------------------------------------------------------------
+\subsection{Primary routines: complex/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+double Az [nz], Xx [n], Xz [n], Bx [n], Bz [n] ;
+
+status = umfpack_zi_symbolic (m, n, Ap, Ai, Ax, Az, &Symbolic, Control, Info) ;
+status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric, Control, Info) ;
+status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, Control, Info) ;
+umfpack_zi_free_symbolic (&Symbolic) ;
+umfpack_zi_free_numeric (&Numeric) ;
+\end{verbatim}
+}
+
+The arrays {\tt Ax}, {\tt Bx}, and {\tt Xx} double in size if
+any imaginary argument ({\tt Az}, {\tt Xz}, or {\tt Bz}) is {\tt NULL}.
+
+%-------------------------------------------------------------------------------
+\subsection{Alternative routines: complex/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+double Wz [10*n] ;
+
+umfpack_zi_defaults (Control) ;
+status = umfpack_zi_qsymbolic (m, n, Ap, Ai, Ax, Az, Qinit, &Symbolic, Control, Info) ;
+status = umfpack_zi_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric, Control, Info, Wi, Wz) ;
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{Matrix manipulation routines: complex/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+double Tz [nz], Rz [nz], Yx [m], Yz [m], Zx [m], Zz [m] ;
+
+status = umfpack_zi_col_to_triplet (n, Ap, Tj) ;
+status = umfpack_zi_triplet_to_col (m, n, nz, Ti, Tj, Tx, Tz, Ap, Ai, Ax, Az, Map) ;
+status = umfpack_zi_transpose (m, n, Ap, Ai, Ax, Az, P, Q, Rp, Ri, Rx, Rz, 1) ;
+status = umfpack_zi_transpose (m, n, Ap, Ai, Ax, Az, P, Q, Rp, Ri, Rx, Rz, 0) ;
+status = umfpack_zi_scale (Yx, Yz, Zx, Zz, Numeric) ;
+\end{verbatim}
+}
+
+The arrays {\tt Tx}, {\tt Rx}, {\tt Yx}, and {\tt Zx} double in size if
+any imaginary argument ({\tt Tz}, {\tt Rz}, {\tt Yz}, or {\tt Zz}) is {\tt NULL}.
+
+%-------------------------------------------------------------------------------
+\subsection{Getting the contents of opaque objects: complex/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+double Lz [lnz], Uz [unz], Dx [min (m,n)], Dz [min (m,n)], Mz [1] ;
+
+status = umfpack_zi_get_lunz (&lnz, &unz, &m, &n, &nz_udiag, Numeric) ;
+status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q, Dx, Dz,
+    &do_recip, Rs, Numeric) ;
+status = umfpack_zi_get_symbolic (&m, &n, &n1, &nz, &nfr, &nchains, P1, Q1,
+    Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc,
+    Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ;
+status = umfpack_zi_load_numeric (&Numeric, filename) ;
+status = umfpack_zi_save_numeric (Numeric, filename) ;
+status = umfpack_zi_load_symbolic (&Symbolic, filename) ;
+status = umfpack_zi_save_symbolic (Symbolic, filename) ;
+status = umfapck_zi_get_determinant (Mx, Mz, Ex, Numeric, Info) ;
+\end{verbatim}
+}
+
+The arrays {\tt Lx}, {\tt Ux}, {\tt Dx}, and {\tt Mx} double in size if
+any imaginary argument ({\tt Lz}, {\tt Uz}, {\tt Dz}, or {\tt Mz}) is {\tt NULL}.
+
+%-------------------------------------------------------------------------------
+\subsection{Reporting routines: complex/{\tt int}}
+%-------------------------------------------------------------------------------
+
+{\footnotesize
+\begin{verbatim}
+
+umfpack_zi_report_status (Control, status) ;
+umfpack_zi_report_control (Control) ;
+umfpack_zi_report_info (Control, Info) ;
+status = umfpack_zi_report_matrix (m, n, Ap, Ai, Ax, Az, 1, Control) ;
+status = umfpack_zi_report_matrix (m, n, Rp, Ri, Rx, Rz, 0, Control) ;
+status = umfpack_zi_report_numeric (Numeric, Control) ;
+status = umfpack_zi_report_perm (m, P, Control) ;
+status = umfpack_zi_report_perm (n, Q, Control) ;
+status = umfpack_zi_report_symbolic (Symbolic, Control) ;
+status = umfpack_zi_report_triplet (m, n, nz, Ti, Tj, Tx, Tz, Control) ;
+status = umfpack_zi_report_vector (n, Xx, Xz, Control) ;
+\end{verbatim}
+}
+
+The arrays {\tt Ax}, {\tt Rx}, {\tt Tx}, and {\tt Xx} double in size if
+any imaginary argument ({\tt Az}, {\tt Rz}, {\tt Tz}, or {\tt Xz}) is {\tt NULL}.
+
+
+
+
+%-------------------------------------------------------------------------------
+\subsection{Utility routines}
+%-------------------------------------------------------------------------------
+
+These routines are the same in all four versions of UMFPACK.
+
+{\footnotesize
+\begin{verbatim}
+double t, s [2] ;
+
+t = umfpack_timer ( ) ;
+umfpack_tic (s) ;
+umfpack_toc (s) ;
+
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\subsection{AMD ordering routines}
+%-------------------------------------------------------------------------------
+
+UMFPACK makes use of the AMD ordering package for its symmetric ordering
+strategy.  You may also use these four user-callable routines in your own C
+programs.  You need to include the {\tt amd.h} file only if you make direct
+calls to the AMD routines themselves.  The {\tt int} versions are summarized
+below; {\tt long} versions are also available.  Refer to the AMD User Guide
+for more information, or to the file {\tt amd.h} which documents these routines.
+
+{\footnotesize
+\begin{verbatim}
+#include "amd.h"
+double amd_control [AMD_CONTROL], amd_info [AMD_INFO] ;
+
+amd_defaults (amd_control) ;
+status = amd_order (n, Ap, Ai, P, amd_control, amd_info) ;
+amd_control (amd_control) ;
+amd_info (amd_info) ;
+
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\section{Using UMFPACK in a Fortran program}
+%-------------------------------------------------------------------------------
+
+UMFPACK includes a basic Fortran 77 interface to some of the C-callable
+UMFPACK routines.
+Since interfacing C and Fortran programs is not portable, this interface might
+not work with all C and Fortran compilers.  Refer to Section~\ref{Install} for
+more details.  The following Fortran routines are provided.
+The list includes the C-callable routines that the Fortran interface
+routine calls.  Refer to the corresponding C routines in Section~\ref{C} for
+more details on what the Fortran routine does.
+
+\begin{itemize}
+\item {\tt umf4def}: sets the default control parameters
+    ({\tt umfpack\_di\_defaults}).
+
+\item {\tt umf4sym}: pre-ordering and symbolic factorization
+    ({\tt umfpack\_di\_symbolic}).
+
+\item {\tt umf4num}: numeric factorization
+    ({\tt umfpack\_di\_numeric}).
+
+\item {\tt umf4solr}: solve a linear system with iterative refinement
+    ({\tt umfpack\_di\_solve}).
+
+\item {\tt umf4sol}: solve a linear system without iterative refinement
+    ({\tt umfpack\_di\_solve}).  Sets {\tt Control [UMFPACK\_IRSTEP]}
+    to zero, and does not require the matrix $\m{A}$.
+
+\item {\tt umf4scal}: scales a vector using UMFPACK's scale factors
+    ({\tt umfpack\_di\_scale}).
+
+\item {\tt umf4fnum}: free the {\tt Numeric} object
+    ({\tt umfpack\_di\_free\_numeric}).
+
+\item {\tt umf4fsym}: free the {\tt Symbolic} object
+    ({\tt umfpack\_di\_free\_symbolic}).
+
+\item {\tt umf4pcon}: prints the control parameters
+    ({\tt umfpack\_di\_report\_control}).
+
+\item {\tt umf4pinf}: print statistics
+    ({\tt umfpack\_di\_report\_info}).
+
+\item {\tt umf4snum}: save the {\tt Numeric} object to a file
+    ({\tt umfpack\_di\_save\_numeric}).
+
+\item {\tt umf4ssym}: save the {\tt Symbolic} object to a file
+    ({\tt umfpack\_di\_save\_symbolic}).
+
+\item {\tt umf4lnum}: load the {\tt Numeric} object from a file
+    ({\tt umfpack\_di\_load\_numeric}).
+
+\item {\tt umf4lsym}: load the {\tt Symbolic} object from a file
+    ({\tt umfpack\_di\_load\_symbolic}).
+\end{itemize}
+
+The matrix $\m{A}$ is passed to UMFPACK in compressed column form, with 0-based
+indices.  In Fortran, for an {\tt m}-by-{\tt n} matrix $\m{A}$ with {\tt nz}
+entries, the row indices of the first column (column 1) are in
+{\tt Ai (Ap(1)+1} \ldots {\tt Ap(2))}, with values in
+{\tt Ax (Ap(1)+1} \ldots {\tt Ap(2))}.  The last column (column {\tt n}) is in
+{\tt Ai (Ap(n)+1} \ldots {\tt Ap(n+1))} and
+{\tt Ax (Ap(n)+1} \ldots {\tt Ap(n+1))}.
+The number of entries in the matrix is thus {\tt nz = Ap (n+1)}.
+The row indices in {\tt Ai} are in the range 0 to {\tt m}-1.  They must be
+sorted, with no duplicate entries allowed.  None of the UMFPACK routines
+modify the input matrix $\m{A}$.
+The following definitions apply for the Fortran routines:
+
+{\footnotesize
+\begin{verbatim}
+    integer m, n, Ap (n+1), Ai (nz), symbolic, numeric, filenum, status
+    double precision Ax (nz), control (20), info (90), x (n), b (n)
+\end{verbatim}
+}
+
+UMFPACK's status is returned in either a {\tt status} argument, or in
+{\tt info (1)}.
+It is zero if UMFPACK was successful, 1 if the matrix is singular (this is a
+warning, not an error), and negative if an error occurred.
+Section~\ref{error_codes} summarizes the possible values of {\tt status}
+and {\tt info (1)}.
+See Table~\ref{sys} for a list of the values of the {\tt sys} argument.
+See Table~\ref{control} for a list of the control parameters (the
+Fortran usage is the same as the MATLAB usage for this array).
+
+For the {\tt Numeric} and {\tt Symbolic} handles, it is probably safe to
+assume that a Fortran {\tt integer} is sufficient to store a C pointer.  If
+that does not work, try defining {\tt numeric} and {\tt symbolic} in your
+Fortran program as integer arrays of size 2.  You will need to define them
+as {\tt integer*8} if you compile UMFPACK in the 64-bit mode.
+
+To avoid passing strings between C and Fortran in the load/save routines,
+a file number is passed instead, and the C interface constructs a file name
+(if {\tt filenum} is 42, the {\tt Numeric} file name is {\tt n42.umf}, and
+the {\tt Symbolic} file name is {\tt s42.umf}).
+
+The following is a summary of the calling sequence of each Fortran
+interface routine.  An example of their use is in the {\tt Demo/umf4hb.f}
+file.  That routine also includes an example of how to convert a 1-based
+sparse matrix into 0-based form.  For more details on the arguments of each
+routine, refer to the arguments of the same name in the corresponding
+C-callable routine, in Sections~\ref{Primary}~through~\ref{Utility}.
+The only exception is the {\tt control} argument of {\tt umf4sol},
+which sets {\tt control (8)} to zero to disable iterative refinement.
+Note that the solve routines do not overwrite {\tt b} with the solution,
+but return their solution in a different array, {\tt x}.
+
+{\footnotesize
+\begin{verbatim}
+    call umf4def (control)
+    call umf4sym (m, n, Ap, Ai, Ax, symbolic, control, info)
+    call umf4num (Ap, Ai, Ax, symbolic, numeric, control, info)
+    call umf4solr (sys, Ap, Ai, Ax, x, b, numeric, control, info)
+    call umf4sol (sys, x, b, numeric, control, info)
+    call umf4scal (x, b, numeric, status)
+    call umf4fnum (numeric)
+    call umf4fsym (symbolic)
+    call umf4pcon (control)
+    call umf4pinf (control)
+    call umf4snum (numeric, filenum, status)
+    call umf4ssym (symbolic, filenum, status)
+    call umf4lnum (numeric, filenum, status)
+    call umf4lsym (symbolic, filenum, status)
+\end{verbatim}
+}
+
+Access to the complex routines in UMFPACK is provided by the interface
+routines in {\tt umf4\_f77zwrapper.c}.  The following is a synopsis
+of each routine.  All the arguments are the same as the real versions,
+except {\tt Az}, {\tt xz}, and {\tt bz} are the imaginary parts of
+the matrix, solution, and right-hand-side, respectively.  The
+{\tt Ax}, {\tt x}, and {\tt b} are the real parts.
+
+{\footnotesize
+\begin{verbatim}
+    call umf4zdef (control)
+    call umf4zsym (m, n, Ap, Ai, Ax, Az, symbolic, control, info)
+    call umf4znum (Ap, Ai, Ax, Az, symbolic, numeric, control, info)
+    call umf4zsolr (sys, Ap, Ai, Ax, Az, x, xz, b, bz, numeric, control, info)
+    call umf4zsol (sys, x, xz, b, bz, numeric, control, info)
+    call umf4zscal (x, xz, b, bz, numeric, status)
+    call umf4zfnum (numeric)
+    call umf4zfsym (symbolic)
+    call umf4zpcon (control)
+    call umf4zpinf (control)
+    call umf4zsnum (numeric, filenum, status)
+    call umf4zssym (symbolic, filenum, status)
+    call umf4zlnum (numeric, filenum, status)
+    call umf4zlsym (symbolic, filenum, status)
+\end{verbatim}
+}
+
+The Fortran interface does not support the packed complex case.
+
+%-------------------------------------------------------------------------------
+\section{Installation}
+\label{Install}
+%-------------------------------------------------------------------------------
+
+%-------------------------------------------------------------------------------
+\subsection{Installing the C library}
+%-------------------------------------------------------------------------------
+
+The following discussion assumes you have the {\tt make} program, either in
+Unix, or in Windows with Cygwin\footnote{www.cygwin.com}.
+You can skip this section and go to next one if all you want to use is
+the UMFPACK and AMD mexFunctions in MATLAB.
+
+You will need to install both UMFPACK v4.4 and AMD v1.1 (or AMD v1.0) to use UMFPACK.
+The {\tt UMFPACK} and {\tt AMD} subdirectories must be placed side-by-side
+within the same directory.  AMD is a stand-alone package that
+is required by UMFPACK.  UMFPACK can be compiled without the
+BLAS \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02},
+but your performance will be much less than what it should be.
+
+System-dependent configurations are in the {\tt AMD/Make}
+and {\tt UMFPACK/Make} directories (the \newline
+{\tt UMFPACK/Make} directory is actually
+just a symbolic link to {\tt AMD/Make}\footnote{Windows might not extract
+the symbolic link {\tt UMFPACK/Make} correctly.  If it doesn't, simply
+create the {\tt UMFPACK/Make} folder by copying it from {\tt AMD/Make}.}).
+You can edit the {\tt Make.include}
+files in either of those directories to customize the compilation.  The default
+settings will work on most systems, except that UMFPACK will be compiled so
+that it does not use the BLAS.  Sample configuration files are provided
+for Linux, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha.
+
+To compile and install both packages,
+go to the {\tt UMFPACK} directory and type {\tt make}.  This will compile the
+libraries ({\tt AMD/Lib/libamd.a} and {\tt UMFPACK/Lib/libumfpack.a}).
+A demo of the AMD ordering routine will be compiled and tested in
+the {\tt AMD/Demo} directory, and five demo programs will then be
+compiled and tested in the {\tt UMFPACK/Demo} directory.
+The outputs of these demo programs will then be compared with output
+files in the distribution.  Expect to see a few differences, such as
+residual norms, compile-time control settings, and perhaps memory usage
+differences.  The AMD and UMFPACK mexFunctions for
+use in MATLAB will also be compiled.  If you do not have MATLAB 6.0 or
+later, type {\tt make lib} instead.
+
+If you have the GNU version of {\tt make}, the {\tt Source/GNUmakefile} and
+{\tt MATLAB/GNUmakefile} files are used.  These are much more concise than
+what the ``old'' version of {\tt make} can handle.  If you do not have
+GNU {\tt make}, the {\tt Source/Makefile} and {\tt MATLAB/Makefile} files
+are used instead.  Each UMFPACK source file is compiled into four
+versions ({\tt double} / complex, and {\tt int} / {\tt long}).  A proper
+old-style {\tt Makefile} is cumbersome in this case, so these two
+{\tt Makefile}'s have been constructed by brute force.  They ignore
+dependencies, and simply compile everything.  I highly recommend using GNU
+{\tt make} if you wish to modify UMFPACK.
+
+If you compile UMFPACK and AMD and then later change the {\tt Make.include}
+file or your system-specific configuration file such as {\tt Make.linux},
+then you should type {\tt make purge} and then {\tt make} to recompile.
+
+Here are the various parameters that you can control in your
+{\tt Make.include} file:
+
+\begin{itemize}
+\item {\tt CC = } your C compiler, such as {\tt cc}.
+\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed.
+\item {\tt CFLAGS = } optimization flags, such as {\tt -O}.
+    Add {\tt -DLP64} if you are compiling in 64-bit mode
+    (32 bit {\tt int}'s, 64 bit {\tt long}'s, and 64 bit pointers).
+\item {\tt CONFIG = } configuration settings for the BLAS, memory allocation
+    routines, and timing routines.
+\item {\tt LIB = } your libraries, such as {\tt -lm} or {\tt -lblas}.
+\item {\tt RM =} the command to delete a file.
+\item {\tt MV =} the command to rename a file.
+\item {\tt MEX =} the command to compile a MATLAB mexFunction.
+    If you are using MATLAB 5, you need to add {\tt -DNBLAS} and
+    {\tt -DNUTIL} to this command.  An example is provided in
+    the {\tt Make/Make.include} file.
+\item {\tt F77 =} the command to compile a Fortran program (optional).
+\item {\tt F77FLAGS =} the Fortran compiler flags (optional).
+\item {\tt F77LIB =} the Fortran libraries (optional).
+\end{itemize}
+
+The {\tt CONFIG} string can include combinations of the following;
+most deal with how the BLAS are called:
+\begin{itemize}
+\item {\tt -DNBLAS} if you do not have any BLAS at all.
+\item {\tt -DCBLAS} if you have the C-BLAS \cite{ATLAS}.
+\item {\tt -DNSUNPERF} if you are on Solaris but do not have the Sun
+    Performance Library (for the BLAS).
+\item {\tt -DNSCSL} if you on SGI IRIX but do not have the SCSL BLAS library.
+\item {\tt -DLONGBLAS} if your BLAS can take {\tt long} integer input
+    arguments.  If not defined, then the {\tt umfpack\_*l\_*} versions of
+    UMFPACK that use {\tt long} integers do not call the BLAS.
+    This flag is set internally when using the Sun Performance BLAS
+    or SGI's SCSL BLAS (both have 64-bit versions of the BLAS).
+\item Options for controlling how C calls the Fortran BLAS:
+    {\tt -DBLAS\_BY\_VALUE}, {\tt -DBLAS\_NO\_UNDERSCORE},
+    and {\tt -DBLAS\_CHAR\_ARG}.  These are set automatically for Windows,
+    Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and
+    AIX (the IBM RS 6000).  They are ignored if you are using
+    the C-BLAS interface to the BLAS.
+\item {\tt -DGETRUSAGE} if you have the {\tt getrusage} function.
+\item {\tt -DNUTIL} if you wish to compile the MATLAB-callable
+    UMFPACK mexFunction with the {\tt mxMalloc}, {\tt mxRealloc}
+    and {\tt mxFree} routines, instead of the undocumented (but
+    superior) {\tt utMalloc}, {\tt utRealloc}, and {\tt utFree}
+    routines.  The default is to use the {\tt ut*} routines on
+    Unix, and the {\tt mx*} routines on Windows.
+\item {\tt -DNPOSIX} if you do not have the POSIX-compliant
+    {\tt sysconf} and {\tt times} routines used by
+    {\tt umfpack\_tic} and {\tt umfpack\_toc}.
+\item {\tt -DNRECIPROCAL} controls a trade-off between speed and accuracy.
+    If defined (or if the pivot value itself is less than $10^{-12}$),
+    then the pivot column is divided by the pivot value during numeric
+    factorization.  Otherwise, it is multiplied by the reciprocal of the
+    pivot, which is faster but can be less accurate.  The default is
+    to multiply by the reciprocal unless the pivot value is small.
+    This option also modifies how the rows of the matrix $\m{A}$ are
+    scaled.  If {\tt -DNRECIPROCAL} is defined (or if any scale factor is
+    less than $10^{-12}$), entries in the rows of $\m{A}$ are divided
+    by the scale factors.  Otherwise, they are multiplied by the reciprocal.
+    When compiling the complex routines with the GNU {\tt gcc} compiler, the
+    pivot column is always divided by the pivot entry, because of a
+    numerical accuracy issue encountered with {\tt gcc} version 3.2 with a
+    few complex matrices on a Pentium 4M (running Linux).  You can still
+    use {\tt -DNRECIPROCAL} to control how the scale factors
+    for the rows of $\m{A}$ are applied.
+\item {\tt -DNO\_DIVIDE\_BY\_ZERO} controls how UMFPACK treats zeros
+    on the diagonal of $\m{U}$, for a singular matrix $\m{A}$.
+    If defined, then no division by
+    zero is performed (a zero entry on the diagonal of $\m{U}$ is
+    treated as if it were equal to one).  By default,
+    UMFPACK will divide by zero.
+\item {\tt -DNO\_TIMER} controls whether or not timing routines
+    are to be called.  If defined, no timers are used.
+    Timers are included by default.
+\end{itemize}
+
+If a Fortran BLAS package is used you may see compiler warnings.  The BLAS
+routines
+{\tt dgemm}, {\tt dgemv}, {\tt dger}, {\tt dtrsm}, {\tt dtrsv}, {\tt dscal}
+and their corresponding complex versions are used.
+Header files are not provided for the Fortran
+BLAS.  You may safely ignore all of these warnings.
+
+I highly recommend the recent BLAS by Goto and van de Geijn
+\cite{GotoVandeGeijn02}.  Using this BLAS increased the performance
+of UMFPACK by up to 50\% on a Dell Latitude C840 laptop (2GHz Pentium 4M,
+512K L2 cache, 1GB main memory).  The peak performance of
+{\tt umfpack\_di\_numeric} with Goto and van de Geijn's BLAS is 1.6 Gflops
+on this computer.  In MATLAB, the peak performance of UMFPACK on
+a dense matrix (stored in sparse format) is 900 Mflops, as compared to
+1 Gflop for {\tt x = A}$\backslash${\tt b}
+when {\tt A} is stored as a regular full matrix.
+
+When you compile your program that uses the C-callable UMFPACK library,
+you need to link your program with both libraries
+({\tt UMFPACK/Lib/libumfpack.a} and {\tt AMD/Lib/libamd.a})
+and you need to tell your compiler to look in the
+directories {\tt UMFPACK/Include} and {\tt AMD/Include} for include
+files.  See {\tt UMFPACK/Demo/Makefile} for an example.
+You do not need to directly include any AMD include files in your
+program, unless you directly call AMD routines.  You only need the
+\begin{verbatim}
+#include "umfpack.h"
+\end{verbatim}
+statement, as described in Section~\ref{Synopsis}.
+
+If you would like to compile both 32-bit and 64-bit versions of the libraries,
+you will need to do it in two steps.  Modify your {\tt Make/Make.<arch>}
+file, and select the 32-bit option.  Type {\tt make} in the {\tt UMFPACK}
+directory, which creates the {\tt UMFPACK/Lib/libumfpack.a} and
+{\tt AMD/Lib/libamd.a} libraries.  Rename those two files.  Edit your
+{\tt Make/Make.<arch>} and select the 64-bit option.   Type {\tt make purge},
+and then {\tt make}, and you will create the 64-bit libraries.
+You can use the same {\tt umfpack.h} include file for both 32-bit and
+64-bit versions.  Simply link your program with the appropriate 32-bit
+or 64-bit compiled version of the UMFPACK and AMD libraries.
+
+Type {\tt make hb} in the {\tt UMFPACK/Demo/HB} directory
+to compile and run a C program that reads in and factorizes
+Harwell/Boeing matrices.  Note that this uses a stand-alone Fortran
+program to read in the Fortran-formatted Harwell/Boeing matrices and
+write them to a file which can be read by a C program.
+
+The {\tt umf\_multicompile.c} file has been added to assist in the
+compilation of UMFPACK in Microsoft Visual Studio, for Windows.
+
+%-------------------------------------------------------------------------------
+\subsection{Installing the MATLAB interface}
+%-------------------------------------------------------------------------------
+
+If all you want to do is use the UMFPACK mexFunction in MATLAB, you can skip
+the use of the {\tt make} command described above.  Simply type
+{\tt umfpack\_make} in MATLAB while in the {\tt UMFPACK/MATLAB} directory.
+You can also type {\tt amd\_make} in the {\tt AMD/MATLAB} directory
+to compile the stand-alone AMD mexFunction (this is not required to
+compile the UMFPACK mexFunction).  This works on any computer with MATLAB,
+including Windows.
+
+You will be prompted to select several configuration options, including
+whether or not to use the BLAS.
+MATLAB 5.3 (or earlier) does not include the BLAS, so you either have to
+compile UMFPACK without the BLAS (UMFPACK will be slow), or modify your
+{\tt <matlab>/bin/mexopts.sh} by adding your BLAS library
+to the {\tt CLIBS} string,
+where {\tt <matlab>} is the directory in which MATLAB is installed.
+
+If you are using Windows and the {\tt lcc} compiler bundled with
+MATLAB 6.1, then you may need to copy the
+{\tt UMFPACK}$\backslash${\tt MATLAB}$\backslash${\tt lcc\_lib}$\backslash${\tt libmwlapack.lib}
+file into the
+{\tt <matlab>}$\backslash${\tt extern}$\backslash${\tt lib}$\backslash${\tt win32}$\backslash${\tt lcc}$\backslash$
+directory.
+Next, type {\tt mex -setup}
+at the MATLAB prompt, and ask MATLAB to select the {\tt lcc} compiler.
+MATLAB 6.1 has built-in BLAS, but in that version of MATLAB the BLAS
+cannot be accessed by a mexFunction compiled by {\tt lcc} without first copying
+this file to the location listed above.
+If you have MATLAB 6.5 or later, you can probably skip this step.
+
+%-------------------------------------------------------------------------------
+\subsection{Installing the Fortran interface}
+%-------------------------------------------------------------------------------
+
+Once the 32-bit C-callable UMFPACK library is compiled, you can also compile
+the Fortran interface, by typing {\tt make fortran}.  This will create
+the {\tt umf4hb} program, test it, and compare the output with the
+file {\tt umf4hb.out} in the distribution.
+If you compiled UMFPACK in 64-bit mode, you need to use {\tt make fortran64}
+instead, which compiles the {\tt umf4hb64} program and compares its output
+with the file {\tt umf4hb64.out}.
+Refer to the comments in the {\tt Demo/umf4\_f77wrapper.c} file
+for more details.
+
+This interface is {\bf highly} non-portable, since it depends
+on how C and Fortran are interfaced.
+Because of this issue, the interface is included in the {\tt Demo} directory,
+and not as a primary part of the UMFPACK library.  The interface routines are
+not included in the compiled {\tt UMFPACK/Lib/libumfpack.a} library, but left
+as stand-alone compiled files ({\tt umf4\_f77wrapper.o} and
+{\tt umf4\_f77wrapper64.o} in the {\tt Demo} directory).
+You may need to modify the interface routines in the file
+{\tt umf4\_f77wrapper.c} if you are using compilers for which this interface
+has not been tested.
+
+%-------------------------------------------------------------------------------
+\subsection{Known Issues}
+%-------------------------------------------------------------------------------
+
+The Microsoft C or C++ compilers on a Pentium badly break the IEEE 754 standard,
+and do not treat NaN's properly.  According to IEEE 754, the expression
+{\tt (x != x)} is supposed to be true if and only if {\tt x} is NaN.  For
+non-compliant compilers in Windows that expression is always false, and another
+test must be used: {\tt (x < x)} is true if and only if {\tt x}
+is NaN.  For compliant compilers, {\tt (x < x)} is always false, for any
+value of {\tt x} (including NaN).
+To cover both cases, UMFPACK when running under Microsoft Windows
+defines the following macro, which is true if and only if {\tt x} is NaN,
+regardless of whether your compiler is compliant or not:
+
+\begin{verbatim}
+#define SCALAR_IS_NAN(x) (((x) != (x)) || ((x) < (x)))
+\end{verbatim}
+
+If your compiler breaks this test, then UMFPACK will fail catastrophically
+if it encounters a NaN.  You will not just see NaN's in your output; UMFPACK
+will probably crash with a segmentation fault.  In that case, you might try to
+see if the common (but non-ANSI C) routine {\tt isnan} is available, and modify
+the macro {\tt SCALAR\_IS\_NAN} in {\tt umf\_version.h} accordingly.  The
+simpler (and IEEE 754-compliant) test {\tt (x != x)} is always true with Linux
+on a PC, and on every Unix compiler I have tested.
+
+Some compilers will complain about the Fortran BLAS being defined implicitly.
+C prototypes for the BLAS are not used, except the C-BLAS.  Some compilers
+will complain about unrecognized {\tt \#pragma}'s.  You may safely ignore
+all of these warnings.
+
+%-------------------------------------------------------------------------------
+\section{Future work}
+\label{Future}
+%-------------------------------------------------------------------------------
+
+Here are a few features that are not in UMFPACK Version 4.4, in no particular
+order.  They may appear in a future release of UMFPACK.  If you are interested,
+let me know and I could consider including them:
+
+\begin{enumerate}
+
+\item Future versions may have different default {\tt Control} parameters.
+    Future versions may return more statistics in the {\tt Info} array, and
+    they may use more entries in the {\tt Control} array.
+    These two arrays will probably become larger, since there are very few
+    unused entries.  If they change in size, the constants
+    {\tt UMFPACK\_CONTROL} and {\tt UMFPACK\_INFO} defined in {\tt umfpack.h}
+    will be changed to reflect their new size.  Your C program should use
+    these constants when declaring the size of these two arrays.  Do not
+    define them as {\tt Control [20]} and {\tt Info [90]}.
+
+\item Forward/back solvers for the conventional row or column-form data
+    structure for $\m{L}$ and $\m{U}$ (the output of
+    {\tt umfpack\_*\_di\_get\_numeric}).  This would enable a separate
+    solver that could be used to write a MATLAB mexFunction
+    {\tt x = lu\_refine (A, b, L, U, P, Q, R)} that gives MATLAB access
+    to the iterative refinement algorithm with sparse backward error
+    analysis.  It would also be easier to handle sparse right-hand-sides
+    in this data structure, and end up with good asymptotic run-time
+    in this case
+    (particularly for $\m{Lx}=\m{b}$; see \cite{GilbertPeierls88}).
+
+\item Complex absolute value computations could be
+    based on FDLIBM (see \newline
+    http://www.netlib.org/fdlibm),
+    using the {\tt hypot(x,y)} routine.
+
+\item When using iterative refinement, the residual $\m{Ax}-\m{b}$ could be
+    returned by {\tt umfpack\_solve}.
+
+\item The solve routines could handle multiple right-hand sides, and sparse
+    right-hand sides.  See {\tt umfpack\_solve} for the MATLAB version
+    of this feature.
+
+\item An option to redirect the error and diagnostic output.
+
+\item Permutation to block-triangular-form \cite{Duff78a} for the C-callable
+    interface.  There are two routines in the ACM Collected
+    Algorithms (529 and 575) \cite{Duff81b,Duff78b}
+    that could be translated from Fortran
+    to C and included in UMFPACK.  This would result in better performance
+    for matrices from circuit simulation and
+    chemical process engineering.  See {\tt umfpack\_btf.m} for the MATLAB
+    version of this feature.  An upcoming package (KLU) will include
+    this feature.
+
+\item The ability to use user-provided {\tt malloc}, {\tt free}, and
+    {\tt realloc} memory allocation routines.  Note that UMFPACK makes very
+    few calls to these routines.  You can do this at compile-time by
+    modifying the definitions of {\tt ALLOCATE}, {\tt FREE}, and
+    {\tt REALLOCATE} in the file {\tt umf\_internal.h}.  Be sure to document
+    your changes carefully when you change UMFPACK source code.
+
+\item The ability to use user-provided work arrays, so that {\tt malloc},
+    {\tt free}, and {\tt realloc} realloc are not called.  The
+    {\tt umfpack\_*\_wsolve} routine is one example.
+
+\item A method that takes time proportional to the number of nonzeros in
+    $\m{A}$ to compute the symbolic factorization \cite{GilbertNgPeyton94}.
+    This would improve the performance of the symmetric and 2-by-2 strategies,
+    and the unsymmetric strategy when dense rows are present.
+    The current method takes
+    time proportional to the number of nonzeros in the upper bound of $\m{U}$.
+    The method used in UMFPACK exploits super-columns, however, so this
+    bound is rarely reached.
+
+\item Other basic sparse matrix operations, such as sparse matrix
+    multiplication, could be included.
+
+\item A more complete Fortran interface.
+
+\item A C++ interface.
+
+\item A parallel version using MPI.  This would require a large amount
+    of effort.
+
+\end{enumerate}
+
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{The primary UMFPACK routines}
+\label{Primary}
+%-------------------------------------------------------------------------------
+
+The include files are the same for all four versions of
+UMFPACK.  The generic integer type is {\tt Int}, which is an {\tt int} or
+{\tt long}, depending on which version of UMFPACK you are using.
+
+\subsection{umfpack\_*\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_numeric.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_solve}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_solve.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_free\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_free_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_free\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_free_numeric.h via sed
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Alternative routines}
+\label{Alternative}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_*\_defaults}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_defaults.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_qsymbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_qsymbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_wsolve}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_wsolve.h via sed
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Matrix manipulation routines}
+\label{Manipulate}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_*\_col\_to\_triplet}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_col_to_triplet.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_triplet\_to\_col}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_triplet_to_col.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_transpose}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_transpose.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_scale}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_scale.h via sed
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Getting the contents of opaque objects}
+\label{Get}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_*\_get\_lunz}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_get_lunz.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_get\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_get_numeric.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_get\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_get_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_save\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_save_numeric.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_load\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_load_numeric.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_save\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_save_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_load\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_load_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_get\_determinant}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_get_determinant.h via sed
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Reporting routines}
+\label{Report}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_*\_report\_status}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_status.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_control}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_control.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_info}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_info.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_matrix}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_matrix.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_numeric}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_numeric.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_perm}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_perm.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_symbolic}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_symbolic.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_triplet}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_triplet.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_*\_report\_vector}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_report_vector.h via sed
+\end{verbatim}
+}
+
+%-------------------------------------------------------------------------------
+\newpage
+\section{Utility routines}
+\label{Utility}
+%-------------------------------------------------------------------------------
+
+\subsection{umfpack\_timer}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_timer.h via sed
+\end{verbatim}
+}
+
+\newpage
+\subsection{umfpack\_tic and umfpack\_toc}
+
+{\footnotesize
+\begin{verbatim}
+INCLUDE umfpack_tictoc.h via sed
+\end{verbatim}
+}
+
+
+%-------------------------------------------------------------------------------
+\newpage
+% References
+%-------------------------------------------------------------------------------
+
+\bibliographystyle{plain}
+\bibliography{UserGuide}
+
+\end{document}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,374 @@
+/* ========================================================================== */
+/* === umfpack.h ============================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This is the umfpack.h include file, and should be included in all user code
+    that uses UMFPACK.  Do not include any of the umf_* header files in user
+    code.  All routines in UMFPACK starting with "umfpack_" are user-callable.
+    All other routines are prefixed "umf_XY_", (where X is d or z, and Y is
+    i or l) and are not user-callable.
+*/
+
+#ifndef UMFPACK_H
+#define UMFPACK_H
+
+/* -------------------------------------------------------------------------- */
+/* size of Info and Control arrays */
+/* -------------------------------------------------------------------------- */
+
+/* These might be larger in future versions, since there are only 3 unused
+ * entries in Info, and no unused entries in Control. */
+
+#define UMFPACK_INFO 90
+#define UMFPACK_CONTROL 20
+
+/* -------------------------------------------------------------------------- */
+/* User-callable routines */
+/* -------------------------------------------------------------------------- */
+
+/* Primary routines: */
+#include "umfpack_symbolic.h"
+#include "umfpack_numeric.h"
+#include "umfpack_solve.h"
+#include "umfpack_free_symbolic.h"
+#include "umfpack_free_numeric.h"
+
+/* Alternative routines: */
+#include "umfpack_defaults.h"
+#include "umfpack_qsymbolic.h"
+#include "umfpack_wsolve.h"
+
+/* Matrix manipulation routines: */
+#include "umfpack_triplet_to_col.h"
+#include "umfpack_col_to_triplet.h"
+#include "umfpack_transpose.h"
+#include "umfpack_scale.h"
+
+/* Getting the contents of the Symbolic and Numeric opaque objects: */
+#include "umfpack_get_lunz.h"
+#include "umfpack_get_numeric.h"
+#include "umfpack_get_symbolic.h"
+#include "umfpack_save_numeric.h"
+#include "umfpack_load_numeric.h"
+#include "umfpack_save_symbolic.h"
+#include "umfpack_load_symbolic.h"
+#include "umfpack_get_determinant.h"
+
+/* Reporting routines (the above 14 routines print nothing): */
+#include "umfpack_report_status.h"
+#include "umfpack_report_info.h"
+#include "umfpack_report_control.h"
+#include "umfpack_report_matrix.h"
+#include "umfpack_report_triplet.h"
+#include "umfpack_report_vector.h"
+#include "umfpack_report_symbolic.h"
+#include "umfpack_report_numeric.h"
+#include "umfpack_report_perm.h"
+
+/* Utility routines: */
+#include "umfpack_timer.h"
+#include "umfpack_tictoc.h"
+
+/* -------------------------------------------------------------------------- */
+/* Version, copyright, and license */
+/* -------------------------------------------------------------------------- */
+
+#define UMFPACK_VERSION "UMFPACK V4.4 (Jan. 28, 2005)"
+
+#define UMFPACK_COPYRIGHT \
+"UMFPACK:  Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.\n"
+
+#define UMFPACK_LICENSE_PART1 \
+"\nUMFPACK License:\n" \
+"\n" \
+"   Your use or distribution of UMFPACK or any modified version of\n" \
+"   UMFPACK implies that you agree to this License.\n" \
+"\n" \
+"   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n" \
+"   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n"
+#define UMFPACK_LICENSE_PART2 \
+"\n" \
+"   Permission is hereby granted to use or copy this program, provided\n" \
+"   that the Copyright, this License, and the Availability of the original\n" \
+"   version is retained on all copies.  User documentation of any code that\n" \
+"   uses UMFPACK or any modified version of UMFPACK code must cite the\n" \
+"   Copyright, this License, the Availability note, and \"Used by permission.\"\n"
+#define UMFPACK_LICENSE_PART3 \
+"   Permission to modify the code and to distribute modified code is granted,\n" \
+"   provided the Copyright, this License, and the Availability note are\n" \
+"   retained, and a notice that the code was modified is included.  This\n" \
+"   software was developed with support from the National Science Foundation,\n" \
+"   and is provided to you free of charge.\n" \
+"\n" \
+"Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n" \
+"\n"
+
+/* -------------------------------------------------------------------------- */
+/* contents of Info */
+/* -------------------------------------------------------------------------- */
+
+/* Note that umfpack_report.m must coincide with these definitions.  S is
+ * the submatrix of A after removing row/col singletons and empty rows/cols. */
+
+/* returned by all routines that use Info: */
+#define UMFPACK_STATUS 0	/* UMFPACK_OK, or other result */
+#define UMFPACK_NROW 1		/* n_row input value */
+#define UMFPACK_NCOL 16		/* n_col input value */
+#define UMFPACK_NZ 2		/* # of entries in A */
+
+/* computed in UMFPACK_*symbolic and UMFPACK_numeric: */
+#define UMFPACK_SIZE_OF_UNIT 3		/* sizeof (Unit) */
+
+/* computed in UMFPACK_*symbolic: */
+#define UMFPACK_SIZE_OF_INT 4		/* sizeof (int) */
+#define UMFPACK_SIZE_OF_LONG 5		/* sizeof (long) */
+#define UMFPACK_SIZE_OF_POINTER 6	/* sizeof (void *) */
+#define UMFPACK_SIZE_OF_ENTRY 7		/* sizeof (Entry), real or complex */
+#define UMFPACK_NDENSE_ROW 8		/* number of dense rows */
+#define UMFPACK_NEMPTY_ROW 9		/* number of empty rows */
+#define UMFPACK_NDENSE_COL 10		/* number of dense rows */
+#define UMFPACK_NEMPTY_COL 11		/* number of empty rows */
+#define UMFPACK_SYMBOLIC_DEFRAG 12	/* # of memory compactions */
+#define UMFPACK_SYMBOLIC_PEAK_MEMORY 13	/* memory used by symbolic analysis */
+#define UMFPACK_SYMBOLIC_SIZE 14	/* size of Symbolic object, in Units */
+#define UMFPACK_SYMBOLIC_TIME 15	/* time (sec.) for symbolic analysis */
+#define UMFPACK_SYMBOLIC_WALLTIME 17	/* wall clock time for sym. analysis */
+#define UMFPACK_STRATEGY_USED 18	/* strategy used: sym, unsym, 2by2 */
+#define UMFPACK_ORDERING_USED 19	/* ordering used: colamd, amd, given */
+#define UMFPACK_QFIXED 31		/* whether Q is fixed or refined */
+#define UMFPACK_DIAG_PREFERRED 32	/* whether diagonal pivoting attempted*/
+#define UMFPACK_PATTERN_SYMMETRY 33	/* symmetry of pattern of S */
+#define UMFPACK_NZ_A_PLUS_AT 34		/* nnz (S+S'), excl. diagonal */
+#define UMFPACK_NZDIAG 35		/* nnz (diag (S)) */
+
+/* AMD statistics, computed in UMFPACK_*symbolic: */
+#define UMFPACK_SYMMETRIC_LUNZ 36	/* nz in L+U, if AMD ordering used */
+#define UMFPACK_SYMMETRIC_FLOPS 37	/* flops for LU, if AMD ordering used */
+#define UMFPACK_SYMMETRIC_NDENSE 38	/* # of "dense" rows/cols in S+S' */
+#define UMFPACK_SYMMETRIC_DMAX 39	/* max nz in cols of L, for AMD */
+
+/* statistics for 2-by-2 strategy */
+#define UMFPACK_2BY2_NWEAK 51		    /* number of weak diagonal entries*/
+#define UMFPACK_2BY2_UNMATCHED 52	    /* # of weak diagonals not matched*/
+#define UMFPACK_2BY2_PATTERN_SYMMETRY 53    /* symmetry of pattern of P*S */
+#define UMFPACK_2BY2_NZ_PA_PLUS_PAT 54	    /* nz in PS+(PS)' */
+#define UMFPACK_2BY2_NZDIAG 55		    /* nz on diagonal of PS+(PS)' */
+
+/* statistcs for singleton pruning */
+#define UMFPACK_COL_SINGLETONS 56	/* # of column singletons */
+#define UMFPACK_ROW_SINGLETONS 57	/* # of row singletons */
+#define UMFPACK_N2 58			/* size of S */
+#define UMFPACK_S_SYMMETRIC 59		/* 1 if S square and symmetricly perm.*/
+
+/* estimates computed in UMFPACK_*symbolic: */
+#define UMFPACK_NUMERIC_SIZE_ESTIMATE 20    /* final size of Numeric->Memory */
+#define UMFPACK_PEAK_MEMORY_ESTIMATE 21	    /* for symbolic & numeric */
+#define UMFPACK_FLOPS_ESTIMATE 22	    /* flop count */
+#define UMFPACK_LNZ_ESTIMATE 23		    /* nz in L, incl. diagonal */
+#define UMFPACK_UNZ_ESTIMATE 24		    /* nz in U, incl. diagonal */
+#define UMFPACK_VARIABLE_INIT_ESTIMATE 25   /* initial size of Numeric->Memory*/
+#define UMFPACK_VARIABLE_PEAK_ESTIMATE 26   /* peak size of Numeric->Memory */
+#define UMFPACK_VARIABLE_FINAL_ESTIMATE 27  /* final size of Numeric->Memory */
+#define UMFPACK_MAX_FRONT_SIZE_ESTIMATE 28  /* max frontal matrix size */
+#define UMFPACK_MAX_FRONT_NROWS_ESTIMATE 29 /* max # rows in any front */
+#define UMFPACK_MAX_FRONT_NCOLS_ESTIMATE 30 /* max # columns in any front */
+
+/* exact values, (estimates shown above) computed in UMFPACK_numeric: */
+#define UMFPACK_NUMERIC_SIZE 40		    /* final size of Numeric->Memory */
+#define UMFPACK_PEAK_MEMORY 41		    /* for symbolic & numeric */
+#define UMFPACK_FLOPS 42		    /* flop count */
+#define UMFPACK_LNZ 43			    /* nz in L, incl. diagonal */
+#define UMFPACK_UNZ 44			    /* nz in U, incl. diagonal */
+#define UMFPACK_VARIABLE_INIT 45	    /* initial size of Numeric->Memory*/
+#define UMFPACK_VARIABLE_PEAK 46	    /* peak size of Numeric->Memory */
+#define UMFPACK_VARIABLE_FINAL 47	    /* final size of Numeric->Memory */
+#define UMFPACK_MAX_FRONT_SIZE 48	    /* max frontal matrix size */
+#define UMFPACK_MAX_FRONT_NROWS 49	    /* max # rows in any front */
+#define UMFPACK_MAX_FRONT_NCOLS 50	    /* max # columns in any front */
+
+/* computed in UMFPACK_numeric: */
+#define UMFPACK_NUMERIC_DEFRAG 60	    /* # of garbage collections */
+#define UMFPACK_NUMERIC_REALLOC 61	    /* # of memory reallocations */
+#define UMFPACK_NUMERIC_COSTLY_REALLOC 62   /* # of costlly memory realloc's */
+#define UMFPACK_COMPRESSED_PATTERN 63	    /* # of integers in LU pattern */
+#define UMFPACK_LU_ENTRIES 64		    /* # of reals in LU factors */
+#define UMFPACK_NUMERIC_TIME 65		    /* numeric factorization time */
+#define UMFPACK_UDIAG_NZ 66		    /* nz on diagonal of U */
+#define UMFPACK_RCOND 67		    /* est. reciprocal condition # */
+#define UMFPACK_WAS_SCALED 68		    /* none, max row, or sum row */
+#define UMFPACK_RSMIN 69		    /* min (max row) or min (sum row) */
+#define UMFPACK_RSMAX 70		    /* max (max row) or max (sum row) */
+#define UMFPACK_UMIN 71			    /* min abs diagonal entry of U */
+#define UMFPACK_UMAX 72			    /* max abs diagonal entry of U */
+#define UMFPACK_ALLOC_INIT_USED 73	    /* alloc_init parameter used */
+#define UMFPACK_FORCED_UPDATES 74	    /* # of forced updates */
+#define UMFPACK_NUMERIC_WALLTIME 75	    /* numeric wall clock time */
+#define UMFPACK_NOFF_DIAG 76		    /* number of off-diagonal pivots */
+
+#define UMFPACK_ALL_LNZ 77		    /* nz in L, if no dropped entries */
+#define UMFPACK_ALL_UNZ 78		    /* nz in U, if no dropped entries */
+#define UMFPACK_NZDROPPED 79		    /* # of dropped small entries */
+
+/* computed in UMFPACK_solve: */
+#define UMFPACK_IR_TAKEN 80	    /* # of iterative refinement steps taken */
+#define UMFPACK_IR_ATTEMPTED 81	    /* # of iter. refinement steps attempted */
+#define UMFPACK_OMEGA1 82	    /* omega1, sparse backward error estimate */
+#define UMFPACK_OMEGA2 83	    /* omega2, sparse backward error estimate */
+#define UMFPACK_SOLVE_FLOPS 84	    /* flop count for solve */
+#define UMFPACK_SOLVE_TIME 85	    /* solve time (seconds) */
+#define UMFPACK_SOLVE_WALLTIME 86   /* solve time (wall clock, seconds) */
+
+/* Info [87, 88, 89] unused */
+
+/* Unused parts of Info may be used in future versions of UMFPACK. */
+
+/* -------------------------------------------------------------------------- */
+
+/* Info [UMFPACK_ORDERING_USED] is one of the following: */
+#define UMFPACK_ORDERING_COLAMD 0	/* COLAMD(A) */
+#define UMFPACK_ORDERING_AMD 1		/* AMD(A+A') */
+#define UMFPACK_ORDERING_GIVEN 2	/* Q is provided on input */
+
+/* -------------------------------------------------------------------------- */
+/* contents of Control */
+/* -------------------------------------------------------------------------- */
+
+/* used in all UMFPACK_report_* routines: */
+#define UMFPACK_PRL 0			/* print level */
+
+/* used in UMFPACK_*symbolic only: */
+#define UMFPACK_DENSE_ROW 1		/* dense row parameter */
+#define UMFPACK_DENSE_COL 2		/* dense col parameter */
+#define UMFPACK_BLOCK_SIZE 4		/* BLAS-3 block size */
+#define UMFPACK_STRATEGY 5		/* auto, symmetric, unsym., or 2by2 */
+#define UMFPACK_2BY2_TOLERANCE 12	/* 2-by-2 pivot tolerance */
+#define UMFPACK_FIXQ 13			/* -1: no fixQ, 0: default, 1: fixQ */
+#define UMFPACK_AMD_DENSE 14		/* for AMD ordering */
+#define UMFPACK_AGGRESSIVE 19		/* whether or not to use aggressive
+					 * absorption in AMD and COLAMD */
+
+/* used in UMFPACK_numeric only: */
+#define UMFPACK_PIVOT_TOLERANCE 3	/* threshold partial pivoting setting */
+#define UMFPACK_ALLOC_INIT 6		/* initial allocation ratio */
+#define UMFPACK_SYM_PIVOT_TOLERANCE 15	/* threshold, only for diag. entries */
+#define UMFPACK_SCALE 16		/* what row scaling to do */
+#define UMFPACK_FRONT_ALLOC_INIT 17	/* frontal matrix allocation ratio */
+#define UMFPACK_DROPTOL 18		/* drop tolerance for entries in L,U */
+
+/* used in UMFPACK_*solve only: */
+#define UMFPACK_IRSTEP 7		/* max # of iterative refinements */
+
+/* compile-time settings - Control [8..11] cannot be changed at run time: */
+#define UMFPACK_COMPILED_WITH_BLAS 8	    /* uses the BLAS */
+#define UMFPACK_COMPILED_FOR_MATLAB 9	    /* 1 if MATLAB mexFunction, etc. */
+#define UMFPACK_COMPILED_WITH_GETRUSAGE 10  /* uses getrusage timer, or not */
+#define UMFPACK_COMPILED_IN_DEBUG_MODE 11   /* debugging enabled (very slow!) */
+
+/* -------------------------------------------------------------------------- */
+
+/* Control [UMFPACK_STRATEGY] is one of the following: */
+#define UMFPACK_STRATEGY_AUTO 0		/* use sym. or unsym. strategy */
+#define UMFPACK_STRATEGY_UNSYMMETRIC 1	/* COLAMD(A), coletree postorder,
+					   not prefer diag*/
+#define UMFPACK_STRATEGY_2BY2 2		/* AMD(PA+PA'), no coletree postorder,
+					   prefer diag(PA) where P is pseudo
+					   max transversal */
+#define UMFPACK_STRATEGY_SYMMETRIC 3	/* AMD(A+A'), no coletree postorder,
+					   prefer diagonal */
+
+/* Control [UMFPACK_SCALE] is one of the following: */
+#define UMFPACK_SCALE_NONE 0	/* no scaling */
+#define UMFPACK_SCALE_SUM 1	/* default: divide each row by sum (abs (row))*/
+#define UMFPACK_SCALE_MAX 2	/* divide each row by max (abs (row)) */
+
+/* -------------------------------------------------------------------------- */
+/* default values of Control: */
+/* -------------------------------------------------------------------------- */
+
+#define UMFPACK_DEFAULT_PRL 1
+#define UMFPACK_DEFAULT_DENSE_ROW 0.2
+#define UMFPACK_DEFAULT_DENSE_COL 0.2
+#define UMFPACK_DEFAULT_PIVOT_TOLERANCE 0.1
+#define UMFPACK_DEFAULT_2BY2_TOLERANCE 0.01
+#define UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE 0.001
+#define UMFPACK_DEFAULT_BLOCK_SIZE 32
+#define UMFPACK_DEFAULT_ALLOC_INIT 0.7
+#define UMFPACK_DEFAULT_FRONT_ALLOC_INIT 0.5
+#define UMFPACK_DEFAULT_IRSTEP 2
+#define UMFPACK_DEFAULT_SCALE UMFPACK_SCALE_SUM
+#define UMFPACK_DEFAULT_STRATEGY UMFPACK_STRATEGY_AUTO
+#define UMFPACK_DEFAULT_AMD_DENSE AMD_DEFAULT_DENSE
+#define UMFPACK_DEFAULT_FIXQ 0
+#define UMFPACK_DEFAULT_AGGRESSIVE 1
+#define UMFPACK_DEFAULT_DROPTOL 0
+
+/* default values of Control may change in future versions of UMFPACK. */
+
+/* -------------------------------------------------------------------------- */
+/* status codes */
+/* -------------------------------------------------------------------------- */
+
+#define UMFPACK_OK (0)
+
+/* status > 0 means a warning, but the method was successful anyway. */
+/* A Symbolic or Numeric object was still created. */
+#define UMFPACK_WARNING_singular_matrix (1)
+
+/* The following warnings were added in umfpack_*_get_determinant */
+#define UMFPACK_WARNING_determinant_underflow (2)
+#define UMFPACK_WARNING_determinant_overflow (3)
+
+/* status < 0 means an error, and the method was not successful. */
+/* No Symbolic of Numeric object was created. */
+#define UMFPACK_ERROR_out_of_memory (-1)
+#define UMFPACK_ERROR_invalid_Numeric_object (-3)
+#define UMFPACK_ERROR_invalid_Symbolic_object (-4)
+#define UMFPACK_ERROR_argument_missing (-5)
+#define UMFPACK_ERROR_n_nonpositive (-6)
+#define UMFPACK_ERROR_invalid_matrix (-8)
+#define UMFPACK_ERROR_different_pattern (-11)
+#define UMFPACK_ERROR_invalid_system (-13)
+#define UMFPACK_ERROR_invalid_permutation (-15)
+#define UMFPACK_ERROR_internal_error (-911) /* yes, call me if you get this! */
+#define UMFPACK_ERROR_file_IO (-17)
+
+/* -------------------------------------------------------------------------- */
+/* solve codes */
+/* -------------------------------------------------------------------------- */
+
+/* Solve the system ( )x=b, where ( ) is defined below.  "t" refers to the */
+/* linear algebraic transpose (complex conjugate if A is complex), or the (') */
+/* operator in MATLAB.  "at" refers to the array transpose, or the (.') */
+/* operator in MATLAB. */
+
+#define UMFPACK_A	(0)	/* Ax=b    */
+#define UMFPACK_At	(1)	/* A'x=b   */
+#define UMFPACK_Aat	(2)	/* A.'x=b  */
+
+#define UMFPACK_Pt_L	(3)	/* P'Lx=b  */
+#define UMFPACK_L	(4)	/* Lx=b    */
+#define UMFPACK_Lt_P	(5)	/* L'Px=b  */
+#define UMFPACK_Lat_P	(6)	/* L.'Px=b */
+#define UMFPACK_Lt	(7)	/* L'x=b   */
+#define UMFPACK_Lat	(8)	/* L.'x=b  */
+
+#define UMFPACK_U_Qt	(9)	/* UQ'x=b  */
+#define UMFPACK_U	(10)	/* Ux=b    */
+#define UMFPACK_Q_Ut	(11)	/* QU'x=b  */
+#define UMFPACK_Q_Uat	(12)	/* QU.'x=b */
+#define UMFPACK_Ut	(13)	/* U'x=b   */
+#define UMFPACK_Uat	(14)	/* U.'x=b  */
+
+/* -------------------------------------------------------------------------- */
+
+/* Integer constants are used for status and solve codes instead of enum */
+/* to make it easier for a Fortran code to call UMFPACK. */
+
+#endif /* UMFPACK_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_col_to_triplet.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,110 @@
+/* ========================================================================== */
+/* === umfpack_col_to_triplet =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_col_to_triplet
+(
+    int n_col,
+    const int Ap [ ],
+    int Tj [ ]
+) ;
+
+long umfpack_dl_col_to_triplet
+(
+    long n_col,
+    const long Ap [ ],
+    long Tj [ ]
+) ;
+
+int umfpack_zi_col_to_triplet
+(
+    int n_col,
+    const int Ap [ ],
+    int Tj [ ]
+) ;
+
+long umfpack_zl_col_to_triplet
+(
+    long n_col,
+    const long Ap [ ],
+    long Tj [ ]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n_col, *Tj, *Ap, status ;
+    status = umfpack_di_col_to_triplet (n_col, Ap, Tj) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n_col, *Tj, *Ap, status ;
+    status = umfpack_dl_col_to_triplet (n_col, Ap, Tj) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n_col, *Tj, *Ap, status ;
+    status = umfpack_zi_col_to_triplet (n_col, Ap, Tj) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long n_col, *Tj, *Ap, status ;
+    status = umfpack_zl_col_to_triplet (n_col, Ap, Tj) ;
+
+Purpose:
+
+    Converts a column-oriented matrix to a triplet form.  Only the column
+    pointers, Ap, are required, and only the column indices of the triplet form
+    are constructed.   This routine is the opposite of umfpack_*_triplet_to_col.
+    The matrix may be singular and/or rectangular.  Analogous to [i, Tj, x] =
+    find (A) in MATLAB, except that zero entries present in the column-form of
+    A are present in the output, and i and x are not created (those are just Ai
+    and Ax+Az*1i, respectively, for a column-form matrix A).
+
+Returns:
+
+    UMFPACK_OK if successful
+    UMFPACK_ERROR_argument_missing if Ap or Tj is missing
+    UMFPACK_ERROR_n_nonpositive if n_col <= 0
+    UMFPACK_ERROR_invalid_matrix if Ap [n_col] < 0, Ap [0] != 0, or
+	Ap [j] > Ap [j+1] for any j in the range 0 to n-1.
+    Unsorted columns and duplicate entries do not cause an error (these would
+    only be evident by examining Ai).  Empty rows and columns are OK.
+
+Arguments:
+
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_col matrix.  Restriction: n_col > 0.
+	(n_row is not required)
+
+    Int Ap [n_col+1] ;	Input argument, not modified.
+
+	The column pointers of the column-oriented form of the matrix.  See
+	umfpack_*_*symbolic for a description.  The number of entries in
+	the matrix is nz = Ap [n_col].  Restrictions on Ap are the same as those
+	for umfpack_*_transpose.  Ap [0] must be zero, nz must be >= 0, and
+	Ap [j] <= Ap [j+1] and Ap [j] <= Ap [n_col] must be true for all j in
+	the range 0 to n_col-1.  Empty columns are OK (that is, Ap [j] may equal
+	Ap [j+1] for any j in the range 0 to n_col-1).
+
+    Int Tj [nz] ;	Output argument.
+
+	Tj is an integer array of size nz on input, where nz = Ap [n_col].
+	Suppose the column-form of the matrix is held in Ap, Ai, Ax, and Az
+	(see umfpack_*_*symbolic for a description).  Then on output, the
+	triplet form of the same matrix is held in Ai (row indices), Tj (column
+	indices), and Ax (numerical values).  Note, however, that this routine
+	does not require Ai and Ax (or Az for the complex version) in order to
+	do the conversion.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_defaults.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,69 @@
+/* ========================================================================== */
+/* === umfpack_defaults ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_defaults
+(
+    double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_dl_defaults
+(
+    double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_zi_defaults
+(
+    double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_zl_defaults
+(
+    double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_di_defaults (Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_dl_defaults (Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_zi_defaults (Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_zl_defaults (Control) ;
+
+Purpose:
+
+    Sets the default control parameter settings.
+
+Arguments:
+
+    double Control [UMFPACK_CONTROL] ;	Output argument.
+
+	Control is set to the default control parameter settings.  You can
+	then modify individual settings by changing specific entries in the
+	Control array.  If Control is a (double *) NULL pointer, then
+	umfpack_*_defaults returns silently (no error is generated, since
+	passing a NULL pointer for Control to any UMFPACK routine is valid).
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_free_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,67 @@
+/* ========================================================================== */
+/* === umfpack_free_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_free_numeric
+(
+    void **Numeric
+) ;
+
+void umfpack_dl_free_numeric
+(
+    void **Numeric
+) ;
+
+void umfpack_zi_free_numeric
+(
+    void **Numeric
+) ;
+
+void umfpack_zl_free_numeric
+(
+    void **Numeric
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    umfpack_di_free_numeric (&Numeric) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    umfpack_dl_free_numeric (&Numeric) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    umfpack_zi_free_numeric (&Numeric) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    umfpack_zl_free_numeric (&Numeric) ;
+
+Purpose:
+
+    Deallocates the Numeric object and sets the Numeric handle to NULL.  This
+    routine is the only valid way of destroying the Numeric object.
+
+Arguments:
+
+    void **Numeric ;	    Input argument, set to (void *) NULL on output.
+
+	Numeric points to a valid Numeric object, computed by umfpack_*_numeric.
+	No action is taken if Numeric is a (void *) NULL pointer.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_free_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,67 @@
+/* ========================================================================== */
+/* === umfpack_free_symbolic ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_free_symbolic
+(
+    void **Symbolic
+) ;
+
+void umfpack_dl_free_symbolic
+(
+    void **Symbolic
+) ;
+
+void umfpack_zi_free_symbolic
+(
+    void **Symbolic
+) ;
+
+void umfpack_zl_free_symbolic
+(
+    void **Symbolic
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    umfpack_di_free_symbolic (&Symbolic) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    umfpack_dl_free_symbolic (&Symbolic) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    umfpack_zi_free_symbolic (&Symbolic) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    umfpack_zl_free_symbolic (&Symbolic) ;
+
+Purpose:
+
+    Deallocates the Symbolic object and sets the Symbolic handle to NULL.  This
+    routine is the only valid way of destroying the Symbolic object.
+
+Arguments:
+
+    void **Symbolic ;	    Input argument, set to (void *) NULL on output.
+
+	Points to a valid Symbolic object computed by umfpack_*_symbolic.
+	No action is taken if Symbolic is a (void *) NULL pointer.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_determinant.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,192 @@
+/* ========================================================================== */
+/* === UMFPACK_get_determinant ============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_get_determinant
+(
+    double *Mx,
+    double *Ex,
+    void *NumericHandle,
+    double User_Info [UMFPACK_INFO]
+) ;
+
+long umfpack_dl_get_determinant
+(
+    double *Mx,
+    double *Ex,
+    void *NumericHandle,
+    double User_Info [UMFPACK_INFO]
+) ;
+
+int umfpack_zi_get_determinant
+(
+    double *Mx,
+    double *Mz,
+    double *Ex,
+    void *NumericHandle,
+    double User_Info [UMFPACK_INFO]
+) ;
+
+long umfpack_zl_get_determinant
+(
+    double *Mx,
+    double *Mz,
+    double *Ex,
+    void *NumericHandle,
+    double User_Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status ;
+    double Mx, Ex, Info [UMFPACK_INFO] ;
+    status = umfpack_di_get_determinant (&Mx, &Ex, Numeric, Info) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status ;
+    double Mx, Ex, Info [UMFPACK_INFO] ;
+    status = umfpack_dl_get_determinant (&Mx, &Ex, Numeric, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status ;
+    double Mx, Mz, Ex, Info [UMFPACK_INFO] ;
+    status = umfpack_zi_get_determinant (&Mx, &Mz, &Ex, Numeric, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status ;
+    double *Mx, *Mz, *Ex, Info [UMFPACK_INFO] ;
+    status = umfpack_zl_get_determinant (&Mx, &Mz, &Ex, Numeric, Info) ;
+
+packed complex int Syntax:
+
+    Same as above, except Mz is NULL.
+
+Purpose:
+
+    Using the LU factors and the permutation vectors contained in the Numeric
+    object, calculate the determinant of the matrix A.
+
+    The value of the determinant can be returned in two forms, depending on
+    whether Ex is NULL or not.  If Ex is NULL then the value of the determinant
+    is returned on Mx and Mz for the real and imaginary parts.  However, to
+    avoid over- or underflows, the determinant can be split into a mantissa
+    and exponent, and the parts returned separately, in which case Ex is not
+    NULL.  The actual determinant is then given by
+
+      double det ;
+      det = Mx * pow (10.0, Ex) ;
+
+    for the double case, or
+
+      double det [2] ;
+      det [0] = Mx * pow (10.0, Ex) ;	    // real part
+      det [1] = Mz * pow (10.0, Ex) ;	    // imaginary part
+
+    for the complex case.  Information on if the determinant will or has
+    over or under-flowed is given by Info [UMFPACK_STATUS].
+
+    In the "packed complex" syntax, Mx [0] holds the real part and Mx [1]
+    holds the imaginary part.  Mz is not used (it is NULL).
+
+Returns:
+
+    Returns UMFPACK_OK if sucessful.  Returns UMFPACK_ERROR_out_of_memory if
+    insufficient memory is available for the n_row integer workspace that
+    umfpack_*_get_determinant allocates to construct pivots from the
+    permutation vectors.  Returns UMFPACK_ERROR_invalid_Numeric_object if the
+    Numeric object provided as input is invalid.  Returns
+    UMFPACK_WARNING_singular_matrix if the determinant is zero.  Returns
+    UMFPACK_WARNING_determinant_underflow or
+    UMFPACK_WARNING_determinant_overflow if the determinant has underflowed
+    overflowed (for the case when Ex is NULL), or will overflow if Ex is not
+    NULL and det is computed (see above) in the user program.
+
+Arguments:
+
+    double *Mx ;   Output argument (array of size 1, or size 2 if Mz is NULL)
+    double *Mz ;   Output argument (optional)
+    double *Ex ;   Output argument (optional)
+
+        The determinant returned in mantissa/exponent form, as discussed above.
+	If Mz is NULL, then both the original and imaginary parts will be
+	returned in Mx. If Ex is NULL then the determinant is returned directly
+	in Mx and Mz (or Mx [0] and Mx [1] if Mz is NULL), rather than in
+	mantissa/exponent form.
+
+    void *Numeric ;	Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric.
+
+    double Info [UMFPACK_INFO] ;	Output argument.
+
+	Contains information about the calculation of the determinant. If a
+	(double *) NULL pointer is passed, then no statistics are returned in
+	Info (this is not an error condition).  The following statistics are
+	computed in umfpack_*_determinant:
+
+	Info [UMFPACK_STATUS]: status code.  This is also the return value,
+	    whether or not Info is present.
+
+	    UMFPACK_OK
+
+	        The determinant was successfully found.
+
+	    UMFPACK_ERROR_out_of_memory
+
+		Insufficient memory to solve the linear system.
+
+	    UMFPACK_ERROR_argument_missing
+
+		Mx is missing (NULL).
+
+	    UMFPACK_ERROR_invalid_Numeric_object
+
+		The Numeric object is not valid.
+
+	    UMFPACK_ERROR_invalid_system
+
+		The matrix is rectangular.  Only square systems can be
+		handled.
+
+	    UMFPACK_WARNING_singluar_matrix
+
+		The determinant is zero or NaN.  The matrix is singular.
+
+	    UMFPACK_WARNING_determinant_underflow
+
+	        When passing from mantissa/exponent form to the determinant
+		an underflow has or will occur.  If the mantissa/exponent from
+		of obtaining the determinant is used, the underflow will occur
+		in the user program.  If the single argument method of
+		obtaining the determinant is used, the underflow has already
+		occurred.
+
+	    UMFPACK_WARNING_determinant_overflow
+
+	        When passing from mantissa/exponent form to the determinant
+		an overflow has or will occur.  If the mantissa/exponent from
+		of obtaining the determinant is used, the overflow will occur
+		in the user program.  If the single argument method of
+		obtaining the determinant is used, the overflow has already
+		occurred.
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_lunz.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,133 @@
+/* ========================================================================== */
+/* === umfpack_get_lunz ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_get_lunz
+(
+    int *lnz,
+    int *unz,
+    int *n_row,
+    int *n_col,
+    int *nz_udiag,
+    void *Numeric
+) ;
+
+long umfpack_dl_get_lunz
+(
+    long *lnz,
+    long *unz,
+    long *n_row,
+    long *n_col,
+    long *nz_udiag,
+    void *Numeric
+) ;
+
+int umfpack_zi_get_lunz
+(
+    int *lnz,
+    int *unz,
+    int *n_row,
+    int *n_col,
+    int *nz_udiag,
+    void *Numeric
+) ;
+
+long umfpack_zl_get_lunz
+(
+    long *lnz,
+    long *unz,
+    long *n_row,
+    long *n_col,
+    long *nz_udiag,
+    void *Numeric
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, lnz, unz, n_row, n_col ;
+    status = umfpack_di_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, lnz, unz, n_row, n_col ;
+    status = umfpack_dl_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, lnz, unz, n_row, n_col ;
+    status = umfpack_zi_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, lnz, unz, n_row, n_col ;
+    status = umfpack_zl_get_lunz (&lnz, &unz, &n_row, &n_col, Numeric) ;
+
+Purpose:
+
+    Determines the size and number of nonzeros in the LU factors held by the
+    Numeric object.  These are also the sizes of the output arrays required
+    by umfpack_*_get_numeric.
+
+    The matrix L is n_row -by- min(n_row,n_col), with lnz nonzeros, including
+    the entries on the unit diagonal of L.
+
+    The matrix U is min(n_row,n_col) -by- n_col, with unz nonzeros, including
+    nonzeros on the diagonal of U.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_invalid_Numeric_object if Numeric is not a valid object.
+    UMFPACK_ERROR_argument_missing if any other argument is (Int *) NULL.
+
+Arguments:
+
+    Int *lnz ;		Output argument.
+
+	The number of nonzeros in L, including the diagonal (which is all
+	one's).  This value is the required size of the Lj and Lx arrays as
+	computed by umfpack_*_get_numeric.  The value of lnz is identical to
+	Info [UMFPACK_LNZ], if that value was returned by umfpack_*_numeric.
+
+    Int *unz ;		Output argument.
+
+	The number of nonzeros in U, including the diagonal.  This value is the
+	required size of the Ui and Ux arrays as computed by
+	umfpack_*_get_numeric.  The value of unz is identical to
+	Info [UMFPACK_UNZ], if that value was returned by umfpack_*_numeric.
+
+    Int *n_row ;	Output argument.
+    Int *n_col ;	Output argument.
+
+	The order of the L and U matrices.  L is n_row -by- min(n_row,n_col)
+	and U is min(n_row,n_col) -by- n_col.
+
+    Int *nz_udiag ;	Output argument.
+
+	The number of numerically nonzero values on the diagonal of U.  The
+	matrix is singular if nz_diag < min(n_row,n_col).  A divide-by-zero
+	will occur if nz_diag < n_row == n_col when solving a sparse system
+	involving the matrix U in umfpack_*_*solve.  The value of nz_udiag is
+	identical to Info [UMFPACK_UDIAG_NZ] if that value was returned by
+	umfpack_*_numeric.
+
+    void *Numeric ;	Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,252 @@
+/* ========================================================================== */
+/* === umfpack_get_numeric ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_get_numeric
+(
+    int Lp [ ],
+    int Lj [ ],
+    double Lx [ ],
+    int Up [ ],
+    int Ui [ ],
+    double Ux [ ],
+    int P [ ],
+    int Q [ ],
+    double Dx [ ],
+    int *do_recip,
+    double Rs [ ],
+    void *Numeric
+) ;
+
+long umfpack_dl_get_numeric
+(
+    long Lp [ ],
+    long Lj [ ],
+    double Lx [ ],
+    long Up [ ],
+    long Ui [ ],
+    double Ux [ ],
+    long P [ ],
+    long Q [ ],
+    double Dx [ ],
+    long *do_recip,
+    double Rs [ ],
+    void *Numeric
+) ;
+
+int umfpack_zi_get_numeric
+(
+    int Lp [ ],
+    int Lj [ ],
+    double Lx [ ], double Lz [ ],
+    int Up [ ],
+    int Ui [ ],
+    double Ux [ ], double Uz [ ],
+    int P [ ],
+    int Q [ ],
+    double Dx [ ], double Dz [ ],
+    int *do_recip,
+    double Rs [ ],
+    void *Numeric
+) ;
+
+long umfpack_zl_get_numeric
+(
+    long Lp [ ],
+    long Lj [ ],
+    double Lx [ ], double Lz [ ],
+    long Up [ ],
+    long Ui [ ],
+    double Ux [ ], double Uz [ ],
+    long P [ ],
+    long Q [ ],
+    double Dx [ ], double Dz [ ],
+    long *do_recip,
+    double Rs [ ],
+    void *Numeric
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ;
+    double *Lx, *Ux, *Dx, *Rs ;
+    status = umfpack_di_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx,
+	&do_recip, Rs, Numeric) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ;
+    double *Lx, *Ux, *Dx, *Rs ;
+    status = umfpack_dl_get_numeric (Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx,
+	&do_recip, Rs, Numeric) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ;
+    double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ;
+    status = umfpack_zi_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q,
+	Dx, Dz, &do_recip, Rs, Numeric) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long *Lp, *Lj, *Up, *Ui, *P, *Q, status, do_recip ;
+    double *Lx, *Lz, *Ux, *Uz, *Dx, *Dz, *Rs ;
+    status = umfpack_zl_get_numeric (Lp, Lj, Lx, Lz, Up, Ui, Ux, Uz, P, Q,
+	Dx, Dz, &do_recip, Rs, Numeric) ;
+
+packed complex int/long Syntax:
+
+    Same as above, except Lz, Uz, and Dz are all NULL.
+
+Purpose:
+
+    This routine copies the LU factors and permutation vectors from the Numeric
+    object into user-accessible arrays.  This routine is not needed to solve a
+    linear system.  Note that the output arrays Lp, Lj, Lx, Up, Ui, Ux, P, Q,
+    Dx, and Rs are not allocated by umfpack_*_get_numeric; they must exist on
+    input.
+
+    All output arguments are optional.  If any of them are NULL
+    on input, then that part of the LU factorization is not copied.  You can
+    use this routine to extract just the parts of the LU factorization that
+    you want.  For example, to retrieve just the column permutation Q, use:
+
+    #define noD (double *) NULL
+    #define noI (int *) NULL
+    status = umfpack_di_get_numeric (noI, noI, noD, noI, noI, noD, noI,
+	Q, noD, noI, noD, Numeric) ;
+
+Returns:
+
+    Returns UMFPACK_OK if successful.  Returns UMFPACK_ERROR_out_of_memory
+    if insufficient memory is available for the 2*max(n_row,n_col) integer
+    workspace that umfpack_*_get_numeric allocates to construct L and/or U.
+    Returns UMFPACK_ERROR_invalid_Numeric_object if the Numeric object provided
+    as input is invalid.
+
+Arguments:
+
+    Int Lp [n_row+1] ;	Output argument.
+    Int Lj [lnz] ;	Output argument.
+    double Lx [lnz] ;	Output argument.  Size 2*lnz for packed complex case.
+    double Lz [lnz] ;	Output argument for complex versions.
+
+	The n_row-by-min(n_row,n_col) matrix L is returned in compressed-row
+	form.  The column indices of row i and corresponding numerical values
+	are in:
+
+	    Lj [Lp [i] ... Lp [i+1]-1]
+	    Lx [Lp [i] ... Lp [i+1]-1]	real part
+	    Lz [Lp [i] ... Lp [i+1]-1]	imaginary part (complex versions)
+
+	respectively.  Each row is stored in sorted order, from low column
+	indices to higher.  The last entry in each row is the diagonal, which
+	is numerically equal to one.  The sizes of Lp, Lj, Lx, and Lz are
+	returned by umfpack_*_get_lunz.    If Lp, Lj, or Lx are not present,
+	then the matrix L is not returned.  This is not an error condition.
+	The L matrix can be printed if n_row, Lp, Lj, Lx (and Lz for the split
+	complex case) are passed to umfpack_*_report_matrix (using the
+	"row" form).
+
+	If Lx is present and Lz is NULL, then both real
+	and imaginary parts are returned in Lx[0..2*lnz-1], with Lx[2*k]
+	and Lx[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int Up [n_col+1] ;	Output argument.
+    Int Ui [unz] ;	Output argument.
+    double Ux [unz] ;	Output argument. Size 2*unz for packed complex case.
+    double Uz [unz] ;	Output argument for complex versions.
+
+	The min(n_row,n_col)-by-n_col matrix U is returned in compressed-column
+	form.  The row indices of column j and corresponding numerical values
+	are in
+
+	    Ui [Up [j] ... Up [j+1]-1]
+	    Ux [Up [j] ... Up [j+1]-1]	real part
+	    Uz [Up [j] ... Up [j+1]-1]	imaginary part (complex versions)
+
+	respectively.  Each column is stored in sorted order, from low row
+	indices to higher.  The last entry in each column is the diagonal
+	(assuming that it is nonzero).  The sizes of Up, Ui, Ux, and Uz are
+	returned by umfpack_*_get_lunz.  If Up, Ui, or Ux are not present,
+	then the matrix U is not returned.  This is not an error condition.
+	The U matrix can be printed if n_col, Up, Ui, Ux (and Uz for the
+	split complex case) are passed to umfpack_*_report_matrix (using the
+	"column" form).
+
+	If Ux is present and Uz is NULL, then both real
+	and imaginary parts are returned in Ux[0..2*unz-1], with Ux[2*k]
+	and Ux[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int P [n_row] ;		Output argument.
+
+	The permutation vector P is defined as P [k] = i, where the original
+	row i of A is the kth pivot row in PAQ.  If you do not want the P vector
+	to be returned, simply pass (Int *) NULL for P.  This is not an error
+	condition.  You can print P and Q with umfpack_*_report_perm.
+
+    Int Q [n_col] ;		Output argument.
+
+	The permutation vector Q is defined as Q [k] = j, where the original
+	column j of A is the kth pivot column in PAQ.  If you not want the Q
+	vector to be returned, simply pass (Int *) NULL for Q.  This is not
+	an error condition.  Note that Q is not necessarily identical to
+	Qtree, the column pre-ordering held in the Symbolic object.  Refer to
+	the description of Qtree and Front_npivcol in umfpack_*_get_symbolic for
+	details.
+
+    double Dx [min(n_row,n_col)] ;	Output argument.  Size 2*n for
+					the packed complex case.
+    double Dz [min(n_row,n_col)] ;	Output argument for complex versions.
+
+	The diagonal of U is also returned in Dx and Dz.  You can extract the
+	diagonal of U without getting all of U by passing a non-NULL Dx (and
+	Dz for the complex version) and passing Up, Ui, and Ux as NULL.  Dx is
+	the real part of the diagonal, and Dz is the imaginary part.
+
+	If Dx is present and Dz is NULL, then both real
+	and imaginary parts are returned in Dx[0..2*min(n_row,n_col)-1],
+	with Dx[2*k] and Dx[2*k+1] being the real and imaginary part of the kth
+	entry.
+
+    Int *do_recip ;		Output argument.
+
+	If do_recip is returned as zero (false), then the scale factors Rs [i]
+	are to be used by multiplying row i by Rs [i].  Otherwise, the entries
+	in row i are to be divided by Rs [i].
+
+	If UMFPACK has been compiled with gcc, or for MATLAB as either a
+	built-in routine or as a mexFunction, then the NRECIPROCAL flag is
+	set, and do_recip will always be zero (false).
+
+    double Rs [n_row] ;		Output argument.
+
+	The row scale factors are returned in Rs [0..n_row-1].  Row i of A is
+	scaled by dividing or multiplying its values by Rs [i].  If default
+	scaling is in use, Rs [i] is the sum of the absolute values of row i
+	(or its reciprocal).  If max row scaling is in use, then Rs [i] is the
+	maximum absolute value in row i (or its reciprocal).
+	Otherwise, Rs [i] = 1.  If row i is all zero, Rs [i] = 1 as well.  For
+	the complex version, an approximate absolute value is used
+	(|x_real|+|x_imag|).
+
+    void *Numeric ;	Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_get_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,339 @@
+/* ========================================================================== */
+/* === umfpack_get_symbolic ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_get_symbolic
+(
+    int *n_row,
+    int *n_col,
+    int *n1,
+    int *nz,
+    int *nfr,
+    int *nchains,
+    int P [ ],
+    int Q [ ],
+    int Front_npivcol [ ],
+    int Front_parent [ ],
+    int Front_1strow [ ],
+    int Front_leftmostdesc [ ],
+    int Chain_start [ ],
+    int Chain_maxrows [ ],
+    int Chain_maxcols [ ],
+    void *Symbolic
+) ;
+
+long umfpack_dl_get_symbolic
+(
+    long *n_row,
+    long *n_col,
+    long *n1,
+    long *nz,
+    long *nfr,
+    long *nchains,
+    long P [ ],
+    long Q [ ],
+    long Front_npivcol [ ],
+    long Front_parent [ ],
+    long Front_1strow [ ],
+    long Front_leftmostdesc [ ],
+    long Chain_start [ ],
+    long Chain_maxrows [ ],
+    long Chain_maxcols [ ],
+    void *Symbolic
+) ;
+
+int umfpack_zi_get_symbolic
+(
+    int *n_row,
+    int *n_col,
+    int *n1,
+    int *nz,
+    int *nfr,
+    int *nchains,
+    int P [ ],
+    int Q [ ],
+    int Front_npivcol [ ],
+    int Front_parent [ ],
+    int Front_1strow [ ],
+    int Front_leftmostdesc [ ],
+    int Chain_start [ ],
+    int Chain_maxrows [ ],
+    int Chain_maxcols [ ],
+    void *Symbolic
+) ;
+
+long umfpack_zl_get_symbolic
+(
+    long *n_row,
+    long *n_col,
+    long *n1,
+    long *nz,
+    long *nfr,
+    long *nchains,
+    long P [ ],
+    long Q [ ],
+    long Front_npivcol [ ],
+    long Front_parent [ ],
+    long Front_1strow [ ],
+    long Front_leftmostdesc [ ],
+    long Chain_start [ ],
+    long Chain_maxrows [ ],
+    long Chain_maxcols [ ],
+    void *Symbolic
+) ;
+
+/*
+
+double int Syntax:
+
+    #include "umfpack.h"
+    int status, n_row, n_col, nz, nfr, nchains, *P, *Q,
+	*Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc,
+	*Chain_start, *Chain_maxrows, *Chain_maxcols ;
+    void *Symbolic ;
+    status = umfpack_di_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains,
+	P, Q, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long status, n_row, n_col, nz, nfr, nchains, *P, *Q,
+	*Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc,
+	*Chain_start, *Chain_maxrows, *Chain_maxcols ;
+    void *Symbolic ;
+    status = umfpack_dl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains,
+	P, Q, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int status, n_row, n_col, nz, nfr, nchains, *P, *Q,
+	*Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc,
+	*Chain_start, *Chain_maxrows, *Chain_maxcols ;
+    void *Symbolic ;
+    status = umfpack_zi_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains,
+	P, Q, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long status, n_row, n_col, nz, nfr, nchains, *P, *Q,
+	*Front_npivcol, *Front_parent, *Front_1strow, *Front_leftmostdesc,
+	*Chain_start, *Chain_maxrows, *Chain_maxcols ;
+    void *Symbolic ;
+    status = umfpack_zl_get_symbolic (&n_row, &n_col, &nz, &nfr, &nchains,
+	P, Q, Front_npivcol, Front_parent, Front_1strow,
+	Front_leftmostdesc, Chain_start, Chain_maxrows, Chain_maxcols,
+	Symbolic) ;
+
+Purpose:
+
+    Copies the contents of the Symbolic object into simple integer arrays
+    accessible to the user.  This routine is not needed to factorize and/or
+    solve a sparse linear system using UMFPACK.  Note that the output arrays
+    P, Q, Front_npivcol, Front_parent, Front_1strow, Front_leftmostdesc,
+    Chain_start, Chain_maxrows, and Chain_maxcols are not allocated by
+    umfpack_*_get_symbolic; they must exist on input.
+
+    All output arguments are optional.  If any of them are NULL
+    on input, then that part of the symbolic analysis is not copied.  You can
+    use this routine to extract just the parts of the symbolic analysis that
+    you want.  For example, to retrieve just the column permutation Q, use:
+
+    #define noI (int *) NULL
+    status = umfpack_di_get_symbolic (noI, noI, noI, noI, noI, noI, noI,
+	    Q, noI, noI, noI, noI, noI, noI, noI, Symbolic) ;
+
+    The only required argument the last one, the pointer to the Symbolic object.
+
+    The Symbolic object is small.  Its size for an n-by-n square matrix varies
+    from 4*n to 13*n, depending on the matrix.  The object holds the initial
+    column permutation, the supernodal column elimination tree, and information
+    about each frontal matrix.  You can print it with umfpack_*_report_symbolic.
+
+Returns:
+
+    Returns UMFPACK_OK if successful, UMFPACK_ERROR_invalid_Symbolic_object
+    if Symbolic is an invalid object.
+
+Arguments:
+
+    Int *n_row ;	Output argument.
+    Int *n_col ;	Output argument.
+
+	The dimensions of the matrix A analyzed by the call to
+	umfpack_*_symbolic that generated the Symbolic object.
+
+    Int *n1 ;		Output argument.
+
+	The number of pivots with zero Markowitz cost (they have just one entry
+	in the pivot row, or the pivot column, or both).  These appear first in
+	the output permutations P and Q.
+
+    Int *nz ;		Output argument.
+
+	The number of nonzeros in A.
+
+    Int *nfr ;	Output argument.
+
+	The number of frontal matrices that will be used by umfpack_*_numeric
+	to factorize the matrix A.  It is in the range 0 to n_col.
+
+    Int *nchains ;	Output argument.
+
+	The frontal matrices are related to one another by the supernodal
+	column elimination tree.  Each node in this tree is one frontal matrix.
+	The tree is partitioned into a set of disjoint paths, and a frontal
+	matrix chain is one path in this tree.  Each chain is factorized using
+	a unifrontal technique, with a single working array that holds each
+	frontal matrix in the chain, one at a time.  nchains is in the range
+	0 to nfr.
+
+    Int P [n_row] ;	Output argument.
+
+	The initial row permutation.  If P [k] = i, then this means that
+	row i is the kth row in the pre-ordered matrix.  In general, this P is
+	not the same as the final row permutation computed by umfpack_*_numeric.
+
+	For the unsymmetric strategy, P defines the row-merge order.  Let j be
+	the column index of the leftmost nonzero entry in row i of A*Q.  Then
+	P defines a sort of the rows according to this value.  A row can appear
+	earlier in this ordering if it is aggressively absorbed before it can
+	become a pivot row.  If P [k] = i, row i typically will not be the kth
+	pivot row.
+
+	For the symmetric strategy, P = Q.  For the 2-by-2 strategy, P is the
+	row permutation that places large entries on the diagonal of P*A*Q.
+	If no pivoting occurs during numerical factorization, P [k] = i also
+	defines the final permutation of umfpack_*_numeric, for either the
+	symmetric or 2-by-2 strategies.
+
+    Int Q [n_col] ;	Output argument.
+
+	The initial column permutation.  If Q [k] = j, then this means that
+	column j is the kth pivot column in the pre-ordered matrix.  Q is
+	not necessarily the same as the final column permutation Q, computed by
+	umfpack_*_numeric.  The numeric factorization may reorder the pivot
+	columns within each frontal matrix to reduce fill-in.  If the matrix is
+	structurally singular, and if the symmetric or 2-by-2 strategies or
+	used (or if Control [UMFPACK_FIXQ] > 0), then this Q will be the same
+	as the final column permutation computed in umfpack_*_numeric.
+
+    Int Front_npivcol [n_col+1] ;	Output argument.
+
+	This array should be of size at least n_col+1, in order to guarantee
+	that it will be large enough to hold the output.  Only the first nfr+1
+	entries are used, however.
+
+	The kth frontal matrix holds Front_npivcol [k] pivot columns.  Thus, the
+	first frontal matrix, front 0, is used to factorize the first
+	Front_npivcol [0] columns; these correspond to the original columns
+	Q [0] through Q [Front_npivcol [0]-1].  The next frontal matrix
+	is used to factorize the next Front_npivcol [1] columns, which are thus
+	the original columns Q [Front_npivcol [0]] through
+	Q [Front_npivcol [0] + Front_npivcol [1] - 1], and so on.  Columns
+	with no entries at all are put in a placeholder "front",
+	Front_npivcol [nfr].  The sum of Front_npivcol [0..nfr] is equal to
+	n_col.
+
+	Any modifications that umfpack_*_numeric makes to the initial column
+	permutation are constrained to within each frontal matrix.  Thus, for
+	the first frontal matrix, Q [0] through Q [Front_npivcol [0]-1] is some
+	permutation of the columns Q [0] through
+	Q [Front_npivcol [0]-1].  For second frontal matrix,
+	Q [Front_npivcol [0]] through Q [Front_npivcol [0] + Front_npivcol[1]-1]
+	is some permutation of the same portion of Q, and so on.  All pivot
+	columns are numerically factorized within the frontal matrix originally
+	determined by the symbolic factorization; there is no delayed pivoting
+	across frontal matrices.
+
+    Int Front_parent [n_col+1] ;	Output argument.
+
+	This array should be of size at least n_col+1, in order to guarantee
+	that it will be large enough to hold the output.  Only the first nfr+1
+	entries are used, however.
+
+	Front_parent [0..nfr] holds the supernodal column elimination tree
+	(including the placeholder front nfr, which may be empty).  Each node in
+	the tree corresponds to a single frontal matrix.  The parent of node f
+	is Front_parent [f].
+
+    Int Front_1strow [n_col+1] ;	Output argument.
+
+	This array should be of size at least n_col+1, in order to guarantee
+	that it will be large enough to hold the output.  Only the first nfr+1
+	entries are used, however.
+
+	Front_1strow [k] is the row index of the first row in A (P,Q)
+	whose leftmost entry is in a pivot column for the kth front.  This is
+	necessary only to properly factorize singular matrices.  Rows in the
+	range Front_1strow [k] to Front_1strow [k+1]-1 first become pivot row
+	candidates at the kth front.  Any rows not eliminated in the kth front
+	may be selected as pivot rows in the parent of k (Front_parent [k])
+	and so on up the tree.
+
+    Int Front_leftmostdesc [n_col+1] ;	Output argument.
+
+	This array should be of size at least n_col+1, in order to guarantee
+	that it will be large enough to hold the output.  Only the first nfr+1
+	entries are used, however.
+
+	Front_leftmostdesc [k] is the leftmost descendant of front k, or k
+	if the front has no children in the tree.  Since the rows and columns
+	(P and Q) have been post-ordered via a depth-first-search of
+	the tree, rows in the range Front_1strow [Front_leftmostdesc [k]] to
+	Front_1strow [k+1]-1 form the entire set of candidate pivot rows for
+	the kth front (some of these will typically have already been selected
+	by fronts in the range Front_leftmostdesc [k] to front k-1, before
+	the factorization reaches front k).
+
+    Chain_start [n_col+1] ;	Output argument.
+
+	This array should be of size at least n_col+1, in order to guarantee
+	that it will be large enough to hold the output.  Only the first
+	nchains+1 entries are used, however.
+
+	The kth frontal matrix chain consists of frontal matrices Chain_start[k]
+	through Chain_start [k+1]-1.  Thus, Chain_start [0] is always 0, and
+	Chain_start [nchains] is the total number of frontal matrices, nfr.  For
+	two adjacent fronts f and f+1 within a single chain, f+1 is always the
+	parent of f (that is, Front_parent [f] = f+1).
+
+    Int Chain_maxrows [n_col+1] ;	Output argument.
+    Int Chain_maxcols [n_col+1] ;	Output argument.
+
+	These arrays should be of size at least n_col+1, in order to guarantee
+	that they will be large enough to hold the output.  Only the first
+	nchains entries are used, however.
+
+	The kth frontal matrix chain requires a single working array of
+	dimension Chain_maxrows [k] by Chain_maxcols [k], for the unifrontal
+	technique that factorizes the frontal matrix chain.  Since the symbolic
+	factorization only provides an upper bound on the size of each frontal
+	matrix, not all of the working array is necessarily used during the
+	numerical factorization.
+
+	Note that the upper bound on the number of rows and columns of each
+	frontal matrix is computed by umfpack_*_symbolic, but all that is
+	required by umfpack_*_numeric is the maximum of these two sets of
+	values for each frontal matrix chain.  Thus, the size of each
+	individual frontal matrix is not preserved in the Symbolic object.
+
+    void *Symbolic ;			Input argument, not modified.
+
+	The Symbolic object, which holds the symbolic factorization computed by
+	umfpack_*_symbolic.  The Symbolic object is not modified by
+	umfpack_*_get_symbolic.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_load_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,95 @@
+/* ========================================================================== */
+/* === umfpack_load_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_load_numeric
+(
+    void **Numeric,
+    char *filename
+) ;
+
+long umfpack_dl_load_numeric
+(
+    void **Numeric,
+    char *filename
+) ;
+
+int umfpack_zi_load_numeric
+(
+    void **Numeric,
+    char *filename
+) ;
+
+long umfpack_zl_load_numeric
+(
+    void **Numeric,
+    char *filename
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_di_load_numeric (&Numeric, filename) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_dl_load_numeric (&Numeric, filename) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_zi_load_numeric (&Numeric, filename) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_zl_load_numeric (&Numeric, filename) ;
+
+Purpose:
+
+    Loads a Numeric object from a file created by umfpack_*_save_numeric.  The
+    Numeric handle passed to this routine is overwritten with the new object.
+    If that object exists prior to calling this routine, a memory leak will
+    occur.  The contents of Numeric are ignored on input.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_out_of_memory if not enough memory is available.
+    UMFPACK_ERROR_file_IO if an I/O error occurred.
+
+Arguments:
+
+    void **Numeric ;	    Output argument.
+
+	**Numeric is the address of a (void *) pointer variable in the user's
+	calling routine (see Syntax, above).  On input, the contents of this
+	variable are not defined.  On output, this variable holds a (void *)
+	pointer to the Numeric object (if successful), or (void *) NULL if
+	a failure occurred.
+
+    char *filename ;	    Input argument, not modified.
+
+	A string that contains the filename from which to read the Numeric
+	object.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_load_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,95 @@
+/* ========================================================================== */
+/* === umfpack_load_symbolic ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_load_symbolic
+(
+    void **Symbolic,
+    char *filename
+) ;
+
+long umfpack_dl_load_symbolic
+(
+    void **Symbolic,
+    char *filename
+) ;
+
+int umfpack_zi_load_symbolic
+(
+    void **Symbolic,
+    char *filename
+) ;
+
+long umfpack_zl_load_symbolic
+(
+    void **Symbolic,
+    char *filename
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_di_load_symbolic (&Symbolic, filename) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_dl_load_symbolic (&Symbolic, filename) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_zi_load_symbolic (&Symbolic, filename) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_zl_load_symbolic (&Symbolic, filename) ;
+
+Purpose:
+
+    Loads a Symbolic object from a file created by umfpack_*_save_symbolic. The
+    Symbolic handle passed to this routine is overwritten with the new object.
+    If that object exists prior to calling this routine, a memory leak will
+    occur.  The contents of Symbolic are ignored on input.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_out_of_memory if not enough memory is available.
+    UMFPACK_ERROR_file_IO if an I/O error occurred.
+
+Arguments:
+
+    void **Symbolic ;	    Output argument.
+
+	**Symbolic is the address of a (void *) pointer variable in the user's
+	calling routine (see Syntax, above).  On input, the contents of this
+	variable are not defined.  On output, this variable holds a (void *)
+	pointer to the Symbolic object (if successful), or (void *) NULL if
+	a failure occurred.
+
+    char *filename ;	    Input argument, not modified.
+
+	A string that contains the filename from which to read the Symbolic
+	object.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,546 @@
+/* ========================================================================== */
+/* === umfpack_numeric ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_numeric
+(
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    void *Symbolic,
+    void **Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_dl_numeric
+(
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    void *Symbolic,
+    void **Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+int umfpack_zi_numeric
+(
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    void *Symbolic,
+    void **Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_zl_numeric
+(
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    void *Symbolic,
+    void **Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic, *Numeric ;
+    int *Ap, *Ai, status ;
+    double *Ax, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info);
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic, *Numeric ;
+    long *Ap, *Ai, status ;
+    double *Ax, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    status = umfpack_dl_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info);
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic, *Numeric ;
+    int *Ap, *Ai, status ;
+    double *Ax, *Az, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic, *Numeric ;
+    long *Ap, *Ai, status ;
+    double *Ax, *Az, Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    status = umfpack_zl_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+	Control, Info) ;
+
+packed complex Syntax:
+
+    Same as above, except that Az is NULL.
+
+Purpose:
+
+    Given a sparse matrix A in column-oriented form, and a symbolic analysis
+    computed by umfpack_*_*symbolic, the umfpack_*_numeric routine performs the
+    numerical factorization, PAQ=LU, PRAQ=LU, or P(R\A)Q=LU, where P and Q are
+    permutation matrices (represented as permutation vectors), R is the row
+    scaling, L is unit-lower triangular, and U is upper triangular.  This is
+    required before the system Ax=b (or other related linear systems) can be
+    solved.  umfpack_*_numeric can be called multiple times for each call to
+    umfpack_*_*symbolic, to factorize a sequence of matrices with identical
+    nonzero pattern.  Simply compute the Symbolic object once, with
+    umfpack_*_*symbolic, and reuse it for subsequent matrices.  This routine
+    safely detects if the pattern changes, and sets an appropriate error code.
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int Ap [n_col+1] ;	Input argument, not modified.
+
+	This must be identical to the Ap array passed to umfpack_*_*symbolic.
+	The value of n_col is what was passed to umfpack_*_*symbolic (this is
+	held in the Symbolic object).
+
+    Int Ai [nz] ;	Input argument, not modified, of size nz = Ap [n_col].
+
+	This must be identical to the Ai array passed to umfpack_*_*symbolic.
+
+    double Ax [nz] ;	Input argument, not modified, of size nz = Ap [n_col].
+			Size 2*nz for packed complex case.
+
+	The numerical values of the sparse matrix A.  The nonzero pattern (row
+	indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and
+	the corresponding numerical values are stored in
+	Ax [(Ap [j]) ... (Ap [j+1]-1)].
+
+    double Az [nz] ;	Input argument, not modified, for complex versions.
+
+	For the complex versions, this holds the imaginary part of A.  The
+	imaginary part of column j is held in Az [(Ap [j]) ... (Ap [j+1]-1)].
+
+	If Az is NULL, then both real
+	and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+    void *Symbolic ;	Input argument, not modified.
+
+	The Symbolic object, which holds the symbolic factorization computed by
+	umfpack_*_*symbolic.  The Symbolic object is not modified by
+	umfpack_*_numeric.
+
+    void **Numeric ;	Output argument.
+
+	**Numeric is the address of a (void *) pointer variable in the user's
+	calling routine (see Syntax, above).  On input, the contents of this
+	variable are not defined.  On output, this variable holds a (void *)
+	pointer to the Numeric object (if successful), or (void *) NULL if
+	a failure occurred.
+
+    double Control [UMFPACK_CONTROL] ;   Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PIVOT_TOLERANCE]:  relative pivot tolerance for
+	    threshold partial pivoting with row interchanges.  In any given
+	    column, an entry is numerically acceptable if its absolute value is
+	    greater than or equal to Control [UMFPACK_PIVOT_TOLERANCE] times
+	    the largest absolute value in the column.  A value of 1.0 gives true
+	    partial pivoting.  If less than or equal to zero, then any nonzero
+	    entry is numerically acceptable as a pivot.  Default: 0.1.
+
+	    Smaller values tend to lead to sparser LU factors, but the solution
+	    to the linear system can become inaccurate.  Larger values can lead
+	    to a more accurate solution (but not always), and usually an
+	    increase in the total work.
+
+	    For complex matrices, a cheap approximate of the absolute value
+	    is used for the threshold partial pivoting test (|a_real| + |a_imag|
+	    instead of the more expensive-to-compute exact absolute value
+	    sqrt (a_real^2 + a_imag^2)).
+
+	Control [UMFPACK_SYM_PIVOT_TOLERANCE]:
+	    If diagonal pivoting is attempted (the symmetric or symmetric-2by2
+	    strategies are used) then this parameter is used to control when the
+	    diagonal entry is selected in a given pivot column.  The absolute
+	    value of the entry must be >= Control [UMFPACK_SYM_PIVOT_TOLERANCE]
+	    times the largest absolute value in the column.  A value of zero
+	    will ensure that no off-diagonal pivoting is performed, except that
+	    zero diagonal entries are not selected if there are any off-diagonal
+	    nonzero entries.
+
+	    If an off-diagonal pivot is selected, an attempt is made to restore
+	    symmetry later on.  Suppose A (i,j) is selected, where i != j.
+	    If column i has not yet been selected as a pivot column, then
+	    the entry A (j,i) is redefined as a "diagonal" entry, except that
+	    the tighter tolerance (Control [UMFPACK_PIVOT_TOLERANCE]) is
+	    applied.  This strategy has an effect similar to 2-by-2 pivoting
+	    for symmetric indefinite matrices.  If a 2-by-2 block pivot with
+	    nonzero structure
+
+		       i j
+		    i: 0 x
+		    j: x 0
+
+	    is selected in a symmetric indefinite factorization method, the
+	    2-by-2 block is inverted and a rank-2 update is applied.  In
+	    UMFPACK, this 2-by-2 block would be reordered as
+
+		       j i
+		    i: x 0
+		    j: 0 x
+
+	    In both cases, the symmetry of the Schur complement is preserved.
+
+	Control [UMFPACK_SCALE]:  Note that the user's input matrix is
+	    never modified, only an internal copy is scaled.
+
+	    There are three valid settings for this parameter.  If any other
+	    value is provided, the default is used.
+
+	    UMFPACK_SCALE_NONE:  no scaling is performed.
+
+	    UMFPACK_SCALE_SUM:  each row of the input matrix A is divided by
+		the sum of the absolute values of the entries in that row.
+		The scaled matrix has an infinity norm of 1.
+
+	    UMFPACK_SCALE_MAX:  each row of the input matrix A is divided by
+		the maximum the absolute values of the entries in that row.
+		In the scaled matrix the largest entry in each row has
+		a magnitude exactly equal to 1.
+
+	    Note that for complex matrices, a cheap approximate absolute value
+	    is used, |a_real| + |a_imag|, instead of the exact absolute value
+	    sqrt ((a_real)^2 + (a_imag)^2).
+
+	    Scaling is very important for the "symmetric" strategy when
+	    diagonal pivoting is attempted.  It also improves the performance
+	    of the "unsymmetric" strategy.
+
+	    Default: UMFPACK_SCALE_SUM.
+
+	Control [UMFPACK_ALLOC_INIT]:
+
+	    When umfpack_*_numeric starts, it allocates memory for the Numeric
+	    object.  Part of this is of fixed size (approximately n double's +
+	    12*n integers).  The remainder is of variable size, which grows to
+	    hold the LU factors and the frontal matrices created during
+	    factorization.  A estimate of the upper bound is computed by
+	    umfpack_*_*symbolic, and returned by umfpack_*_*symbolic in
+	    Info [UMFPACK_VARIABLE_PEAK_ESTIMATE] (in Units).
+
+	    If Control [UMFPACK_ALLOC_INIT] is >= 0, umfpack_*_numeric initially
+	    allocates space for the variable-sized part equal to this estimate
+	    times Control [UMFPACK_ALLOC_INIT].  Typically, for matrices for
+	    which the "unsymmetric" strategy applies, umfpack_*_numeric needs
+	    only about half the estimated memory space, so a setting of 0.5 or
+	    0.6 often provides enough memory for umfpack_*_numeric to factorize
+	    the matrix with no subsequent increases in the size of this block.
+
+	    If the matrix is ordered via AMD, then this non-negative parameter
+	    is ignored.  The initial allocation ratio computed automatically,
+	    as 1.2 * (nz + Info [UMFPACK_SYMMETRIC_LUNZ]) /
+	    (Info [UMFPACK_LNZ_ESTIMATE] + Info [UMFPACK_UNZ_ESTIMATE] -
+	    min (n_row, n_col)).
+
+	    If Control [UMFPACK_ALLOC_INIT] is negative, then umfpack_*_numeric
+	    allocates a space with initial size (in Units) equal to
+	    (-Control [UMFPACK_ALLOC_INIT]).
+
+	    Regardless of the value of this parameter, a space equal to or
+	    greater than the the bare minimum amount of memory needed to start
+	    the factorization is always initially allocated.  The bare initial
+	    memory required is returned by umfpack_*_*symbolic in
+	    Info [UMFPACK_VARIABLE_INIT_ESTIMATE] (an exact value, not an
+	    estimate).
+
+	    If the variable-size part of the Numeric object is found to be too
+	    small sometime after numerical factorization has started, the memory
+	    is increased in size by a factor of 1.2.   If this fails, the
+	    request is reduced by a factor of 0.95 until it succeeds, or until
+	    it determines that no increase in size is possible.  Garbage
+	    collection then occurs.
+
+	    The strategy of attempting to "malloc" a working space, and
+	    re-trying with a smaller space, may not work under MATLAB, since
+	    mxMalloc aborts the mexFunction if it fails.  The built-in umfpack
+	    routine in MATLAB 6.5 uses utMalloc instead, which
+	    avoids this problem.  As a mexFunction, utMalloc is used unless
+	    -DNUTIL is defined at compile time.  The utMalloc routine, and
+	    utFree and utRealloc, are not documented.  If the mexFunction
+	    doesn't work, then compile it with -DNUTIL instead.
+
+	    If you are using the umfpack mexFunction, decrease the magnitude of
+	    Control [UMFPACK_ALLOC_INIT] if you run out of memory in MATLAB.
+
+	    Default initial allocation size: 0.7.  Thus, with the default
+	    control settings and the "unsymmetric" strategy, the upper-bound is
+	    reached after two reallocations (0.7 * 1.2 * 1.2 = 1.008).
+
+	    Changing this parameter has little effect on fill-in or operation
+	    count.  It has a small impact on run-time (the extra time required
+	    to do the garbage collection and memory reallocation).
+
+	Control [UMFPACK_FRONT_ALLOC_INIT]:
+
+	    When UMFPACK starts the factorization of each "chain" of frontal
+	    matrices, it allocates a working array to hold the frontal matrices
+	    as they are factorized.  The symbolic factorization computes the
+	    size of the largest possible frontal matrix that could occur during
+	    the factorization of each chain.
+
+	    If Control [UMFPACK_FRONT_ALLOC_INIT] is >= 0, the following
+	    strategy is used.  If the AMD ordering was used, this non-negative
+	    parameter is ignored.  A front of size (d+2)*(d+2) is allocated,
+	    where d = Info [UMFPACK_SYMMETRIC_DMAX].  Otherwise, a front of
+	    size Control [UMFPACK_FRONT_ALLOC_INIT] times the largest front
+	    possible for this chain is allocated.
+
+	    If Control [UMFPACK_FRONT_ALLOC_INIT] is negative, then a front of
+	    size (-Control [UMFPACK_FRONT_ALLOC_INIT]) is allocated (where the
+	    size is in terms of the number of numerical entries).  This is done
+	    regardless of the ordering method or ordering strategy used.
+
+	    Default: 0.5.
+
+	Control [UMFPACK_DROPTOL]:
+
+	    Entries in L and U with absolute value less than or equal to the
+	    drop tolerance are removed from the data structures (unless leaving
+	    them there reduces memory usage by reducing the space required
+	    for the nonzero pattern of L and U).
+
+	    Default: 0.0.
+
+    double Info [UMFPACK_INFO] ;	Output argument.
+
+	Contains statistics about the numeric factorization.  If a
+	(double *) NULL pointer is passed, then no statistics are returned in
+	Info (this is not an error condition).  The following statistics are
+	computed in umfpack_*_numeric:
+
+	Info [UMFPACK_STATUS]: status code.  This is also the return value,
+	    whether or not Info is present.
+
+	    UMFPACK_OK
+
+		Numeric factorization was successful.  umfpack_*_numeric
+		computed a valid numeric factorization.
+
+	    UMFPACK_WARNING_singular_matrix
+
+		Numeric factorization was successful, but the matrix is
+		singular.  umfpack_*_numeric computed a valid numeric
+		factorization, but you will get a divide by zero in
+		umfpack_*_*solve.  For the other cases below, no Numeric object
+		is created (*Numeric is (void *) NULL).
+
+	    UMFPACK_ERROR_out_of_memory
+
+		Insufficient memory to complete the numeric factorization.
+
+	    UMFPACK_ERROR_argument_missing
+
+		One or more required arguments are missing.
+
+	    UMFPACK_ERROR_invalid_Symbolic_object
+
+		Symbolic object provided as input is invalid.
+
+	    UMFPACK_ERROR_different_pattern
+
+		The pattern (Ap and/or Ai) has changed since the call to
+		umfpack_*_*symbolic which produced the Symbolic object.
+
+	Info [UMFPACK_NROW]:  the value of n_row stored in the Symbolic object.
+
+	Info [UMFPACK_NCOL]:  the value of n_col stored in the Symbolic object.
+
+	Info [UMFPACK_NZ]:  the number of entries in the input matrix.
+	    This value is obtained from the Symbolic object.
+
+	Info [UMFPACK_SIZE_OF_UNIT]:  the number of bytes in a Unit, for memory
+	    usage statistics below.
+
+	Info [UMFPACK_VARIABLE_INIT]: the initial size (in Units) of the
+	    variable-sized part of the Numeric object.  If this differs from
+	    Info [UMFPACK_VARIABLE_INIT_ESTIMATE], then the pattern (Ap and/or
+	    Ai) has changed since the last call to umfpack_*_*symbolic, which is
+	    an error condition.
+
+	Info [UMFPACK_VARIABLE_PEAK]: the peak size (in Units) of the
+	    variable-sized part of the Numeric object.  This size is the amount
+	    of space actually used inside the block of memory, not the space
+	    allocated via UMF_malloc.  You can reduce UMFPACK's memory
+	    requirements by setting Control [UMFPACK_ALLOC_INIT] to the ratio
+	    Info [UMFPACK_VARIABLE_PEAK] / Info[UMFPACK_VARIABLE_PEAK_ESTIMATE].
+	    This will ensure that no memory reallocations occur (you may want to
+	    add 0.001 to make sure that integer roundoff does not lead to a
+	    memory size that is 1 Unit too small; otherwise, garbage collection
+	    and reallocation will occur).
+
+	Info [UMFPACK_VARIABLE_FINAL]: the final size (in Units) of the
+	    variable-sized part of the Numeric object.  It holds just the
+	    sparse LU factors.
+
+	Info [UMFPACK_NUMERIC_SIZE]:  the actual final size (in Units) of the
+	    entire Numeric object, including the final size of the variable
+	    part of the object.  Info [UMFPACK_NUMERIC_SIZE_ESTIMATE],
+	    an estimate, was computed by umfpack_*_*symbolic.  The estimate is
+	    normally an upper bound on the actual final size, but this is not
+	    guaranteed.
+
+	Info [UMFPACK_PEAK_MEMORY]:  the actual peak memory usage (in Units) of
+	    both umfpack_*_*symbolic and umfpack_*_numeric.  An estimate,
+	    Info [UMFPACK_PEAK_MEMORY_ESTIMATE], was computed by
+	    umfpack_*_*symbolic.  The estimate is normally an upper bound on the
+	    actual peak usage, but this is not guaranteed.  With testing on
+	    hundreds of matrix arising in real applications, I have never
+	    observed a matrix where this estimate or the Numeric size estimate
+	    was less than the actual result, but this is theoretically possible.
+	    Please send me one if you find such a matrix.
+
+	Info [UMFPACK_FLOPS]:  the actual count of the (useful) floating-point
+	    operations performed.  An estimate, Info [UMFPACK_FLOPS_ESTIMATE],
+	    was computed by umfpack_*_*symbolic.  The estimate is guaranteed to
+	    be an upper bound on this flop count.  The flop count excludes
+	    "useless" flops on zero values, flops performed during the pivot
+	    search (for tentative updates and assembly of candidate columns),
+	    and flops performed to add frontal matrices together.
+
+	    For the real version, only (+ - * /) are counted.  For the complex
+	    version, the following counts are used:
+
+		operation	flops
+	    	c = 1/b		6
+		c = a*b		6
+		c -= a*b	8
+
+	Info [UMFPACK_LNZ]: the actual nonzero entries in final factor L,
+	    including the diagonal.  This excludes any zero entries in L,
+	    although some of these are stored in the Numeric object.  The
+	    Info [UMFPACK_LU_ENTRIES] statistic does account for all
+	    explicitly stored zeros, however.  Info [UMFPACK_LNZ_ESTIMATE],
+	    an estimate, was computed by umfpack_*_*symbolic.  The estimate is
+	    guaranteed to be an upper bound on Info [UMFPACK_LNZ].
+
+	Info [UMFPACK_UNZ]: the actual nonzero entries in final factor U,
+	    including the diagonal.  This excludes any zero entries in U,
+	    although some of these are stored in the Numeric object.  The
+	    Info [UMFPACK_LU_ENTRIES] statistic does account for all
+	    explicitly stored zeros, however.  Info [UMFPACK_UNZ_ESTIMATE],
+	    an estimate, was computed by umfpack_*_*symbolic.  The estimate is
+	    guaranteed to be an upper bound on Info [UMFPACK_UNZ].
+
+	Info [UMFPACK_NUMERIC_DEFRAG]:  The number of garbage collections
+	    performed during umfpack_*_numeric, to compact the contents of the
+	    variable-sized workspace used by umfpack_*_numeric.  No estimate was
+	    computed by umfpack_*_*symbolic.  In the current version of UMFPACK,
+	    garbage collection is performed and then the memory is reallocated,
+	    so this statistic is the same as Info [UMFPACK_NUMERIC_REALLOC],
+	    below.  It may differ in future releases.
+
+	Info [UMFPACK_NUMERIC_REALLOC]:  The number of times that the Numeric
+	    object was increased in size from its initial size.  A rough upper
+	    bound on the peak size of the Numeric object was computed by
+	    umfpack_*_*symbolic, so reallocations should be rare.  However, if
+	    umfpack_*_numeric is unable to allocate that much storage, it
+	    reduces its request until either the allocation succeeds, or until
+	    it gets too small to do anything with.  If the memory that it
+	    finally got was small, but usable, then the reallocation count
+	    could be high.  No estimate of this count was computed by
+	    umfpack_*_*symbolic.
+
+	Info [UMFPACK_NUMERIC_COSTLY_REALLOC]:  The number of times that the
+	    system realloc library routine (or mxRealloc for the mexFunction)
+	    had to move the workspace.  Realloc can sometimes increase the size
+	    of a block of memory without moving it, which is much faster.  This
+	    statistic will always be <= Info [UMFPACK_NUMERIC_REALLOC].  If your
+	    memory space is fragmented, then the number of "costly" realloc's
+	    will be equal to Info [UMFPACK_NUMERIC_REALLOC].
+
+	Info [UMFPACK_COMPRESSED_PATTERN]:  The number of integers used to
+	    represent the pattern of L and U.
+
+	Info [UMFPACK_LU_ENTRIES]:  The total number of numerical values that
+	    are stored for the LU factors.  Some of the values may be explicitly
+	    zero in order to save space (allowing for a smaller compressed
+	    pattern).
+
+	Info [UMFPACK_NUMERIC_TIME]:  The CPU time taken, in seconds.
+
+	Info [UMFPACK_RCOND]:  A rough estimate of the condition number, equal
+	    to min (abs (diag (U))) / max (abs (diag (U))), or zero if the
+	    diagonal of U is all zero.
+
+	Info [UMFPACK_UDIAG_NZ]:  The number of numerically nonzero values on
+	    the diagonal of U.
+
+	Info [UMFPACK_UMIN]:  the smallest absolute value on the diagonal of U.
+
+	Info [UMFPACK_UMAX]:  the smallest absolute value on the diagonal of U.
+
+	Info [UMFPACK_MAX_FRONT_SIZE]: the size of the
+	    largest frontal matrix (number of entries).
+
+	Info [UMFPACK_NUMERIC_WALLTIME]:  The wallclock time taken, in seconds.
+
+	Info [UMFPACK_MAX_FRONT_NROWS]: the max number of
+	    rows in any frontal matrix.
+
+	Info [UMFPACK_MAX_FRONT_NCOLS]: the max number of
+	    columns in any frontal matrix.
+
+	Info [UMFPACK_WAS_SCALED]:  the scaling used, either UMFPACK_SCALE_NONE,
+	    UMFPACK_SCALE_SUM, or UMFPACK_SCALE_MAX.
+
+	Info [UMFPACK_RSMIN]: if scaling is performed, the smallest scale factor
+	    for any row (either the smallest sum of absolute entries, or the
+	    smallest maximum of absolute entries).
+
+	Info [UMFPACK_RSMAX]: if scaling is performed, the largest scale factor
+	    for any row (either the largest sum of absolute entries, or the
+	    largest maximum of absolute entries).
+
+	Info [UMFPACK_ALLOC_INIT_USED]:  the initial allocation parameter used.
+
+	Info [UMFPACK_FORCED_UPDATES]:  the number of BLAS-3 updates to the
+	    frontal matrices that were required because the frontal matrix
+	    grew larger than its current working array.
+
+	Info [UMFPACK_NOFF_DIAG]: number of off-diagonal pivots selected, if the
+	    symmetric or 2-by-2 strategies are used.
+
+	Info [UMFPACK_NZDROPPED]: the number of entries smaller in absolute
+	    value than Control [UMFPACK_DROPTOL] that were dropped from L and U.
+	    Note that entries on the diagonal of U are never dropped.
+
+	Info [UMFPACK_ALL_LNZ]: the number of entries in L, including the
+	    diagonal, if no small entries are dropped.
+
+	Info [UMFPACK_ALL_UNZ]: the number of entries in U, including the
+	    diagonal, if no small entries are dropped.
+
+	Only the above listed Info [...] entries are accessed.  The remaining
+	entries of Info are not accessed or modified by umfpack_*_numeric.
+	Future versions might modify different parts of Info.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_qsymbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,150 @@
+/* ========================================================================== */
+/* === umfpack_qsymbolic ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_qsymbolic
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    const int Qinit [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_dl_qsymbolic
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    const long Qinit [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+int umfpack_zi_qsymbolic
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    const int Qinit [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_zl_qsymbolic
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    const long Qinit [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    int n_row, n_col, *Ap, *Ai, *Qinit, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ;
+    status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit,
+	&Symbolic, Control, Info) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    long n_row, n_col, *Ap, *Ai, *Qinit, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ;
+    status = umfpack_dl_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit,
+	&Symbolic, Control, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    int n_row, n_col, *Ap, *Ai, *Qinit, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ;
+    status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az, Qinit,
+	&Symbolic, Control, Info) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    long n_row, n_col, *Ap, *Ai, *Qinit, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ;
+    status = umfpack_zl_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az, Qinit,
+	&Symbolic, Control, Info) ;
+
+packed complex Syntax:
+
+    Same as above, except Az is NULL.
+
+Purpose:
+
+    Given the nonzero pattern of a sparse matrix A in column-oriented form, and
+    a sparsity preserving column pre-ordering Qinit, umfpack_*_qsymbolic
+    performs the symbolic factorization of A*Qinit (or A (:,Qinit) in MATLAB
+    notation).  This is identical to umfpack_*_symbolic, except that neither
+    COLAMD nor AMD are called and the user input column order Qinit is used
+    instead.  Note that in general, the Qinit passed to umfpack_*_qsymbolic
+    can differ from the final Q found in umfpack_*_numeric.  The unsymmetric
+    strategy will perform a column etree postordering done in
+    umfpack_*_qsymbolic and sparsity-preserving modifications are made within
+    each frontal matrix during umfpack_*_numeric.  The symmetric and 2-by-2
+    strategies will preserve Qinit, unless the matrix is structurally singular.
+
+    See umfpack_*_symbolic for more information.
+
+    *** WARNING ***  A poor choice of Qinit can easily cause umfpack_*_numeric
+    to use a huge amount of memory and do a lot of work.  The "default" symbolic
+    analysis method is umfpack_*_symbolic, not this routine.  If you use this
+    routine, the performance of UMFPACK is your responsibility;  UMFPACK will
+    not try to second-guess a poor choice of Qinit.
+
+Returns:
+
+    The value of Info [UMFPACK_STATUS]; see umfpack_*_symbolic.
+    Also returns UMFPACK_ERROR_invalid_permuation if Qinit is not a valid
+    permutation vector.
+
+Arguments:
+
+    All arguments are the same as umfpack_*_symbolic, except for the following:
+
+    Int Qinit [n_col] ;		Input argument, not modified.
+
+	The user's fill-reducing initial column pre-ordering.  This must be a
+	permutation of 0..n_col-1.  If Qinit [k] = j, then column j is the kth
+	column of the matrix A (:,Qinit) to be factorized.  If Qinit is an
+	(Int *) NULL pointer, then COLAMD or AMD are called instead.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If Qinit is not NULL, then only two strategies are recognized:
+	the unsymmetric strategy and the symmetric strategy.
+	If Control [UMFPACK_STRATEGY] is UMFPACK_STRATEGY_SYMMETRIC,
+	then the symmetric strategy is used.  Otherwise the unsymmetric
+	strategy is used.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_control.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,76 @@
+/* ========================================================================== */
+/* === umfpack_report_control =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_report_control
+(
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_dl_report_control
+(
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_zi_report_control
+(
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+void umfpack_zl_report_control
+(
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_di_report_control (Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_dl_report_control (Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_zi_report_control (Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    umfpack_zl_report_control (Control) ;
+
+Purpose:
+
+    Prints the current control settings.  Note that with the default print
+    level, nothing is printed.  Does nothing if Control is (double *) NULL.
+
+Arguments:
+
+    double Control [UMFPACK_CONTROL] ;   Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    1 or less: no output
+	    2 or more: print all of Control
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_info.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,86 @@
+/* ========================================================================== */
+/* === umfpack_report_info ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_report_info
+(
+    const double Control [UMFPACK_CONTROL],
+    const double Info [UMFPACK_INFO]
+) ;
+
+void umfpack_dl_report_info
+(
+    const double Control [UMFPACK_CONTROL],
+    const double Info [UMFPACK_INFO]
+) ;
+
+void umfpack_zi_report_info
+(
+    const double Control [UMFPACK_CONTROL],
+    const double Info [UMFPACK_INFO]
+) ;
+
+void umfpack_zl_report_info
+(
+    const double Control [UMFPACK_CONTROL],
+    const double Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    umfpack_di_report_info (Control, Info) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    umfpack_dl_report_info (Control, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    umfpack_zi_report_info (Control, Info) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO] ;
+    umfpack_zl_report_info (Control, Info) ;
+
+Purpose:
+
+    Reports statistics from the umfpack_*_*symbolic, umfpack_*_numeric, and
+    umfpack_*_*solve routines.
+
+Arguments:
+
+    double Control [UMFPACK_CONTROL] ;   Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    0 or less: no output, even when an error occurs
+	    1: error messages only
+	    2 or more: error messages, and print all of Info
+	    Default: 1
+
+    double Info [UMFPACK_INFO] ;		Input argument, not modified.
+
+	Info is an output argument of several UMFPACK routines.
+	The contents of Info are printed on standard output.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_matrix.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,203 @@
+/* ========================================================================== */
+/* === umfpack_report_matrix ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_matrix
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    int col_form,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_matrix
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    long col_form,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_matrix
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    int col_form,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_matrix
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    long col_form,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, *Ap, *Ai, status ;
+    double *Ax, Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, 1, Control) ;
+or:
+    status = umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, 0, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, *Ap, *Ai, status ;
+    double *Ax, Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_report_matrix (n_row, n_col, Ap, Ai, Ax, 1, Control) ;
+or:
+    status = umfpack_dl_report_matrix (n_row, n_col, Ap, Ai, Ax, 0, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, *Ap, *Ai, status ;
+    double *Ax, *Az, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 1,
+        Control) ;
+or:
+    status = umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 0,
+        Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, *Ap, *Ai, status ;
+    double *Ax, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 1,
+	Control) ;
+or:
+    status = umfpack_zl_report_matrix (n_row, n_col, Ap, Ai, Ax, Az, 0,
+	Control) ;
+
+packed complex Syntax:
+
+    Same as above, except Az is NULL.
+
+Purpose:
+
+    Verifies and prints a row or column-oriented sparse matrix.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked).
+
+    Otherwise (where n is n_col for the column form and n_row for row
+    and let ni be n_row for the column form and n_col for row):
+
+    UMFPACK_OK if the matrix is valid.
+
+    UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0.
+    UMFPACK_ERROR_argument_missing if Ap and/or Ai are missing.
+    UMFPACK_ERROR_invalid_matrix if Ap [n] < 0, if Ap [0] is not zero,
+	if Ap [j+1] < Ap [j] for any j in the range 0 to n-1,
+	if any row index in Ai is not in the range 0 to ni-1, or
+	if the row indices in any column are not in
+	ascending order, or contain duplicates.
+    UMFPACK_ERROR_out_of_memory if out of memory.
+
+Arguments:
+
+    Int n_row ;		Input argument, not modified.
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_row matrix.  Restriction: n_row > 0 and n_col > 0.
+
+    Int Ap [n+1] ;	Input argument, not modified.
+
+	n is n_row for a row-form matrix, and n_col for a column-form matrix.
+
+	Ap is an integer array of size n+1.  If col_form is true (nonzero),
+	then on input, it holds the "pointers" for the column form of the
+	sparse matrix A.  The row indices of column j of the matrix A are held
+	in Ai [(Ap [j]) ... (Ap [j+1]-1)].  Otherwise, Ap holds the
+	row pointers, and the column indices of row j of the matrix are held
+	in Ai [(Ap [j]) ... (Ap [j+1]-1)].
+
+	The first entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold
+	for all j in the range 0 to n-1.  The value nz = Ap [n] is thus the
+	total number of entries in the pattern of the matrix A.
+
+    Int Ai [nz] ;	Input argument, not modified, of size nz = Ap [n].
+
+	If col_form is true (nonzero), then the nonzero pattern (row indices)
+	for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)].  Row indices
+	must be in the range 0 to n_row-1 (the matrix is 0-based).
+
+	Otherwise, the nonzero pattern (column indices) for row j is stored in
+	Ai [(Ap [j]) ... (Ap [j+1]-1)]. Column indices must be in the range 0
+	to n_col-1 (the matrix is 0-based).
+
+    double Ax [nz] ;	Input argument, not modified, of size nz = Ap [n].
+			Size 2*nz for packed complex case.
+
+	The numerical values of the sparse matrix A.
+
+	If col_form is true (nonzero), then the nonzero pattern (row indices)
+	for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the
+	corresponding (real) numerical values are stored in
+	Ax [(Ap [j]) ... (Ap [j+1]-1)].  The imaginary parts are stored in
+	Az [(Ap [j]) ... (Ap [j+1]-1)], for the complex versions
+	(see below if Az is NULL).
+
+	Otherwise, the nonzero pattern (column indices) for row j
+	is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the corresponding
+	(real) numerical values are stored in Ax [(Ap [j]) ... (Ap [j+1]-1)].
+	The imaginary parts are stored in Az [(Ap [j]) ... (Ap [j+1]-1)],
+	for the complex versions (see below if Az is NULL).
+
+	No numerical values are printed if Ax is NULL.
+
+    double Az [nz] ;	Input argument, not modified, for complex versions.
+
+	The imaginary values of the sparse matrix A.   See the description
+	of Ax, above.
+
+	If Az is NULL, then both real
+	and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int col_form ;	Input argument, not modified.
+
+	The matrix is in row-oriented form if form is col_form is false (0).
+	Otherwise, the matrix is in column-oriented form.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,112 @@
+/* ========================================================================== */
+/* === umfpack_report_numeric =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_numeric
+(
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_numeric
+(
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_numeric
+(
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_numeric
+(
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    status = umfpack_di_report_numeric (Numeric, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    status = umfpack_dl_report_numeric (Numeric, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    status = umfpack_zi_report_numeric (Numeric, Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    status = umfpack_zl_report_numeric (Numeric, Control) ;
+
+Purpose:
+
+    Verifies and prints a Numeric object (the LU factorization, both its pattern
+    numerical values, and permutation vectors P and Q).  This routine checks the
+    object more carefully than the computational routines.  Normally, this check
+    is not required, since umfpack_*_numeric either returns (void *) NULL, or a
+    valid Numeric object.  However, if you suspect that your own code has
+    corrupted the Numeric object (by overruning memory bounds, for example),
+    then this routine might be able to detect a corrupted Numeric object.  Since
+    this is a complex object, not all such user-generated errors are guaranteed
+    to be caught by this routine.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked).
+
+    Otherwise:
+
+    UMFPACK_OK if the Numeric object is valid.
+    UMFPACK_ERROR_invalid_Numeric_object if the Numeric object is invalid.
+    UMFPACK_ERROR_out_of_memory if out of memory.
+
+Arguments:
+
+    void *Numeric ;			Input argument, not modified.
+
+	The Numeric object, which holds the numeric factorization computed by
+	umfpack_*_numeric.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_perm.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,112 @@
+/* ========================================================================== */
+/* === umfpack_report_perm ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_perm
+(
+    int np,
+    const int Perm [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_perm
+(
+    long np,
+    const long Perm [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_perm
+(
+    int np,
+    const int Perm [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_perm
+(
+    long np,
+    const long Perm [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int np, *Perm, status ;
+    double Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_report_perm (np, Perm, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long np, *Perm, status ;
+    double Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_report_perm (np, Perm, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int np, *Perm, status ;
+    double Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_report_perm (np, Perm, Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long np, *Perm, status ;
+    double Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_report_perm (np, Perm, Control) ;
+
+Purpose:
+
+    Verifies and prints a permutation vector.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked).
+
+    Otherwise:
+    UMFPACK_OK if the permutation vector is valid (this includes that case
+	when Perm is (Int *) NULL, which is not an error condition).
+    UMFPACK_ERROR_n_nonpositive if np <= 0.
+    UMFPACK_ERROR_out_of_memory if out of memory.
+    UMFPACK_ERROR_invalid_permutation if Perm is not a valid permutation vector.
+
+Arguments:
+
+    Int np ;		Input argument, not modified.
+
+	Perm is an integer vector of size np.  Restriction: np > 0.
+
+    Int Perm [np] ;	Input argument, not modified.
+
+	A permutation vector of size np.  If Perm is not present (an (Int *)
+	NULL pointer), then it is assumed to be the identity permutation.  This
+	is consistent with its use as an input argument to umfpack_*_qsymbolic,
+	and is not an error condition.  If Perm is present, the entries in Perm
+	must range between 0 and np-1, and no duplicates may exist.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_status.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,90 @@
+/* ========================================================================== */
+/* === umfpack_report_status ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_di_report_status
+(
+    const double Control [UMFPACK_CONTROL],
+    int status
+) ;
+
+void umfpack_dl_report_status
+(
+    const double Control [UMFPACK_CONTROL],
+    long status
+) ;
+
+void umfpack_zi_report_status
+(
+    const double Control [UMFPACK_CONTROL],
+    int status
+) ;
+
+void umfpack_zl_report_status
+(
+    const double Control [UMFPACK_CONTROL],
+    long status
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    umfpack_di_report_status (Control, status) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    umfpack_dl_report_status (Control, status) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    umfpack_zi_report_status (Control, status) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    umfpack_zl_report_status (Control, status) ;
+
+Purpose:
+
+    Prints the status (return value) of other umfpack_* routines.
+
+Arguments:
+
+    double Control [UMFPACK_CONTROL] ;   Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    0 or less: no output, even when an error occurs
+	    1: error messages only
+	    2 or more: print status, whether or not an error occurred
+	    4 or more: also print the UMFPACK Copyright
+	    6 or more: also print the UMFPACK License
+	    Default: 1
+
+    Int status ;			Input argument, not modified.
+
+	The return value from another umfpack_* routine.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,111 @@
+/* ========================================================================== */
+/* === umfpack_report_symbolic ============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_symbolic
+(
+    void *Symbolic,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_symbolic
+(
+    void *Symbolic,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_symbolic
+(
+    void *Symbolic,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_symbolic
+(
+    void *Symbolic,
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    status = umfpack_di_report_symbolic (Symbolic, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    status = umfpack_dl_report_symbolic (Symbolic, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    double Control [UMFPACK_CONTROL] ;
+    int status ;
+    status = umfpack_zi_report_symbolic (Symbolic, Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    double Control [UMFPACK_CONTROL] ;
+    long status ;
+    status = umfpack_zl_report_symbolic (Symbolic, Control) ;
+
+Purpose:
+
+    Verifies and prints a Symbolic object.  This routine checks the object more
+    carefully than the computational routines.  Normally, this check is not
+    required, since umfpack_*_*symbolic either returns (void *) NULL, or a valid
+    Symbolic object.  However, if you suspect that your own code has corrupted
+    the Symbolic object (by overruning memory bounds, for example), then this
+    routine might be able to detect a corrupted Symbolic object.  Since this is
+    a complex object, not all such user-generated errors are guaranteed to be
+    caught by this routine.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] is <= 2 (no inputs are checked).
+
+    Otherwise:
+
+    UMFPACK_OK if the Symbolic object is valid.
+    UMFPACK_ERROR_invalid_Symbolic_object if the Symbolic object is invalid.
+    UMFPACK_ERROR_out_of_memory if out of memory.
+
+Arguments:
+
+    void *Symbolic ;			Input argument, not modified.
+
+	The Symbolic object, which holds the symbolic factorization computed by
+	umfpack_*_*symbolic.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_triplet.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,153 @@
+/* ========================================================================== */
+/* === umfpack_report_triplet =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_triplet
+(
+    int n_row,
+    int n_col,
+    int nz,
+    const int Ti [ ],
+    const int Tj [ ],
+    const double Tx [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_triplet
+(
+    long n_row,
+    long n_col,
+    long nz,
+    const long Ti [ ],
+    const long Tj [ ],
+    const double Tx [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_triplet
+(
+    int n_row,
+    int n_col,
+    int nz,
+    const int Ti [ ],
+    const int Tj [ ],
+    const double Tx [ ], const double Tz [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_triplet
+(
+    long n_row,
+    long n_col,
+    long nz,
+    const long Ti [ ],
+    const long Tj [ ],
+    const double Tx [ ], const double Tz [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, nz, *Ti, *Tj, status ;
+    double *Tx, Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, nz, *Ti, *Tj, status ;
+    double *Tx, Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, nz, *Ti, *Tj, status ;
+    double *Tx, *Tz, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Tz,
+	Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, nz, *Ti, *Tj, status ;
+    double *Tx, *Tz, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Tz,
+	Control) ;
+
+packed complex Syntax:
+
+    Same as above, except Tz is NULL.
+
+Purpose:
+
+    Verifies and prints a matrix in triplet form.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked).
+
+    Otherwise:
+
+    UMFPACK_OK if the Triplet matrix is OK.
+    UMFPACK_ERROR_argument_missing if Ti and/or Tj are missing.
+    UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0.
+    UMFPACK_ERROR_invalid_matrix if nz < 0, or
+	if any row or column index in Ti and/or Tj
+	is not in the range 0 to n_row-1 or 0 to n_col-1, respectively.
+
+Arguments:
+
+    Int n_row ;		Input argument, not modified.
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_col matrix.
+
+    Int nz ;		Input argument, not modified.
+
+	The number of entries in the triplet form of the matrix.
+
+    Int Ti [nz] ;	Input argument, not modified.
+    Int Tj [nz] ;	Input argument, not modified.
+    double Tx [nz] ;	Input argument, not modified.
+			Size 2*nz for packed complex case.
+    double Tz [nz] ;	Input argument, not modified, for complex versions.
+
+	Ti, Tj, Tx (and Tz for complex versions) hold the "triplet" form of a
+	sparse matrix.  The kth nonzero entry is in row i = Ti [k], column
+	j = Tj [k], the real numerical value of a_ij is Tx [k], and the
+	imaginary part of a_ij is Tz [k] (for complex versions).  The row and
+	column indices i and j must be in the range 0 to n_row-1 or 0 to
+	n_col-1, respectively.  Duplicate entries may be present.  The
+	"triplets" may be in any order.  Tx and Tz are optional; if Tx is
+	not present ((double *) NULL), then the numerical values are
+	not printed.
+
+	If Tx is present and Tz is NULL, then both real
+	and imaginary parts are contained in Tx[0..2*nz-1], with Tx[2*k]
+	and Tx[2*k+1] being the real and imaginary part of the kth entry.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_report_vector.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,133 @@
+/* ========================================================================== */
+/* === umfpack_report_vector ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_report_vector
+(
+    int n,
+    const double X [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_dl_report_vector
+(
+    long n,
+    const double X [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+int umfpack_zi_report_vector
+(
+    int n,
+    const double Xx [ ], const double Xz [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+long umfpack_zl_report_vector
+(
+    long n,
+    const double Xx [ ], const double Xz [ ],
+    const double Control [UMFPACK_CONTROL]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n, status ;
+    double *X, Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_report_vector (n, X, Control) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n, status ;
+    double *X, Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_report_vector (n, X, Control) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n, status ;
+    double *Xx, *Xz, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_report_vector (n, Xx, Xz, Control) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long n, status ;
+    double *Xx, *Xz, Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_report_vector (n, Xx, Xz, Control) ;
+
+Purpose:
+
+    Verifies and prints a dense vector.
+
+Returns:
+
+    UMFPACK_OK if Control [UMFPACK_PRL] <= 2 (the input is not checked).
+
+    Otherwise:
+
+    UMFPACK_OK if the vector is valid.
+    UMFPACK_ERROR_argument_missing if X or Xx is missing.
+    UMFPACK_ERROR_n_nonpositive if n <= 0.
+
+Arguments:
+
+    Int n ;		Input argument, not modified.
+
+	X is a real or complex vector of size n.  Restriction: n > 0.
+
+    double X [n] ;	Input argument, not modified.  For real versions.
+
+	A real vector of size n.  X must not be (double *) NULL.
+
+    double Xx [n or 2*n] ; Input argument, not modified.  For complex versions.
+    double Xz [n or 0] ;   Input argument, not modified.  For complex versions.
+
+	A complex vector of size n, in one of two storage formats.
+	Xx must not be (double *) NULL.
+
+	If Xz is not (double *) NULL, then Xx [i] is the real part of X (i) and
+	Xz [i] is the imaginary part of X (i).  Both vectors are of length n.
+	This is the "split" form of the complex vector X.
+
+	If Xz is (double *) NULL, then Xx holds both real and imaginary parts,
+	where Xx [2*i] is the real part of X (i) and Xx [2*i+1] is the imaginary
+	part of X (i).  Xx is of length 2*n doubles.  If you have an ANSI C99
+	compiler with the intrinsic double _Complex type, then Xx can be of
+	type double _Complex in the calling routine and typecast to (double *)
+	when passed to umfpack_*_report_vector (this is untested, however).
+	This is the "merged" form of the complex vector X.
+
+	Note that all complex routines in UMFPACK V4.4 use this same
+	strategy for their complex arguments.  The split format is useful for
+	MATLAB, which holds its real and imaginary parts in seperate arrays.
+	The packed format is compatible with the intrinsic double _Complex
+	type in ANSI C99, and is also compatible with SuperLU's method of
+	storing complex matrices.  In Version 4.3, this routine was the only
+	one that allowed for packed complex arguments.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_PRL]:  printing level.
+
+	    2 or less: no output.  returns silently without checking anything.
+	    3: fully check input, and print a short summary of its status
+	    4: as 3, but print first few entries of the input
+	    5: as 3, but print all of the input
+	    Default: 1
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_save_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,90 @@
+/* ========================================================================== */
+/* === umfpack_save_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_save_numeric
+(
+    void *Numeric,
+    char *filename
+) ;
+
+long umfpack_dl_save_numeric
+(
+    void *Numeric,
+    char *filename
+) ;
+
+int umfpack_zi_save_numeric
+(
+    void *Numeric,
+    char *filename
+) ;
+
+long umfpack_zl_save_numeric
+(
+    void *Numeric,
+    char *filename
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_di_save_numeric (Numeric, filename) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_dl_save_numeric (Numeric, filename) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_zi_save_numeric (Numeric, filename) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Numeric ;
+    status = umfpack_zl_save_numeric (Numeric, filename) ;
+
+Purpose:
+
+    Saves a Numeric object to a file, which can later be read by
+    umfpack_*_load_numeric.  The Numeric object is not modified.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_invalid_Numeric_object if Numeric is not valid.
+    UMFPACK_ERROR_file_IO if an I/O error occurred.
+
+Arguments:
+
+    void *Numeric ;	    Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric or loaded by umfpack_*_load_numeric.
+
+    char *filename ;	    Input argument, not modified.
+
+	A string that contains the filename to which the Numeric
+	object is written.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_save_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,90 @@
+/* ========================================================================== */
+/* === umfpack_save_symbolic================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_save_symbolic
+(
+    void *Symbolic,
+    char *filename
+) ;
+
+long umfpack_dl_save_symbolic
+(
+    void *Symbolic,
+    char *filename
+) ;
+
+int umfpack_zi_save_symbolic
+(
+    void *Symbolic,
+    char *filename
+) ;
+
+long umfpack_zl_save_symbolic
+(
+    void *Symbolic,
+    char *filename
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_di_save_symbolic (Symbolic, filename) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_dl_save_symbolic (Symbolic, filename) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_zi_save_symbolic (Symbolic, filename) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long status ;
+    char *filename ;
+    void *Symbolic ;
+    status = umfpack_zl_save_symbolic (Symbolic, filename) ;
+
+Purpose:
+
+    Saves a Symbolic object to a file, which can later be read by
+    umfpack_*_load_symbolic.  The Symbolic object is not modified.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_invalid_Symbolic_object if Symbolic is not valid.
+    UMFPACK_ERROR_file_IO if an I/O error occurred.
+
+Arguments:
+
+    void *Symbolic ;	    Input argument, not modified.
+
+	Symbolic must point to a valid Symbolic object, computed by
+	umfpack_*_symbolic or loaded by umfpack_*_load_symbolic.
+
+    char *filename ;	    Input argument, not modified.
+
+	A string that contains the filename to which the Symbolic
+	object is written.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_scale.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,112 @@
+/* ========================================================================== */
+/* === umfpack_scale ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_scale
+(
+    double X [ ],
+    const double B [ ],
+    void *Numeric
+) ;
+
+long umfpack_dl_scale
+(
+    double X [ ],
+    const double B [ ],
+    void *Numeric
+) ;
+
+int umfpack_zi_scale
+(
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric
+) ;
+
+long umfpack_zl_scale
+(
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double *B, *X ;
+    status = umfpack_di_scale (X, B, Numeric) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double *B, *X ;
+    status = umfpack_dl_scale (X, B, Numeric) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double *Bx, *Bz, *Xx, *Xz ;
+    status = umfpack_zi_scale (Xx, Xz, Bx, Bz, Numeric) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    double *Bx, *Bz, *Xx, *Xz ;
+    status = umfpack_zl_scale (Xx, Xz, Bx, Bz, Numeric) ;
+
+packed complex Syntax:
+
+    Same as above, except both Xz and Bz are NULL.
+
+Purpose:
+
+    Given LU factors computed by umfpack_*_numeric (PAQ=LU, PRAQ=LU, or
+    P(R\A)Q=LU), and a vector B, this routine computes X = B, X = R*B, or
+    X = R\B, as appropriate.  X and B must be vectors equal in length to the
+    number of rows of A.
+
+Returns:
+
+    The status code is returned.  UMFPACK_OK is returned if successful.
+    UMFPACK_ERROR_invalid_Numeric_object is returned in the Numeric
+    object is invalid.  UMFPACK_ERROR_argument_missing is returned if
+    any of the input vectors are missing (X and B for the real version,
+    and Xx and Bx for the complex version).
+
+Arguments:
+
+    double X [n_row] ;	Output argument.
+    or:
+    double Xx [n_row] ;	Output argument, real part.
+			Size 2*n_row for packed complex case.
+    double Xz [n_row] ;	Output argument, imaginary part.
+
+	The output vector X.  If either Xz or Bz are NULL, the vector
+	X is in packed complex form, with the kth entry in Xx [2*k] and
+	Xx [2*k+1], and likewise for B.
+
+    double B [n_row] ;	Input argument, not modified.
+    or:
+    double Bx [n_row] ;	Input argument, not modified, real part.
+			Size 2*n_row for packed complex case.
+    double Bz [n_row] ;	Input argument, not modified, imaginary part.
+
+	The input vector B.  See above if either Xz or Bz are NULL.
+
+    void *Numeric ;		Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric.
+
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_solve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,301 @@
+/* ========================================================================== */
+/* === umfpack_solve ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_solve
+(
+    int sys,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    double X [ ],
+    const double B [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_dl_solve
+(
+    long sys,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    double X [ ],
+    const double B [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+int umfpack_zi_solve
+(
+    int sys,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_zl_solve
+(
+    long sys,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, *Ap, *Ai, sys ;
+    double *B, *X, *Ax, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, *Ap, *Ai, sys ;
+    double *B, *X, *Ax, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, *Ap, *Ai, sys ;
+    double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, Info [UMFPACK_INFO],
+	Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric,
+	Control, Info) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, *Ap, *Ai, sys ;
+    double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, Info [UMFPACK_INFO],
+	Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric,
+	Control, Info) ;
+
+packed complex Syntax:
+
+    Same as above, Xz, Bz, and Az are NULL.
+
+Purpose:
+
+    Given LU factors computed by umfpack_*_numeric (PAQ=LU, PRAQ=LU, or
+    P(R\A)Q=LU) and the right-hand-side, B, solve a linear system for the
+    solution X.  Iterative refinement is optionally performed.  Only square
+    systems are handled.  Singular matrices result in a divide-by-zero for all
+    systems except those involving just the matrix L.  Iterative refinement is
+    not performed for singular matrices.  In the discussion below, n is equal
+    to n_row and n_col, because only square systems are handled.
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int sys ;		Input argument, not modified.
+
+	Defines which system to solve.  (') is the linear algebraic transpose
+	(complex conjugate if A is complex), and (.') is the array transpose.
+
+	    sys value	    system solved
+	    UMFPACK_A       Ax=b
+	    UMFPACK_At      A'x=b
+	    UMFPACK_Aat     A.'x=b
+	    UMFPACK_Pt_L    P'Lx=b
+	    UMFPACK_L       Lx=b
+	    UMFPACK_Lt_P    L'Px=b
+	    UMFPACK_Lat_P   L.'Px=b
+	    UMFPACK_Lt      L'x=b
+	    UMFPACK_U_Qt    UQ'x=b
+	    UMFPACK_U       Ux=b
+	    UMFPACK_Q_Ut    QU'x=b
+	    UMFPACK_Q_Uat   QU.'x=b
+	    UMFPACK_Ut      U'x=b
+	    UMFPACK_Uat     U.'x=b
+
+	Iterative refinement can be optionally performed when sys is any of
+	the following:
+
+	    UMFPACK_A       Ax=b
+	    UMFPACK_At      A'x=b
+	    UMFPACK_Aat     A.'x=b
+
+	For the other values of the sys argument, iterative refinement is not
+	performed (Control [UMFPACK_IRSTEP], Ap, Ai, Ax, and Az are ignored).
+
+    Int Ap [n+1] ;	Input argument, not modified.
+    Int Ai [nz] ;	Input argument, not modified.
+    double Ax [nz] ;	Input argument, not modified.
+			Size 2*nz for packed complex case.
+    double Az [nz] ;	Input argument, not modified, for complex versions.
+
+	If iterative refinement is requested (Control [UMFPACK_IRSTEP] >= 1,
+	Ax=b, A'x=b, or A.'x=b is being solved, and A is nonsingular), then
+	these arrays must be identical to the same ones passed to
+	umfpack_*_numeric.  The umfpack_*_solve routine does not check the
+	contents of these arguments, so the results are undefined if Ap, Ai, Ax,
+	and/or Az are modified between the calls the umfpack_*_numeric and
+	umfpack_*_solve.  These three arrays do not need to be present (NULL
+	pointers can be passed) if Control [UMFPACK_IRSTEP] is zero, or if a
+	system other than Ax=b, A'x=b, or A.'x=b is being solved, or if A is
+	singular, since in each of these cases A is not accessed.
+
+	If Az, Xz, or Bz are NULL, then both real
+	and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+    double X [n] ;	Output argument.
+    or:
+    double Xx [n] ;	Output argument, real part
+			Size 2*n for packed complex case.
+    double Xz [n] ;	Output argument, imaginary part.
+
+	The solution to the linear system, where n = n_row = n_col is the
+	dimension of the matrices A, L, and U.
+
+	If Az, Xz, or Bz are NULL, then both real
+	and imaginary parts are returned in Xx[0..2*n-1], with Xx[2*k] and
+	Xx[2*k+1] being the real and imaginary part of the kth entry.
+
+    double B [n] ;	Input argument, not modified.
+    or:
+    double Bx [n] ;	Input argument, not modified, real part.
+			Size 2*n for packed complex case.
+    double Bz [n] ;	Input argument, not modified, imaginary part.
+
+	The right-hand side vector, b, stored as a conventional array of size n
+	(or two arrays of size n for complex versions).  This routine does not
+	solve for multiple right-hand-sides, nor does it allow b to be stored in
+	a sparse-column form.
+
+	If Az, Xz, or Bz are NULL, then both real
+	and imaginary parts are contained in Bx[0..2*n-1], with Bx[2*k]
+	and Bx[2*k+1] being the real and imaginary part of the kth entry.
+
+    void *Numeric ;		Input argument, not modified.
+
+	Numeric must point to a valid Numeric object, computed by
+	umfpack_*_numeric.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used.  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_IRSTEP]:  The maximum number of iterative refinement
+	    steps to attempt.  A value less than zero is treated as zero.  If
+	    less than 1, or if Ax=b, A'x=b, or A.'x=b is not being solved, or
+	    if A is singular, then the Ap, Ai, Ax, and Az arguments are not
+	    accessed.  Default: 2.
+
+    double Info [UMFPACK_INFO] ;	Output argument.
+
+	Contains statistics about the solution factorization.  If a
+	(double *) NULL pointer is passed, then no statistics are returned in
+	Info (this is not an error condition).  The following statistics are
+	computed in umfpack_*_solve:
+
+	Info [UMFPACK_STATUS]: status code.  This is also the return value,
+	    whether or not Info is present.
+
+	    UMFPACK_OK
+
+		The linear system was successfully solved.
+
+	    UMFPACK_WARNING_singular_matrix
+
+		A divide-by-zero occurred.  Your solution will contain Inf's
+		and/or NaN's.  Some parts of the solution may be valid.  For
+		example, solving Ax=b with
+
+		A = [2 0]  b = [ 1 ]  returns x = [ 0.5 ]
+		    [0 0]      [ 0 ]              [ Inf ]
+
+	    UMFPACK_ERROR_out_of_memory
+
+		Insufficient memory to solve the linear system.
+
+	    UMFPACK_ERROR_argument_missing
+
+		One or more required arguments are missing.  The B, X, (or
+		Bx and Xx for the complex versions) arguments
+		are always required.  Info and Control are not required.  Ap,
+		Ai, Ax are required if Ax=b,
+		A'x=b, A.'x=b is to be solved, the (default) iterative
+		refinement is requested, and the matrix A is nonsingular.
+
+	    UMFPACK_ERROR_invalid_system
+
+		The sys argument is not valid, or the matrix A is not square.
+
+	    UMFPACK_ERROR_invalid_Numeric_object
+
+		The Numeric object is not valid.
+
+	Info [UMFPACK_NROW], Info [UMFPACK_NCOL]:
+		The dimensions of the matrix A (L is n_row-by-n_inner and
+		U is n_inner-by-n_col, with n_inner = min(n_row,n_col)).
+
+	Info [UMFPACK_NZ]:  the number of entries in the input matrix, Ap [n],
+	    if iterative refinement is requested (Ax=b, A'x=b, or A.'x=b is
+	    being solved, Control [UMFPACK_IRSTEP] >= 1, and A is nonsingular).
+
+	Info [UMFPACK_IR_TAKEN]:  The number of iterative refinement steps
+	    effectively taken.  The number of steps attempted may be one more
+	    than this; the refinement algorithm backtracks if the last
+	    refinement step worsens the solution.
+
+	Info [UMFPACK_IR_ATTEMPTED]:   The number of iterative refinement steps
+	    attempted.  The number of times a linear system was solved is one
+	    more than this (once for the initial Ax=b, and once for each Ay=r
+	    solved for each iterative refinement step attempted).
+
+	Info [UMFPACK_OMEGA1]:  sparse backward error estimate, omega1, if
+	    iterative refinement was performed, or -1 if iterative refinement
+	    not performed.
+
+	Info [UMFPACK_OMEGA2]:  sparse backward error estimate, omega2, if
+	    iterative refinement was performed, or -1 if iterative refinement
+	    not performed.
+
+	Info [UMFPACK_SOLVE_FLOPS]:  the number of floating point operations
+	    performed to solve the linear system.  This includes the work
+	    taken for all iterative refinement steps, including the backtrack
+	    (if any).
+
+	Info [UMFPACK_SOLVE_TIME]:  The time taken, in seconds.
+
+        Info [UMFPACK_SOLVE_WALLTIME]:  The wallclock time taken, in seconds.
+
+	Only the above listed Info [...] entries are accessed.  The remaining
+	entries of Info are not accessed or modified by umfpack_*_solve.
+	Future versions might modify different parts of Info.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,536 @@
+/* ========================================================================== */
+/* === umfpack_symbolic ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_symbolic
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_dl_symbolic
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+int umfpack_zi_symbolic
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+long umfpack_zl_symbolic
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    void **Symbolic,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    int n_row, n_col, *Ap, *Ai, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ;
+    status = umfpack_di_symbolic (n_row, n_col, Ap, Ai, Ax,
+	&Symbolic, Control, Info) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    long n_row, n_col, *Ap, *Ai, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax ;
+    status = umfpack_dl_symbolic (n_row, n_col, Ap, Ai, Ax,
+	&Symbolic, Control, Info) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    int n_row, n_col, *Ap, *Ai, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ;
+    status = umfpack_zi_symbolic (n_row, n_col, Ap, Ai, Ax, Az,
+	&Symbolic, Control, Info) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Symbolic ;
+    long n_row, n_col, *Ap, *Ai, status ;
+    double Control [UMFPACK_CONTROL], Info [UMFPACK_INFO], *Ax, *Az ;
+    status = umfpack_zl_symbolic (n_row, n_col, Ap, Ai, Ax, Az,
+	&Symbolic, Control, Info) ;
+
+packed complex Syntax:
+
+    Same as above, except Az is NULL.
+
+Purpose:
+
+    Given nonzero pattern of a sparse matrix A in column-oriented form,
+    umfpack_*_symbolic performs a column pre-ordering to reduce fill-in
+    (using COLAMD or AMD) and a symbolic factorization.  This is required
+    before the matrix can be numerically factorized with umfpack_*_numeric.
+    If you wish to bypass the COLAMD or AMD pre-ordering and provide your own
+    ordering, use umfpack_*_qsymbolic instead.
+
+    Since umfpack_*_symbolic and umfpack_*_qsymbolic are very similar, options
+    for both routines are discussed below.
+
+    For the following discussion, let S be the submatrix of A obtained after
+    eliminating all pivots of zero Markowitz cost.  S has dimension
+    (n_row-n1-nempty_row) -by- (n_col-n1-nempty_col), where
+    n1 = Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS],
+    nempty_row = Info [UMFPACK_NEMPTY_ROW] and
+    nempty_col = Info [UMFPACK_NEMPTY_COL].
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int n_row ;		Input argument, not modified.
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_col matrix.  Restriction: n_row > 0 and n_col > 0.
+
+    Int Ap [n_col+1] ;	Input argument, not modified.
+
+	Ap is an integer array of size n_col+1.  On input, it holds the
+	"pointers" for the column form of the sparse matrix A.  Column j of
+	the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)].  The first
+	entry, Ap [0], must be zero, and Ap [j] <= Ap [j+1] must hold for all
+	j in the range 0 to n_col-1.  The value nz = Ap [n_col] is thus the
+	total number of entries in the pattern of the matrix A.  nz must be
+	greater than or equal to zero.
+
+    Int Ai [nz] ;	Input argument, not modified, of size nz = Ap [n_col].
+
+	The nonzero pattern (row indices) for column j is stored in
+	Ai [(Ap [j]) ... (Ap [j+1]-1)].  The row indices in a given column j
+	must be in ascending order, and no duplicate row indices may be present.
+	Row indices must be in the range 0 to n_row-1 (the matrix is 0-based).
+	See umfpack_*_triplet_to_col for how to sort the columns of a matrix
+	and sum up the duplicate entries.  See umfpack_*_report_matrix for how
+	to print the matrix A.
+
+    double Ax [nz] ;	Optional input argument, not modified.
+			Size 2*nz for packed complex case.
+
+	The numerical values of the sparse matrix A.  The nonzero pattern (row
+	indices) for column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and
+	the corresponding numerical values are stored in
+	Ax [(Ap [j]) ... (Ap [j+1]-1)].  Used only by the 2-by-2 strategy to
+	determine whether entries are "large" or "small".  You do not have to
+	pass the same numerical values to umfpack_*_numeric.  If Ax is not
+	present (a (double *) NULL pointer), then any entry in A is assumed to
+	be "large".
+
+    double Az [nz] ;	Optional input argument, not modified, for complex
+			versions.
+
+	For the complex versions, this holds the imaginary part of A.  The
+	imaginary part of column j is held in Az [(Ap [j]) ... (Ap [j+1]-1)].
+
+	If Az is NULL, then both real
+	and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+	Used by the 2-by-2 strategy only.  See the description of Ax, above.
+
+    void **Symbolic ;	Output argument.
+
+	**Symbolic is the address of a (void *) pointer variable in the user's
+	calling routine (see Syntax, above).  On input, the contents of this
+	variable are not defined.  On output, this variable holds a (void *)
+	pointer to the Symbolic object (if successful), or (void *) NULL if
+	a failure occurred.
+
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+
+	If a (double *) NULL pointer is passed, then the default control
+	settings are used (the defaults are suitable for all matrices,
+	ranging from those with highly unsymmetric nonzero pattern, to
+	symmetric matrices).  Otherwise, the settings are determined from the
+	Control array.  See umfpack_*_defaults on how to fill the Control
+	array with the default settings.  If Control contains NaN's, the
+	defaults are used.  The following Control parameters are used:
+
+	Control [UMFPACK_STRATEGY]:  This is the most important control
+	    parameter.  It determines what kind of ordering and pivoting
+	    strategy that UMFPACK should use.  There are 4 options:
+
+	    UMFPACK_STRATEGY_AUTO:  This is the default.  The input matrix is
+		analyzed to determine how symmetric the nonzero pattern is, and
+		how many entries there are on the diagonal.  It then selects one
+		of the following strategies.  Refer to the User Guide for a
+		description of how the strategy is automatically selected.
+
+	    UMFPACK_STRATEGY_UNSYMMETRIC:  Use the unsymmetric strategy.  COLAMD
+		is used to order the columns of A, followed by a postorder of
+		the column elimination tree.  No attempt is made to perform
+		diagonal pivoting.  The column ordering is refined during
+		factorization.
+
+		In the numerical factorization, the
+		Control [UMFPACK_SYM_PIVOT_TOLERANCE] parameter is ignored.  A
+		pivot is selected if its magnitude is >=
+		Control [UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the
+		largest entry in its column.
+
+	    UMFPACK_STRATEGY_SYMMETRIC:  Use the symmetric strategy
+		In this method, the approximate minimum degree
+		ordering (AMD) is applied to A+A', followed by a postorder of
+		the elimination tree of A+A'.  UMFPACK attempts to perform
+		diagonal pivoting during numerical factorization.  No refinement
+		of the column pre-ordering is performed during factorization.
+
+		In the numerical factorization, a nonzero entry on the diagonal
+		is selected as the pivot if its magnitude is >= Control
+		[UMFPACK_SYM_PIVOT_TOLERANCE] (default 0.001) times the largest
+		entry in its column.  If this is not acceptable, then an
+		off-diagonal pivot is selected with magnitude >= Control
+		[UMFPACK_PIVOT_TOLERANCE] (default 0.1) times the largest entry
+		in its column.
+
+	    UMFPACK_STRATEGY_2BY2:  a row permutation P2 is found that places
+		large entries on the diagonal.  The matrix P2*A is then
+		factorized using the symmetric strategy, described above.
+		Refer to the User Guide for more information.
+
+	Control [UMFPACK_DENSE_COL]:
+	    If COLAMD is used, columns with more than
+	    max (16, Control [UMFPACK_DENSE_COL] * 16 * sqrt (n_row)) entries
+	    are placed placed last in the column pre-ordering.  Default: 0.2.
+
+	Control [UMFPACK_DENSE_ROW]:
+	    Rows with more than max (16, Control [UMFPACK_DENSE_ROW] * 16 *
+	    sqrt (n_col)) entries are treated differently in the COLAMD
+	    pre-ordering, and in the internal data structures during the
+	    subsequent numeric factorization.  Default: 0.2.
+
+	Control [UMFPACK_AMD_DENSE]:  rows/columns in A+A' with more than
+	    max (16, Control [UMFPACK_AMD_DENSE] * sqrt (n)) entries
+	    (where n = n_row = n_col) are ignored in the AMD pre-ordering.
+	    Default: 10.
+
+	Control [UMFPACK_BLOCK_SIZE]:  the block size to use for Level-3 BLAS
+	    in the subsequent numerical factorization (umfpack_*_numeric).
+	    A value less than 1 is treated as 1.  Default: 32.  Modifying this
+	    parameter affects when updates are applied to the working frontal
+	    matrix, and can indirectly affect fill-in and operation count.
+	    As long as the block size is large enough (8 or so), this parameter
+	    has a modest effect on performance.
+
+	Control [UMFPACK_2BY2_TOLERANCE]:  a diagonal entry S (k,k) is
+	    considered "small" if it is < tol * max (abs (S (:,k))), where S a
+	    submatrix of the scaled input matrix, with pivots of zero Markowitz
+	    cost removed.
+
+	Control [UMFPACK_SCALE]:  See umfpack_numeric.h for a description.
+	    Only affects the 2-by-2 strategy.  Default: UMFPACK_SCALE_SUM.
+
+	Control [UMFPACK_FIXQ]:  If > 0, then the pre-ordering Q is not modified
+	    during numeric factorization.  If < 0, then Q may be modified.  If
+	    zero, then this is controlled automatically (the unsymmetric
+	    strategy modifies Q, the others do not).  Default: 0.
+
+	Control [UMFPACK_AGGRESSIVE]:  If nonzero, aggressive absorption is used
+	    in COLAMD and AMD.  Default: 1.
+
+    double Info [UMFPACK_INFO] ;	Output argument, not defined on input.
+
+	Contains statistics about the symbolic analysis.  If a (double *) NULL
+	pointer is passed, then no statistics are returned in Info (this is not
+	an error condition).  The entire Info array is cleared (all entries set
+	to -1) and then the following statistics are computed:
+
+	Info [UMFPACK_STATUS]: status code.  This is also the return value,
+	    whether or not Info is present.
+
+	    UMFPACK_OK
+
+		Each column of the input matrix contained row indices
+		in increasing order, with no duplicates.  Only in this case
+		does umfpack_*_symbolic compute a valid symbolic factorization.
+		For the other cases below, no Symbolic object is created
+		(*Symbolic is (void *) NULL).
+
+	    UMFPACK_ERROR_n_nonpositive
+
+		n is less than or equal to zero.
+
+	    UMFPACK_ERROR_invalid_matrix
+
+		Number of entries in the matrix is negative, Ap [0] is nonzero,
+		a column has a negative number of entries, a row index is out of
+		bounds, or the columns of input matrix were jumbled (unsorted
+		columns or duplicate entries).
+
+	    UMFPACK_ERROR_out_of_memory
+
+		Insufficient memory to perform the symbolic analysis.  If the
+		analysis requires more than 2GB of memory and you are using
+		the 32-bit ("int") version of UMFPACK, then you are guaranteed
+		to run out of memory.  Try using the 64-bit version of UMFPACK.
+
+	    UMFPACK_ERROR_argument_missing
+
+		One or more required arguments is missing.
+
+	    UMFPACK_ERROR_internal_error
+
+		Something very serious went wrong.  This is a bug.
+		Please contact the author (davis@cise.ufl.edu).
+
+	Info [UMFPACK_NROW]:  the value of the input argument n_row.
+
+	Info [UMFPACK_NCOL]:  the value of the input argument n_col.
+
+	Info [UMFPACK_NZ]:  the number of entries in the input matrix
+	    (Ap [n_col]).
+
+	Info [UMFPACK_SIZE_OF_UNIT]:  the number of bytes in a Unit,
+	    for memory usage statistics below.
+
+	Info [UMFPACK_SIZE_OF_INT]:  the number of bytes in an int.
+
+	Info [UMFPACK_SIZE_OF_LONG]:  the number of bytes in a long.
+
+	Info [UMFPACK_SIZE_OF_POINTER]:  the number of bytes in a void *
+	    pointer.
+
+	Info [UMFPACK_SIZE_OF_ENTRY]:  the number of bytes in a numerical entry.
+
+	Info [UMFPACK_NDENSE_ROW]:  number of "dense" rows in A.  These rows are
+	    ignored when the column pre-ordering is computed in COLAMD.  They
+	    are also treated differently during numeric factorization.  If > 0,
+	    then the matrix had to be re-analyzed by UMF_analyze, which does
+	    not ignore these rows.
+
+	Info [UMFPACK_NEMPTY_ROW]:  number of "empty" rows in A, as determined
+	    These are rows that either have no entries, or whose entries are
+	    all in pivot columns of zero-Markowitz-cost pivots.
+
+	Info [UMFPACK_NDENSE_COL]:  number of "dense" columns in A.  COLAMD
+	    orders these columns are ordered last in the factorization, but
+	    before "empty" columns.
+
+	Info [UMFPACK_NEMPTY_COL]:  number of "empty" columns in A.  These are
+	    columns that either have no entries, or whose entries are all in
+	    pivot rows of zero-Markowitz-cost pivots.  These columns are
+	    ordered last in the factorization, to the right of "dense" columns.
+
+	Info [UMFPACK_SYMBOLIC_DEFRAG]:  number of garbage collections
+	    performed during ordering and symbolic pre-analysis.
+
+	Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]:  the amount of memory (in Units)
+	    required for umfpack_*_symbolic to complete.  This count includes
+	    the size of the Symbolic object itself, which is also reported in
+	    Info [UMFPACK_SYMBOLIC_SIZE].
+
+	Info [UMFPACK_SYMBOLIC_SIZE]: the final size of the Symbolic object (in
+	    Units).  This is fairly small, roughly 2*n to 13*n integers,
+	    depending on the matrix.
+
+	Info [UMFPACK_VARIABLE_INIT_ESTIMATE]: the Numeric object contains two
+	    parts.  The first is fixed in size (O (n_row+n_col)).  The
+	    second part holds the sparse LU factors and the contribution blocks
+	    from factorized frontal matrices.  This part changes in size during
+	    factorization.  Info [UMFPACK_VARIABLE_INIT_ESTIMATE] is the exact
+	    size (in Units) required for this second variable-sized part in
+	    order for the numerical factorization to start.
+
+	Info [UMFPACK_VARIABLE_PEAK_ESTIMATE]: the estimated peak size (in
+	    Units) of the variable-sized part of the Numeric object.  This is
+	    usually an upper bound, but that is not guaranteed.
+
+	Info [UMFPACK_VARIABLE_FINAL_ESTIMATE]: the estimated final size (in
+	    Units) of the variable-sized part of the Numeric object.  This is
+	    usually an upper bound, but that is not guaranteed.  It holds just
+	    the sparse LU factors.
+
+	Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]:  an estimate of the final size (in
+	    Units) of the entire Numeric object (both fixed-size and variable-
+	    sized parts), which holds the LU factorization (including the L, U,
+	    P and Q matrices).
+
+	Info [UMFPACK_PEAK_MEMORY_ESTIMATE]:  an estimate of the total amount of
+	    memory (in Units) required by umfpack_*_symbolic and
+	    umfpack_*_numeric to perform both the symbolic and numeric
+	    factorization.  This is the larger of the amount of memory needed
+	    in umfpack_*_numeric itself, and the amount of memory needed in
+	    umfpack_*_symbolic (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]).  The
+	    count includes the size of both the Symbolic and Numeric objects
+	    themselves.  It can be a very loose upper bound, particularly when
+	    the symmetric or 2-by-2 strategies are used.
+
+	Info [UMFPACK_FLOPS_ESTIMATE]:  an estimate of the total floating-point
+	    operations required to factorize the matrix.  This is a "true"
+	    theoretical estimate of the number of flops that would be performed
+	    by a flop-parsimonious sparse LU algorithm.  It assumes that no
+	    extra flops are performed except for what is strictly required to
+	    compute the LU factorization.  It ignores, for example, the flops
+            performed by umfpack_di_numeric to add contribution blocks of
+	    frontal matrices together.  If L and U are the upper bound on the
+	    pattern of the factors, then this flop count estimate can be
+	    represented in MATLAB (for real matrices, not complex) as:
+
+		Lnz = full (sum (spones (L))) - 1 ;	% nz in each col of L
+		Unz = full (sum (spones (U')))' - 1 ;	% nz in each row of U
+		flops = 2*Lnz*Unz + sum (Lnz) ;
+
+	    The actual "true flop" count found by umfpack_*_numeric will be
+	    less than this estimate.
+
+	    For the real version, only (+ - * /) are counted.  For the complex
+	    version, the following counts are used:
+
+		operation	flops
+	    	c = 1/b		6
+		c = a*b		6
+		c -= a*b	8
+
+	Info [UMFPACK_LNZ_ESTIMATE]:  an estimate of the number of nonzeros in
+	    L, including the diagonal.  Since L is unit-diagonal, the diagonal
+	    of L is not stored.  This estimate is a strict upper bound on the
+	    actual nonzeros in L to be computed by umfpack_*_numeric.
+
+	Info [UMFPACK_UNZ_ESTIMATE]:  an estimate of the number of nonzeros in
+	    U, including the diagonal.  This estimate is a strict upper bound on
+	    the actual nonzeros in U to be computed by umfpack_*_numeric.
+
+	Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE]: estimate of the size of the
+	    largest frontal matrix (# of entries), for arbitrary partial
+	    pivoting during numerical factorization.
+
+	Info [UMFPACK_SYMBOLIC_TIME]:  The CPU time taken, in seconds.
+
+	Info [UMFPACK_SYMBOLIC_WALLTIME]:  The wallclock time taken, in seconds.
+
+	Info [UMFPACK_STRATEGY_USED]: The ordering strategy used:
+	    UMFPACK_STRATEGY_SYMMETRIC, UMFPACK_STRATEGY_UNSYMMETRIC, or
+	    UMFPACK_STRATEGY_2BY2.
+
+	Info [UMFPACK_ORDERING_USED]:  The ordering method used:
+	    UMFPACK_ORDERING_COLAMD or UMFPACK_ORDERING_AMD.  It can be
+	    UMFPACK_ORDERING_GIVEN for umfpack_*_qsymbolic.
+
+	Info [UMFPACK_QFIXED]: 1 if the column pre-ordering will be refined
+	    during numerical factorization, 0 if not.
+
+	Info [UMFPACK_DIAG_PREFERED]: 1 if diagonal pivoting will be attempted,
+	    0 if not.
+
+	Info [UMFPACK_COL_SINGLETONS]:  the matrix A is analyzed by first
+	    eliminating all pivots with zero Markowitz cost.  This count is the
+	    number of these pivots with exactly one nonzero in their pivot
+	    column.
+
+	Info [UMFPACK_ROW_SINGLETONS]:  the number of zero-Markowitz-cost
+	    pivots with exactly one nonzero in their pivot row.
+
+	Info [UMFPACK_PATTERN_SYMMETRY]: the symmetry of the pattern of S.
+
+	Info [UMFPACK_NZ_A_PLUS_AT]: the number of off-diagonal entries in S+S'.
+
+	Info [UMFPACK_NZDIAG]:  the number of entries on the diagonal of S.
+
+	Info [UMFPACK_N2]:  if S is square, and nempty_row = nempty_col, this
+	    is equal to n_row - n1 - nempty_row.
+
+	Info [UMFPACK_S_SYMMETRIC]: 1 if S is square and its diagonal has been
+	    preserved, 0 otherwise.
+
+
+	Info [UMFPACK_MAX_FRONT_NROWS_ESTIMATE]: estimate of the max number of
+	    rows in any frontal matrix, for arbitrary partial pivoting.
+
+	Info [UMFPACK_MAX_FRONT_NCOLS_ESTIMATE]: estimate of the max number of
+	    columns in any frontal matrix, for arbitrary partial pivoting.
+
+	------------------------------------------------------------------------
+	The next four statistics are computed only if AMD is used:
+	------------------------------------------------------------------------
+
+	Info [UMFPACK_SYMMETRIC_LUNZ]: The number of nonzeros in L and U,
+	    assuming no pivoting during numerical factorization, and assuming a
+	    zero-free diagonal of U.  Excludes the entries on the diagonal of
+	    L.  If the matrix has a purely symmetric nonzero pattern, this is
+	    often a lower bound on the nonzeros in the actual L and U computed
+	    in the numerical factorization, for matrices that fit the criteria
+	    for the "symmetric" strategy.
+
+	Info [UMFPACK_SYMMETRIC_FLOPS]: The floating-point operation count in
+	    the numerical factorization phase, assuming no pivoting.  If the
+	    pattern of the matrix is symmetric, this is normally a lower bound
+	    on the floating-point operation count in the actual numerical
+	    factorization, for matrices that fit the criteria for the symmetric
+	    or 2-by-2 strategies
+
+	Info [UMFPACK_SYMMETRIC_NDENSE]: The number of "dense" rows/columns of
+	    S+S' that were ignored during the AMD ordering.  These are placed
+	    last in the output order.  If > 0, then the
+	    Info [UMFPACK_SYMMETRIC_*] statistics, above are rough upper bounds.
+
+	Info [UMFPACK_SYMMETRIC_DMAX]: The maximum number of nonzeros in any
+	    column of L, if no pivoting is performed during numerical
+	    factorization.  Excludes the part of the LU factorization for
+	    pivots with zero Markowitz cost.
+
+	------------------------------------------------------------------------
+	The following statistics are computed only if the 2-by-2 strategy is
+	used or attempted:
+	------------------------------------------------------------------------
+
+	Info [UMFPACK_2BY2_NWEAK]: the number of small diagonal entries in S.
+
+	Info [UMFPACK_2BY2_UNMATCHED]: the number of small diagonal entries
+	    in P2*S.
+
+	Info [UMFPACK_2BY2_PATTERN_SYMMETRY]: the symmetry of P2*S.
+
+	Info [UMFPACK_2BY2_NZ_PA_PLUS_AT]:  the number of off-diagonal entries
+	    in (P2*S)+(P2*S)'.
+
+	Info [UMFPACK_2BY2_NZDIAG]:  the number of nonzero entries on the
+	    diagonal of P2*S.
+
+
+	At the start of umfpack_*_symbolic, all of Info is set of -1, and then
+	after that only the above listed Info [...] entries are accessed.
+	Future versions might modify different parts of Info.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_tictoc.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,60 @@
+/* ========================================================================== */
+/* === umfpack_tictoc ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_tic (double stats [2]) ;
+
+void umfpack_toc (double stats [2]) ;
+
+
+/*
+Syntax (for all versions: di, dl, zi, and zl):
+
+    #include "umfpack.h"
+    double stats [2] ;
+    umfpack_tic (stats) ;
+    ...
+    umfpack_toc (stats) ;
+
+Purpose:
+
+    umfpack_tic returns the CPU time and wall clock time used by the process.
+    The CPU time includes both "user" and "system" time (the latter is time
+    spent by the system on behalf of the process, and is thus charged to the
+    process).  umfpack_toc returns the CPU time and wall clock time since the
+    last call to umfpack_tic with the same stats array.
+
+    Typical usage:
+
+	umfpack_tic (stats) ;
+	... do some work ...
+	umfpack_toc (stats) ;
+
+    then stats [1] contains the time in seconds used by the code between
+    umfpack_tic and umfpack_toc, and stats [0] contains the wall clock time
+    elapsed between the umfpack_tic and umfpack_toc.  These two routines act
+    just like tic and toc in MATLAB, except that the both process time and
+    wall clock time are returned.
+
+    This routine normally uses the sysconf and times routines in the POSIX
+    standard.  If -DNPOSIX is defined at compile time, then the ANSI C clock
+    routine is used instead, and only the CPU time is returned (stats [0]
+    is set to zero).
+
+    umfpack_tic and umfpack_toc are the routines used internally in UMFPACK
+    to time the symbolic analysis, numerical factorization, and the forward/
+    backward solve.
+
+Arguments:
+
+    double stats [2]:
+
+	stats [0]:  wall clock time, in seconds
+	stats [1]:  CPU time, in seconds
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_timer.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,39 @@
+/* ========================================================================== */
+/* === umfpack_timer ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+double umfpack_timer ( void ) ;
+
+/*
+Syntax (for all versions: di, dl, zi, and zl):
+
+    #include "umfpack.h"
+    double t ;
+    t = umfpack_timer ( ) ;
+
+Purpose:
+
+    Returns the CPU time used by the process.  Includes both "user" and "system"
+    time (the latter is time spent by the system on behalf of the process, and
+    is thus charged to the process).  It does not return the wall clock time.
+    See umfpack_tic and umfpack_toc (the file umfpack_tictoc.h) for the timer
+    used internally by UMFPACK.
+
+    This routine uses the Unix getrusage routine, if available.  It is less
+    subject to overflow than the ANSI C clock routine.  If getrusage is not
+    available, the portable ANSI C clock routine is used instead.
+    Unfortunately, clock ( ) overflows if the CPU time exceeds 2147 seconds
+    (about 36 minutes) when sizeof (clock_t) is 4 bytes.  If you have getrusage,
+    be sure to compile UMFPACK with the -DGETRUSAGE flag set; see umf_config.h
+    and the User Guide for details.  Even the getrusage routine can overlow.
+
+Arguments:
+
+    None.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_transpose.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,216 @@
+/* ========================================================================== */
+/* === umfpack_transpose ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_transpose
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    const int P [ ],
+    const int Q [ ],
+    int Rp [ ],
+    int Ri [ ],
+    double Rx [ ]
+) ;
+
+long umfpack_dl_transpose
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    const long P [ ],
+    const long Q [ ],
+    long Rp [ ],
+    long Ri [ ],
+    double Rx [ ]
+) ;
+
+int umfpack_zi_transpose
+(
+    int n_row,
+    int n_col,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    const int P [ ],
+    const int Q [ ],
+    int Rp [ ],
+    int Ri [ ],
+    double Rx [ ], double Rz [ ],
+    int do_conjugate
+) ;
+
+long umfpack_zl_transpose
+(
+    long n_row,
+    long n_col,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    const long P [ ],
+    const long Q [ ],
+    long Rp [ ],
+    long Ri [ ],
+    double Rx [ ], double Rz [ ],
+    long do_conjugate
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri ;
+    double *Ax, *Rx ;
+    status = umfpack_di_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri ;
+    double *Ax, *Rx ;
+    status = umfpack_dl_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, Rp, Ri, Rx) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri, do_conjugate ;
+    double *Ax, *Az, *Rx, *Rz ;
+    status = umfpack_zi_transpose (n_row, n_col, Ap, Ai, Ax, Az, P, Q,
+	Rp, Ri, Rx, Rz, do_conjugate) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, status, *Ap, *Ai, *P, *Q, *Rp, *Ri, do_conjugate ;
+    double *Ax, *Az, *Rx, *Rz ;
+    status = umfpack_zl_transpose (n_row, n_col, Ap, Ai, Ax, Az, P, Q,
+	Rp, Ri, Rx, Rz, do_conjugate) ;
+
+packed complex Syntax:
+
+    Same as above, except Az are Rz are NULL.
+
+Purpose:
+
+    Transposes and optionally permutes a sparse matrix in row or column-form,
+    R = (PAQ)'.  In MATLAB notation, R = (A (P,Q))' or R = (A (P,Q)).' doing
+    either the linear algebraic transpose or the array transpose. Alternatively,
+    this routine can be viewed as converting A (P,Q) from column-form to
+    row-form, or visa versa (for the array transpose).  Empty rows and columns
+    may exist.  The matrix A may be singular and/or rectangular.
+
+    umfpack_*_transpose is useful if you want to factorize A' or A.' instead of
+    A.  Factorizing A' or A.' instead of A can be much better, particularly if
+    AA' is much sparser than A'A.  You can still solve Ax=b if you factorize
+    A' or A.', by solving with the sys argument UMFPACK_At or UMFPACK_Aat,
+    respectively, in umfpack_*_*solve.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_out_of_memory if umfpack_*_transpose fails to allocate a
+	size-max (n_row,n_col) workspace.
+    UMFPACK_ERROR_argument_missing if Ai, Ap, Ri, and/or Rp are missing.
+    UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0
+    UMFPACK_ERROR_invalid_permutation if P and/or Q are invalid.
+    UMFPACK_ERROR_invalid_matrix if Ap [n_col] < 0, if Ap [0] != 0,
+	if Ap [j] > Ap [j+1] for any j in the range 0 to n_col-1,
+	if any row index i is < 0 or >= n_row, or if the row indices
+	in any column are not in ascending order.
+
+Arguments:
+
+    Int n_row ;		Input argument, not modified.
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_col matrix.  Restriction: n_row > 0 and n_col > 0.
+
+    Int Ap [n_col+1] ;	Input argument, not modified.
+
+	The column pointers of the column-oriented form of the matrix A.  See
+	umfpack_*_symbolic for a description.  The number of entries in
+	the matrix is nz = Ap [n_col].  Ap [0] must be zero, Ap [n_col] must be
+	=> 0, and Ap [j] <= Ap [j+1] and Ap [j] <= Ap [n_col] must be true for
+	all j in the range 0 to n_col-1.  Empty columns are OK (that is, Ap [j]
+	may equal Ap [j+1] for any j in the range 0 to n_col-1).
+
+    Int Ai [nz] ;	Input argument, not modified, of size nz = Ap [n_col].
+
+	The nonzero pattern (row indices) for column j is stored in
+	Ai [(Ap [j]) ... (Ap [j+1]-1)].  The row indices in a given column j
+	must be in ascending order, and no duplicate row indices may be present.
+	Row indices must be in the range 0 to n_row-1 (the matrix is 0-based).
+
+    double Ax [nz] ;	Input argument, not modified, of size nz = Ap [n_col].
+			Size 2*nz if Az or Rz are NULL.
+    double Az [nz] ;	Input argument, not modified, for complex versions.
+
+	If present, these are the numerical values of the sparse matrix A.
+	The nonzero pattern (row indices) for column j is stored in
+	Ai [(Ap [j]) ... (Ap [j+1]-1)], and the corresponding real numerical
+	values are stored in Ax [(Ap [j]) ... (Ap [j+1]-1)].  The imaginary
+	values are stored in Az [(Ap [j]) ... (Ap [j+1]-1)].  The values are
+	transposed only if Ax and Rx are present.
+	This is not an error conditions; you are able to transpose
+	and permute just the pattern of a matrix.
+
+	If Az or Rz are NULL, then both real
+	and imaginary parts are contained in Ax[0..2*nz-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int P [n_row] ;		Input argument, not modified.
+
+	The permutation vector P is defined as P [k] = i, where the original
+	row i of A is the kth row of PAQ.  If you want to use the identity
+	permutation for P, simply pass (Int *) NULL for P.  This is not an error
+	condition.  P is a complete permutation of all the rows of A; this
+	routine does not support the creation of a transposed submatrix of A
+	(R = A (1:3,:)' where A has more than 3 rows, for example, cannot be
+	done; a future version might support this operation).
+
+    Int Q [n_col] ;		Input argument, not modified.
+
+	The permutation vector Q is defined as Q [k] = j, where the original
+	column j of A is the kth column of PAQ.  If you want to use the identity
+	permutation for Q, simply pass (Int *) NULL for Q.  This is not an error
+	condition.  Q is a complete permutation of all the columns of A; this
+	routine does not support the creation of a transposed submatrix of A.
+
+    Int Rp [n_row+1] ;	Output argument.
+
+	The column pointers of the matrix R = (A (P,Q))' or (A (P,Q)).', in the
+	same form as the column pointers Ap for the matrix A.
+
+    Int Ri [nz] ;	Output argument.
+
+	The row indices of the matrix R = (A (P,Q))' or (A (P,Q)).' , in the
+	same form as the row indices Ai for the matrix A.
+
+    double Rx [nz] ;	Output argument.
+			Size 2*nz if Az or Rz are NULL.
+    double Rz [nz] ;	Output argument, imaginary part for complex versions.
+
+	If present, these are the numerical values of the sparse matrix R,
+	in the same form as the values Ax and Az of the matrix A.
+
+	If Az or Rz are NULL, then both real
+	and imaginary parts are contained in Rx[0..2*nz-1], with Rx[2*k]
+	and Rx[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int do_conjugate ;	Input argument for complex versions only.
+
+	If true, and if Ax and Rx are present, then the linear
+	algebraic transpose is computed (complex conjugate).  If false, the
+	array transpose is computed instead.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_triplet_to_col.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,263 @@
+/* ========================================================================== */
+/* === umfpack_triplet_to_col =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_triplet_to_col
+(
+    int n_row,
+    int n_col,
+    int nz,
+    const int Ti [ ],
+    const int Tj [ ],
+    const double Tx [ ],
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ],
+    int Map [ ]
+) ;
+
+long umfpack_dl_triplet_to_col
+(
+    long n_row,
+    long n_col,
+    long nz,
+    const long Ti [ ],
+    const long Tj [ ],
+    const double Tx [ ],
+    long Ap [ ],
+    long Ai [ ],
+    double Ax [ ],
+    long Map [ ]
+) ;
+
+int umfpack_zi_triplet_to_col
+(
+    int n_row,
+    int n_col,
+    int nz,
+    const int Ti [ ],
+    const int Tj [ ],
+    const double Tx [ ], const double Tz [ ],
+    int Ap [ ],
+    int Ai [ ],
+    double Ax [ ], double Az [ ],
+    int Map [ ]
+) ;
+
+long umfpack_zl_triplet_to_col
+(
+    long n_row,
+    long n_col,
+    long nz,
+    const long Ti [ ],
+    const long Tj [ ],
+    const double Tx [ ], const double Tz [ ],
+    long Ap [ ],
+    long Ai [ ],
+    double Ax [ ], double Az [ ],
+    long Map [ ]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ;
+    double *Tx, *Ax ;
+    status = umfpack_di_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx,
+	Ap, Ai, Ax, Map) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ;
+    double *Tx, *Ax ;
+    status = umfpack_dl_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx,
+	Ap, Ai, Ax, Map) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    int n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ;
+    double *Tx, *Tz, *Ax, *Az ;
+    status = umfpack_zi_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, Tz,
+	Ap, Ai, Ax, Az, Map) ;
+
+long Syntax:
+
+    #include "umfpack.h"
+    long n_row, n_col, nz, *Ti, *Tj, *Ap, *Ai, status, *Map ;
+    double *Tx, *Tz, *Ax, *Az ;
+    status = umfpack_zl_triplet_to_col (n_row, n_col, nz, Ti, Tj, Tx, Tz,
+	Ap, Ai, Ax, Az, Map) ;
+
+packed complex Syntax:
+
+    Same as above, except Tz and Az are NULL.
+
+Purpose:
+
+    Converts a sparse matrix from "triplet" form to compressed-column form.
+    Analogous to A = spconvert (Ti, Tj, Tx + Tz*1i) in MATLAB, except that
+    zero entries present in the triplet form are present in A.
+
+    The triplet form of a matrix is a very simple data structure for basic
+    sparse matrix operations.  For example, suppose you wish to factorize a
+    matrix A coming from a finite element method, in which A is a sum of
+    dense submatrices, A = E1 + E2 + E3 + ... .  The entries in each element
+    matrix Ei can be concatenated together in the three triplet arrays, and
+    any overlap between the elements will be correctly summed by
+    umfpack_*_triplet_to_col.
+
+    Transposing a matrix in triplet form is simple; just interchange the
+    use of Ti and Tj.  You can construct the complex conjugate transpose by
+    negating Tz, for the complex versions.
+
+    Permuting a matrix in triplet form is also simple.  If you want the matrix
+    PAQ, or A (P,Q) in MATLAB notation, where P [k] = i means that row i of
+    A is the kth row of PAQ and Q [k] = j means that column j of A is the kth
+    column of PAQ, then do the following.  First, create inverse permutations
+    Pinv and Qinv such that Pinv [i] = k if P [k] = i and Qinv [j] = k if
+    Q [k] = j.  Next, for the mth triplet (Ti [m], Tj [m], Tx [m], Tz [m]),
+    replace Ti [m] with Pinv [Ti [m]] and replace Tj [m] with Qinv [Tj [m]].
+
+    If you have a column-form matrix with duplicate entries or unsorted
+    columns, you can sort it and sum up the duplicates by first converting it
+    to triplet form with umfpack_*_col_to_triplet, and then converting it back
+    with umfpack_*_triplet_to_col.
+
+    Constructing a submatrix is also easy.  Just scan the triplets and remove
+    those entries outside the desired subset of 0...n_row-1 and 0...n_col-1,
+    and renumber the indices according to their position in the subset.
+
+    You can do all these operations on a column-form matrix by first
+    converting it to triplet form with umfpack_*_col_to_triplet, doing the
+    operation on the triplet form, and then converting it back with
+    umfpack_*_triplet_to_col.
+
+    The only operation not supported easily in the triplet form is the
+    multiplication of two sparse matrices (UMFPACK does not provide this
+    operation).
+
+    You can print the input triplet form with umfpack_*_report_triplet, and
+    the output matrix with umfpack_*_report_matrix.
+
+    The matrix may be singular (nz can be zero, and empty rows and/or columns
+    may exist).  It may also be rectangular and/or complex.
+
+Returns:
+
+    UMFPACK_OK if successful.
+    UMFPACK_ERROR_argument_missing if Ap, Ai, Ti, and/or Tj are missing.
+    UMFPACK_ERROR_n_nonpositive if n_row <= 0 or n_col <= 0.
+    UMFPACK_ERROR_invalid_matrix if nz < 0, or if for any k, Ti [k] and/or
+	Tj [k] are not in the range 0 to n_row-1 or 0 to n_col-1, respectively.
+    UMFPACK_ERROR_out_of_memory if unable to allocate sufficient workspace.
+
+Arguments:
+
+    Int n_row ;		Input argument, not modified.
+    Int n_col ;		Input argument, not modified.
+
+	A is an n_row-by-n_col matrix.  Restriction: n_row > 0 and n_col > 0.
+	All row and column indices in the triplet form must be in the range
+	0 to n_row-1 and 0 to n_col-1, respectively.
+
+    Int nz ;		Input argument, not modified.
+
+	The number of entries in the triplet form of the matrix.  Restriction:
+	nz >= 0.
+
+    Int Ti [nz] ;	Input argument, not modified.
+    Int Tj [nz] ;	Input argument, not modified.
+    double Tx [nz] ;	Input argument, not modified.
+			Size 2*nz if Tz or Az are NULL.
+    double Tz [nz] ;	Input argument, not modified, for complex versions.
+
+	Ti, Tj, Tx, and Tz hold the "triplet" form of a sparse matrix.  The kth
+	nonzero entry is in row i = Ti [k], column j = Tj [k], and the real part
+	of a_ij is Tx [k].  The imaginary part of a_ij is Tz [k], for complex
+	versions.  The row and column indices i and j must be in the range 0 to
+	n_row-1 and 0 to n_col-1, respectively.  Duplicate entries may be
+	present; they are summed in the output matrix.  This is not an error
+	condition.  The "triplets" may be in any order.  Tx, Tz, Ax, and Az
+	are optional.  Ax is computed only if both Ax and Tx are present
+	(not (double *) NULL).  This is not error condition; the routine can
+	create just the pattern of the output matrix from the pattern of the
+	triplets.
+
+	If Az or Tz are NULL, then both real
+	and imaginary parts are contained in Tx[0..2*nz-1], with Tx[2*k]
+	and Tx[2*k+1] being the real and imaginary part of the kth entry.
+
+    Int Ap [n_col+1] ;	Output argument.
+
+	Ap is an integer array of size n_col+1 on input.  On output, Ap holds
+	the "pointers" for the column form of the sparse matrix A.  Column j of
+	the matrix A is held in Ai [(Ap [j]) ... (Ap [j+1]-1)].  The first
+	entry, Ap [0], is zero, and Ap [j] <= Ap [j+1] holds for all j in the
+	range 0 to n_col-1.  The value nz2 = Ap [n_col] is thus the total
+	number of entries in the pattern of the matrix A.  Equivalently, the
+	number of duplicate triplets is nz - Ap [n_col].
+
+    Int Ai [nz] ;	Output argument.
+
+	Ai is an integer array of size nz on input.  Note that only the first
+	Ap [n_col] entries are used.
+
+	The nonzero pattern (row indices) for column j is stored in
+	Ai [(Ap [j]) ... (Ap [j+1]-1)].  The row indices in a given column j
+	are in ascending order, and no duplicate row indices are present.
+	Row indices are in the range 0 to n_col-1 (the matrix is 0-based).
+
+    double Ax [nz] ;	Output argument.  Size 2*nz if Tz or Az are NULL.
+    double Az [nz] ;	Output argument for complex versions.
+
+	Ax and Az (for the complex versions) are double arrays of size nz on
+	input.  Note that only the first Ap [n_col] entries are used
+	in both arrays.
+
+	Ax is optional; if Tx and/or Ax are not present (a (double *) NULL
+	pointer), then Ax is not computed.  If present, Ax holds the
+	numerical values of the the real part of the sparse matrix A and Az
+	holds the imaginary parts.  The nonzero pattern (row indices) for
+	column j is stored in Ai [(Ap [j]) ... (Ap [j+1]-1)], and the
+	corresponding numerical values are stored in
+	Ax [(Ap [j]) ... (Ap [j+1]-1)].  The imaginary parts are stored in
+	Az [(Ap [j]) ... (Ap [j+1]-1)], for the complex versions.
+
+	If Az or Tz are NULL, then both real
+	and imaginary parts are returned in Ax[0..2*nz2-1], with Ax[2*k]
+	and Ax[2*k+1] being the real and imaginary part of the kth entry.
+
+    int Map [nz] ;	Optional output argument.
+
+	If Map is present (a non-NULL pointer to an Int array of size nz), then
+	on output it holds the position of the triplets in the column-form
+	matrix.  That is, suppose p = Map [k], and the k-th triplet is i=Ti[k],
+	j=Tj[k], and aij=Tx[k].  Then i=Ai[p], and aij will have been summed
+	into Ax[p] (or simply aij=Ax[p] if there were no duplicate entries also
+	in row i and column j).  Also, Ap[j] <= p < Ap[j+1].  The Map array is
+	not computed if it is (Int *) NULL.  The Map array is useful for
+	converting a subsequent triplet form matrix with the same pattern as the
+	first one, without calling this routine.  If Ti and Tj do not change,
+	then Ap, and Ai can be reused from the prior call to
+	umfpack_*_triplet_to_col.  You only need to recompute Ax (and Az for the
+	split complex version).  This code excerpt properly sums up all
+	duplicate values (for the real version):
+
+	    for (p = 0 ; p < Ap [n_col] ; p++) Ax [p] = 0 ;
+	    for (k = 0 ; k < nz ; k++) Ax [Map [k]] += Tx [k] ;
+
+	This feature is useful (along with the reuse of the Symbolic object) if
+	you need to factorize a sequence of triplet matrices with identical
+	nonzero pattern (the order of the triplets in the Ti,Tj,Tx arrays must
+	also remain unchanged).  It is faster than calling this routine for
+	each matrix, and requires no workspace.
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Include/umfpack_wsolve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,172 @@
+/* ========================================================================== */
+/* === umfpack_wsolve ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+int umfpack_di_wsolve
+(
+    int sys,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ],
+    double X [ ],
+    const double B [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO],
+    int Wi [ ],
+    double W [ ]
+) ;
+
+long umfpack_dl_wsolve
+(
+    long sys,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ],
+    double X [ ],
+    const double B [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO],
+    long Wi [ ],
+    double W [ ]
+) ;
+
+int umfpack_zi_wsolve
+(
+    int sys,
+    const int Ap [ ],
+    const int Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO],
+    int Wi [ ],
+    double W [ ]
+) ;
+
+long umfpack_zl_wsolve
+(
+    long sys,
+    const long Ap [ ],
+    const long Ai [ ],
+    const double Ax [ ], const double Az [ ],
+    double Xx [ ],	 double Xz [ ],
+    const double Bx [ ], const double Bz [ ],
+    void *Numeric,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO],
+    long Wi [ ],
+    double W [ ]
+) ;
+
+/*
+double int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, *Ap, *Ai, *Wi, sys ;
+    double *B, *X, *Ax, *W, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_di_wsolve (sys, Ap, Ai, Ax, X, B, Numeric,
+	Control, Info, Wi, W) ;
+
+double long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, *Ap, *Ai, *Wi, sys ;
+    double *B, *X, *Ax, *W, Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_dl_wsolve (sys, Ap, Ai, Ax, X, B, Numeric,
+	Control, Info, Wi, W) ;
+
+complex int Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    int status, *Ap, *Ai, *Wi, sys ;
+    double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, *W,
+	Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_zi_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric,
+	Control, Info, Wi, W) ;
+
+complex long Syntax:
+
+    #include "umfpack.h"
+    void *Numeric ;
+    long status, *Ap, *Ai, *Wi, sys ;
+    double *Bx, *Bz, *Xx, *Xz, *Ax, *Az, *W,
+	Info [UMFPACK_INFO], Control [UMFPACK_CONTROL] ;
+    status = umfpack_zl_wsolve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz, Numeric,
+	Control, Info, Wi, W) ;
+
+packed complex Syntax:
+
+    Same as above, except Az, Xz, and Bz are NULL.
+
+Purpose:
+
+    Given LU factors computed by umfpack_*_numeric (PAQ=LU) and the
+    right-hand-side, B, solve a linear system for the solution X.  Iterative
+    refinement is optionally performed.  This routine is identical to
+    umfpack_*_solve, except that it does not dynamically allocate any workspace.
+    When you have many linear systems to solve, this routine is faster than
+    umfpack_*_solve, since the workspace (Wi, W) needs to be allocated only
+    once, prior to calling umfpack_*_wsolve.
+
+Returns:
+
+    The status code is returned.  See Info [UMFPACK_STATUS], below.
+
+Arguments:
+
+    Int sys ;		Input argument, not modified.
+    Int Ap [n+1] ;	Input argument, not modified.
+    Int Ai [nz] ;	Input argument, not modified.
+    double Ax [nz] ;	Input argument, not modified.
+			Size 2*nz in packed complex case.
+    double X [n] ;	Output argument.
+    double B [n] ;	Input argument, not modified.
+    void *Numeric ;	Input argument, not modified.
+    double Control [UMFPACK_CONTROL] ;	Input argument, not modified.
+    double Info [UMFPACK_INFO] ;	Output argument.
+
+    for complex versions:
+    double Az [nz] ;	Input argument, not modified, imaginary part
+    double Xx [n] ;	Output argument, real part.
+			Size 2*n in packed complex case.
+    double Xz [n] ;	Output argument, imaginary part
+    double Bx [n] ;	Input argument, not modified, real part.
+			Size 2*n in packed complex case.
+    double Bz [n] ;	Input argument, not modified, imaginary part
+
+	The above arguments are identical to umfpack_*_solve, except that the
+	error code UMFPACK_ERROR_out_of_memory will not be returned in
+	Info [UMFPACK_STATUS], since umfpack_*_wsolve does not allocate any
+	memory.
+
+    Int Wi [n] ;		Workspace.
+    double W [c*n] ;		Workspace, where c is defined below.
+
+	The Wi and W arguments are workspace used by umfpack_*_wsolve.  They
+	need not be initialized on input, and their contents are undefined on
+	output.  The size of W depends on whether or not iterative refinement is
+	used, and which version (real or complex) is called.  Iterative
+	refinement is performed if Ax=b, A'x=b, or A.'x=b is being solved,
+	Control [UMFPACK_IRSTEP] > 0, and A is nonsingular.  The size of W is
+	given below:
+
+				no iter.	with iter.
+				refinement	refinement
+	umfpack_di_wsolve	n		5*n
+	umfpack_dl_wsolve	n		5*n
+	umfpack_zi_wsolve	4*n		10*n
+	umfpack_zl_wsolve	4*n		10*n
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Lib/libumfpack.def	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,105 @@
+LIBRARY libumfpack.dll
+EXPORTS
+umfpack_di_col_to_triplet
+umfpack_di_defaults
+umfpack_di_free_numeric
+umfpack_di_free_symbolic
+umfpack_di_get_numeric
+umfpack_di_get_lunz
+umfpack_di_get_symbolic
+umfpack_di_get_determinant
+umfpack_di_numeric
+umfpack_di_qsymbolic
+umfpack_di_report_control
+umfpack_di_report_info
+umfpack_di_report_matrix
+umfpack_di_report_numeric
+umfpack_di_report_perm
+umfpack_di_report_status
+umfpack_di_report_symbolic
+umfpack_di_report_triplet
+umfpack_di_report_vector
+umfpack_di_solve
+umfpack_di_wsolve
+umfpack_di_symbolic
+umfpack_di_transpose
+umfpack_di_triplet_to_col
+umfpack_di_scale
+umfpack_dl_col_to_triplet
+umfpack_dl_defaults
+umfpack_dl_free_numeric
+umfpack_dl_free_symbolic
+umfpack_dl_get_numeric
+umfpack_dl_get_lunz
+umfpack_dl_get_symbolic
+umfpack_dl_get_determinant
+umfpack_dl_numeric
+umfpack_dl_qsymbolic
+umfpack_dl_report_control
+umfpack_dl_report_info
+umfpack_dl_report_matrix
+umfpack_dl_report_numeric
+umfpack_dl_report_perm
+umfpack_dl_report_status
+umfpack_dl_report_symbolic
+umfpack_dl_report_triplet
+umfpack_dl_report_vector
+umfpack_dl_solve
+umfpack_dl_wsolve
+umfpack_dl_symbolic
+umfpack_dl_transpose
+umfpack_dl_triplet_to_col
+umfpack_dl_scale
+umfpack_zi_col_to_triplet
+umfpack_zi_defaults
+umfpack_zi_free_numeric
+umfpack_zi_free_symbolic
+umfpack_zi_get_numeric
+umfpack_zi_get_lunz
+umfpack_zi_get_symbolic
+umfpack_zi_get_determinant
+umfpack_zi_numeric
+umfpack_zi_qsymbolic
+umfpack_zi_report_control
+umfpack_zi_report_info
+umfpack_zi_report_matrix
+umfpack_zi_report_numeric
+umfpack_zi_report_perm
+umfpack_zi_report_status
+umfpack_zi_report_symbolic
+umfpack_zi_report_triplet
+umfpack_zi_report_vector
+umfpack_zi_solve
+umfpack_zi_wsolve
+umfpack_zi_symbolic
+umfpack_zi_transpose
+umfpack_zi_triplet_to_col
+umfpack_zi_scale
+umfpack_zl_col_to_triplet
+umfpack_zl_defaults
+umfpack_zl_free_numeric
+umfpack_zl_free_symbolic
+umfpack_zl_get_numeric
+umfpack_zl_get_lunz
+umfpack_zl_get_symbolic
+umfpack_zl_get_determinant
+umfpack_zl_numeric
+umfpack_zl_qsymbolic
+umfpack_zl_report_control
+umfpack_zl_report_info
+umfpack_zl_report_matrix
+umfpack_zl_report_numeric
+umfpack_zl_report_perm
+umfpack_zl_report_status
+umfpack_zl_report_symbolic
+umfpack_zl_report_triplet
+umfpack_zl_report_vector
+umfpack_zl_solve
+umfpack_zl_wsolve
+umfpack_zl_symbolic
+umfpack_zl_transpose
+umfpack_zl_triplet_to_col
+umfpack_zl_scale
+umfpack_timer
+umfpack_tic
+umfpack_toc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/Contents.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,24 @@
+%Contents of the UMFPACK sparse matrix toolbox:
+%
+% umfpack           computes x=A\b, x=A/b, or lu (A) for a sparse matrix A
+% umfpack_make      to compile umfpack for use in MATLAB
+% umfpack_details   details on all the options for using umfpack in MATLAB
+% umfpack_report    prints optional control settings and statistics
+% umfpack_demo      a long demo
+% umfpack_simple    a simple demo
+% umfpack_btf       factorize A using a block triangular form
+% umfpack_solve     x = A\b or x = b/A
+% lu_normest        estimates norm (L*U-A, 1) without forming L*U-A
+% luflop	    given L and U, computes # of flops required to compute them
+% umfpack_test	    for testing umfpack (requires UFget interface to UF sparse
+%			matrix collection)
+%
+% See also:
+% amd		    symmetric minimum degree ordering
+% colamd            unsymmetric column approx minimum degree ordering
+% symamd            symmetric approx minimum degree ordering, based on colamd
+%
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+help Contents
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,229 @@
+#-------------------------------------------------------------------------------
+# UMFPACK GNUmakefile for the UMFPACK MATLAB mexFunction (GNU "make" only)
+#-------------------------------------------------------------------------------
+
+all: umfpack luflop
+
+include ../Make/Make.include
+
+MX = $(MEX) -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source
+
+#-------------------------------------------------------------------------------
+# source files
+#-------------------------------------------------------------------------------
+
+# 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/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 and user-callable amd_*.[ch] files (int/long versions only):
+AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid amd_preprocess
+
+# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c,
+# umf_triplet.c, and umf_assemble.c , with int/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/long and real/complex versions:
+UMF = $(UMF_CREATED) $(UMFCH)
+
+# user-callable umfpack_*.[ch] files (int/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/long and real/complex versions:
+UMFPACKW = umfpack_wsolve
+
+USER = $(UMFPACKW) $(UMFPACK)
+
+# user-callable, only one version for int/long, real/complex, *.[ch] files:
+GENERIC = umfpack_timer umfpack_tictoc
+
+#-------------------------------------------------------------------------------
+# include files:
+#-------------------------------------------------------------------------------
+
+AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h
+
+INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h
+
+INC = ../Include/umfpack.h \
+	$(addprefix ../Source/, $(INC1)) \
+	$(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \
+	$(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \
+	$(addprefix ../Include/, $(addsuffix .h,$(USER))) \
+	$(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \
+	$(AMDH)
+
+#-------------------------------------------------------------------------------
+# Create the umfpack and amd mexFunctions for MATLAB (int versions only)
+#-------------------------------------------------------------------------------
+
+MEXI   = $(addsuffix .o, $(subst umf_,umf_m_,$(UMFINT)))
+MEXDI  = $(addsuffix .o, $(subst umf_,umf_md_,$(UMF)) $(subst umfpack_,umfpack_md_,$(USER)))
+MEXZI  = $(addsuffix .o, $(subst umf_,umf_mz_,$(UMF)) $(subst umfpack_,umfpack_mz_,$(USER)) )
+MEXAMD = $(addsuffix .o, $(subst amd_,amd_m_,$(AMD)))
+MEXGN  = $(addsuffix .o, $(subst umfpack_,umfpack_m_,$(GENERIC)))
+
+MEXUMFPACK = $(MEXI) $(MEXDI) $(MEXZI) $(MEXGN)
+
+# Note that mex has no "-o" option, thus the need for $(MV) commands.
+# If it did, then the rules would be much simpler:
+#	$(MX) -DDINT -c $< -o $@
+
+#----------------------------------------
+# integer-only routines (no real/complex):
+#----------------------------------------
+
+amd_m_%.o: ../../AMD/Source/amd_%.c $(AMDH)
+	$(MX) -DDINT -c $<
+	- $(MV) amd_$*.o $@
+
+umf_m_%.o: ../Source/umf_%.c $(INC)
+	$(MX) -DDINT -c $<
+	- $(MV) umf_$*.o $@
+
+#----------------------------------------
+# Double precision, int version, for MATLAB
+#----------------------------------------
+
+umf_md_%.o: ../Source/umf_%.c $(INC)
+	$(MX) -DDINT -c $<
+	- $(MV) umf_$*.o $@
+
+umf_md_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
+	$(MX) -DDINT -DCONJUGATE_SOLVE -c $<
+	- $(MV) umf_$*tsolve.o $@
+
+umf_md_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DDINT -DDO_MAP -DDO_VALUES -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_md_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DDINT -DDO_MAP -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_md_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DDINT -DDO_VALUES -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_md_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DDINT -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_md_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
+	$(MX) -DDINT -DFIXQ -c $<
+	- $(MV) umf_assemble.o $@
+
+umf_md_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
+	$(MX) -DDINT -DDROP -c $<
+	- $(MV) umf_store_lu.o $@
+
+umfpack_md_wsolve.o: ../Source/umfpack_solve.c $(INC)
+	$(MX) -DDINT -DWSOLVE -c $<
+	- $(MV) umfpack_solve.o $@
+
+umfpack_md_%.o: ../Source/umfpack_%.c $(INC)
+	$(MX) -DDINT -c $<
+	- $(MV) umfpack_$*.o $@
+
+#----------------------------------------
+# Complex double precision, int version, for MATLAB
+#----------------------------------------
+
+umf_mz_%.o: ../Source/umf_%.c $(INC)
+	$(MX) -DZINT -c $<
+	- $(MV) umf_$*.o $@
+
+umf_mz_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
+	$(MX) -DZINT -DCONJUGATE_SOLVE -c $<
+	- $(MV) umf_$*tsolve.o $@
+
+umf_mz_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DZINT -DDO_MAP -DDO_VALUES -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_mz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DZINT -DDO_MAP -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_mz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DZINT -DDO_VALUES -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_mz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MX) -DZINT -c $<
+	- $(MV) umf_triplet.o $@
+
+umf_mz_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
+	$(MX) -DZINT -DFIXQ -c $<
+	- $(MV) umf_assemble.o $@
+
+umf_mz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
+	$(MX) -DZINT -DDROP -c $<
+	- $(MV) umf_store_lu.o $@
+
+umfpack_mz_wsolve.o: ../Source/umfpack_solve.c $(INC)
+	$(MX) -DZINT -DWSOLVE -c $<
+	- $(MV) umfpack_solve.o $@
+
+umfpack_mz_%.o: ../Source/umfpack_%.c $(INC)
+	$(MX) -DZINT -c $<
+	- $(MV) umfpack_$*.o $@
+
+#----------------------------------------
+# Generic routines for MATLAB
+#----------------------------------------
+
+umfpack_m_timer.o: ../Source/umfpack_timer.c $(INC)
+	$(MX) -c $<
+	- $(MV) umfpack_timer.o $@
+
+umfpack_m_tictoc.o: ../Source/umfpack_tictoc.c $(INC)
+	$(MX) -c $<
+	- $(MV) umfpack_tictoc.o $@
+
+#----------------------------------------
+# umfpack mexFunction
+#----------------------------------------
+
+umfpack: umfpackmex.c $(MEXUMFPACK) $(MEXAMD)
+	$(MX) -output umfpack umfpackmex.c $(MEXUMFPACK) $(MEXAMD)
+
+luflop: luflopmex.c
+	$(MX) -output luflop luflopmex.c
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) *.mex* *.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,439 @@
+#-------------------------------------------------------------------------------
+# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only)
+#-------------------------------------------------------------------------------
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: umfpack luflop
+
+include ../Make/Make.include
+
+MX = $(MEX) -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source
+
+umfpack:
+	$(MX) -DDINT -c ../Source/umf_analyze.c
+	$(MV) -f umf_analyze.o umf_m_analyze.o
+	$(MX) -DDINT -c ../Source/umf_apply_order.c
+	$(MV) -f umf_apply_order.o umf_m_apply_order.o
+	$(MX) -DDINT -c ../Source/umf_colamd.c
+	$(MV) -f umf_colamd.o umf_m_colamd.o
+	$(MX) -DDINT -c ../Source/umf_free.c
+	$(MV) -f umf_free.o umf_m_free.o
+	$(MX) -DDINT -c ../Source/umf_fsize.c
+	$(MV) -f umf_fsize.o umf_m_fsize.o
+	$(MX) -DDINT -c ../Source/umf_is_permutation.c
+	$(MV) -f umf_is_permutation.o umf_m_is_permutation.o
+	$(MX) -DDINT -c ../Source/umf_malloc.c
+	$(MV) -f umf_malloc.o umf_m_malloc.o
+	$(MX) -DDINT -c ../Source/umf_realloc.c
+	$(MV) -f umf_realloc.o umf_m_realloc.o
+	$(MX) -DDINT -c ../Source/umf_report_perm.c
+	$(MV) -f umf_report_perm.o umf_m_report_perm.o
+	$(MX) -DDINT -c ../Source/umf_singletons.c
+	$(MV) -f umf_singletons.o umf_m_singletons.o
+	$(MX) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
+	$(MV) -f umf_ltsolve.o umf_md_lhsolve.o
+	$(MX) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
+	$(MV) -f umf_utsolve.o umf_md_uhsolve.o
+	$(MX) -DDINT -DDO_MAP -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_md_triplet_map_nox.o
+	$(MX) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_md_triplet_nomap_x.o
+	$(MX) -DDINT -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_md_triplet_nomap_nox.o
+	$(MX) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_md_triplet_map_x.o
+	$(MX) -DDINT -DFIXQ -c ../Source/umf_assemble.c
+	$(MV) -f umf_assemble.o umf_md_assemble_fixq.o
+	$(MX) -DDINT -DDROP -c ../Source/umf_store_lu.c
+	$(MV) -f umf_store_lu.o umf_md_store_lu_drop.o
+	$(MX) -DDINT -c ../Source/umf_assemble.c
+	$(MV) -f umf_assemble.o umf_md_assemble.o
+	$(MX) -DDINT -c ../Source/umf_blas3_update.c
+	$(MV) -f umf_blas3_update.o umf_md_blas3_update.o
+	$(MX) -DDINT -c ../Source/umf_build_tuples.c
+	$(MV) -f umf_build_tuples.o umf_md_build_tuples.o
+	$(MX) -DDINT -c ../Source/umf_create_element.c
+	$(MV) -f umf_create_element.o umf_md_create_element.o
+	$(MX) -DDINT -c ../Source/umf_dump.c
+	$(MV) -f umf_dump.o umf_md_dump.o
+	$(MX) -DDINT -c ../Source/umf_extend_front.c
+	$(MV) -f umf_extend_front.o umf_md_extend_front.o
+	$(MX) -DDINT -c ../Source/umf_garbage_collection.c
+	$(MV) -f umf_garbage_collection.o umf_md_garbage_collection.o
+	$(MX) -DDINT -c ../Source/umf_get_memory.c
+	$(MV) -f umf_get_memory.o umf_md_get_memory.o
+	$(MX) -DDINT -c ../Source/umf_init_front.c
+	$(MV) -f umf_init_front.o umf_md_init_front.o
+	$(MX) -DDINT -c ../Source/umf_kernel.c
+	$(MV) -f umf_kernel.o umf_md_kernel.o
+	$(MX) -DDINT -c ../Source/umf_kernel_init.c
+	$(MV) -f umf_kernel_init.o umf_md_kernel_init.o
+	$(MX) -DDINT -c ../Source/umf_kernel_wrapup.c
+	$(MV) -f umf_kernel_wrapup.o umf_md_kernel_wrapup.o
+	$(MX) -DDINT -c ../Source/umf_local_search.c
+	$(MV) -f umf_local_search.o umf_md_local_search.o
+	$(MX) -DDINT -c ../Source/umf_lsolve.c
+	$(MV) -f umf_lsolve.o umf_md_lsolve.o
+	$(MX) -DDINT -c ../Source/umf_ltsolve.c
+	$(MV) -f umf_ltsolve.o umf_md_ltsolve.o
+	$(MX) -DDINT -c ../Source/umf_mem_alloc_element.c
+	$(MV) -f umf_mem_alloc_element.o umf_md_mem_alloc_element.o
+	$(MX) -DDINT -c ../Source/umf_mem_alloc_head_block.c
+	$(MV) -f umf_mem_alloc_head_block.o umf_md_mem_alloc_head_block.o
+	$(MX) -DDINT -c ../Source/umf_mem_alloc_tail_block.c
+	$(MV) -f umf_mem_alloc_tail_block.o umf_md_mem_alloc_tail_block.o
+	$(MX) -DDINT -c ../Source/umf_mem_free_tail_block.c
+	$(MV) -f umf_mem_free_tail_block.o umf_md_mem_free_tail_block.o
+	$(MX) -DDINT -c ../Source/umf_mem_init_memoryspace.c
+	$(MV) -f umf_mem_init_memoryspace.o umf_md_mem_init_memoryspace.o
+	$(MX) -DDINT -c ../Source/umf_report_vector.c
+	$(MV) -f umf_report_vector.o umf_md_report_vector.o
+	$(MX) -DDINT -c ../Source/umf_row_search.c
+	$(MV) -f umf_row_search.o umf_md_row_search.o
+	$(MX) -DDINT -c ../Source/umf_scale_column.c
+	$(MV) -f umf_scale_column.o umf_md_scale_column.o
+	$(MX) -DDINT -c ../Source/umf_set_stats.c
+	$(MV) -f umf_set_stats.o umf_md_set_stats.o
+	$(MX) -DDINT -c ../Source/umf_solve.c
+	$(MV) -f umf_solve.o umf_md_solve.o
+	$(MX) -DDINT -c ../Source/umf_symbolic_usage.c
+	$(MV) -f umf_symbolic_usage.o umf_md_symbolic_usage.o
+	$(MX) -DDINT -c ../Source/umf_transpose.c
+	$(MV) -f umf_transpose.o umf_md_transpose.o
+	$(MX) -DDINT -c ../Source/umf_tuple_lengths.c
+	$(MV) -f umf_tuple_lengths.o umf_md_tuple_lengths.o
+	$(MX) -DDINT -c ../Source/umf_usolve.c
+	$(MV) -f umf_usolve.o umf_md_usolve.o
+	$(MX) -DDINT -c ../Source/umf_utsolve.c
+	$(MV) -f umf_utsolve.o umf_md_utsolve.o
+	$(MX) -DDINT -c ../Source/umf_valid_numeric.c
+	$(MV) -f umf_valid_numeric.o umf_md_valid_numeric.o
+	$(MX) -DDINT -c ../Source/umf_valid_symbolic.c
+	$(MV) -f umf_valid_symbolic.o umf_md_valid_symbolic.o
+	$(MX) -DDINT -c ../Source/umf_grow_front.c
+	$(MV) -f umf_grow_front.o umf_md_grow_front.o
+	$(MX) -DDINT -c ../Source/umf_start_front.c
+	$(MV) -f umf_start_front.o umf_md_start_front.o
+	$(MX) -DDINT -c ../Source/umf_2by2.c
+	$(MV) -f umf_2by2.o umf_md_2by2.o
+	$(MX) -DDINT -c ../Source/umf_store_lu.c
+	$(MV) -f umf_store_lu.o umf_md_store_lu.o
+	$(MX) -DDINT -c ../Source/umf_scale.c
+	$(MV) -f umf_scale.o umf_md_scale.o
+	$(MX) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c
+	$(MV) -f umfpack_solve.o umfpack_md_wsolve.o
+	$(MX) -DDINT -c ../Source/umfpack_col_to_triplet.c
+	$(MV) -f umfpack_col_to_triplet.o umfpack_md_col_to_triplet.o
+	$(MX) -DDINT -c ../Source/umfpack_defaults.c
+	$(MV) -f umfpack_defaults.o umfpack_md_defaults.o
+	$(MX) -DDINT -c ../Source/umfpack_free_numeric.c
+	$(MV) -f umfpack_free_numeric.o umfpack_md_free_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_free_symbolic.c
+	$(MV) -f umfpack_free_symbolic.o umfpack_md_free_symbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_get_numeric.c
+	$(MV) -f umfpack_get_numeric.o umfpack_md_get_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_get_lunz.c
+	$(MV) -f umfpack_get_lunz.o umfpack_md_get_lunz.o
+	$(MX) -DDINT -c ../Source/umfpack_get_symbolic.c
+	$(MV) -f umfpack_get_symbolic.o umfpack_md_get_symbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_get_determinant.c
+	$(MV) -f umfpack_get_determinant.o umfpack_md_get_determinant.o
+	$(MX) -DDINT -c ../Source/umfpack_numeric.c
+	$(MV) -f umfpack_numeric.o umfpack_md_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_qsymbolic.c
+	$(MV) -f umfpack_qsymbolic.o umfpack_md_qsymbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_report_control.c
+	$(MV) -f umfpack_report_control.o umfpack_md_report_control.o
+	$(MX) -DDINT -c ../Source/umfpack_report_info.c
+	$(MV) -f umfpack_report_info.o umfpack_md_report_info.o
+	$(MX) -DDINT -c ../Source/umfpack_report_matrix.c
+	$(MV) -f umfpack_report_matrix.o umfpack_md_report_matrix.o
+	$(MX) -DDINT -c ../Source/umfpack_report_numeric.c
+	$(MV) -f umfpack_report_numeric.o umfpack_md_report_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_report_perm.c
+	$(MV) -f umfpack_report_perm.o umfpack_md_report_perm.o
+	$(MX) -DDINT -c ../Source/umfpack_report_status.c
+	$(MV) -f umfpack_report_status.o umfpack_md_report_status.o
+	$(MX) -DDINT -c ../Source/umfpack_report_symbolic.c
+	$(MV) -f umfpack_report_symbolic.o umfpack_md_report_symbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_report_triplet.c
+	$(MV) -f umfpack_report_triplet.o umfpack_md_report_triplet.o
+	$(MX) -DDINT -c ../Source/umfpack_report_vector.c
+	$(MV) -f umfpack_report_vector.o umfpack_md_report_vector.o
+	$(MX) -DDINT -c ../Source/umfpack_solve.c
+	$(MV) -f umfpack_solve.o umfpack_md_solve.o
+	$(MX) -DDINT -c ../Source/umfpack_symbolic.c
+	$(MV) -f umfpack_symbolic.o umfpack_md_symbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_transpose.c
+	$(MV) -f umfpack_transpose.o umfpack_md_transpose.o
+	$(MX) -DDINT -c ../Source/umfpack_triplet_to_col.c
+	$(MV) -f umfpack_triplet_to_col.o umfpack_md_triplet_to_col.o
+	$(MX) -DDINT -c ../Source/umfpack_scale.c
+	$(MV) -f umfpack_scale.o umfpack_md_scale.o
+	$(MX) -DDINT -c ../Source/umfpack_load_numeric.c
+	$(MV) -f umfpack_load_numeric.o umfpack_md_load_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_save_numeric.c
+	$(MV) -f umfpack_save_numeric.o umfpack_md_save_numeric.o
+	$(MX) -DDINT -c ../Source/umfpack_load_symbolic.c
+	$(MV) -f umfpack_load_symbolic.o umfpack_md_load_symbolic.o
+	$(MX) -DDINT -c ../Source/umfpack_save_symbolic.c
+	$(MV) -f umfpack_save_symbolic.o umfpack_md_save_symbolic.o
+	$(MX) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
+	$(MV) -f umf_ltsolve.o umf_mz_lhsolve.o
+	$(MX) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
+	$(MV) -f umf_utsolve.o umf_mz_uhsolve.o
+	$(MX) -DZINT -DDO_MAP -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_mz_triplet_map_nox.o
+	$(MX) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_mz_triplet_nomap_x.o
+	$(MX) -DZINT -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_mz_triplet_nomap_nox.o
+	$(MX) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f umf_triplet.o umf_mz_triplet_map_x.o
+	$(MX) -DZINT -DFIXQ -c ../Source/umf_assemble.c
+	$(MV) -f umf_assemble.o umf_mz_assemble_fixq.o
+	$(MX) -DZINT -DDROP -c ../Source/umf_store_lu.c
+	$(MV) -f umf_store_lu.o umf_mz_store_lu_drop.o
+	$(MX) -DZINT -c ../Source/umf_assemble.c
+	$(MV) -f umf_assemble.o umf_mz_assemble.o
+	$(MX) -DZINT -c ../Source/umf_blas3_update.c
+	$(MV) -f umf_blas3_update.o umf_mz_blas3_update.o
+	$(MX) -DZINT -c ../Source/umf_build_tuples.c
+	$(MV) -f umf_build_tuples.o umf_mz_build_tuples.o
+	$(MX) -DZINT -c ../Source/umf_create_element.c
+	$(MV) -f umf_create_element.o umf_mz_create_element.o
+	$(MX) -DZINT -c ../Source/umf_dump.c
+	$(MV) -f umf_dump.o umf_mz_dump.o
+	$(MX) -DZINT -c ../Source/umf_extend_front.c
+	$(MV) -f umf_extend_front.o umf_mz_extend_front.o
+	$(MX) -DZINT -c ../Source/umf_garbage_collection.c
+	$(MV) -f umf_garbage_collection.o umf_mz_garbage_collection.o
+	$(MX) -DZINT -c ../Source/umf_get_memory.c
+	$(MV) -f umf_get_memory.o umf_mz_get_memory.o
+	$(MX) -DZINT -c ../Source/umf_init_front.c
+	$(MV) -f umf_init_front.o umf_mz_init_front.o
+	$(MX) -DZINT -c ../Source/umf_kernel.c
+	$(MV) -f umf_kernel.o umf_mz_kernel.o
+	$(MX) -DZINT -c ../Source/umf_kernel_init.c
+	$(MV) -f umf_kernel_init.o umf_mz_kernel_init.o
+	$(MX) -DZINT -c ../Source/umf_kernel_wrapup.c
+	$(MV) -f umf_kernel_wrapup.o umf_mz_kernel_wrapup.o
+	$(MX) -DZINT -c ../Source/umf_local_search.c
+	$(MV) -f umf_local_search.o umf_mz_local_search.o
+	$(MX) -DZINT -c ../Source/umf_lsolve.c
+	$(MV) -f umf_lsolve.o umf_mz_lsolve.o
+	$(MX) -DZINT -c ../Source/umf_ltsolve.c
+	$(MV) -f umf_ltsolve.o umf_mz_ltsolve.o
+	$(MX) -DZINT -c ../Source/umf_mem_alloc_element.c
+	$(MV) -f umf_mem_alloc_element.o umf_mz_mem_alloc_element.o
+	$(MX) -DZINT -c ../Source/umf_mem_alloc_head_block.c
+	$(MV) -f umf_mem_alloc_head_block.o umf_mz_mem_alloc_head_block.o
+	$(MX) -DZINT -c ../Source/umf_mem_alloc_tail_block.c
+	$(MV) -f umf_mem_alloc_tail_block.o umf_mz_mem_alloc_tail_block.o
+	$(MX) -DZINT -c ../Source/umf_mem_free_tail_block.c
+	$(MV) -f umf_mem_free_tail_block.o umf_mz_mem_free_tail_block.o
+	$(MX) -DZINT -c ../Source/umf_mem_init_memoryspace.c
+	$(MV) -f umf_mem_init_memoryspace.o umf_mz_mem_init_memoryspace.o
+	$(MX) -DZINT -c ../Source/umf_report_vector.c
+	$(MV) -f umf_report_vector.o umf_mz_report_vector.o
+	$(MX) -DZINT -c ../Source/umf_row_search.c
+	$(MV) -f umf_row_search.o umf_mz_row_search.o
+	$(MX) -DZINT -c ../Source/umf_scale_column.c
+	$(MV) -f umf_scale_column.o umf_mz_scale_column.o
+	$(MX) -DZINT -c ../Source/umf_set_stats.c
+	$(MV) -f umf_set_stats.o umf_mz_set_stats.o
+	$(MX) -DZINT -c ../Source/umf_solve.c
+	$(MV) -f umf_solve.o umf_mz_solve.o
+	$(MX) -DZINT -c ../Source/umf_symbolic_usage.c
+	$(MV) -f umf_symbolic_usage.o umf_mz_symbolic_usage.o
+	$(MX) -DZINT -c ../Source/umf_transpose.c
+	$(MV) -f umf_transpose.o umf_mz_transpose.o
+	$(MX) -DZINT -c ../Source/umf_tuple_lengths.c
+	$(MV) -f umf_tuple_lengths.o umf_mz_tuple_lengths.o
+	$(MX) -DZINT -c ../Source/umf_usolve.c
+	$(MV) -f umf_usolve.o umf_mz_usolve.o
+	$(MX) -DZINT -c ../Source/umf_utsolve.c
+	$(MV) -f umf_utsolve.o umf_mz_utsolve.o
+	$(MX) -DZINT -c ../Source/umf_valid_numeric.c
+	$(MV) -f umf_valid_numeric.o umf_mz_valid_numeric.o
+	$(MX) -DZINT -c ../Source/umf_valid_symbolic.c
+	$(MV) -f umf_valid_symbolic.o umf_mz_valid_symbolic.o
+	$(MX) -DZINT -c ../Source/umf_grow_front.c
+	$(MV) -f umf_grow_front.o umf_mz_grow_front.o
+	$(MX) -DZINT -c ../Source/umf_start_front.c
+	$(MV) -f umf_start_front.o umf_mz_start_front.o
+	$(MX) -DZINT -c ../Source/umf_2by2.c
+	$(MV) -f umf_2by2.o umf_mz_2by2.o
+	$(MX) -DZINT -c ../Source/umf_store_lu.c
+	$(MV) -f umf_store_lu.o umf_mz_store_lu.o
+	$(MX) -DZINT -c ../Source/umf_scale.c
+	$(MV) -f umf_scale.o umf_mz_scale.o
+	$(MX) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c
+	$(MV) -f umfpack_solve.o umfpack_mz_wsolve.o
+	$(MX) -DZINT -c ../Source/umfpack_col_to_triplet.c
+	$(MV) -f umfpack_col_to_triplet.o umfpack_mz_col_to_triplet.o
+	$(MX) -DZINT -c ../Source/umfpack_defaults.c
+	$(MV) -f umfpack_defaults.o umfpack_mz_defaults.o
+	$(MX) -DZINT -c ../Source/umfpack_free_numeric.c
+	$(MV) -f umfpack_free_numeric.o umfpack_mz_free_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_free_symbolic.c
+	$(MV) -f umfpack_free_symbolic.o umfpack_mz_free_symbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_get_numeric.c
+	$(MV) -f umfpack_get_numeric.o umfpack_mz_get_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_get_lunz.c
+	$(MV) -f umfpack_get_lunz.o umfpack_mz_get_lunz.o
+	$(MX) -DZINT -c ../Source/umfpack_get_symbolic.c
+	$(MV) -f umfpack_get_symbolic.o umfpack_mz_get_symbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_get_determinant.c
+	$(MV) -f umfpack_get_determinant.o umfpack_mz_get_determinant.o
+	$(MX) -DZINT -c ../Source/umfpack_numeric.c
+	$(MV) -f umfpack_numeric.o umfpack_mz_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_qsymbolic.c
+	$(MV) -f umfpack_qsymbolic.o umfpack_mz_qsymbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_report_control.c
+	$(MV) -f umfpack_report_control.o umfpack_mz_report_control.o
+	$(MX) -DZINT -c ../Source/umfpack_report_info.c
+	$(MV) -f umfpack_report_info.o umfpack_mz_report_info.o
+	$(MX) -DZINT -c ../Source/umfpack_report_matrix.c
+	$(MV) -f umfpack_report_matrix.o umfpack_mz_report_matrix.o
+	$(MX) -DZINT -c ../Source/umfpack_report_numeric.c
+	$(MV) -f umfpack_report_numeric.o umfpack_mz_report_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_report_perm.c
+	$(MV) -f umfpack_report_perm.o umfpack_mz_report_perm.o
+	$(MX) -DZINT -c ../Source/umfpack_report_status.c
+	$(MV) -f umfpack_report_status.o umfpack_mz_report_status.o
+	$(MX) -DZINT -c ../Source/umfpack_report_symbolic.c
+	$(MV) -f umfpack_report_symbolic.o umfpack_mz_report_symbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_report_triplet.c
+	$(MV) -f umfpack_report_triplet.o umfpack_mz_report_triplet.o
+	$(MX) -DZINT -c ../Source/umfpack_report_vector.c
+	$(MV) -f umfpack_report_vector.o umfpack_mz_report_vector.o
+	$(MX) -DZINT -c ../Source/umfpack_solve.c
+	$(MV) -f umfpack_solve.o umfpack_mz_solve.o
+	$(MX) -DZINT -c ../Source/umfpack_symbolic.c
+	$(MV) -f umfpack_symbolic.o umfpack_mz_symbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_transpose.c
+	$(MV) -f umfpack_transpose.o umfpack_mz_transpose.o
+	$(MX) -DZINT -c ../Source/umfpack_triplet_to_col.c
+	$(MV) -f umfpack_triplet_to_col.o umfpack_mz_triplet_to_col.o
+	$(MX) -DZINT -c ../Source/umfpack_scale.c
+	$(MV) -f umfpack_scale.o umfpack_mz_scale.o
+	$(MX) -DZINT -c ../Source/umfpack_load_numeric.c
+	$(MV) -f umfpack_load_numeric.o umfpack_mz_load_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_save_numeric.c
+	$(MV) -f umfpack_save_numeric.o umfpack_mz_save_numeric.o
+	$(MX) -DZINT -c ../Source/umfpack_load_symbolic.c
+	$(MV) -f umfpack_load_symbolic.o umfpack_mz_load_symbolic.o
+	$(MX) -DZINT -c ../Source/umfpack_save_symbolic.c
+	$(MV) -f umfpack_save_symbolic.o umfpack_mz_save_symbolic.o
+	$(MX) -c ../Source/umfpack_timer.c
+	$(MV) -f umfpack_timer.o umfpack_m_timer.o
+	$(MX) -c ../Source/umfpack_tictoc.c
+	$(MV) -f umfpack_tictoc.o umfpack_m_tictoc.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_aat.c
+	$(MV) -f amd_aat.o amd_m_aat.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_1.c
+	$(MV) -f amd_1.o amd_m_1.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_2.c
+	$(MV) -f amd_2.o amd_m_2.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_dump.c
+	$(MV) -f amd_dump.o amd_m_dump.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_postorder.c
+	$(MV) -f amd_postorder.o amd_m_postorder.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_post_tree.c
+	$(MV) -f amd_post_tree.o amd_m_post_tree.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_defaults.c
+	$(MV) -f amd_defaults.o amd_m_defaults.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_order.c
+	$(MV) -f amd_order.o amd_m_order.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_control.c
+	$(MV) -f amd_control.o amd_m_control.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_info.c
+	$(MV) -f amd_info.o amd_m_info.o
+	$(MX) -DDINT -c ../../AMD/Source/amd_valid.c
+	$(MV) -f amd_valid.o amd_m_valid.o
+	$(MX) -output umfpack umfpackmex.c \
+	    umf_m_analyze.o umf_m_apply_order.o umf_m_colamd.o umf_m_free.o \
+	    umf_m_fsize.o umf_m_is_permutation.o umf_m_malloc.o \
+	    umf_m_realloc.o umf_m_report_perm.o umf_m_singletons.o \
+	    umf_md_lhsolve.o umf_md_uhsolve.o umf_md_triplet_map_nox.o \
+	    umf_md_triplet_nomap_x.o umf_md_triplet_nomap_nox.o \
+	    umf_md_triplet_map_x.o umf_md_assemble_fixq.o \
+	    umf_md_store_lu_drop.o umf_md_assemble.o umf_md_blas3_update.o \
+	    umf_md_build_tuples.o umf_md_create_element.o umf_md_dump.o \
+	    umf_md_extend_front.o umf_md_garbage_collection.o \
+	    umf_md_get_memory.o umf_md_init_front.o umf_md_kernel.o \
+	    umf_md_kernel_init.o umf_md_kernel_wrapup.o umf_md_local_search.o \
+	    umf_md_lsolve.o umf_md_ltsolve.o umf_md_mem_alloc_element.o \
+	    umf_md_mem_alloc_head_block.o umf_md_mem_alloc_tail_block.o \
+	    umf_md_mem_free_tail_block.o umf_md_mem_init_memoryspace.o \
+	    umf_md_report_vector.o umf_md_row_search.o umf_md_scale_column.o \
+	    umf_md_set_stats.o umf_md_solve.o umf_md_symbolic_usage.o \
+	    umf_md_transpose.o umf_md_tuple_lengths.o umf_md_usolve.o \
+	    umf_md_utsolve.o umf_md_valid_numeric.o umf_md_valid_symbolic.o \
+	    umf_md_grow_front.o umf_md_start_front.o umf_md_2by2.o \
+	    umf_md_store_lu.o umf_md_scale.o umfpack_md_wsolve.o \
+	    umfpack_md_col_to_triplet.o umfpack_md_defaults.o \
+	    umfpack_md_free_numeric.o umfpack_md_free_symbolic.o \
+	    umfpack_md_get_numeric.o umfpack_md_get_lunz.o \
+	    umfpack_md_get_symbolic.o umfpack_md_get_determinant.o \
+	    umfpack_md_numeric.o \
+	    umfpack_md_qsymbolic.o umfpack_md_report_control.o \
+	    umfpack_md_report_info.o umfpack_md_report_matrix.o \
+	    umfpack_md_report_numeric.o umfpack_md_report_perm.o \
+	    umfpack_md_report_status.o umfpack_md_report_symbolic.o \
+	    umfpack_md_report_triplet.o umfpack_md_report_vector.o \
+	    umfpack_md_solve.o umfpack_md_symbolic.o umfpack_md_transpose.o \
+	    umfpack_md_triplet_to_col.o umfpack_md_scale.o \
+	    umfpack_md_load_numeric.o umfpack_md_save_numeric.o \
+	    umfpack_md_load_symbolic.o umfpack_md_save_symbolic.o \
+	    umf_mz_lhsolve.o umf_mz_uhsolve.o umf_mz_triplet_map_nox.o \
+	    umf_mz_triplet_nomap_x.o umf_mz_triplet_nomap_nox.o \
+	    umf_mz_triplet_map_x.o umf_mz_assemble_fixq.o \
+	    umf_mz_store_lu_drop.o umf_mz_assemble.o umf_mz_blas3_update.o \
+	    umf_mz_build_tuples.o umf_mz_create_element.o umf_mz_dump.o \
+	    umf_mz_extend_front.o umf_mz_garbage_collection.o \
+	    umf_mz_get_memory.o umf_mz_init_front.o umf_mz_kernel.o \
+	    umf_mz_kernel_init.o umf_mz_kernel_wrapup.o umf_mz_local_search.o \
+	    umf_mz_lsolve.o umf_mz_ltsolve.o umf_mz_mem_alloc_element.o \
+	    umf_mz_mem_alloc_head_block.o umf_mz_mem_alloc_tail_block.o \
+	    umf_mz_mem_free_tail_block.o umf_mz_mem_init_memoryspace.o \
+	    umf_mz_report_vector.o umf_mz_row_search.o umf_mz_scale_column.o \
+	    umf_mz_set_stats.o umf_mz_solve.o umf_mz_symbolic_usage.o \
+	    umf_mz_transpose.o umf_mz_tuple_lengths.o umf_mz_usolve.o \
+	    umf_mz_utsolve.o umf_mz_valid_numeric.o umf_mz_valid_symbolic.o \
+	    umf_mz_grow_front.o umf_mz_start_front.o umf_mz_2by2.o \
+	    umf_mz_store_lu.o umf_mz_scale.o umfpack_mz_wsolve.o \
+	    umfpack_mz_col_to_triplet.o umfpack_mz_defaults.o \
+	    umfpack_mz_free_numeric.o umfpack_mz_free_symbolic.o \
+	    umfpack_mz_get_numeric.o umfpack_mz_get_lunz.o \
+	    umfpack_mz_get_symbolic.o umfpack_mz_get_determinant.o \
+	    umfpack_mz_numeric.o \
+	    umfpack_mz_qsymbolic.o umfpack_mz_report_control.o \
+	    umfpack_mz_report_info.o umfpack_mz_report_matrix.o \
+	    umfpack_mz_report_numeric.o umfpack_mz_report_perm.o \
+	    umfpack_mz_report_status.o umfpack_mz_report_symbolic.o \
+	    umfpack_mz_report_triplet.o umfpack_mz_report_vector.o \
+	    umfpack_mz_solve.o umfpack_mz_symbolic.o umfpack_mz_transpose.o \
+	    umfpack_mz_triplet_to_col.o umfpack_mz_scale.o \
+	    umfpack_mz_load_numeric.o umfpack_mz_save_numeric.o \
+	    umfpack_mz_load_symbolic.o umfpack_mz_save_symbolic.o \
+	    umfpack_m_timer.o umfpack_m_tictoc.o \
+	    amd_m_aat.o amd_m_1.o amd_m_2.o amd_m_dump.o \
+	    amd_m_postorder.o amd_m_post_tree.o amd_m_defaults.o amd_m_order.o \
+	    amd_m_control.o amd_m_info.o amd_m_valid.o
+
+luflop: luflopmex.c
+	$(MX) -output luflop luflopmex.c
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) *.mex* *.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/lapacksyms.def	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,718 @@
+LIBRARY liblapack.dll
+EXPORTS
+dasum
+daxpy
+dbdsdc
+dbdsqr
+dcopy
+ddisna
+ddot
+dgbbrd
+dgbcon
+dgbequ
+dgbmv
+dgbrfs
+dgbsv
+dgbsvx
+dgbtf2
+dgbtrf
+dgbtrs
+dgebak
+dgebal
+dgebd2
+dgebrd
+dgecon
+dgeequ
+dgees
+dgeesx
+dgeev
+dgeevx
+dgegs
+dgegv
+dgehd2
+dgehrd
+dgelq2
+dgelqf
+dgels
+dgelsd
+dgelss
+dgelsx
+dgelsy
+dgemm
+dgemv
+dgeql2
+dgeqlf
+dgeqp3
+dgeqpf
+dgeqr2
+dgeqrf
+dger
+dgerfs
+dgerq2
+dgerqf
+dgesc2
+dgesdd
+dgesv
+dgesvd
+dgesvx
+dgetc2
+dgetf2
+dgetrf
+dgetri
+dgetrs
+dggbak
+dggbal
+dgges
+dggesx
+dggev
+dggevx
+dggglm
+dgghrd
+dgglse
+dggqrf
+dggrqf
+dggsvd
+dggsvp
+dgtcon
+dgtrfs
+dgtsv
+dgtsvx
+dgttrf
+dgttrs
+dgtts2
+dhgeqz
+dhsein
+dhseqr
+dlabad
+dlabrd
+dlacon
+dlacpy
+dladiv
+dlae2
+dlaebz
+dlaed0
+dlaed1
+dlaed2
+dlaed3
+dlaed4
+dlaed5
+dlaed6
+dlaed7
+dlaed8
+dlaed9
+dlaeda
+dlaein
+dlaev2
+dlaexc
+dlag2
+dlags2
+dlagtf
+dlagtm
+dlagts
+dlagv2
+dlahqr
+dlahrd
+dlaic1
+dlaln2
+dlals0
+dlalsa
+dlalsd
+dlamch
+dlamrg
+dlangb
+dlange
+dlangt
+dlanhs
+dlansb
+dlansp
+dlanst
+dlansy
+dlantb
+dlantp
+dlantr
+dlanv2
+dlapll
+dlapmt
+dlapy2
+dlapy3
+dlaqgb
+dlaqge
+dlaqp2
+dlaqps
+dlaqsb
+dlaqsp
+dlaqsy
+dlaqtr
+dlar1v
+dlar2v
+dlarf
+dlarfb
+dlarfg
+dlarft
+dlarfx
+dlargv
+dlarnv
+dlarrb
+dlarre
+dlarrf
+dlarrv
+dlartg
+dlartv
+dlaruv
+dlarz
+dlarzb
+dlarzt
+dlas2
+dlascl
+dlasd0
+dlasd1
+dlasd2
+dlasd3
+dlasd4
+dlasd5
+dlasd6
+dlasd7
+dlasd8
+dlasd9
+dlasda
+dlasdq
+dlasdt
+dlaset
+dlasq1
+dlasq2
+dlasq3
+dlasq4
+dlasq5
+dlasq6
+dlasr
+dlasrt
+dlassq
+dlasv2
+dlaswp
+dlasy2
+dlasyf
+dlatbs
+dlatdf
+dlatps
+dlatrd
+dlatrs
+dlatrz
+dlatzm
+dlauu2
+dlauum
+dnrm2
+dopgtr
+dopmtr
+dorg2l
+dorg2r
+dorgbr
+dorghr
+dorgl2
+dorglq
+dorgql
+dorgqr
+dorgr2
+dorgrq
+dorgtr
+dorm2l
+dorm2r
+dormbr
+dormhr
+dorml2
+dormlq
+dormql
+dormqr
+dormr2
+dormr3
+dormrq
+dormrz
+dormtr
+dpbcon
+dpbequ
+dpbrfs
+dpbstf
+dpbsv
+dpbsvx
+dpbtf2
+dpbtrf
+dpbtrs
+dpocon
+dpoequ
+dporfs
+dposv
+dposvx
+dpotf2
+dpotrf
+dpotri
+dpotrs
+dppcon
+dppequ
+dpprfs
+dppsv
+dppsvx
+dpptrf
+dpptri
+dpptrs
+dptcon
+dpteqr
+dptrfs
+dptsv
+dptsvx
+dpttrf
+dpttrs
+dptts2
+drot
+drotg
+drscl
+dsbev
+dsbevd
+dsbevx
+dsbgst
+dsbgv
+dsbgvd
+dsbgvx
+dsbmv
+dsbtrd
+dscal
+dspcon
+dspev
+dspevd
+dspevx
+dspgst
+dspgv
+dspgvd
+dspgvx
+dspmv
+dspr
+dspr2
+dsprfs
+dspsv
+dspsvx
+dsptrd
+dsptrf
+dsptri
+dsptrs
+dstebz
+dstedc
+dstegr
+dstein
+dsteqr
+dsterf
+dstev
+dstevd
+dstevr
+dstevx
+dswap
+dsycon
+dsyev
+dsyevd
+dsyevr
+dsyevx
+dsygs2
+dsygst
+dsygv
+dsygvd
+dsygvx
+dsymm
+dsymv
+dsyr
+dsyr2
+dsyr2k
+dsyrfs
+dsyrk
+dsysv
+dsysvx
+dsytd2
+dsytf2
+dsytrd
+dsytrf
+dsytri
+dsytrs
+dtbcon
+dtbmv
+dtbrfs
+dtbsv
+dtbtrs
+dtgevc
+dtgex2
+dtgexc
+dtgsen
+dtgsja
+dtgsna
+dtgsy2
+dtgsyl
+dtpcon
+dtpmv
+dtprfs
+dtpsv
+dtptri
+dtptrs
+dtrcon
+dtrevc
+dtrexc
+dtrmm
+dtrmv
+dtrrfs
+dtrsen
+dtrsm
+dtrsna
+dtrsv
+dtrsyl
+dtrti2
+dtrtri
+dtrtrs
+dtzrqf
+dtzrzf
+dzasum
+dznrm2
+dzsum1
+idamax
+ieeeck
+ilaenv
+izamax
+izmax1
+lsame
+lsamen
+xerbla
+zaxpy
+zbdsqr
+zcopy
+zdotc
+zdotu
+zdrot
+zdrscl
+zdscal
+zgbbrd
+zgbcon
+zgbequ
+zgbmv
+zgbrfs
+zgbsv
+zgbsvx
+zgbtf2
+zgbtrf
+zgbtrs
+zgebak
+zgebal
+zgebd2
+zgebrd
+zgecon
+zgeequ
+zgees
+zgeesx
+zgeev
+zgeevx
+zgegs
+zgegv
+zgehd2
+zgehrd
+zgelq2
+zgelqf
+zgels
+zgelsd
+zgelss
+zgelsx
+zgelsy
+zgemm
+zgemv
+zgeql2
+zgeqlf
+zgeqp3
+zgeqpf
+zgeqr2
+zgeqrf
+zgerc
+zgerfs
+zgerq2
+zgerqf
+zgeru
+zgesc2
+zgesdd
+zgesv
+zgesvd
+zgesvx
+zgetc2
+zgetf2
+zgetrf
+zgetri
+zgetrs
+zggbak
+zggbal
+zgges
+zggesx
+zggev
+zggevx
+zggglm
+zgghrd
+zgglse
+zggqrf
+zggrqf
+zggsvd
+zggsvp
+zgtcon
+zgtrfs
+zgtsv
+zgtsvx
+zgttrf
+zgttrs
+zgtts2
+zhbev
+zhbevd
+zhbevx
+zhbgst
+zhbgv
+zhbgvd
+zhbgvx
+zhbmv
+zhbtrd
+zhecon
+zheev
+zheevd
+zheevr
+zheevx
+zhegs2
+zhegst
+zhegv
+zhegvd
+zhegvx
+zhemm
+zhemv
+zher
+zher2
+zher2k
+zherfs
+zherk
+zhesv
+zhesvx
+zhetd2
+zhetf2
+zhetrd
+zhetrf
+zhetri
+zhetrs
+zhgeqz
+zhpcon
+zhpev
+zhpevd
+zhpevx
+zhpgst
+zhpgv
+zhpgvd
+zhpgvx
+zhpmv
+zhpr
+zhpr2
+zhprfs
+zhpsv
+zhpsvx
+zhptrd
+zhptrf
+zhptri
+zhptrs
+zhsein
+zhseqr
+zlabrd
+zlacgv
+zlacon
+zlacp2
+zlacpy
+zlacrm
+zlacrt
+zladiv
+zlaed0
+zlaed7
+zlaed8
+zlaein
+zlaesy
+zlaev2
+zlags2
+zlagtm
+zlahef
+zlahqr
+zlahrd
+zlaic1
+zlals0
+zlalsa
+zlalsd
+zlangb
+zlange
+zlangt
+zlanhb
+zlanhe
+zlanhp
+zlanhs
+zlanht
+zlansb
+zlansp
+zlansy
+zlantb
+zlantp
+zlantr
+zlapll
+zlapmt
+zlaqgb
+zlaqge
+zlaqhb
+zlaqhe
+zlaqhp
+zlaqp2
+zlaqps
+zlaqsb
+zlaqsp
+zlaqsy
+zlar1v
+zlar2v
+zlarcm
+zlarf
+zlarfb
+zlarfg
+zlarft
+zlarfx
+zlargv
+zlarnv
+zlarrv
+zlartg
+zlartv
+zlarz
+zlarzb
+zlarzt
+zlascl
+zlaset
+zlasr
+zlassq
+zlaswp
+zlasyf
+zlatbs
+zlatdf
+zlatps
+zlatrd
+zlatrs
+zlatrz
+zlatzm
+zlauu2
+zlauum
+zpbcon
+zpbequ
+zpbrfs
+zpbstf
+zpbsv
+zpbsvx
+zpbtf2
+zpbtrf
+zpbtrs
+zpocon
+zpoequ
+zporfs
+zposv
+zposvx
+zpotf2
+zpotrf
+zpotri
+zpotrs
+zppcon
+zppequ
+zpprfs
+zppsv
+zppsvx
+zpptrf
+zpptri
+zpptrs
+zptcon
+zpteqr
+zptrfs
+zptsv
+zptsvx
+zpttrf
+zpttrs
+zptts2
+zrot
+zrotg
+zscal
+zspcon
+zspmv
+zspr
+zsprfs
+zspsv
+zspsvx
+zsptrf
+zsptri
+zsptrs
+zstedc
+zstegr
+zstein
+zsteqr
+zswap
+zsycon
+zsymm
+zsymv
+zsyr
+zsyr2k
+zsyrfs
+zsyrk
+zsysv
+zsysvx
+zsytf2
+zsytrf
+zsytri
+zsytrs
+ztbcon
+ztbmv
+ztbrfs
+ztbsv
+ztbtrs
+ztgevc
+ztgex2
+ztgexc
+ztgsen
+ztgsja
+ztgsna
+ztgsy2
+ztgsyl
+ztpcon
+ztpmv
+ztprfs
+ztpsv
+ztptri
+ztptrs
+ztrcon
+ztrevc
+ztrexc
+ztrmm
+ztrmv
+ztrrfs
+ztrsen
+ztrsm
+ztrsna
+ztrsv
+ztrsyl
+ztrti2
+ztrtri
+ztrtrs
+ztzrqf
+ztzrzf
+zung2l
+zung2r
+zungbr
+zunghr
+zungl2
+zunglq
+zungql
+zungqr
+zungr2
+zungrq
+zungtr
+zunm2l
+zunm2r
+zunmbr
+zunmhr
+zunml2
+zunmlq
+zunmql
+zunmqr
+zunmr2
+zunmr3
+zunmrq
+zunmrz
+zunmtr
+zupgtr
+zupmtr
Binary file liboctave/UMFPACK/UMFPACK/MATLAB/lcc_lib/libmwlapack.lib has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/lu_normest.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,106 @@
+function rho = lu_normest (A, L, U)
+% LU_NORMEST:  estimate the 1-norm of A-L*U without computing L*U
+%
+% Usage:
+%
+%       rho = lu_normest (A, L, U)
+%
+% which estimates the computation of the 1-norm:
+%
+%       rho = norm (A-L*U, 1)
+%
+% Authors:  William W. Hager, Math Dept., Univ. of Florida
+%       Timothy A. Davis, CISE Dept., Univ. of Florida
+%       Gainesville, FL, 32611, USA.
+%       based on normest1, contributed on November, 1997
+%
+% This code can be quite easily adapted to estimate the 1-norm of any
+% matrix E, where E itself is dense or not explicitly represented, but the
+% computation of E (and E') times a vector is easy.  In this case, our matrix
+% of interest is:
+%
+%       E = A-L*U
+%
+% That is, L*U is the LU factorization of A, where A, L and U
+% are sparse.  This code works for dense matrices A and L too,
+% but it would not be needed in that case, since E is easy to compute
+% explicitly.  For sparse A, L, and U, computing E explicitly would be quite
+% expensive, and thus normest (A-L*U) would be prohibitive.
+%
+% For a detailed description, see Davis, T. A. and Hager, W. W.,
+% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and
+% Applications, 1999, vol. 20, no. 3, 606-627.
+
+% The three places that the matrix-vector multiply E*x is used are highlighted.
+% Note that E is never formed explicity.
+
+[m n] = size (A) ;
+
+if (m ~= n)
+    % pad A, L, and U with zeros so that they are all square
+    if (m < n)
+        U = [ U ; (sparse (n-m,n)) ] ;
+        L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ;
+        A = [ A ; (sparse (n-m,n)) ] ;
+    else
+        U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ;
+        L = [ L , (sparse (m,m-n)) ] ;
+        A = [ A , (sparse (m,m-n)) ] ;
+    end
+end
+
+[m n] = size (A) ;
+
+notvisited = ones (m, 1) ;  % nonvisited(j) is zero if j is visited, 1 otherwise
+rho = 0 ;    % the global rho
+
+At = A' ;
+Lt = L' ;
+
+for trial = 1:3 % {
+
+   x = notvisited ./ sum (notvisited) ;
+   rho1 = 0 ;    % the current rho for this trial
+
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   Ex1 = (A*x) - L*(U*x) ;
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+   rho2 = norm (Ex1, 1) ;
+
+   while rho2 > rho1 % {
+
+        rho1 = rho2 ;
+        y = 2*(Ex1 >= 0) - 1 ;
+
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        z = (A'*y) - U'*(L'*y) ;
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+        [zj, j] = max (abs (z .* notvisited)) ;
+        j = j (1) ;
+        if (abs (z (j)) > z'*x) % {
+            x = zeros (m, 1) ;
+            x (j) = 1 ;
+            notvisited (j) = 0 ;
+        else % } {
+            break ;
+        end % }
+
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        Ex1 = (A*x) - L*(U*x) ;
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+        rho2 = norm (Ex1, 1) ;
+
+    end % }
+
+    rho = max (rho, rho1) ;
+
+end % }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/luflop.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,24 @@
+function f = luflop (L, U)
+%LUFLOP
+%
+% f = luflop (L, U)
+%
+% Given an LU factorization, compute how many flops took to compute it.  This
+% is the same as (assuming U has a zero-free diagonal):
+%
+%   Lnz = full (sum (spones (L))) - 1 ;
+%   Unz = full (sum (spones (U')))' - 1 ;
+%   f = 2*Lnz*Unz + sum (Lnz) ;
+%
+% except that no extra workspace is allocated for spones (L) and spones (U).
+% L and U must be sparse.
+%
+% Note: the above expression has a subtle undercount when exact numerical
+% cancelation occurs.  Try [L,U,P] = lu (sparse (ones (10))) and then
+% luflop (L,U).
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+help luflop
+error ('luflop mexFunction not found!  Use umfpack_make to compile luflop.') ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/luflopmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,121 @@
+/* ========================================================================== */
+/* === luflop  mexFunction ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    f = luflop (L, U) ;
+
+    Given L and U, compute:
+
+        Lnz = full (sum (spones (L))) - 1 ;
+        Unz = full (sum (spones (U')))' - 1 ;
+        f = 2*Lnz*Unz + sum (Lnz) ;
+
+    without allocating O (lunz) space.
+
+*/
+
+#include "mex.h"
+#include "matrix.h"
+
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+void mexFunction
+(
+    int nlhs,			/* number of left-hand sides */
+    mxArray *plhs [ ],		/* left-hand side matrices */
+    int nrhs,			/* number of right--hand sides */
+    const mxArray *prhs [ ]	/* right-hand side matrices */
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double flop_count ;
+    double *pflop ;
+    int *Lp, *Li, *Up, *Ui, *Unz, n, k, row, col, p, Lnz_k, Unz_k ;
+    mxArray *Lmatrix, *Umatrix ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get inputs L, U */
+    /* ---------------------------------------------------------------------- */
+
+    if (nrhs != 2)
+    {
+	mexErrMsgTxt ("Usage:  f = luflop (L, U)") ;
+    }
+
+    Lmatrix = (mxArray *) prhs [0] ;
+    Umatrix = (mxArray *) prhs [1] ;
+
+    n = mxGetM (Lmatrix) ;
+    if (n != mxGetN (Lmatrix) || n != mxGetM (Umatrix) || n != mxGetN (Umatrix))
+    {
+	mexErrMsgTxt ("Usage:  f = luflop (L, U) ;  L and U must be square") ;
+    }
+
+    if (!mxIsSparse (Lmatrix) || !mxIsSparse (Umatrix))
+    {
+	mexErrMsgTxt ("Usage:  f = luflop (L, U) ;  L and U must be sparse") ;
+    }
+
+    Lp = mxGetJc (Lmatrix) ;
+    Li = mxGetIr (Lmatrix) ;
+
+    Up = mxGetJc (Umatrix) ;
+    Ui = mxGetIr (Umatrix) ;
+
+    Unz = (int *) mxMalloc (n * sizeof (int)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* count the nonzeros in each row of U */
+    /* ---------------------------------------------------------------------- */
+
+    for (row = 0 ; row < n ; row++)
+    {
+	Unz [row] = 0 ;
+    }
+    for (col = 0 ; col < n ; col++)
+    {
+	for (p = Up [col] ; p < Up [col+1] ; p++)
+	{
+	    row = Ui [p] ;
+	    Unz [row]++ ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* count the flops */
+    /* ---------------------------------------------------------------------- */
+
+    flop_count = 0.0 ;
+    for (k = 0 ; k < n ; k++)
+    {
+	/* off-diagonal nonzeros in column k of L: */
+	Lnz_k = Lp [k+1] - Lp [k] - 1 ;
+	Unz_k = Unz [k] - 1 ;
+	flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* return the result */
+    /* ---------------------------------------------------------------------- */
+
+    plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ;
+    pflop = mxGetPr (plhs [0]) ;
+    pflop [0] = flop_count ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,44 @@
+function [out1, out2, out3, out4, out5] = umfpack (in1, in2, in3, in4, in5)
+% UMFPACK v4.4 is a MATLAB mexFunction for solving sparse linear systems.
+%
+% UMFPACK v4.4:                       |  MATLAB approximate equivalent:
+% ---------------------------------------------------------------------
+% x = umfpack (A, '\', b) ;           |  x = A \ b
+%                                     |
+% x = umfpack (b, '/', A) ;           |  x = b / A
+%                                     |
+% [L,U,P,Q] = umfpack (A) ;           |  [m,n] = size (A) ;
+%                                     |  I = speye (n) ;
+%                                     |  Q = I (:, colamd (A)) ;
+%                                     |  [L,U,P] = lu (A*Q) ;
+%                                     |
+% [L,U,P,Q,R] = umfpack (A) ;         |  [m,n] = size (A) ;
+%                                     |  I = speye (n) ;
+%                                     |  Q = I (:, colamd (A)) ;
+%                                     |  r = full (sum (abs (A), 2)) ;
+%                                     |  r (find (r == 0)) = 1 ;
+%                                     |  R = spdiags (r, 0, m, m) ;
+%                                     |  [L,U,P] = lu ((R\A)*Q) ;
+%                                     |
+% [P,Q,F,C] = umfpack (A, 'symbolic') |  [m,n] = size (A) ;
+%                                     |  I = speye (n) ;
+%                                     |  Q = I (:, colamd (A)) ;
+%                                     |  [count,h,parent,post] = ...
+%                                     |  symbfact (A*Q, 'col') ;
+%
+% A must be sparse.  It can be complex, singular, and/or rectangular.  A must be
+% square for '/' or '\'.  b must be a full real or complex vector.  For
+% [L,U,P,Q,R] = umfpack (A), the factorization is L*U = P*(R\A)*Q.  If A has a
+% mostly symmetric nonzero pattern, then replace "colamd" with "amd" in the
+% MATLAB-equivalent column in the table above.  Type umfpack_details for more
+% information.
+%
+% See also: lu_normest, colamd, amd.
+% To use UMFPACK for an arbitrary b, see umfpack_solve.
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+help umfpack
+error ('umfpack mexFunction not found!  Use umfpack_make to compile umfpack.') ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_btf.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,129 @@
+function x = umfpack_btf (A, b, Control)
+% UMFPACK_BTF
+%
+% x = umfpack_btf (A, b, Control)
+%
+% solve Ax=b by first permuting the matrix A to block triangular form via dmperm
+% and then using UMFPACK to factorize each diagonal block.  Adjacent 1-by-1
+% blocks are merged into a single upper triangular block, and solved via
+% MATLAB's \ operator.  The Control parameter is optional (Type umfpack_details
+% and umfpack_report for details on its use).  A must be square.
+%
+% See also:  umfpack, umfpack_factorize, umfpack_details, dmperm
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+if (nargin < 2)
+    help umfpack_btf
+    error ('Usage: x = umfpack_btf (A, b, Control)') ;
+end
+
+[m n] = size (A) ;
+if (m ~= n)
+    help umfpack_btf
+    error ('umfpack_btf:  A must be square') ;
+end
+[m1 n1] = size (b) ;
+if (m1 ~= n)
+    help umfpack_btf
+    error ('umfpack_btf:  b has the wrong dimensions') ;
+end
+
+if (nargin < 3)
+    Control = umfpack ;
+end
+
+%-------------------------------------------------------------------------------
+% find the block triangular form
+%-------------------------------------------------------------------------------
+
+[p,q,r] = dmperm (A) ;
+nblocks = length (r) - 1 ;
+
+%-------------------------------------------------------------------------------
+% solve the system
+%-------------------------------------------------------------------------------
+
+if (nblocks == 1 | sprank (A) < n)
+
+    %---------------------------------------------------------------------------
+    % matrix is irreducible or structurally singular
+    %---------------------------------------------------------------------------
+
+    x = umfpack_solve (A, '\', b, Control) ;
+
+else
+
+    %---------------------------------------------------------------------------
+    % A (p,q) is in block triangular form
+    %---------------------------------------------------------------------------
+
+    b = b (p,:) ;
+    A = A (p,q) ;
+    x = zeros (size (b)) ;
+
+    %---------------------------------------------------------------------------
+    % merge adjacent singletons into a single upper triangular block
+    %---------------------------------------------------------------------------
+
+    [r, nblocks, is_triangular] = merge_singletons (r) ;
+
+    %---------------------------------------------------------------------------
+    % solve the system: x (q) = A\b
+    %---------------------------------------------------------------------------
+
+    for k = nblocks:-1:1
+
+	% get the kth block
+        k1 = r (k) ;
+        k2 = r (k+1) - 1 ;
+
+	% solve the system
+	x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ...
+	    is_triangular (k), Control) ;
+
+        % off-diagonal block back substitution
+        b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ;
+
+    end
+
+    x (q,:) = x ;
+
+end
+
+%-------------------------------------------------------------------------------
+% merge_singletons
+%-------------------------------------------------------------------------------
+
+function [r, nblocks, is_triangular] = merge_singletons (r)
+%
+% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that
+% reflects the merger of adjacent singletons into a single upper triangular
+% block.  is_triangular (k) is 1 if the kth block is upper triangular.  nblocks
+% is the number of new blocks.
+
+nblocks = length (r) - 1 ;
+bsize = r (2:nblocks+1) - r (1:nblocks) ;
+t = [0 (bsize == 1)] ;
+z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ;
+y = [(find (z)) nblocks+1] ;
+r = r (y) ;
+nblocks = length (y) - 1 ;
+is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ;
+
+%-------------------------------------------------------------------------------
+% solve Ax=b, but check for small and/or triangular systems
+%-------------------------------------------------------------------------------
+
+function x = solver (A, b, is_triangular, Control)
+if (is_triangular)
+    % back substitution only
+    x = A \ b ;
+elseif (size (A,1) < 4)
+    % a very small matrix, solve it as a dense linear system
+    x = full (A) \ b ;
+else
+    % solve it as a sparse linear system
+    x = umfpack_solve (A, '\', b, Control) ;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,202 @@
+function umfpack_demo
+% UMFPACK DEMO
+%
+% A demo of UMFPACK for MATLAB.
+%
+% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
+% and umfpack_simple.
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+%-------------------------------------------------------------------------------
+% get default control parameters
+%-------------------------------------------------------------------------------
+
+control = umfpack ;
+fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ;
+fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ;
+c = input ('5: print all output [default is 1]: ') ;
+if (isempty (c))
+    c = 1 ;
+end
+control (1) = c ;
+
+%-------------------------------------------------------------------------------
+% solve a simple system
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ;
+if (control (1) > 1)
+    fprintf ('(except for verbose printing enabled)\n') ;
+end
+
+load west0067
+A = Problem.A ;
+n = size (A, 1) ;
+b = rand (n, 1) ;
+
+fprintf ('Solving Ax=b via UMFPACK:\n') ;
+[xu, info] = umfpack (A, '\', b, control) ;
+x = xu ;
+
+fprintf ('Solving Ax=b via MATLAB:\n') ;
+xm = A\b ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% spy the results
+%-------------------------------------------------------------------------------
+
+figure (1)
+clf
+
+subplot (2,3,1)
+spy (A)
+title ('The matrix A') ;
+
+subplot (2,3,2)
+[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;
+treeplot (Fr (1:end-1,2)') ;
+title ('Supernodal column elimination tree') ;
+
+subplot (2,3,3)
+spy (P1 * A * Q1)
+title ('A, with initial row and column order') ;
+
+subplot (2,3,4)
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ;
+[L, U, P, Q, R] = umfpack (A) ;
+spy (P*A*Q)
+title ('A, with final row/column order') ;
+
+fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ;
+fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
+    norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q,  L, U)) ;
+
+fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ;
+fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ;
+xu = Q * (U \ (L \ (P * (R \ b)))) ;
+x = xu ;
+
+fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ;
+
+subplot (2,3,5)
+spy (spones (L) + spones (U))
+title ('UMFPACK LU factors') ;
+
+subplot (2,3,6)
+fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ;
+fprintf ('If you are using a version of MATLAB prior to V6.0, then the\n') ;
+fprintf ('following statement (q = colamd (A)) may fail.  Either download\n');
+fprintf ('colamd from http://www.cise.ufl.edu/research/sparse, upgrade to\n') ;
+fprintf ('MATLAB V6.0 or later, or replace the statement with\n') ;
+fprintf ('q = colmmd (A) ;\n') ;
+try
+    q = colamd (A) ;
+catch
+    fprintf ('\n *** colamd not found, using colmmd instead *** \n') ;
+    q = colmmd (A) ;
+end
+[L, U, P] = lu (A (:,q)) ;
+spy (spones (L) + spones (U))
+title ('MATLAB LU factors') ;
+
+fprintf ('\nSolution to Ax=b via MATLAB factorization:\n') ;
+fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ;
+xm = U \ (L \ (P * b)) ;
+xm (q) = xm ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+fprintf ('\nMATLAB LU flop count: %d\n', luflop (L, U)) ;
+
+%-------------------------------------------------------------------------------
+% solve A'x=b
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Solve A''x=b:\n') ;
+
+fprintf ('Solving A''x=b via UMFPACK:\n') ;
+[xu, info] = umfpack (b', '/', A, control) ;
+xu = xu' ;
+
+fprintf ('Solving A''x=b via MATLAB:\n') ;
+xm = (b'/A)' ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% factor A' and then solve Ax=b using the factors of A'
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ;
+fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n');
+fprintf ('(less work and memory usage).  Solve C''x=b; the solution is the\n') ;
+fprintf ('same as the solution to Ax=b for the original A.\n');
+
+C = A' ;
+
+% factorize C (P,Q) = L*U
+[L, U, P, Q, R, info] = umfpack (C, control) ;
+
+fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ;
+fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
+    norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q,  L, U)) ;
+
+fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ;
+fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ;
+xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
+x = xu ;
+
+fprintf ('Solution to Ax=b via MATLAB:\n') ;
+xm = A\b ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% solve Ax=B
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ;
+B = sprandn (n, 10, 0.05) ;
+XU = umfpack_solve (A, '\', B, control) ;
+XM = A\B ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ;
+XU = umfpack_btf (A, B, control) ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ;
+XU = umfpack_solve (B', '/', A, control) ;
+XM = B'/A ;
+
+fprintf ('Difference between UMFPACK and MATLAB solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% compute the determinant
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('det(A): %g  UMFPACK determinant: %g\n', det (A), umfpack (A, 'det')) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_demo.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,76 @@
+>> umfpack_demo
+
+Enter the printing level for UMFPACK's output statistics:
+0: none, 1: errors only, 2: statistics, 4: print some of outputs
+5: print all output [default is 1]: 
+
+--------------------------------------------------------------
+Factor and solve a small system, Ax=b, using default parameters
+Solving Ax=b via UMFPACK:
+Solving Ax=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 0
+
+--------------------------------------------------------------
+
+Factorizing [L, U, P, Q, R] = umfpack (A)
+
+P * (R\A) * Q - L*U should be zero:
+norm (P*(R\A)*Q - L*U, 1) = 6.80012e-16 (exact) 6.80012e-16 (estimated)
+
+Solution to Ax=b via UMFPACK factorization:
+x = Q * (U \ (L \ (P * (R \ b))))
+
+UMFPACK flop count: 2354
+
+Factorizing [L, U, P] = lu (A (:, q))
+If you are using a version of MATLAB prior to V6.0, then the
+following statement (q = colamd (A)) may fail.  Either download
+colamd from http://www.cise.ufl.edu/research/sparse, upgrade to
+MATLAB V6.0 or later, or replace the statement with
+q = colmmd (A) ;
+
+Solution to Ax=b via MATLAB factorization:
+x = U \ (L \ (P * b)) ; x (q) = x ;
+Difference between UMFPACK and MATLAB solution: 7.10543e-15
+
+MATLAB LU flop count: 3164
+
+--------------------------------------------------------------
+Solve A'x=b:
+Solving A'x=b via UMFPACK:
+Solving A'x=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 2.66454e-15
+
+--------------------------------------------------------------
+Compute C = A', and compute the LU factorization of C.
+Factorizing A' can sometimes be better than factorizing A itself
+(less work and memory usage).  Solve C'x=b; the solution is the
+same as the solution to Ax=b for the original A.
+
+P * (R\C) * Q - L*U should be zero:
+norm (P*(R\C)*Q - L*U, 1) = 1.94289e-16 (exact) 5.55112e-17 (estimated)
+
+Solution to Ax=b via UMFPACK, using the factors of C:
+x = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
+Solution to Ax=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 7.10543e-15
+
+--------------------------------------------------------------
+
+Solve AX=B, where B is n-by-10, and sparse
+Difference between UMFPACK and MATLAB solution: 6.72949e-14
+
+--------------------------------------------------------------
+
+Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf
+Difference between UMFPACK and MATLAB solution: 8.51541e-14
+
+--------------------------------------------------------------
+
+Solve A'X=B, where B is n-by-10, and sparse
+Difference between UMFPACK and MATLAB solution: 7.99291e-14
+
+--------------------------------------------------------------
+det(A): -4.07453e-05  UMFPACK determinant: -4.07453e-05
+>> 
+>> diary off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_details.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,164 @@
+function [out1, out2, out3, out4, out5] = umfpack (in1, in2, in3, in4, in5)
+% UMFPACK v4.4:  details on each usage.
+%
+% Factor or solve a sparse linear system, returning either the solution x to
+% Ax=b or A'x'=b', the factorization LU=PAQ, or LU=P(R\A)Q.  A must be sparse.
+% For the solve, A must be square and b must be a dense n-by-1 vector.  For LU
+% factorization, A can be rectangular.  In both cases, A and/or b can be real
+% or complex.
+%
+% UMFPACK analyzes the matrix and selects one of three strategies to factorize
+% the matrix.  It first finds a set of k initial pivot entries of zero Markowitz
+% cost.  This forms the first k rows and columns of L and U.  The remaining
+% submatrix S is then analyzed, based on the symmetry of the nonzero pattern of
+% the submatrix and the values on the diagaonal.  The strategies include:
+%
+%	(1) unsymmetric:  use a COLAMD pre-ordering, a column elimination tree
+%	    post-ordering, refine the column ordering during factorization,
+%	    and make no effort at selecting pivots on the diagonal.
+%	(2) 2-by-2:  like the symmetric strategy (see below), except that local
+%	    row permutations are first made to attempt to place large entries
+%	    on the diagonal.
+%	(3) symmetric:  use an AMD pre-ordering on the matrix S+S', an
+%	    elimination tree post-ordering, do not refine the column ordering
+%	    during factorization, and attempt to select pivots on the diagonal.
+%
+% Each of the following uses of umfpack (except for "Control = umfpack") is
+% stand-alone.  That is, no call to umfpack is required for any subsequent
+% call.  In each usage, the Info output argument is optional.
+%
+% Usage:
+%
+% [x, Info] = umfpack (A, '\', b) ;
+% [x, Info] = umfpack (A, '\', b, Control) ;
+% [x, Info] = umfpack (A, Qinit, '\', b, Control) ;
+% [x, Info] = umfpack (A, Qinit, '\', b) ;
+%
+%       Solves Ax=b (similar to x = A\b in MATLAB).
+%
+% [x, Info] = umfpack (b, '/', A) ;
+% [x, Info] = umfpack (b, '/', A, Control) ;
+% [x, Info] = umfpack (b, '/', A, Qinit) ;
+% [x, Info] = umfpack (b, '/', A, Qinit, Control) ;
+%
+%       Solves A'x'=b' (similar to x = b/A in MATLAB).
+%
+% [L, U, P, Q, R, Info] = umfpack (A) ;
+% [L, U, P, Q, R, Info] = umfpack (A, Control) ;
+% [L, U, P, Q, R, Info] = umfpack (A, Qinit) ;
+% [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;
+%
+%       Returns the LU factorization of A.  P and Q are returned as permutation
+%       matrices.  R is a diagonal sparse matrix of scale factors for the rows
+%	of A, L is lower triangular, and U is upper triangular.  The
+%	factorization is L*U = P*(R\A)*Q.  You can turn off scaling by setting
+%	Control (17) to zero (in which case R = speye (m)), or by using the
+%	following syntaxes (in which case Control (17) is ignored):
+%
+% [L, U, P, Q] = umfpack (A) ;
+% [L, U, P, Q] = umfpack (A, Control) ;
+% [L, U, P, Q] = umfpack (A, Qinit) ;
+% [L, U, P, Q] = umfpack (A, Qinit, Control) ;
+%
+%       Same as above, except that no row scaling is performed.  The Info array
+%	is not returned, either.
+%
+% [P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;
+% [P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ;
+% [P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ;
+% [P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control);
+%
+%       Performs only the fill-reducing column pre-ordering (including the
+%       elimination tree post-ordering) and symbolic factorization.  Q1 is the
+%	initial column permutation (either from colamd, amd, or the input
+%	ordering Qinit), possibly followed by a column elimination tree post-
+%	ordering or a symmetric elimination tree post-ordering, depending on
+%	the strategy used.
+%
+%	For the unsymmetric strategy, P1 is the row ordering induced by Q1
+%	(row-merge order). For the 2-by-2 strategy, P1 is the row ordering that
+%	places large entries on the diagonal of P1*A*Q1.  For the symmetric
+%	strategy, P1 = Q1.
+%
+%       Fr is a (nfr+1)-by-4 array containing information about each frontal
+%       matrix, where nfr <= n is the number of frontal matrices.  Fr (:,1) is
+%       the number of pivot columns in each front, and Fr (:,2) is the parent
+%       of each front in the supercolumn elimination tree.  Fr (k,2) is zero if
+%       k is a root.  The first Fr (1,1) columns of P1*A*Q1 are the pivot
+%       columns for the first front, the next Fr (2,1) columns of P1*A*Q1
+%       are the pivot columns for the second front, and so on.
+%
+%	For the unsymmetric strategy, Fr (:,3) is the row index of the first
+%	row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for
+%	the kth front.  Fr (:,4) is the leftmost descendent of the kth front.
+%	Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set
+%	of candidate pivot rows for the kth front (some of these will typically
+%	have been selected as pivot rows of fronts Fr (k,3) to k-1, before the
+%	factorization reaches the kth front.  If front k is a leaf node, then
+%	Fr (k,4) is k.
+%
+%       Ch is a (nchains+1)-by-3 array containing information about each "chain"
+%       (unifrontal sequence) of frontal matrices, and where nchains <= nfr
+%       is the number of chains.  The ith chain consists of frontal matrices.
+%       Chain (i,1) to Chain (i+1,1)-1, and the largest front in chain i is
+%       Chain (i,2)-by-Chain (i,3).
+%
+%       This use of umfpack is not required to factor or solve a linear system
+%       in MATLAB.  It analyzes the matrix A and provides information only.
+%       The MATLAB statement "treeplot (Fr (:,2)')" plots the column elimination
+%       tree.
+%
+% Control = umfpack ;
+%
+%       Returns a 20-by-1 vector of default parameter settings for umfpack.
+%
+% umfpack_report (Control, Info) ;
+%
+%       Prints the current Control settings, and Info
+%
+% det = umfpack (A, 'det') ;
+% [det dexp] = umfpack (A, 'det') ;
+%
+%	Computes the determinant of A.  The 2nd form returns the determinant
+%	in the form det*10^dexp, where det is in the range +/- 1 to 10,
+%	which helps to avoid overflow/underflow when dexp is out of range of
+%	normal floating-point numbers.
+%
+% If present, Qinit is a user-supplied 1-by-n permutation vector.  It is an
+% initial fill-reducing column pre-ordering for A; if not present, then colamd
+% or amd are used instead.  If present, Control is a user-supplied 20-by-1
+% array.   Control and Info are optional; if Control is not present, defaults
+% are used.  If a Control entry is NaN, then the default is used for that entry.
+%
+%
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+%
+% UMFPACK License:
+%
+%     Your use or distribution of UMFPACK or any modified version of
+%     UMFPACK implies that you agree to this License.
+%
+%     THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+%     EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+%
+%     Permission is hereby granted to use or copy this program, provided
+%     that the Copyright, this License, and the Availability of the original
+%     version is retained on all copies.  User documentation of any code that
+%     uses UMFPACK or any modified version of UMFPACK code must cite the
+%     Copyright, this License, the Availability note, and "Used by permission."
+%     Permission to modify the code and to distribute modified code is granted,
+%     provided the Copyright, this License, and the Availability note are
+%     retained, and a notice that the code was modified is included.  This
+%     software was developed with support from the National Science Foundation,
+%     and is provided to you free of charge.
+%
+% Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+%
+% See also umfpack, umfpack_make, umfpack_report,
+%    umfpack_demo, and umfpack_simple.
+
+more on
+help umfpack_details
+more off
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_make.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,356 @@
+function umfpack_make
+% UMFPACK_MAKE
+%
+% Compiles the UMFPACK mexFunction and then runs a simple demo.
+%
+% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and
+% umfpack_simple.
+%
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+help umfpack_make
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ;
+fprintf ('--------------------------------------------------------------\n') ;
+
+try
+    % ispc does not appear in MATLAB 5.3
+    pc = ispc ;
+catch
+    % if ispc fails, assume we aren't on a Windows PC.
+    pc = 0 ;
+end
+
+obj = 'o' ;
+blas_lib = '' ;
+if (pc)
+    obj = 'obj' ;
+end
+
+%-------------------------------------------------------------------------------
+% BLAS option
+%-------------------------------------------------------------------------------
+
+msg = [ ...
+    '\nUsing the BLAS is faster, but might not compile correctly.\n', ...
+    'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ...
+    'zgemv, and/or zger are not defined, then recompile without the\n', ...
+    'BLAS.  You can ignore warnings that these routines are implicitly\n', ...
+    'declared.\n\nPlease select one of the following options: \n', ...
+    '   1:  attempt to compile with the BLAS (default)\n', ...
+    '   2:  do not use the BLAS\n'] ;
+fprintf (msg) ;
+blas = input (': ') ;
+if (isempty (blas))
+    blas = 1 ;
+end
+if (blas == 1)
+    % try to link to MATLAB's built-in BLAS
+    blas = '' ;
+    if (pc)
+        % the default lcc compiler needs this library to access the BLAS
+        blas_lib = ' libmwlapack.lib' ;
+        msg = [ ...
+        '\nCheck to see if you have a file called libmwlapack.lib in the\n', ...
+        '<matlab>\\extern\\lib\\win32\\lcc\\ directory, where <matlab> is ', ...
+        'the\ndirectory where MATLAB is installed.  If a file of that ', ...
+        'name is already\nthere, then you don''t have to do anything.  ', ...
+        'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ...
+        'the umfpack\\lcc_lib\\ directory to the\n', ...
+        '<matlab>\\extern\\lib\\win32\\lcc\\ directory.  Next, type\n\n', ...
+        '    mex -setup\n\n', ...
+        'at the MATLAB prompt, and ask MATLAB to select the lcc compiler.  ',...
+        'You can skip\nall of this if you have already done it, or have ', ...
+        'configured mex to use\na different compiler.  If you are using ', ...
+        'Norton anti-virus software on Windows\n98SE, then you need to ', ...
+        'exit MATLAB, turn off virus checking, and restart MATLAB\n', ...
+        'before you can use the mex command or compile UMFPACK.\n', ...
+        'You may also need to turn off virus checking in other cases.\n', ...
+        '\nHit enter to continue, or type control-C if you do not wish to '] ;
+        fprintf (msg) ;
+        input ('proceed: ') ;
+    end
+    fprintf ('\nUsing the BLAS (recommended).\n') ;
+else
+    % No BLAS
+    fprintf ('\nNot using the BLAS.  UMFPACK will be slow.\n') ;
+    blas = ' -DNBLAS' ;
+end
+
+%-------------------------------------------------------------------------------
+% -DNUTIL option (using utMalloc or mxMalloc)
+%-------------------------------------------------------------------------------
+
+utils = '' ;
+
+if (~pc)
+    msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nUMFPACK uses MATLAB''s memory allocation routines.  The internal', ...
+    '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ...
+    '\nbut they are internal utility routines that are not documented.\n', ...
+    'Thus, they might not always work.  Using mxMalloc, mxFree, and\n', ...
+    'mxRealloc works, but UMFPACK might run out of memory when solving\n', ...
+    'problems that it could otherwise solve.  Try using the default.\n', ...
+    'If you get an error stating that utMalloc, utFree, and/or\n', ...
+    'utRealloc are not defined, then recompile with the mx* routines.\n', ...
+    '\nPlease select one of the following options:\n', ...
+    '    1:  attempt to use the ut* routines (default)\n', ...
+    '    2:  use the standard mx* routines\n'] ;
+    fprintf (msg) ;
+    utils = input (': ') ;
+    if (isempty (utils))
+	utils = 1 ;
+    end
+    if (utils == 2)
+        fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ;
+        utils = ' -DNUTIL' ;
+    else
+        fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ;
+        utils = '' ;
+    end
+end
+
+%-------------------------------------------------------------------------------
+% -DNPOSIX option (for sysconf and times timer routines)
+%-------------------------------------------------------------------------------
+
+posix = '' ;
+
+if (~pc)
+    msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ...
+    'to provide CPU time and wallclock time statistics.  If you do not\n', ...
+    'have a POSIX-compliant operating system, then UMFPACK won''t\n', ...
+    'compile.  If you don''t know which option to pick, try the\n', ...
+    'default.  If you get an error saying that sysconf and/or times\n', ...
+    'are not defined, then recompile with the non-POSIX option.\n', ...
+    '\nPlease select one of the following options:\n', ...
+    '    1:  use POSIX sysconf and times routines (default)\n', ...
+    '    2:  do not use POSIX routines\n'] ;
+    fprintf (msg) ;
+    posix = input (': ') ;
+    if (isempty (posix))
+	posix = 1 ;
+    end
+    if (posix == 2)
+        fprintf ('\nNot using POSIX sysconf and times routines.\n') ;
+        posix = ' -DNPOSIX' ;
+    else
+        fprintf ('\nUsing POSIX sysconf and times routines.\n') ;
+        posix = '' ;
+    end
+end
+
+%-------------------------------------------------------------------------------
+% mex command
+%-------------------------------------------------------------------------------
+
+umfdir = sprintf ('..%sSource%s', filesep, filesep) ;
+amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ;
+incdir = sprintf ( ...
+' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ...
+filesep,filesep,  filesep, filesep, filesep, filesep, filesep, filesep) ;
+
+mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ;
+msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nCompile options:\n%s\nNow compiling.  Please wait.\n'] ;
+fprintf (msg, mx) ;
+
+% The following is adapted from GNUmakefile
+
+%-------------------------------------------------------------------------------
+% source files
+%-------------------------------------------------------------------------------
+
+% non-user-callable umf_*.[ch] files:
+umfch = { 'assemble', 'blas3_update', ...
+        'build_tuples', 'create_element', ...
+        'dump', 'extend_front', 'garbage_collection', ...
+        'get_memory', 'init_front', 'kernel', ...
+        'kernel_init', 'kernel_wrapup', ...
+        'local_search', 'lsolve', 'ltsolve', ...
+        'mem_alloc_element', 'mem_alloc_head_block', ...
+        'mem_alloc_tail_block', 'mem_free_tail_block', ...
+        'mem_init_memoryspace', ...
+        'report_vector', 'row_search', 'scale_column', ...
+        'set_stats', 'solve', 'symbolic_usage', 'transpose', ...
+        'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ...
+        'valid_symbolic', 'grow_front', 'start_front', '2by2', ...
+	'store_lu', 'scale' } ;
+
+% non-user-callable umf_*.[ch] files, int versions only (no real/complex):
+umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ...
+        'is_permutation', 'malloc', 'realloc', 'report_perm', ...
+	'singletons' } ;
+
+% non-user-callable and user-callable amd_*.[ch] files (int versions only):
+amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ...
+        'order', 'control', 'info', 'valid', 'preprocess' } ;
+
+% user-callable umfpack_*.[ch] files (real/complex):
+user = { 'col_to_triplet', 'defaults', 'free_numeric', ...
+        'free_symbolic', 'get_numeric', 'get_lunz', ...
+        'get_symbolic', 'get_determinant', 'numeric', 'qsymbolic', ...
+        'report_control', 'report_info', 'report_matrix', ...
+        'report_numeric', 'report_perm', 'report_status', ...
+        'report_symbolic', 'report_triplet', ...
+        'report_vector', 'solve', 'symbolic', ...
+        'transpose', 'triplet_to_col', 'scale' ...
+	'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ;
+
+% user-callable umfpack_*.[ch], only one version
+generic = { 'timer', 'tictoc' } ;
+
+M = cell (0) ;
+
+%-------------------------------------------------------------------------------
+% Create the umfpack and amd mexFunctions for MATLAB (int versions only)
+%-------------------------------------------------------------------------------
+
+for k = 1:length(umfint)
+    M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
+        mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ;
+end
+
+rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ;
+kinds = { 'md', 'mz' } ;
+
+for what = 1:2
+
+    rule = rules {what} ;
+    kind = kinds {what} ;
+
+    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s',  ...
+        'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ...
+	umfdir) ;
+
+    M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ...
+	'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ...
+	'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ;
+
+    for k = 1:length(umfch)
+        M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
+            rule, umfch {k}, umfch {k}, kind, obj, umfdir) ;
+    end
+
+    M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+        'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ;
+
+    for k = 1:length(user)
+        M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+            'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ;
+    end
+end
+
+for k = 1:length(generic)
+    M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+	'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ;
+end
+
+%----------------------------------------
+% AMD routines (int only)
+%----------------------------------------
+
+for k = 1:length(amd)
+    M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ...
+        mx, amd {k}, amd {k}, 'm', obj, amddir) ;
+end
+
+%----------------------------------------
+% compile the umfpack mexFunction
+%----------------------------------------
+
+C = sprintf ('%s -output umfpack umfpackmex.c', mx) ;
+for i = 1:length (M)
+    C = [C ' ' (M {i})] ;
+end
+C = [C ' ' blas_lib] ;
+cmd (C) ;
+
+%----------------------------------------
+% delete the object files
+%----------------------------------------
+
+for i = 1:length (M)
+    rmfile (M {i}) ;
+end
+
+%----------------------------------------
+% compile the luflop mexFunction
+%----------------------------------------
+
+cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ;
+
+fprintf ('\n\nCompilation has completed.  Now trying the umfpack_simple demo.\n');
+umfpack_simple
+
+%-------------------------------------------------------------------------------
+% rmfile:  delete a file, but only if it exists
+%-------------------------------------------------------------------------------
+
+function rmfile (file)
+if (length (dir (file)) > 0)
+    delete (file) ;
+end
+
+%-------------------------------------------------------------------------------
+% cpfile:  copy the src file to the filename dst, overwriting dst if it exists
+%-------------------------------------------------------------------------------
+
+function cpfile (src, dst)
+rmfile (dst)
+if (length (dir (src)) == 0)
+    help umfpack_make
+    error (sprintf ('File does not exist: %s\n', src)) ;
+end
+copyfile (src, dst) ;
+
+%-------------------------------------------------------------------------------
+% mvfile:  move the src file to the filename dst, overwriting dst if it exists
+%-------------------------------------------------------------------------------
+
+function mvfile (src, dst)
+cpfile (src, dst) ;
+rmfile (src) ;
+
+%-------------------------------------------------------------------------------
+% cmd:  display and execute a command
+%-------------------------------------------------------------------------------
+
+function cmd (s)
+fprintf ('.') ;
+eval (s) ;
+
+%-------------------------------------------------------------------------------
+% make:  execute a "make" command for a source file
+%-------------------------------------------------------------------------------
+
+function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir)
+cmd (sprintf (s, rule, srcdir, file1)) ;
+src = sprintf (src, file1, obj) ;
+dst = sprintf (dst, kind, file2, obj) ;
+mvfile (src, dst) ;
+M {end + 1} = dst ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_report.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,346 @@
+function umfpack_report (Control, Info)
+% UMFPACK_REPORT
+%
+%       umfpack_report (Control, Info) ;
+%
+% Prints the current Control settings for umfpack, and the statistical
+% information returned by umfpack in the Info array.  If Control is
+% an empty matrix, then the default control settings are printed.
+%
+% Control is 20-by-1, and Info is 90-by-1.  Not all entries are used.
+%
+% Alternative usages:
+%
+%       umfpack_report ([ ], Info) ;    print the default control parameters
+%                                       and the Info array.
+%       umfpack_report (Control) ;      print the control parameters only.
+%       umfpack_report ;                print the default control parameters
+%                                       and an empty Info array.
+%
+% See also umfpack, umfpack_make, umfpack_details,
+% umfpack_demo, and umfpack_simple.
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+%-------------------------------------------------------------------------------
+% get inputs, use defaults if input arguments not present
+%-------------------------------------------------------------------------------
+
+% The contents of Control and Info are defined in umfpack.h
+if (nargin < 1)
+    Control = [] ;
+end
+if (nargin < 2)
+    Info = [] ;
+end
+if (isempty (Control))
+    Control = umfpack ;
+end
+if (isempty (Info))
+    Info = [ 0 (-ones (1, 89)) ] ;
+end
+
+%-------------------------------------------------------------------------------
+% control settings
+%-------------------------------------------------------------------------------
+
+fprintf ('\nUMFPACK Version 4.4:  Control settings:\n\n') ;
+fprintf ('    Control (1): print level: %d\n', Control (1)) ;
+fprintf ('    Control (2): dense row parameter:    %g\n', Control (2)) ;
+fprintf ('       "dense" rows have    > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ;
+fprintf ('    Control (3): dense column parameter: %g\n', Control (3)) ;
+fprintf ('       "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ;
+fprintf ('    Control (4): pivot tolerance: %g\n', Control (4)) ;
+fprintf ('    Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ;
+prstrat ('    Control (6): strategy: %g ', Control (6)) ;
+fprintf ('    Control (7): initial allocation ratio: %g\n', Control (7)) ;
+fprintf ('    Control (8): max iterative refinement steps: %d\n', Control (8)) ;
+fprintf ('    Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ;
+fprintf ('    Control (14): Q fixed during numeric factorization: %g ', Control (14)) ;
+if (Control (14) > 0)
+    fprintf ('(yes)\n') ;
+elseif (Control (14) < 0)
+    fprintf ('(no)\n') ;
+else
+    fprintf ('(auto)\n') ;
+end
+fprintf ('    Control (15): AMD dense row/column parameter: %g\n', Control (15)) ;
+fprintf ('       "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ;
+fprintf ('        Only used if the AMD ordering is used.\n') ;
+fprintf ('    Control (16): diagonal pivot tolerance: %g\n', Control (16)) ;
+fprintf ('        Only used if diagonal pivoting is attempted.\n') ;
+
+fprintf ('    Control (17): scaling option: %g ', Control (17)) ;
+if (Control (17) == 0)
+    fprintf ('(none)\n') ;
+elseif (Control (17) == 2)
+    fprintf ('(scale the matrix by\n') ;
+    fprintf ('        dividing each row by max. abs. value in each row)\n') ;
+else
+    fprintf ('(scale the matrix by\n') ;
+    fprintf ('        dividing each row by sum of abs. values in each row)\n') ;
+end
+
+fprintf ('    Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ;
+fprintf ('    Control (19): drop tolerance: %g\n', Control (19)) ;
+fprintf ('    Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ;
+yes_no (Control (20)) ;
+
+% compile-time options:
+
+fprintf ('\n  The following options can only be changed at compile-time:\n') ;
+
+if (Control (9) == 1)
+    fprintf ('    Control (9): compiled to use the BLAS\n') ;
+else
+    fprintf ('    Control (9): compiled without the BLAS\n') ;
+    fprintf ('        (you will not get the best possible performance)\n') ;
+end
+
+if (Control (10) == 1)
+    fprintf ('    Control (10): compiled for MATLAB\n') ;
+elseif (Control (10) == 2)
+    fprintf ('    Control (10): compiled for MATLAB\n') ;
+    fprintf ('        Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ;
+    fprintf ('        utDivideComplex, and utFdlibm_hypot routines.\n') ;
+else
+    fprintf ('    Control (10): not compiled for MATLAB\n') ;
+    fprintf ('        Uses ANSI C malloc, free, realloc, and printf\n') ;
+    fprintf ('        instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ;
+    fprintf ('        Printing will be in terms of 0-based matrix indexing,\n') ;
+    fprintf ('        not 1-based as is expected in MATLAB.  Diary output may\n') ;
+    fprintf ('        not be properly recorded.\n') ;
+end
+
+if (Control (11) == 2)
+    fprintf ('    Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ;
+elseif (Control (11) == 1)
+    fprintf ('    Control (11): uses getrusage to get CPU time.\n') ;
+else
+    fprintf ('    Control (11): uses ANSI C clock to get CPU time.\n') ;
+    fprintf ('        The CPU time may wrap around, type "help cputime".\n') ;
+end
+
+if (Control (12) == 1)
+    fprintf ('    Control (12): compiled with debugging enabled\n') ;
+    fprintf ('        ###########################################\n') ;
+    fprintf ('        ### This will be exceedingly slow! ########\n') ;
+    fprintf ('        ###########################################\n') ;
+    if (Control (10) == 1)
+        fprintf ('        Uses mxAssert.\n') ;
+    elseif (Control (10) == 2)
+        fprintf ('        Uses utAssert.\n') ;
+    else
+        fprintf ('        Uses ANSI C assert instead of mxAssert.\n') ;
+    end
+else
+    fprintf ('    Control (12): compiled for normal operation (no debugging)\n') ;
+end
+
+%-------------------------------------------------------------------------------
+% Info:
+%-------------------------------------------------------------------------------
+
+if (nargin == 1)
+    return
+end
+
+status = Info (1) ;
+fprintf ('\nUMFPACK status:  Info (1): %d, ', status) ;
+
+if (status == 0)
+    fprintf ('OK\n') ;
+elseif (status == 1)
+    fprintf ('WARNING  matrix is singular\n') ;
+elseif (status == -1)
+    fprintf ('ERROR    out of memory\n') ;
+elseif (status == -3)
+    fprintf ('ERROR    numeric LU factorization is invalid\n') ;
+elseif (status == -4)
+    fprintf ('ERROR    symbolic LU factorization is invalid\n') ;
+elseif (status == -5)
+    fprintf ('ERROR    required argument is missing\n') ;
+elseif (status == -6)
+    fprintf ('ERROR    n <= 0\n') ;
+elseif (status <= -7 & status >= -12 | status == -14)
+    fprintf ('ERROR    matrix A is corrupted\n') ;
+elseif (status == -13)
+    fprintf ('ERROR    invalid system\n') ;
+elseif (status == -15)
+    fprintf ('ERROR    invalid permutation\n') ;
+elseif (status == -911)
+    fprintf ('ERROR    internal error!\n') ;
+    fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ;
+else
+    fprintf ('ERROR    unrecognized error.  Info array corrupted\n') ;
+end
+
+fprintf ('    (a -1 means the entry has not been computed):\n') ;
+
+fprintf ('\n  Basic statistics:\n') ;
+fprintf ('    Info (2):  %d, # of rows of A\n', Info (2)) ;
+fprintf ('    Info (17): %d, # of columns of A\n', Info (17)) ;
+fprintf ('    Info (3): %d, nnz (A)\n', Info (3)) ;
+fprintf ('    Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ;
+fprintf ('    Info (5): %d, size of int (in bytes)\n', Info (5)) ;
+fprintf ('    Info (6): %d, size of long (in bytes)\n', Info (6)) ;
+fprintf ('    Info (7): %d, size of pointer (in bytes)\n', Info (7)) ;
+fprintf ('    Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ;
+
+fprintf ('\n  Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ;
+fprintf ('    Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ;
+fprintf ('    Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ;
+fprintf ('    Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ;
+fprintf ('    Info (60): %d ') ;
+if (Info (60) > 0)
+    fprintf ('submatrix S square and diagonal preserved\n') ;
+elseif (Info  (60) == 0)
+    fprintf ('submatrix S not square or diagonal not preserved\n') ;
+else
+    fprintf ('\n') ;
+end
+fprintf ('    Info (9):  %d, # of "dense" rows in S\n', Info (9)) ;
+fprintf ('    Info (10): %d, # of empty rows in S\n', Info (10)) ;
+fprintf ('    Info (11): %d, # of "dense" columns in S\n', Info (11)) ;
+fprintf ('    Info (12): %d, # of empty columns in S\n', Info (12)) ;
+fprintf ('    Info (34): %g, symmetry of pattern of S\n', Info (34)) ;
+fprintf ('    Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ;
+fprintf ('    Info (36): %d, nnz (diag (S))\n', Info (36)) ;
+
+fprintf ('\n  2-by-2 pivoting to place large entries on diagonal:\n') ;
+fprintf ('    Info (52): %d, # of small diagonal entries of S\n', Info (52)) ;
+fprintf ('    Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ;
+fprintf ('    Info (54): %g, symmetry of P2*S\n', Info (54)) ;
+fprintf ('    Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ;
+fprintf ('    Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ;
+
+fprintf ('\n  AMD results, for strict diagonal pivoting:\n') ;
+fprintf ('    Info (37): %d, est. nz in L and U\n', Info (37)) ;
+fprintf ('    Info (38): %g, est. flop count\n', Info (38)) ;
+fprintf ('    Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ;
+fprintf ('    Info (40): %g, est. max. nz in any column of L\n', Info (40)) ;
+
+fprintf ('\n  Final strategy selection, based on the analysis above:\n') ;
+prstrat ('    Info (19): %d, strategy used ', Info (19)) ;
+fprintf ('    Info (20): %d, ordering used ', Info (20)) ;
+if (Info (20) == 0)
+    fprintf ('(COLAMD on A)\n') ;
+elseif (Info (20) == 1)
+    fprintf ('(AMD on A+A'')\n') ;
+elseif (Info (20) == 2)
+    fprintf ('(provided by user)\n') ;
+else
+    fprintf ('(undefined ordering option)\n') ;
+end
+fprintf ('    Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ;
+yes_no (Info (32)) ;
+fprintf ('    Info (33): %d, prefer diagonal pivoting: ', Info (33)) ;
+yes_no (Info (33)) ;
+
+fprintf ('\n  symbolic analysis time and memory usage:\n') ;
+fprintf ('    Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ;
+fprintf ('    Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ;
+fprintf ('    Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ;
+fprintf ('    Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ;
+fprintf ('    Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ;
+
+fprintf ('\n  Estimates computed in the symbolic analysis:\n') ;
+fprintf ('    Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ;
+fprintf ('    Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ;
+fprintf ('    Info (23): %d, est. factorization flop count\n', Info (23)) ;
+fprintf ('    Info (24): %d, est. nnz (L)\n', Info (24)) ;
+fprintf ('    Info (25): %d, est. nnz (U)\n', Info (25)) ;
+fprintf ('    Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ;
+fprintf ('    Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ;
+fprintf ('    Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ;
+fprintf ('    Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ;
+fprintf ('    Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ;
+fprintf ('    Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ;
+
+fprintf ('\n  Computed in the numeric factorization (estimates shown above):\n') ;
+fprintf ('    Info (41): %d, size of LU factors (Units)\n', Info (41)) ;
+fprintf ('    Info (42): %d, total peak memory usage (Units)\n', Info (42)) ;
+fprintf ('    Info (43): %d, factorization flop count\n', Info (43)) ;
+fprintf ('    Info (44): %d, nnz (L)\n', Info (44)) ;
+fprintf ('    Info (45): %d, nnz (U)\n', Info (45)) ;
+fprintf ('    Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ;
+fprintf ('    Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ;
+fprintf ('    Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ;
+fprintf ('    Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ;
+fprintf ('    Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ;
+fprintf ('    Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ;
+
+fprintf ('\n  Computed in the numeric factorization (no estimates computed a priori):\n') ;
+fprintf ('    Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ;
+fprintf ('    Info (62): %d, reallocations during numeric factorization\n', Info (62)) ;
+fprintf ('    Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ;
+fprintf ('    Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ;
+fprintf ('    Info (65): %d, numerical values stored in L and U\n', Info (65)) ;
+fprintf ('    Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ;
+fprintf ('    Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ;
+if (Info (66) > 0.05 & Info (43) > 0)
+fprintf ('    mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ;
+end
+fprintf ('    Info (67): %d, nnz (diag (U))\n', Info (67)) ;
+fprintf ('    Info (68): %g, reciprocal condition number estimate\n', Info (68)) ;
+fprintf ('    Info (69): %g, matrix was ', Info (69)) ;
+if (Info (69) == 0)
+    fprintf ('not scaled\n') ;
+elseif (Info (69) == 2)
+    fprintf ('scaled (row max)\n') ;
+else
+    fprintf ('scaled (row sum)\n') ;
+end
+fprintf ('    Info (70): %g, min. scale factor of rows of A\n', Info (70)) ;
+fprintf ('    Info (71): %g, max. scale factor of rows of A\n', Info (71)) ;
+fprintf ('    Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ;
+fprintf ('    Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ;
+fprintf ('    Info (74): %g, initial allocation parameter used\n', Info (74)) ;
+fprintf ('    Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ;
+fprintf ('    Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ;
+fprintf ('    Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ;
+fprintf ('    Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ;
+fprintf ('    Info (80): %d, # of small entries dropped\n', Info (80)) ;
+
+fprintf ('\n  Computed in the solve step:\n') ;
+fprintf ('    Info (81): %d, iterative refinement steps taken\n', Info (81)) ;
+fprintf ('    Info (82): %d, iterative refinement steps attempted\n', Info (82)) ;
+fprintf ('    Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ;
+fprintf ('    Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ;
+fprintf ('    Info (85): %d, solve flop count\n', Info (85)) ;
+fprintf ('    Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ;
+fprintf ('    Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ;
+
+fprintf ('\n    Info (88:90): unused\n\n') ;
+
+%-------------------------------------------------------------------------------
+
+function prstrat (fmt, strategy)
+fprintf (fmt, strategy) ;
+if (strategy == 1)
+    fprintf ('(unsymmetric)\n') ;
+    fprintf ('        Q = COLAMD (A), Q refined during numerical\n') ;
+    fprintf ('        factorization, and no attempt at diagonal pivoting.\n') ;
+elseif (strategy == 2)
+    fprintf ('(symmetric, with 2-by-2 pivoting)\n') ;
+    fprintf ('        P2 = row permutation to place large values on the diagonal\n') ;
+    fprintf ('        Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ;
+    fprintf ('        and diagonal pivoting attempted.\n') ;
+elseif (strategy == 3)
+    fprintf ('(symmetric)\n') ;
+    fprintf ('        Q = AMD (A+A''), Q not refined during numeric factorization,\n') ;
+    fprintf ('        and diagonal pivoting (P=Q'') attempted.\n') ;
+else
+    strategy = 0 ;
+    fprintf ('(auto)\n') ;
+end
+
+%-------------------------------------------------------------------------------
+
+function yes_no (s)
+if (s == 0)
+    fprintf ('(no)\n') ;
+else
+    fprintf ('(yes)\n') ;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,61 @@
+% umfpack_simple:  a simple demo of UMFPACK
+%
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+%
+% UMFPACK License:
+%
+%     Your use or distribution of UMFPACK or any modified version of
+%     UMFPACK implies that you agree to this License.
+%
+%     THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+%     EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+%
+%     Permission is hereby granted to use or copy this program, provided
+%     that the Copyright, this License, and the Availability of the original
+%     version is retained on all copies.  User documentation of any code that
+%     uses UMFPACK or any modified version of UMFPACK code must cite the
+%     Copyright, this License, the Availability note, and "Used by permission."
+%     Permission to modify the code and to distribute modified code is granted,
+%     provided the Copyright, this License, and the Availability note are
+%     retained, and a notice that the code was modified is included.  This
+%     software was developed with support from the National Science Foundation,
+%     and is provided to you free of charge.
+%
+% Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+%
+% See also: umfpack, umfpack_details
+
+help umfpack_simple
+i = input ('Hit enter to agree to the above License: ', 's') ;
+if (~isempty (i))
+    error ('terminating') ;
+end
+
+format short
+
+A = [
+ 2  3  0  0  0
+ 3  0  4  0  6
+ 0 -1 -3  2  0
+ 0  0  1  0  0
+ 0  4  2  0  1
+]
+
+A = sparse (A) ;
+
+b = [8 45 -3 3 19]'
+
+fprintf ('Solution to Ax=b via UMFPACK:\n') ;
+fprintf ('x1 = umfpack (A, ''\\'', b)\n') ;
+
+x1 = umfpack (A, '\', b)
+
+fprintf ('Solution to Ax=b via MATLAB:\n') ;
+fprintf ('x2 = A\\b\n') ;
+
+x2 = A\b
+
+fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ;
+
+fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_simple.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,75 @@
+>> umfpack_simple
+  umfpack_simple:  a simple demo of UMFPACK
+ 
+  UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+  All Rights Reserved.  Type umfpack_details for License.
+ 
+  UMFPACK License:
+ 
+      Your use or distribution of UMFPACK or any modified version of
+      UMFPACK implies that you agree to this License.
+ 
+      THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+      EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ 
+      Permission is hereby granted to use or copy this program, provided
+      that the Copyright, this License, and the Availability of the original
+      version is retained on all copies.  User documentation of any code that
+      uses UMFPACK or any modified version of UMFPACK code must cite the
+      Copyright, this License, the Availability note, and "Used by permission."
+      Permission to modify the code and to distribute modified code is granted,
+      provided the Copyright, this License, and the Availability note are
+      retained, and a notice that the code was modified is included.  This
+      software was developed with support from the National Science Foundation,
+      and is provided to you free of charge.
+ 
+  Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+ 
+  See also: umfpack, umfpack_details
+
+
+
+Hit enter to agree to the above License: 
+
+A =
+
+     2     3     0     0     0
+     3     0     4     0     6
+     0    -1    -3     2     0
+     0     0     1     0     0
+     0     4     2     0     1
+
+
+b =
+
+     8
+    45
+    -3
+     3
+    19
+
+Solution to Ax=b via UMFPACK:
+x1 = umfpack (A, '\', b)
+
+x1 =
+
+    1.0000
+    2.0000
+    3.0000
+    4.0000
+    5.0000
+
+Solution to Ax=b via MATLAB:
+x2 = A\b
+
+x2 =
+
+    1.0000
+    2.0000
+    3.0000
+    4.0000
+    5.0000
+
+norm (x1-x2) should be small: 1.28037e-15
+Type 'umfpack_demo' for a full demo of UMFPACK
+>> diary off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_solve.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,96 @@
+function x = umfpack_solve (arg1, op, arg2, Control)
+% UMFPACK_SOLVE
+%
+% x = umfpack_solve (A, '\', b, Control)
+% x = umfpack_solve (b, '/', A, Control)
+%
+% Computes x = A\b, or b/A, where A is square.  Uses UMFPACK if A is sparse.
+% The Control argument is optional.
+%
+% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
+% and umfpack_simple.
+
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+%-------------------------------------------------------------------------------
+% check inputs and get default control parameters
+%-------------------------------------------------------------------------------
+
+if (op == '\')
+    A = arg1 ;
+    b = arg2 ;
+elseif (op == '/')
+    A = arg2 ;
+    b = arg1 ;
+else
+    help umfack_solve
+    error ('umfpack_solve:  unrecognized operator') ;
+end
+
+[m n] = size (A) ;
+if (m ~= n)
+    help umfpack_solve
+    error ('umfpack_solve:  A must be square') ;
+end
+
+[m1 n1] = size (b) ;
+if ((op == '\' & n ~= m1) | (op == '/' & n1 ~= m))
+    help umfpack_solve
+    error ('umfpack_solve:  b has the wrong dimensions') ;
+end
+
+if (nargin < 4)
+    Control = umfpack ;
+end
+
+%-------------------------------------------------------------------------------
+% solve the system
+%-------------------------------------------------------------------------------
+
+if (op == '\')
+
+    if (~issparse (A))
+
+	% A is not sparse, so just use MATLAB
+	x = A\b ;
+
+    elseif (n1 == 1 & ~issparse (b))
+
+	% the UMFPACK '\' requires b to be a dense column vector
+	x = umfpack (A, '\', b, Control) ;
+
+    else
+
+	% factorize with UMFPACK and do the forward/back solves in MATLAB
+	[L, U, P, Q, R] = umfpack (A, Control) ;
+	x = Q * (U \ (L \ (P * (R \ b)))) ;
+
+    end
+
+else
+
+    if (~issparse (A))
+
+	% A is not sparse, so just use MATLAB
+	x = b/A ;
+
+    elseif (m1 == 1 & ~issparse (b))
+
+	% the UMFPACK '\' requires b to be a dense column vector
+	x = umfpack (b, '/', A, Control) ;
+
+    else
+
+	% factorize with UMFPACK and do the forward/back solves in MATLAB
+	% this mimics the behavior of x = b/A, except for the row scaling
+	[L, U, P, Q, R] = umfpack (A.', Control) ;
+	x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ;
+
+	% an alternative method:
+	% [L, U, P, Q, r] = umfpack (A, Control) ;
+	% x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ;
+
+    end
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpack_test.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,152 @@
+% UMFPACK_TEST: test UMFPACK solve: b/A, A\b with iterative refinement
+% Requires the UFsparse package for downloading matrices from the UF
+% sparse matrix library.
+%
+% UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.
+% All Rights Reserved.  Type umfpack_details for License.
+
+index = UFget ;
+
+f = find (index.nrows == index.ncols) ;
+[ignore, i] = sort (index.nrows (f)) ;
+f = f (i) ;
+
+Control = umfpack ;
+Control (1) = 0 ;
+
+warning ('off', 'all') ;
+figure (1)
+clf
+
+
+for i = f
+
+    fprintf ('\nmatrix: %s %s %d\n', index.Group{i}, index.Name{i}, index.nrows(i)) ;
+
+    Prob = UFget (i) ;
+    A = Prob.A ;
+    n = size (A,1) ;
+
+    b = rand (1,n) ;
+    c = b' ;
+
+    try
+
+	%-----------------------------------------------------------------------
+	% symbolic factorization
+	%-----------------------------------------------------------------------
+
+	[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;
+	subplot (2,2,1)
+	spy (A)
+	title ('A')
+
+	subplot (2,2,2)
+	treeplot (Fr (1:end-1,2)') ;
+	title ('supercolumn etree')
+
+	%-----------------------------------------------------------------------
+	% P(R\A)Q = LU
+	%-----------------------------------------------------------------------
+
+	[L,U,P,Q,R,Info] = umfpack (A) ;
+	err = lu_normest (P*(R\A)*Q, L, U) ;
+	fprintf ('norm est PR\\AQ-LU: %g relative: %g\n', ...
+	    err, err / norm (A,1)) ;
+
+	subplot (2,2,3)
+	spy (P*A*Q)
+	title ('PAQ') ;
+
+	cs = Info (57) ;
+	rs = Info (58) ;
+
+	subplot (2,2,4)
+	hold off
+	spy (L|U)
+	hold on
+	if (cs > 0)
+	    plot ([0 cs n n 0] + .5, [0 cs cs 0 0]+.5, 'c') ;
+	end
+	if (rs > 0)
+	    plot ([0 rs rs 0 0] + cs +.5, [cs cs+rs n n cs]+.5, 'r') ;
+	end
+
+	title ('LU factors')
+	drawnow
+
+	%-----------------------------------------------------------------------
+	% PAQ = LU
+	%-----------------------------------------------------------------------
+
+	[L,U,P,Q] = umfpack (A) ;
+	err = lu_normest (P*A*Q, L, U) ;
+	fprintf ('norm est PAQ-LU:   %g relative: %g\n', ...
+	    err, err / norm (A,1)) ;
+
+	%-----------------------------------------------------------------------
+	% solve
+	%-----------------------------------------------------------------------
+
+	x1 = b/A ;
+	y1 = A\c ;
+	m1 = norm (b-x1*A) ;
+	m2 = norm (A*y1-c) ;
+
+	% factor the transpose
+	Control (8) = 2 ;
+	[x, info] = umfpack (A', '\', c, Control) ;
+	lunz0 = info (44) + info (45) - info (67) ;
+	r = norm (A'*x-c) ;
+
+	fprintf (':: %8.2e  matlab: %8.2e %8.2e\n',  r, m1, m2) ;
+
+	% factor the original matrix and solve xA=b
+	for ir = 0:4
+	    Control (8) = ir ;
+	    [x, info] = umfpack (b, '/', A, Control) ;
+	    r = norm (b-x*A) ;
+	    if (ir == 0)
+		lunz1 = info (44) + info (45) - info (67) ;
+	    end
+	    fprintf ('%d: %8.2e %d %d\n', ir, r, info (81), info (82)) ;
+	end
+
+	% factor the original matrix and solve Ax=b
+	for ir = 0:4
+	    Control (8) = ir ;
+	    [x, info] = umfpack (A, '\', c, Control) ;
+	    r = norm (A*x-c) ;
+	    fprintf ('%d: %8.2e %d %d\n', ir, r, info (81), info (82)) ;
+	end
+
+	fprintf ('lunz trans %12d    no trans: %12d  trans/notrans: %10.4f\n', ...
+	    lunz0, lunz1, lunz0 / lunz1) ;
+
+	%-----------------------------------------------------------------------
+	% get the determinant
+	%-----------------------------------------------------------------------
+
+	det1 = det (A) ;
+	det2 = umfpack (A, 'det') ;
+	[det3 dexp3] = umfpack (A, 'det') ;
+	err = abs (det1-det2) ;
+	err3 = abs (det1 - (det3 * 10^dexp3)) ;
+	denom = det1 ;
+	if (denom == 0)
+	    denom = 1 ;
+	end
+	err = err / denom ;
+	err3 = err3 / denom ;
+	fprintf ('det:  %24.16e + (%24.16e)i MATLAB\n', real(det1), imag(det1)) ;
+	fprintf ('det:  %24.16e + (%24.16e)i umfpack\n',real(det2), imag(det2)) ;
+	fprintf ('det: (%24.16e + (%24.16e)i) * 10^(%g) umfpack\n', real(det3), imag(det3), dexp3) ;
+	fprintf ('diff %g %g\n', err, err3) ;
+
+    catch
+	fprintf ('failed\n') ;
+    end
+
+%   pause
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/MATLAB/umfpackmex.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1364 @@
+/* ========================================================================== */
+/* === UMFPACK mexFunction ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    MATLAB interface for umfpack.
+
+    Factor or solve a sparse linear system, returning either the solution
+    x to Ax=b or A'x'=b', or the factorization LU=P(R\A)Q or LU=PAQ.  A must be
+    sparse, with nonzero dimensions, but it may be complex, singular, and/or
+    rectangular.  b must be a dense n-by-1 vector (real or complex).
+    L is unit lower triangular, U is upper triangular, and R is diagonal.
+    P and Q are permutation matrices (permutations of an identity matrix).
+
+    The matrix A is scaled, by default.  Each row i is divided by r (i), where
+    r (i) is the sum of the absolute values of the entries in that row.  The
+    scaled matrix has an infinity norm of 1.  The scale factors r (i) are
+    returned in a diagonal sparse matrix.  If the factorization is:
+
+	[L, U, P, Q, R] = umfpack (A) ;
+
+    then the factorization is
+
+	L*U = P * (R \ A) * Q
+
+    This is safer than returning a matrix R such that L*U = P*R*A*Q, because
+    it avoids the division by small entries.  If r(i) is subnormal, multiplying
+    by 1/r(i) would result in an IEEE Infinity, but dividing by r(i) is safe.
+
+    The factorization
+
+	[L, U, P, Q] = umfpack (A) ;
+
+    returns LU factors such that L*U = P*A*Q, with no scaling.
+
+    See umfpack.m, umfpack_details.m, and umfpack.h for details.
+
+    Note that this mexFunction accesses only the user-callable UMFPACK routines.
+    Thus, is also provides another example of how user C code can access
+    UMFPACK.
+
+    If NO_TRANSPOSE_FORWARD_SLASH is not defined at compile time, then the
+    forward slash (/) operator acts almost like x = b/A in MATLAB 6.1.  It is
+    solved by factorizing the array transpose, and then x = (A.'\b.').' is
+    solved.  This is the default behavior (for historical reasons), since
+    factorizing A can behave perform much differently than factorizing its
+    transpose.
+
+    If NO_TRANSPOSE_FORWARD_SLASH is defined at compile time, then the forward
+    slash operator does not act like x=b/A in MATLAB 6.1.  It is solved by
+    factorizing A, and then solving via the transposed L and U matrices.
+    The solution is still x = (A.'\b.').', except that A is factorized instead
+    of A.'.
+
+    Modified for v4.3.1, Jan 10, 2005: default has been changed to
+    NO_TRANSPOSE_FORWARD_SLASH, to test iterative refinement for b/A.
+    v4.4: added method for computing the determinant.
+*/
+#define NO_TRANSPOSE_FORWARD_SLASH  /* default has changed for v4.3.1 */
+
+#include "umfpack.h"
+#include "mex.h"
+#include "matrix.h"
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define STRING_MATCH(s1,s2) (strcmp ((s1), (s2)) == 0)
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+/* ========================================================================== */
+/* === error ================================================================ */
+/* ========================================================================== */
+
+/* Return an error message */
+
+static void error
+(
+    char *s,
+    int A_is_complex,
+    int nargout,
+    mxArray *pargout [ ],
+    double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO],
+    int status,
+    int do_info
+)
+{
+    int i ;
+    double *OutInfo ;
+    if (A_is_complex)
+    {
+	umfpack_zi_report_status (Control, status) ;
+	umfpack_zi_report_info (Control, Info) ;
+    }
+    else
+    {
+	umfpack_di_report_status (Control, status) ;
+	umfpack_di_report_info (Control, Info) ;
+    }
+    if (do_info > 0)
+    {
+	/* return Info */
+	pargout [do_info] = mxCreateDoubleMatrix (1, UMFPACK_INFO, mxREAL) ;
+	OutInfo = mxGetPr (pargout [do_info]) ;
+	for (i = 0 ; i < UMFPACK_INFO ; i++)
+	{
+	    OutInfo [i] = Info [i] ;
+	}
+    }
+    mexErrMsgTxt (s) ;
+}
+
+
+/* ========================================================================== */
+/* === UMFPACK ============================================================== */
+/* ========================================================================== */
+
+void mexFunction
+(
+    int nargout,		/* number of outputs */
+    mxArray *pargout [ ],	/* output arguments */
+    int nargin,			/* number of inputs */
+    const mxArray *pargin [ ]	/* input arguments */
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL], dx, dz, dexp ;
+    double *Lx, *Lz, *Ux, *Uz, *Ax, *Az, *Bx, *Bz, *Xx, *Xz, *User_Control,
+	*p, *q, *OutInfo, *p1, *p2, *p3, *p4, *Ltx, *Ltz, *Rs, *Px, *Qx ;
+    void *Symbolic, *Numeric ;
+    int *Lp, *Li, *Up, *Ui, *Ap, *Ai, *P, *Q, do_solve, lnz, unz, nn, i,
+	transpose, size, do_info, do_numeric, *Front_npivcol, op, k, *Rp, *Ri,
+	*Front_parent, *Chain_start, *Chain_maxrows, *Chain_maxcols, nz, status,
+	nfronts, nchains, *Ltp, *Ltj, *Qinit, print_level, status2, no_scale,
+	*Front_1strow, *Front_leftmostdesc, n_row, n_col, n_inner, sys,
+	ignore1, ignore2, ignore3, A_is_complex, B_is_complex, X_is_complex,
+	*Pp, *Pi, *Qp, *Qi, do_recip, do_det ;
+    mxArray *Amatrix, *Bmatrix, *User_Control_matrix, *User_Qinit ;
+    char *operator, *operation ;
+    mxComplexity Atype, Xtype ;
+    char warning [200] ;
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+    int *Cp, *Ci ;
+    double *Cx, *Cz ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get inputs A, b, and the operation to perform */
+    /* ---------------------------------------------------------------------- */
+
+    User_Control_matrix = (mxArray *) NULL ;
+    User_Qinit = (mxArray *) NULL ;
+
+    do_info = 0 ;
+    do_solve = FALSE ;
+    do_numeric = TRUE ;
+    transpose = FALSE ;
+    no_scale = FALSE ;
+    do_det = FALSE ;
+
+    /* find the operator */
+    op = 0 ;
+    for (i = 0 ; i < nargin ; i++)
+    {
+	if (mxIsChar (pargin [i]))
+	{
+	    op = i ;
+	    break ;
+	}
+    }
+
+    if (op > 0)
+    {
+	operator = mxArrayToString (pargin [op]) ;
+
+	if (STRING_MATCH (operator, "\\"))
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* matrix left divide, x = A\b */
+	    /* -------------------------------------------------------------- */
+
+	    /*
+		[x, Info] = umfpack (A, '\', b) ;
+		[x, Info] = umfpack (A, '\', b, Control) ;
+		[x, Info] = umfpack (A, Qinit, '\', b, Control) ;
+		[x, Info] = umfpack (A, Qinit, '\', b) ;
+	    */
+
+	    operation = "x = A\\b" ;
+	    do_solve = TRUE ;
+	    Amatrix = (mxArray *) pargin [0] ;
+	    Bmatrix = (mxArray *) pargin [op+1] ;
+
+	    if (nargout == 2)
+	    {
+		do_info = 1 ;
+	    }
+	    if (op == 2)
+	    {
+		User_Qinit = (mxArray *) pargin [1] ;
+	    }
+	    if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5))
+	    {
+		User_Control_matrix = (mxArray *) pargin [nargin-1] ;
+	    }
+	    if (nargin < 3 || nargin > 5 || nargout > 2)
+	    {
+		mexErrMsgTxt ("wrong number of arguments") ;
+	    }
+
+	}
+	else if (STRING_MATCH (operator, "/"))
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* matrix right divide, x = b/A */
+	    /* -------------------------------------------------------------- */
+
+	    /*
+		[x, Info] = umfpack (b, '/', A) ;
+		[x, Info] = umfpack (b, '/', A, Control) ;
+		[x, Info] = umfpack (b, '/', A, Qinit) ;
+		[x, Info] = umfpack (b, '/', A, Qinit, Control) ;
+	    */
+
+	    operation = "x = b/A" ;
+	    do_solve = TRUE ;
+	    transpose = TRUE ;
+	    Amatrix = (mxArray *) pargin [2] ;
+	    Bmatrix = (mxArray *) pargin [0] ;
+
+	    if (nargout == 2)
+	    {
+		do_info = 1 ;
+	    }
+	    if (nargin == 5)
+	    {
+		User_Qinit = (mxArray *) pargin [3] ;
+		User_Control_matrix = (mxArray *) pargin [4] ;
+	    }
+	    else if (nargin == 4)
+	    {
+		/* Control is k-by-1 where k > 1, Qinit is 1-by-n */
+		if (mxGetM (pargin [3]) == 1)
+		{
+		    User_Qinit = (mxArray *) pargin [3] ;
+		}
+		else
+		{
+		    User_Control_matrix = (mxArray *) pargin [3] ;
+		}
+	    }
+	    else if (nargin < 3 || nargin > 5 || nargout > 2)
+	    {
+		mexErrMsgTxt ("wrong number of arguments") ;
+	    }
+
+	}
+	else if (STRING_MATCH (operator, "symbolic"))
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* symbolic factorization only */
+	    /* -------------------------------------------------------------- */
+
+	    /*
+	    [P Q Fr Ch Info] = umfpack (A, 'symbolic') ;
+	    [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ;
+	    [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ;
+	    [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ;
+	    */
+
+	    operation = "symbolic factorization" ;
+	    do_numeric = FALSE ;
+	    Amatrix = (mxArray *) pargin [0] ;
+
+	    if (nargout == 5)
+	    {
+		do_info = 4 ;
+	    }
+	    if (op == 2)
+	    {
+		User_Qinit = (mxArray *) pargin [1] ;
+	    }
+	    if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4))
+	    {
+		User_Control_matrix = (mxArray *) pargin [nargin-1] ;
+	    }
+	    if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4)
+	    {
+		mexErrMsgTxt ("wrong number of arguments") ;
+	    }
+
+	}
+	else if (STRING_MATCH (operator, "det"))
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* compute the determinant */
+	    /* -------------------------------------------------------------- */
+
+	    /*
+	     * [det] = umfpack (A, 'det') ;
+	     * [dmantissa dexp] = umfpack (A, 'det') ;
+	     */
+
+	    operation = "determinant" ;
+	    do_det = TRUE ;
+	    Amatrix = (mxArray *) pargin [0] ;
+	    if (nargin > 2 || nargout > 2)
+	    {
+		mexErrMsgTxt ("wrong number of arguments") ;
+	    }
+
+	}
+	else
+	{
+	    mexErrMsgTxt ("operator must be '/', '\\', or 'symbolic'") ;
+	}
+	mxFree (operator) ;
+
+    }
+    else if (nargin > 0)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* LU factorization */
+	/* ------------------------------------------------------------------ */
+
+	/*
+	    with scaling:
+	    [L, U, P, Q, R, Info] = umfpack (A) ;
+	    [L, U, P, Q, R, Info] = umfpack (A, Qinit) ;
+
+	    scaling determined by Control settings:
+	    [L, U, P, Q, R, Info] = umfpack (A, Control) ;
+	    [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;
+
+	    with no scaling:
+	    [L, U, P, Q] = umfpack (A) ;
+	    [L, U, P, Q] = umfpack (A, Control) ;
+	    [L, U, P, Q] = umfpack (A, Qinit) ;
+	    [L, U, P, Q] = umfpack (A, Qinit, Control) ;
+	*/
+
+	operation = "numeric factorization" ;
+	Amatrix = (mxArray *) pargin [0] ;
+
+	no_scale = nargout <= 4 ;
+
+	if (nargout == 6)
+	{
+	    do_info = 5 ;
+	}
+	if (nargin == 3)
+	{
+	    User_Qinit = (mxArray *) pargin [1] ;
+	    User_Control_matrix = (mxArray *) pargin [2] ;
+	}
+	else if (nargin == 2)
+	{
+	    /* Control is k-by-1 where k > 1, Qinit is 1-by-n */
+	    if (mxGetM (pargin [1]) == 1)
+	    {
+		User_Qinit = (mxArray *) pargin [1] ;
+	    }
+	    else
+	    {
+		User_Control_matrix = (mxArray *) pargin [1] ;
+	    }
+	}
+	else if (nargin > 3 || nargout > 6 || nargout < 4)
+	{
+	    mexErrMsgTxt ("wrong number of arguments") ;
+	}
+
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* return default control settings */
+	/* ------------------------------------------------------------------ */
+
+	/*
+	    Control = umfpack ;
+	    umfpack ;
+	*/
+
+	if (nargout > 1)
+	{
+	    mexErrMsgTxt ("wrong number of arguments") ;
+	}
+
+	pargout [0] = mxCreateDoubleMatrix (UMFPACK_CONTROL, 1, mxREAL) ;
+	User_Control = mxGetPr (pargout [0]) ;
+	umfpack_di_defaults (User_Control) ;
+
+	return ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* check inputs */
+    /* ---------------------------------------------------------------------- */
+
+    if (mxGetNumberOfDimensions (Amatrix) != 2)
+    {
+	mexErrMsgTxt ("input matrix A must be 2-dimensional") ;
+    }
+    n_row = mxGetM (Amatrix) ;
+    n_col = mxGetN (Amatrix) ;
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+    if (do_solve && n_row != n_col)
+    {
+	mexErrMsgTxt ("input matrix A must square for '\\' or '/'") ;
+    }
+    if (!mxIsSparse (Amatrix))
+    {
+	mexErrMsgTxt ("input matrix A must be sparse") ;
+    }
+    if (n_row == 0 || n_col == 0)
+    {
+	mexErrMsgTxt ("input matrix A cannot have zero rows or zero columns") ;
+    }
+
+    /* The real/complex status of A determines which version to use, */
+    /* (umfpack_di_* or umfpack_zi_*). */
+    A_is_complex = mxIsComplex (Amatrix) ;
+    Atype = A_is_complex ? mxCOMPLEX : mxREAL ;
+    Ap = mxGetJc (Amatrix) ;
+    Ai = mxGetIr (Amatrix) ;
+    Ax = mxGetPr (Amatrix) ;
+    Az = mxGetPi (Amatrix) ;
+
+    if (do_solve)
+    {
+
+	if (n_row != n_col)
+	{
+	    mexErrMsgTxt ("A must be square for \\ or /") ;
+	}
+	if (transpose)
+	{
+	    if (mxGetM (Bmatrix) != 1 || mxGetN (Bmatrix) != nn)
+	    {
+		mexErrMsgTxt ("b has the wrong dimensions") ;
+	    }
+	}
+	else
+	{
+	    if (mxGetM (Bmatrix) != nn || mxGetN (Bmatrix) != 1)
+	    {
+		mexErrMsgTxt ("b has the wrong dimensions") ;
+	    }
+	}
+	if (mxGetNumberOfDimensions (Bmatrix) != 2)
+	{
+	    mexErrMsgTxt ("input matrix b must be 2-dimensional") ;
+	}
+	if (mxIsSparse (Bmatrix))
+	{
+	    mexErrMsgTxt ("input matrix b cannot be sparse") ;
+	}
+	if (mxGetClassID (Bmatrix) != mxDOUBLE_CLASS)
+	{
+	    mexErrMsgTxt ("input matrix b must double precision matrix") ;
+	}
+
+	B_is_complex = mxIsComplex (Bmatrix) ;
+	Bx = mxGetPr (Bmatrix) ;
+	Bz = mxGetPi (Bmatrix) ;
+
+	X_is_complex = A_is_complex || B_is_complex ;
+	Xtype = X_is_complex ? mxCOMPLEX : mxREAL ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* set the Control parameters */
+    /* ---------------------------------------------------------------------- */
+
+    if (A_is_complex)
+    {
+	umfpack_zi_defaults (Control) ;
+    }
+    else
+    {
+	umfpack_di_defaults (Control) ;
+    }
+    if (User_Control_matrix)
+    {
+	if (mxGetClassID (User_Control_matrix) != mxDOUBLE_CLASS ||
+	    mxIsSparse (User_Control_matrix))
+	{
+	    mexErrMsgTxt ("Control must be a dense real matrix") ;
+	}
+	size = UMFPACK_CONTROL ;
+	size = MIN (size, mxGetNumberOfElements (User_Control_matrix)) ;
+	User_Control = mxGetPr (User_Control_matrix) ;
+	for (i = 0 ; i < size ; i++)
+	{
+	    Control [i] = User_Control [i] ;
+	}
+    }
+
+    if (no_scale)
+    {
+	/* turn off scaling for [L, U, P, Q] = umfpack (A) ;
+	 * ignoring the input value of Control (24) for the usage
+	 * [L, U, P, Q] = umfpack (A, Control) ; */
+	Control [UMFPACK_SCALE] = UMFPACK_SCALE_NONE ;
+    }
+
+    if (mxIsNaN (Control [UMFPACK_PRL]))
+    {
+	print_level = UMFPACK_DEFAULT_PRL ;
+    }
+    else
+    {
+	print_level = (int) Control [UMFPACK_PRL] ;
+    }
+
+    Control [UMFPACK_PRL] = print_level ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get Qinit, if present */
+    /* ---------------------------------------------------------------------- */
+
+    if (User_Qinit)
+    {
+	if (mxGetM (User_Qinit) != 1 || mxGetN (User_Qinit) != n_col)
+	{
+	    mexErrMsgTxt ("Qinit must be 1-by-n_col") ;
+	}
+	if (mxGetNumberOfDimensions (User_Qinit) != 2)
+	{
+	    mexErrMsgTxt ("input Qinit must be 2-dimensional") ;
+	}
+	if (mxIsComplex (User_Qinit))
+	{
+	    mexErrMsgTxt ("input Qinit must not be complex") ;
+	}
+	if (mxGetClassID (User_Qinit) != mxDOUBLE_CLASS)
+	{
+	    mexErrMsgTxt ("input Qinit must be a double matrix") ;
+	}
+	if (mxIsSparse (User_Qinit))
+	{
+	    mexErrMsgTxt ("input Qinit must be dense") ;
+	}
+	Qinit = (int *) mxMalloc (n_col * sizeof (int)) ;
+	p = mxGetPr (User_Qinit) ;
+	for (k = 0 ; k < n_col ; k++)
+	{
+	    /* convert from 1-based to 0-based indexing */
+	    Qinit [k] = ((int) (p [k])) - 1 ;
+	}
+
+    }
+    else
+    {
+	/* umfpack_*_qsymbolic will call colamd to get Qinit. This is the */
+	/* same as calling umfpack_*_symbolic with Qinit set to NULL*/
+	Qinit = (int *) NULL ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* report the inputs A and Qinit */
+    /* ---------------------------------------------------------------------- */
+
+    if (print_level >= 2)
+    {
+	/* print the operation */
+	mexPrintf ("\numfpack: %s\n", operation) ;
+    }
+
+    if (A_is_complex)
+    {
+	umfpack_zi_report_control (Control) ;
+	if (print_level >= 3) mexPrintf ("\nA: ") ;
+	(void) umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, Az,
+	    1, Control) ;
+	if (Qinit)
+	{
+	    if (print_level >= 3) mexPrintf ("\nQinit: ") ;
+	    (void) umfpack_zi_report_perm (n_col, Qinit, Control) ;
+	}
+    }
+    else
+    {
+	umfpack_di_report_control (Control) ;
+	if (print_level >= 3) mexPrintf ("\nA: ") ;
+	(void) umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax,
+	    1, Control) ;
+	if (Qinit)
+	{
+	    if (print_level >= 3) mexPrintf ("\nQinit: ") ;
+	    (void) umfpack_di_report_perm (n_col, Qinit, Control) ;
+	}
+    }
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+    /* ---------------------------------------------------------------------- */
+    /* create the array transpose for x = b/A */
+    /* ---------------------------------------------------------------------- */
+
+    if (transpose)
+    {
+	/* note that in this case A will be square (nn = n_row = n_col) */
+	/* x = (A.'\b.').' will be computed */
+
+	/* make sure Ci and Cx exist, avoid malloc of zero-sized arrays. */
+	nz = MAX (Ap [nn], 1) ;
+
+	Cp = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Ci = (int *) mxMalloc (nz * sizeof (int)) ;
+	Cx = (double *) mxMalloc (nz * sizeof (double)) ;
+	if (A_is_complex)
+	{
+	    Cz = (double *) mxMalloc (nz * sizeof (double)) ;
+	    status = umfpack_zi_transpose (nn, nn, Ap, Ai, Ax, Az,
+	        (int *) NULL, (int *) NULL, Cp, Ci, Cx, Cz, FALSE) ;
+	}
+	else
+	{
+	    status = umfpack_di_transpose (nn, nn, Ap, Ai, Ax,
+	        (int *) NULL, (int *) NULL, Cp, Ci, Cx) ;
+	}
+
+	if (status != UMFPACK_OK)
+	{
+	    error ("transpose of A failed", A_is_complex, nargout, pargout,
+		Control, Info, status, do_info);
+	    return ;
+	}
+
+	/* modify pointers so that C will be factorized and solved, not A */
+	Ap = Cp ;
+	Ai = Ci ;
+	Ax = Cx ;
+	if (A_is_complex)
+	{
+	    Az = Cz ;
+	}
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* perform the symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    if (A_is_complex)
+    {
+	status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, Az,
+	    Qinit, &Symbolic, Control, Info) ;
+    }
+    else
+    {
+	status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax,
+	    Qinit, &Symbolic, Control, Info) ;
+    }
+
+    if (Qinit)
+    {
+	mxFree (Qinit) ;
+    }
+
+    if (status < 0)
+    {
+	error ("symbolic factorization failed", A_is_complex, nargout, pargout,
+	    Control, Info, status, do_info) ;
+	return ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* report the Symbolic object */
+    /* ---------------------------------------------------------------------- */
+
+    if (A_is_complex)
+    {
+	(void) umfpack_zi_report_symbolic (Symbolic, Control) ;
+    }
+    else
+    {
+	(void) umfpack_di_report_symbolic (Symbolic, Control) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* perform numeric factorization, or just return symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    if (do_numeric)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* perform the numeric factorization */
+	/* ------------------------------------------------------------------ */
+
+	if (A_is_complex)
+	{
+	    status = umfpack_zi_numeric (Ap, Ai, Ax, Az, Symbolic, &Numeric,
+		Control, Info) ;
+	}
+	else
+	{
+	    status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+		Control, Info) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* free the symbolic factorization */
+	/* ------------------------------------------------------------------ */
+
+	if (A_is_complex)
+	{
+	    umfpack_zi_free_symbolic (&Symbolic) ;
+	}
+	else
+	{
+	    umfpack_di_free_symbolic (&Symbolic) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* report the Numeric object */
+	/* ------------------------------------------------------------------ */
+
+	if (status < 0)
+	{
+	    error ("numeric factorization failed", A_is_complex, nargout,
+		pargout, Control, Info, status, do_info);
+	    return ;
+	}
+
+	if (A_is_complex)
+	{
+	    (void) umfpack_zi_report_numeric (Numeric, Control) ;
+	}
+	else
+	{
+	    (void) umfpack_di_report_numeric (Numeric, Control) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* return the solution, determinant, or the factorization */
+	/* ------------------------------------------------------------------ */
+
+	if (do_solve)
+	{
+	    /* -------------------------------------------------------------- */
+	    /* solve Ax=b or A'x'=b', and return just the solution x */
+	    /* -------------------------------------------------------------- */
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+	    if (transpose)
+	    {
+		/* A.'x.'=b.' gives the same x=b/A as solving A'x'=b' */
+		/* since C=A.' was factorized, solve with sys = UMFPACK_A */
+		/* since x and b are vectors, x.' and b.' are implicit */
+		pargout [0] = mxCreateDoubleMatrix (1, nn, Xtype) ;
+	    }
+	    else
+	    {
+		pargout [0] = mxCreateDoubleMatrix (nn, 1, Xtype) ;
+	    }
+	    sys = UMFPACK_A ;
+#else
+	    if (transpose)
+	    {
+		/* If A is real, A'x=b is the same as A.'x=b. */
+		/* x and b are vectors, so x and b are the same as x' and b'. */
+		/* If A is complex, then A.'x.'=b.' gives the same solution x */
+		/* as the complex conjugate transpose.  If we used the A'x=b */
+		/* option in umfpack_*_solve, we would have to form b' on */
+		/* input and x' on output (negating the imaginary part). */
+		/* We can save this work by just using the A.'x=b option in */
+		/* umfpack_*_solve.  Then, forming x.' and b.' is implicit, */
+		/* since x and b are just vectors anyway. */
+		/* In both cases, the system to solve is A.'x=b */
+		pargout [0] = mxCreateDoubleMatrix (1, nn, Xtype) ;
+		sys = UMFPACK_Aat ;
+	    }
+	    else
+	    {
+		pargout [0] = mxCreateDoubleMatrix (nn, 1, Xtype) ;
+		sys = UMFPACK_A ;
+	    }
+#endif
+
+	    /* -------------------------------------------------------------- */
+	    /* print the right-hand-side, B */
+	    /* -------------------------------------------------------------- */
+
+	    if (print_level >= 3) mexPrintf ("\nright-hand side, b: ") ;
+	    if (B_is_complex)
+	    {
+		(void) umfpack_zi_report_vector (nn, Bx, Bz, Control) ;
+	    }
+	    else
+	    {
+		(void) umfpack_di_report_vector (nn, Bx, Control) ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* solve the system */
+	    /* -------------------------------------------------------------- */
+
+	    Xx = mxGetPr (pargout [0]) ;
+	    Xz = mxGetPi (pargout [0]) ;
+	    status2 = UMFPACK_OK ;
+
+	    if (A_is_complex)
+	    {
+		if (!B_is_complex)
+		{
+		    /* umfpack_zi_solve expects a complex B */
+		    Bz = (double *) mxCalloc (nn, sizeof (double)) ;
+		}
+		status = umfpack_zi_solve (sys, Ap, Ai, Ax, Az, Xx, Xz, Bx, Bz,
+		    Numeric, Control, Info) ;
+		if (!B_is_complex)
+		{
+		    mxFree (Bz) ;
+		}
+	    }
+	    else
+	    {
+		if (B_is_complex)
+		{
+		    /* Ax=b when b is complex and A is sparse can be split */
+		    /* into two systems, A*xr=br and A*xi=bi, where r denotes */
+		    /* the real part and i the imaginary part of x and b. */
+		    status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Xz, Bz,
+		    Numeric, Control, Info) ;
+		}
+		status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx,
+		    Numeric, Control, Info) ;
+	    }
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+	    /* -------------------------------------------------------------- */
+	    /* free the transposed matrix C */
+	    /* -------------------------------------------------------------- */
+
+	    if (transpose)
+	    {
+	        mxFree (Cp) ;
+	        mxFree (Ci) ;
+	        mxFree (Cx) ;
+	        if (A_is_complex)
+	        {
+	            mxFree (Cz) ;
+	        }
+	    }
+#endif
+
+	    /* -------------------------------------------------------------- */
+	    /* free the Numeric object */
+	    /* -------------------------------------------------------------- */
+
+	    if (A_is_complex)
+	    {
+		umfpack_zi_free_numeric (&Numeric) ;
+	    }
+	    else
+	    {
+		umfpack_di_free_numeric (&Numeric) ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* check error status */
+	    /* -------------------------------------------------------------- */
+
+	    if (status < 0 || status2 < 0)
+	    {
+		mxDestroyArray (pargout [0]) ;
+		error ("solve failed", A_is_complex, nargout, pargout, Control,
+			Info, status, do_info) ;
+		return ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* print the solution, X */
+	    /* -------------------------------------------------------------- */
+
+	    if (print_level >= 3) mexPrintf ("\nsolution, x: ") ;
+	    if (X_is_complex)
+	    {
+		(void) umfpack_zi_report_vector (nn, Xx, Xz, Control) ;
+	    }
+	    else
+	    {
+		(void) umfpack_di_report_vector (nn, Xx, Control) ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* warn about singular or near-singular matrices */
+	    /* -------------------------------------------------------------- */
+
+	    /* no warning is given if Control (1) is zero */
+
+	    if (Control [UMFPACK_PRL] >= 1)
+	    {
+		if (status == UMFPACK_WARNING_singular_matrix)
+		{
+		    sprintf (warning, "matrix is singular\n"
+			"Try increasing Control (%d) and Control (%d).\n"
+			"(Suppress this warning with Control (%d) = 0.)\n",
+			1+UMFPACK_PIVOT_TOLERANCE,
+			1+UMFPACK_SYM_PIVOT_TOLERANCE,
+			1+UMFPACK_PRL) ;
+		    mexWarnMsgTxt (warning) ;
+		}
+		else if (Info [UMFPACK_RCOND] < DBL_EPSILON)
+		{
+		    sprintf (warning, "matrix is nearly singular, rcond = %g\n"
+			"Try increasing Control (%d) and Control (%d).\n"
+			"(Suppress this warning with Control (%d) = 0.)\n",
+			Info [UMFPACK_RCOND],
+			1+UMFPACK_PIVOT_TOLERANCE,
+			1+UMFPACK_SYM_PIVOT_TOLERANCE,
+			1+UMFPACK_PRL) ;
+		    mexWarnMsgTxt (warning) ;
+		}
+	    }
+
+	}
+	else if (do_det)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* get the determinant */
+	    /* -------------------------------------------------------------- */
+
+	    if (nargout == 2)
+	    {
+		/* [det dexp] = umfpack (A, 'det') ;
+		 * return determinant in the form det * 10^dexp */
+		p = &dexp ;
+	    }
+	    else
+	    {
+		/* [det] = umfpack (A, 'det') ;
+		 * return determinant as a single scalar (overflow or
+		 * underflow is much more likely) */
+		p = (double *) NULL ;
+	    }
+	    if (A_is_complex)
+	    {
+		status = umfpack_zi_get_determinant (&dx, &dz, p,
+			Numeric, Info) ;
+		umfpack_zi_free_numeric (&Numeric) ;
+	    }
+	    else
+	    {
+		status = umfpack_di_get_determinant (&dx, p,
+			Numeric, Info) ;
+		umfpack_di_free_numeric (&Numeric) ;
+		dz = 0 ;
+	    }
+	    if (status < 0)
+	    {
+		error ("extracting LU factors failed", A_is_complex, nargout,
+		    pargout, Control, Info, status, do_info) ;
+	    }
+	    if (A_is_complex)
+	    {
+		pargout [0] = mxCreateDoubleMatrix (1, 1, mxCOMPLEX) ;
+		p = mxGetPr (pargout [0]) ;
+		*p = dx ;
+		p = mxGetPi (pargout [0]) ;
+		*p = dz ;
+	    }
+	    else
+	    {
+		pargout [0] = mxCreateDoubleMatrix (1, 1, mxREAL) ;
+		p = mxGetPr (pargout [0]) ;
+		*p = dx ;
+	    }
+	    if (nargout == 2)
+	    {
+		pargout [1] = mxCreateDoubleMatrix (1, 1, mxREAL) ;
+		p = mxGetPr (pargout [1]) ;
+		*p = dexp ;
+	    }
+
+	}
+	else
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* get L, U, P, Q, and r */
+	    /* -------------------------------------------------------------- */
+
+	    if (A_is_complex)
+	    {
+	        status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+		    &ignore3, Numeric) ;
+	    }
+	    else
+	    {
+	        status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+		    &ignore3, Numeric) ;
+	    }
+
+	    if (status < 0)
+	    {
+		if (A_is_complex)
+		{
+		    umfpack_zi_free_numeric (&Numeric) ;
+		}
+		else
+		{
+		    umfpack_di_free_numeric (&Numeric) ;
+		}
+		error ("extracting LU factors failed", A_is_complex, nargout,
+		    pargout, Control, Info, status, do_info) ;
+		return ;
+	    }
+
+	    /* avoid malloc of zero-sized arrays */
+	    lnz = MAX (lnz, 1) ;
+	    unz = MAX (unz, 1) ;
+
+	    /* get temporary space, for the *** ROW *** form of L */
+	    Ltp = (int *) mxMalloc ((n_row+1) * sizeof (int)) ;
+	    Ltj = (int *) mxMalloc (lnz * sizeof (int)) ;
+	    Ltx = (double *) mxMalloc (lnz * sizeof (double)) ;
+	    if (A_is_complex)
+	    {
+	        Ltz = (double *) mxMalloc (lnz * sizeof (double)) ;
+	    }
+	    else
+	    {
+	        Ltz = (double *) NULL ;
+	    }
+
+	    /* create permanent copy of the output matrix U */
+	    pargout [1] = mxCreateSparse (n_inner, n_col, unz, Atype) ;
+	    Up = mxGetJc (pargout [1]) ;
+	    Ui = mxGetIr (pargout [1]) ;
+	    Ux = mxGetPr (pargout [1]) ;
+	    Uz = mxGetPi (pargout [1]) ;
+
+	    /* temporary space for the integer permutation vectors */
+	    P = (int *) mxMalloc (n_row * sizeof (int)) ;
+	    Q = (int *) mxMalloc (n_col * sizeof (int)) ;
+
+	    /* get scale factors, if requested */
+	    status2 = UMFPACK_OK ;
+	    if (!no_scale)
+	    {
+		/* create a diagonal sparse matrix for the scale factors */
+		pargout [4] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ;
+		Rp = mxGetJc (pargout [4]) ;
+		Ri = mxGetIr (pargout [4]) ;
+		for (i = 0 ; i < n_row ; i++)
+		{
+		    Rp [i] = i ;
+		    Ri [i] = i ;
+		}
+		Rp [n_row] = n_row ;
+		Rs = mxGetPr (pargout [4]) ;
+	    }
+	    else
+	    {
+		Rs = (double *) NULL ;
+	    }
+
+	    /* get Lt, U, P, Q, and Rs from the numeric object */
+	    if (A_is_complex)
+	    {
+		status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, Ltz, Up, Ui, Ux,
+		    Uz, P, Q, (double *) NULL, (double *) NULL,
+		    &do_recip, Rs, Numeric) ;
+		umfpack_zi_free_numeric (&Numeric) ;
+	    }
+	    else
+	    {
+		status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui,
+		    Ux, P, Q, (double *) NULL,
+		    &do_recip, Rs, Numeric) ;
+		umfpack_di_free_numeric (&Numeric) ;
+	    }
+
+	    /* for the mexFunction, -DNRECIPROCAL must be set,
+	     * so do_recip must be FALSE */
+
+	    if (status < 0 || status2 < 0 || do_recip)
+	    {
+		mxFree (Ltp) ;
+		mxFree (Ltj) ;
+		mxFree (Ltx) ;
+		if (Ltz) mxFree (Ltz) ;
+		mxFree (P) ;
+		mxFree (Q) ;
+		mxDestroyArray (pargout [1]) ;
+		error ("extracting LU factors failed", A_is_complex, nargout,
+		    pargout, Control, Info, status, do_info) ;
+		return ;
+	    }
+
+	    /* create sparse permutation matrix for P */
+	    pargout [2] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ;
+	    Pp = mxGetJc (pargout [2]) ;
+	    Pi = mxGetIr (pargout [2]) ;
+	    Px = mxGetPr (pargout [2]) ;
+	    for (k = 0 ; k < n_row ; k++)
+	    {
+		Pp [k] = k ;
+		Px [k] = 1 ;
+		Pi [P [k]] = k ;
+	    }
+	    Pp [n_row] = n_row ;
+
+	    /* create sparse permutation matrix for Q */
+	    pargout [3] = mxCreateSparse (n_col, n_col, n_col, mxREAL) ;
+	    Qp = mxGetJc (pargout [3]) ;
+	    Qi = mxGetIr (pargout [3]) ;
+	    Qx = mxGetPr (pargout [3]) ;
+	    for (k = 0 ; k < n_col ; k++)
+	    {
+		Qp [k] = k ;
+		Qx [k] = 1 ;
+		Qi [k] = Q [k] ;
+	    }
+	    Qp [n_col] = n_col ;
+
+	    /* permanent copy of L */
+	    pargout [0] = mxCreateSparse (n_row, n_inner, lnz, Atype) ;
+	    Lp = mxGetJc (pargout [0]) ;
+	    Li = mxGetIr (pargout [0]) ;
+	    Lx = mxGetPr (pargout [0]) ;
+	    Lz = mxGetPi (pargout [0]) ;
+
+	    /* convert L from row form to column form */
+	    if (A_is_complex)
+	    {
+		/* non-conjugate array transpose */
+	        status = umfpack_zi_transpose (n_inner, n_row, Ltp, Ltj, Ltx,
+		    Ltz, (int *) NULL, (int *) NULL, Lp, Li, Lx, Lz, FALSE) ;
+	    }
+	    else
+	    {
+	        status = umfpack_di_transpose (n_inner, n_row, Ltp, Ltj, Ltx,
+		    (int *) NULL, (int *) NULL, Lp, Li, Lx) ;
+	    }
+
+	    mxFree (Ltp) ;
+	    mxFree (Ltj) ;
+	    mxFree (Ltx) ;
+	    if (Ltz) mxFree (Ltz) ;
+
+	    if (status < 0)
+	    {
+		mxFree (P) ;
+		mxFree (Q) ;
+		mxDestroyArray (pargout [0]) ;
+		mxDestroyArray (pargout [1]) ;
+		mxDestroyArray (pargout [2]) ;
+		mxDestroyArray (pargout [3]) ;
+		error ("constructing L failed", A_is_complex, nargout, pargout,
+		    Control, Info, status, do_info) ;
+		return ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* print L, U, P, and Q */
+	    /* -------------------------------------------------------------- */
+
+	    if (A_is_complex)
+	    {
+		if (print_level >= 3) mexPrintf ("\nL: ") ;
+	        (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li,
+		    Lx, Lz, 1, Control) ;
+		if (print_level >= 3) mexPrintf ("\nU: ") ;
+	        (void) umfpack_zi_report_matrix (n_inner, n_col,  Up, Ui,
+		    Ux, Uz, 1, Control) ;
+		if (print_level >= 3) mexPrintf ("\nP: ") ;
+	        (void) umfpack_zi_report_perm (n_row, P, Control) ;
+		if (print_level >= 3) mexPrintf ("\nQ: ") ;
+	        (void) umfpack_zi_report_perm (n_col, Q, Control) ;
+	    }
+	    else
+	    {
+		if (print_level >= 3) mexPrintf ("\nL: ") ;
+	        (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li,
+		    Lx, 1, Control) ;
+		if (print_level >= 3) mexPrintf ("\nU: ") ;
+	        (void) umfpack_di_report_matrix (n_inner, n_col,  Up, Ui,
+		    Ux, 1, Control) ;
+		if (print_level >= 3) mexPrintf ("\nP: ") ;
+	        (void) umfpack_di_report_perm (n_row, P, Control) ;
+		if (print_level >= 3) mexPrintf ("\nQ: ") ;
+	        (void) umfpack_di_report_perm (n_col, Q, Control) ;
+	    }
+
+	    mxFree (P) ;
+	    mxFree (Q) ;
+
+	}
+
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* return the symbolic factorization */
+	/* ------------------------------------------------------------------ */
+
+	Q = (int *) mxMalloc (n_col * sizeof (int)) ;
+	P = (int *) mxMalloc (n_row * sizeof (int)) ;
+	Front_npivcol = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Front_parent = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Front_1strow = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Front_leftmostdesc = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Chain_start = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Chain_maxrows = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+	Chain_maxcols = (int *) mxMalloc ((nn+1) * sizeof (int)) ;
+
+	if (A_is_complex)
+	{
+	    status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3,
+	        &nz, &nfronts, &nchains, P, Q, Front_npivcol,
+	        Front_parent, Front_1strow, Front_leftmostdesc,
+	        Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ;
+	    umfpack_zi_free_symbolic (&Symbolic) ;
+	}
+	else
+	{
+	    status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3,
+	        &nz, &nfronts, &nchains, P, Q, Front_npivcol,
+	        Front_parent, Front_1strow, Front_leftmostdesc,
+	        Chain_start, Chain_maxrows, Chain_maxcols, Symbolic) ;
+	    umfpack_di_free_symbolic (&Symbolic) ;
+	}
+
+	if (status < 0)
+	{
+	    mxFree (P) ;
+	    mxFree (Q) ;
+	    mxFree (Front_npivcol) ;
+	    mxFree (Front_parent) ;
+	    mxFree (Front_1strow) ;
+	    mxFree (Front_leftmostdesc) ;
+	    mxFree (Chain_start) ;
+	    mxFree (Chain_maxrows) ;
+	    mxFree (Chain_maxcols) ;
+	    error ("extracting symbolic factors failed", A_is_complex, nargout,
+		pargout, Control, Info, status, do_info) ;
+	    return ;
+	}
+
+	/* create sparse permutation matrix for P */
+	pargout [0] = mxCreateSparse (n_row, n_row, n_row, mxREAL) ;
+	Pp = mxGetJc (pargout [0]) ;
+	Pi = mxGetIr (pargout [0]) ;
+	Px = mxGetPr (pargout [0]) ;
+	for (k = 0 ; k < n_row ; k++)
+	{
+	    Pp [k] = k ;
+	    Px [k] = 1 ;
+	    Pi [P [k]] = k ;
+	}
+	Pp [n_row] = n_row ;
+
+	/* create sparse permutation matrix for Q */
+	pargout [1] = mxCreateSparse (n_col, n_col, n_col, mxREAL) ;
+	Qp = mxGetJc (pargout [1]) ;
+	Qi = mxGetIr (pargout [1]) ;
+	Qx = mxGetPr (pargout [1]) ;
+	for (k = 0 ; k < n_col ; k++)
+	{
+	    Qp [k] = k ;
+	    Qx [k] = 1 ;
+	    Qi [k] = Q [k] ;
+	}
+	Qp [n_col] = n_col ;
+
+	/* create Fr */
+	pargout [2] = mxCreateDoubleMatrix (nfronts+1, 4, mxREAL) ;
+
+	p1 = mxGetPr (pargout [2]) ;
+	p2 = p1 + nfronts + 1 ;
+	p3 = p2 + nfronts + 1 ;
+	p4 = p3 + nfronts + 1 ;
+	for (i = 0 ; i <= nfronts ; i++)
+	{
+	    /* convert parent, 1strow, and leftmostdesc to 1-based */
+	    p1 [i] = (double) (Front_npivcol [i]) ;
+	    p2 [i] = (double) (Front_parent [i] + 1) ;
+	    p3 [i] = (double) (Front_1strow [i] + 1) ;
+	    p4 [i] = (double) (Front_leftmostdesc [i] + 1) ;
+	}
+
+	/* create Ch */
+	pargout [3] = mxCreateDoubleMatrix (nchains+1, 3, mxREAL) ;
+	p1 = mxGetPr (pargout [3]) ;
+	p2 = p1 + nchains + 1 ;
+	p3 = p2 + nchains + 1 ;
+	for (i = 0 ; i < nchains ; i++)
+	{
+	    p1 [i] = (double) (Chain_start [i] + 1) ;	/* convert to 1-based */
+	    p2 [i] = (double) (Chain_maxrows [i]) ;
+	    p3 [i] = (double) (Chain_maxcols [i]) ;
+	}
+	p1 [nchains] = Chain_start [nchains] + 1 ;
+	p2 [nchains] = 0 ;
+	p3 [nchains] = 0 ;
+
+	mxFree (P) ;
+	mxFree (Q) ;
+	mxFree (Front_npivcol) ;
+	mxFree (Front_parent) ;
+	mxFree (Front_1strow) ;
+	mxFree (Front_leftmostdesc) ;
+	mxFree (Chain_start) ;
+	mxFree (Chain_maxrows) ;
+	mxFree (Chain_maxcols) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* report Info */
+    /* ---------------------------------------------------------------------- */
+
+    if (A_is_complex)
+    {
+	umfpack_zi_report_info (Control, Info) ;
+    }
+    else
+    {
+	umfpack_di_report_info (Control, Info) ;
+    }
+
+    if (do_info > 0)
+    {
+	/* return Info */
+	pargout [do_info] = mxCreateDoubleMatrix (1, UMFPACK_INFO, mxREAL) ;
+	OutInfo = mxGetPr (pargout [do_info]) ;
+	for (i = 0 ; i < UMFPACK_INFO ; i++)
+	{
+	    OutInfo [i] = Info [i] ;
+	}
+    }
+}
Binary file liboctave/UMFPACK/UMFPACK/MATLAB/west0067.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,68 @@
+#-------------------------------------------------------------------------------
+# UMFPACK makefile (for GNU make or original make)
+#-------------------------------------------------------------------------------
+
+# UMFPACK requires the AMD package to be in ../AMD
+
+# compile everything (except hb, fortran, and fortran64), including AMD and the
+# MATLAB mexFunctions
+all:
+	( cd ../AMD ; make )
+	( cd Source ; make )
+	( cd Demo   ; make )
+	( cd MATLAB ; make )
+	- cat Doc/License
+
+# compile just the C-callable libraries and demo programs (not mexFunctions)
+lib:
+	( cd ../AMD ; make lib )
+	( cd Source ; make )
+	( cd Demo   ; make )
+	- cat Doc/License
+
+# compile the FORTRAN interface and demo program
+fortran:
+	( cd Demo   ; make fortran )
+
+# compile the 64-bit FORTRAN interface and demo program
+fortran64:
+	( cd Demo   ; make fortran64 )
+
+# compile the Harwell/Boeing demo program
+hb:
+	( cd Demo   ; make hb )
+
+# compile a Octave version
+# (not compiled by "make all")
+octave:
+	( cd OCTAVE ; make )
+	- cat Doc/License
+
+# remove object files, but keep the compiled programs and library archives
+clean:
+	( cd ../AMD ; make clean )
+	( cd Source ; make clean )
+	( cd Demo   ; make clean )
+	( cd MATLAB ; make clean )
+	( cd OCTAVE ; make clean )
+	( cd Doc    ; make clean )
+
+# clean, and then remove compiled programs and library archives
+purge:
+	( cd ../AMD ; make purge )
+	( cd Source ; make purge )
+	( cd Demo   ; make purge )
+	( cd MATLAB ; make purge )
+	( cd OCTAVE ; make purge )
+	( cd Doc    ; make purge )
+
+# create PDF documents for the original distribution
+doc:
+	( cd ../AMD ; make doc )
+	( cd Doc    ; make )
+
+# get ready for distribution
+dist: purge
+	( cd ../AMD ; make dist )
+	( cd Demo   ; make dist )
+	( cd Doc    ; make )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/Contents.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,21 @@
+%Contents of the UMFPACK sparse matrix toolbox:
+%
+% umfpack           computes x=A\b, x=A/b, or lu (A) for a sparse matrix A
+% umfpack_make      to compile umfpack for use in MATLAB
+% umfpack_report    prints optional control settings and statistics
+% umfpack_demo      a long demo
+% umfpack_simple    a simple demo
+% umfpack_btf       factorize A using a block triangular form
+% umfpack_solve     x = A\b or x = b/A 
+% lu_normest        estimates norm (L*U-A, 1) without forming L*U-A
+% luflop	    given L and U, computes # of flops required to compute them
+%
+% See also:
+% amd		    symmetric minimum degree ordering
+% colamd            unsymmetric column approx minimum degree ordering
+% symamd            symmetric approx minimum degree ordering, based on colamd
+%
+% UMFPACK Version 4.3 (Jan. 16, 2004),  Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  Type umfpack_details for License.
+
+help Contents
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,248 @@
+#-------------------------------------------------------------------------------
+# UMFPACK GNUmakefile for the UMFPACK OCTAVE oct-file (GNU "make" only)
+#-------------------------------------------------------------------------------
+
+.PRECIOUS: %.o
+
+# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+# Davis.  All Rights Reserved.  See ../README for License.
+
+all: umfpack luflop
+
+include ../Make/Make.include
+
+MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source
+
+OCT_SPARSE_INC = -I../../../
+
+
+#-------------------------------------------------------------------------------
+# source files
+#-------------------------------------------------------------------------------
+
+# 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/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 and user-callable amd_*.[ch] files (int/long versions only):
+AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_post_tree amd_defaults \
+	amd_order amd_control amd_info amd_valid
+
+# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c,
+# umf_triplet.c, and umf_assemble.c , with int/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/long and real/complex versions:
+UMF = $(UMF_CREATED) $(UMFCH)
+
+# user-callable umfpack_*.[ch] files (int/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/long and real/complex versions:
+UMFPACKW = umfpack_wsolve
+
+USER = $(UMFPACKW) $(UMFPACK)
+
+# user-callable, only one version for int/long, real/complex, *.[ch] files:
+GENERIC = umfpack_timer umfpack_tictoc
+
+#-------------------------------------------------------------------------------
+# include files:
+#-------------------------------------------------------------------------------
+
+AMDH = ../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h
+
+INC1 = umf_config.h umf_version.h umf_internal.h umf_triplet.h
+
+INC = ../Include/umfpack.h \
+	$(addprefix ../Source/, $(INC1)) \
+	$(addprefix ../Source/, $(addsuffix .h,$(UMFCH))) \
+	$(addprefix ../Source/, $(addsuffix .h,$(UMFINT))) \
+	$(addprefix ../Include/, $(addsuffix .h,$(USER))) \
+	$(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \
+	$(AMDH)
+
+#-------------------------------------------------------------------------------
+# Create the umfpack and amd oct-file for OCTAVE (int versions only)
+#-------------------------------------------------------------------------------
+
+OCTI   = $(addsuffix .o, $(subst umf_,umf_o_,$(UMFINT)))
+OCTDI  = $(addsuffix .o, $(subst umf_,umf_od_,$(UMF)) $(subst umfpack_,umfpack_od_,$(USER)))
+OCTZI  = $(addsuffix .o, $(subst umf_,umf_oz_,$(UMF)) $(subst umfpack_,umfpack_oz_,$(USER)) )
+OCTAMD = $(addsuffix .o, $(subst amd_,amd_o_,$(AMD)))
+OCTGN  = $(addsuffix .o, $(subst umfpack_,umfpack_o_,$(GENERIC)))
+
+OCTUMFPACK = $(OCTI) $(OCTDI) $(OCTZI) $(OCTGN)
+
+OCTUMFPACK_LIB = umfpack_octave.o
+
+# Note that mkoctfile has an "-o" option, but it doesn't work in conjunction
+# with the "-c" option, thus the need for $(MV) commands.
+# If it did, then the rules would be much simpler:
+#	$(MKOCT) -DDINT -c $< -o $@
+
+#----------------------------------------
+# integer-only routines (no real/complex):
+#----------------------------------------
+
+amd_o_%.o: ../../AMD/Source/amd_%.c $(AMDH)
+	$(MKOCT) -DDINT -c $<
+	- $(MV) ../../AMD/Source/amd_$*.o $@
+
+
+umf_o_%.o: ../Source/umf_%.c $(INC)
+	$(MKOCT) -DDINT -c $<
+	- $(MV) ../Source/umf_$*.o $@
+
+#----------------------------------------
+# Double precision, int version, for OCTAVE
+#----------------------------------------
+
+umf_od_%.o: ../Source/umf_%.c $(INC)
+	$(MKOCT) -DDINT -c $<
+	- $(MV) ../Source/umf_$*.o $@
+
+umf_od_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
+	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c $<
+	- $(MV) ../Source/umf_$*tsolve.o $@
+
+umf_od_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_od_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DDINT -DDO_MAP -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_od_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DDINT -DDO_VALUES -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_od_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DDINT -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_od_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
+	$(MKOCT) -DDINT -DFIXQ -c $<
+	- $(MV) ../Source/umf_assemble.o $@
+
+umf_od_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
+	$(MKOCT) -DDINT -DDROP -c $<
+	- $(MV) ../Source/umf_store_lu.o $@
+
+umfpack_od_wsolve.o: ../Source/umfpack_solve.c $(INC)
+	$(MKOCT) -DDINT -DWSOLVE -c $<
+	- $(MV) ../Source/umfpack_solve.o $@
+
+umfpack_od_%.o: ../Source/umfpack_%.c $(INC)
+	$(MKOCT) -DDINT -c $<
+	- $(MV) ../Source/umfpack_$*.o $@
+
+#----------------------------------------
+# Complex double precision, int version, for OCTAVE
+#----------------------------------------
+
+umf_oz_%.o: ../Source/umf_%.c $(INC)
+	$(MKOCT) -DZINT -c $<
+	- $(MV) ../Source/umf_$*.o $@
+
+umf_oz_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
+	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c $<
+	- $(MV) ../Source/umf_$*tsolve.o $@
+
+umf_oz_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_oz_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DZINT -DDO_MAP -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_oz_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DZINT -DDO_VALUES -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_oz_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
+	$(MKOCT) -DZINT -c $<
+	- $(MV) ../Source/umf_triplet.o $@
+
+umf_oz_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
+	$(MKOCT) -DZINT -DFIXQ -c $<
+	- $(MV) ../Source/umf_assemble.o $@
+
+umf_oz_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
+	$(MKOCT) -DZINT -DDROP -c $<
+	- $(MV) ../Source/umf_store_lu.o $@
+
+umfpack_oz_wsolve.o: ../Source/umfpack_solve.c $(INC)
+	$(MKOCT) -DZINT -DWSOLVE -c $<
+	- $(MV) ../Source/umfpack_solve.o $@
+
+umfpack_oz_%.o: ../Source/umfpack_%.c $(INC)
+	$(MKOCT) -DZINT -c $<
+	- $(MV) ../Source/umfpack_$*.o $@
+
+#----------------------------------------
+# Generic routines for OCTAVE
+#----------------------------------------
+
+umfpack_o_timer.o: ../Source/umfpack_timer.c $(INC)
+	$(MKOCT) -c $<
+	- $(MV) ../Source/umfpack_timer.o $@
+
+umfpack_o_tictoc.o: ../Source/umfpack_tictoc.c $(INC)
+	$(MKOCT) -c $<
+	- $(MV) ../Source/umfpack_tictoc.o $@
+
+#----------------------------------------
+# umfpack oct-files
+#----------------------------------------
+
+umfpack: umfpack.cc $(OCTUMFPACK) $(OCTAMD)
+	$(MKOCT) $(OCT_SPARSE_INC) umfpack.cc $(OCTUMFPACK) $(OCTAMD)  -o umfpack.oct 
+
+luflop: luflop.cc
+	$(MKOCT) $(OCT_SPARSE_INC) luflop.cc -o luflop.oct
+
+#----------------------------------------
+# umfpack library to link with octave
+#----------------------------------------
+
+octave: $(OCTUMFPACK) $(OCTAMD)
+	ld -r $(OCTUMFPACK) $(OCTAMD) -o ../../../$(OCTUMFPACK_LIB)
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) *.oct *.so
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,517 @@
+#-------------------------------------------------------------------------------
+# UMFPACK Makefile for the UMFPACK MATLAB mexFunction (old "make" only)
+#-------------------------------------------------------------------------------
+
+# UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+# Davis.  All Rights Reserved.  See ../README for License.
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: umfpack luflop
+
+include ../Make/Make.include
+
+MKOCT = mkoctfile $(CONFIG) -DNRECIPROCAL -I/usr/include/atlas -I../Include -I../Source -I../../AMD/Include -I../../AMD/Source 
+
+OCT_SPARSE_INC = -I../../../
+OCTUMFPACK_LIB = umfpack_octave.o
+
+umfpack:
+	$(MKOCT) -DDINT -c ../Source/umf_analyze.c
+	$(MV) -f ../Source/umf_analyze.o umf_m_analyze.o
+	$(MKOCT) -DDINT -c ../Source/umf_apply_order.c
+	$(MV) -f ../Source/umf_apply_order.o umf_m_apply_order.o
+	$(MKOCT) -DDINT -c ../Source/umf_colamd.c
+	$(MV) -f ../Source/umf_colamd.o umf_m_colamd.o
+	$(MKOCT) -DDINT -c ../Source/umf_free.c
+	$(MV) -f ../Source/umf_free.o umf_m_free.o
+	$(MKOCT) -DDINT -c ../Source/umf_fsize.c
+	$(MV) -f ../Source/umf_fsize.o umf_m_fsize.o
+	$(MKOCT) -DDINT -c ../Source/umf_is_permutation.c
+	$(MV) -f ../Source/umf_is_permutation.o umf_m_is_permutation.o
+	$(MKOCT) -DDINT -c ../Source/umf_malloc.c
+	$(MV) -f ../Source/umf_malloc.o umf_m_malloc.o
+	$(MKOCT) -DDINT -c ../Source/umf_realloc.c
+	$(MV) -f ../Source/umf_realloc.o umf_m_realloc.o
+	$(MKOCT) -DDINT -c ../Source/umf_report_perm.c
+	$(MV) -f ../Source/umf_report_perm.o umf_m_report_perm.o
+	$(MKOCT) -DDINT -c ../Source/umf_singletons.c
+	$(MV) -f ../Source/umf_singletons.o umf_m_singletons.o
+	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
+	$(MV) -f ../Source/umf_ltsolve.o umf_od_lhsolve.o
+	$(MKOCT) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
+	$(MV) -f ../Source/umf_utsolve.o umf_od_uhsolve.o
+	$(MKOCT) -DDINT -DDO_MAP -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_nox.o
+	$(MKOCT) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_x.o
+	$(MKOCT) -DDINT -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_nomap_nox.o
+	$(MKOCT) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_od_triplet_map_x.o
+	$(MKOCT) -DDINT -DFIXQ -c ../Source/umf_assemble.c
+	$(MV) -f ../Source/umf_assemble.o umf_od_assemble_fixq.o
+	$(MKOCT) -DDINT -DDROP -c ../Source/umf_store_lu.c
+	$(MV) -f ../Source/umf_store_lu.o umf_od_store_lu_drop.o
+	$(MKOCT) -DDINT -c ../Source/umf_assemble.c
+	$(MV) -f ../Source/umf_assemble.o umf_od_assemble.o
+	$(MKOCT) -DDINT -c ../Source/umf_blas3_update.c
+	$(MV) -f ../Source/umf_blas3_update.o umf_od_blas3_update.o
+	$(MKOCT) -DDINT -c ../Source/umf_build_tuples.c
+	$(MV) -f ../Source/umf_build_tuples.o umf_od_build_tuples.o
+	$(MKOCT) -DDINT -c ../Source/umf_create_element.c
+	$(MV) -f ../Source/umf_create_element.o umf_od_create_element.o
+	$(MKOCT) -DDINT -c ../Source/umf_dump.c
+	$(MV) -f ../Source/umf_dump.o umf_od_dump.o
+	$(MKOCT) -DDINT -c ../Source/umf_extend_front.c
+	$(MV) -f ../Source/umf_extend_front.o umf_od_extend_front.o
+	$(MKOCT) -DDINT -c ../Source/umf_garbage_collection.c
+	$(MV) -f ../Source/umf_garbage_collection.o umf_od_garbage_collection.o
+	$(MKOCT) -DDINT -c ../Source/umf_get_memory.c
+	$(MV) -f ../Source/umf_get_memory.o umf_od_get_memory.o
+	$(MKOCT) -DDINT -c ../Source/umf_init_front.c
+	$(MV) -f ../Source/umf_init_front.o umf_od_init_front.o
+	$(MKOCT) -DDINT -c ../Source/umf_kernel.c
+	$(MV) -f ../Source/umf_kernel.o umf_od_kernel.o
+	$(MKOCT) -DDINT -c ../Source/umf_kernel_init.c
+	$(MV) -f ../Source/umf_kernel_init.o umf_od_kernel_init.o
+	$(MKOCT) -DDINT -c ../Source/umf_kernel_wrapup.c
+	$(MV) -f ../Source/umf_kernel_wrapup.o umf_od_kernel_wrapup.o
+	$(MKOCT) -DDINT -c ../Source/umf_local_search.c
+	$(MV) -f ../Source/umf_local_search.o umf_od_local_search.o
+	$(MKOCT) -DDINT -c ../Source/umf_lsolve.c
+	$(MV) -f ../Source/umf_lsolve.o umf_od_lsolve.o
+	$(MKOCT) -DDINT -c ../Source/umf_ltsolve.c
+	$(MV) -f ../Source/umf_ltsolve.o umf_od_ltsolve.o
+	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_element.c
+	$(MV) -f ../Source/umf_mem_alloc_element.o umf_od_mem_alloc_element.o
+	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_head_block.c
+	$(MV) -f ../Source/umf_mem_alloc_head_block.o umf_od_mem_alloc_head_block.o
+	$(MKOCT) -DDINT -c ../Source/umf_mem_alloc_tail_block.c
+	$(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_od_mem_alloc_tail_block.o
+	$(MKOCT) -DDINT -c ../Source/umf_mem_free_tail_block.c
+	$(MV) -f ../Source/umf_mem_free_tail_block.o umf_od_mem_free_tail_block.o
+	$(MKOCT) -DDINT -c ../Source/umf_mem_init_memoryspace.c
+	$(MV) -f ../Source/umf_mem_init_memoryspace.o umf_od_mem_init_memoryspace.o
+	$(MKOCT) -DDINT -c ../Source/umf_report_vector.c
+	$(MV) -f ../Source/umf_report_vector.o umf_od_report_vector.o
+	$(MKOCT) -DDINT -c ../Source/umf_row_search.c
+	$(MV) -f ../Source/umf_row_search.o umf_od_row_search.o
+	$(MKOCT) -DDINT -c ../Source/umf_scale_column.c
+	$(MV) -f ../Source/umf_scale_column.o umf_od_scale_column.o
+	$(MKOCT) -DDINT -c ../Source/umf_set_stats.c
+	$(MV) -f ../Source/umf_set_stats.o umf_od_set_stats.o
+	$(MKOCT) -DDINT -c ../Source/umf_solve.c
+	$(MV) -f ../Source/umf_solve.o umf_od_solve.o
+	$(MKOCT) -DDINT -c ../Source/umf_symbolic_usage.c
+	$(MV) -f ../Source/umf_symbolic_usage.o umf_od_symbolic_usage.o
+	$(MKOCT) -DDINT -c ../Source/umf_transpose.c
+	$(MV) -f ../Source/umf_transpose.o umf_od_transpose.o
+	$(MKOCT) -DDINT -c ../Source/umf_tuple_lengths.c
+	$(MV) -f ../Source/umf_tuple_lengths.o umf_od_tuple_lengths.o
+	$(MKOCT) -DDINT -c ../Source/umf_usolve.c
+	$(MV) -f ../Source/umf_usolve.o umf_od_usolve.o
+	$(MKOCT) -DDINT -c ../Source/umf_utsolve.c
+	$(MV) -f ../Source/umf_utsolve.o umf_od_utsolve.o
+	$(MKOCT) -DDINT -c ../Source/umf_valid_numeric.c
+	$(MV) -f ../Source/umf_valid_numeric.o umf_od_valid_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umf_valid_symbolic.c
+	$(MV) -f ../Source/umf_valid_symbolic.o umf_od_valid_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umf_grow_front.c
+	$(MV) -f ../Source/umf_grow_front.o umf_od_grow_front.o
+	$(MKOCT) -DDINT -c ../Source/umf_start_front.c
+	$(MV) -f ../Source/umf_start_front.o umf_od_start_front.o
+	$(MKOCT) -DDINT -c ../Source/umf_2by2.c
+	$(MV) -f ../Source/umf_2by2.o umf_od_2by2.o
+	$(MKOCT) -DDINT -c ../Source/umf_store_lu.c
+	$(MV) -f ../Source/umf_store_lu.o umf_od_store_lu.o
+	$(MKOCT) -DDINT -c ../Source/umf_scale.c
+	$(MV) -f ../Source/umf_scale.o umf_od_scale.o
+	$(MKOCT) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c
+	$(MV) -f ../Source/umfpack_solve.o umfpack_od_wsolve.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_col_to_triplet.c
+	$(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_od_col_to_triplet.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_defaults.c
+	$(MV) -f ../Source/umfpack_defaults.o umfpack_od_defaults.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_free_numeric.c
+	$(MV) -f ../Source/umfpack_free_numeric.o umfpack_od_free_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_free_symbolic.c
+	$(MV) -f ../Source/umfpack_free_symbolic.o umfpack_od_free_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_get_numeric.c
+	$(MV) -f ../Source/umfpack_get_numeric.o umfpack_od_get_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_get_lunz.c
+	$(MV) -f ../Source/umfpack_get_lunz.o umfpack_od_get_lunz.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_get_symbolic.c
+	$(MV) -f ../Source/umfpack_get_symbolic.o umfpack_od_get_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_get_determinant.c
+	$(MV) -f ../Source/umfpack_get_determinant.o umfpack_od_get_determinant.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_numeric.c
+	$(MV) -f ../Source/umfpack_numeric.o umfpack_od_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_qsymbolic.c
+	$(MV) -f ../Source/umfpack_qsymbolic.o umfpack_od_qsymbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_control.c
+	$(MV) -f ../Source/umfpack_report_control.o umfpack_od_report_control.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_info.c
+	$(MV) -f ../Source/umfpack_report_info.o umfpack_od_report_info.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_matrix.c
+	$(MV) -f ../Source/umfpack_report_matrix.o umfpack_od_report_matrix.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_numeric.c
+	$(MV) -f ../Source/umfpack_report_numeric.o umfpack_od_report_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_perm.c
+	$(MV) -f ../Source/umfpack_report_perm.o umfpack_od_report_perm.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_status.c
+	$(MV) -f ../Source/umfpack_report_status.o umfpack_od_report_status.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_symbolic.c
+	$(MV) -f ../Source/umfpack_report_symbolic.o umfpack_od_report_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_triplet.c
+	$(MV) -f ../Source/umfpack_report_triplet.o umfpack_od_report_triplet.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_report_vector.c
+	$(MV) -f ../Source/umfpack_report_vector.o umfpack_od_report_vector.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_solve.c
+	$(MV) -f ../Source/umfpack_solve.o umfpack_od_solve.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_symbolic.c
+	$(MV) -f ../Source/umfpack_symbolic.o umfpack_od_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_transpose.c
+	$(MV) -f ../Source/umfpack_transpose.o umfpack_od_transpose.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_triplet_to_col.c
+	$(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_od_triplet_to_col.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_scale.c
+	$(MV) -f ../Source/umfpack_scale.o umfpack_od_scale.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_load_numeric.c
+	$(MV) -f ../Source/umfpack_load_numeric.o umfpack_od_load_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_save_numeric.c
+	$(MV) -f ../Source/umfpack_save_numeric.o umfpack_od_save_numeric.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_load_symbolic.c
+	$(MV) -f ../Source/umfpack_load_symbolic.o umfpack_od_load_symbolic.o
+	$(MKOCT) -DDINT -c ../Source/umfpack_save_symbolic.c
+	$(MV) -f ../Source/umfpack_save_symbolic.o umfpack_od_save_symbolic.o
+	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c
+	$(MV) -f ../Source/umf_ltsolve.o umf_oz_lhsolve.o
+	$(MKOCT) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c
+	$(MV) -f ../Source/umf_utsolve.o umf_oz_uhsolve.o
+	$(MKOCT) -DZINT -DDO_MAP -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_nox.o
+	$(MKOCT) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_x.o
+	$(MKOCT) -DZINT -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_nomap_nox.o
+	$(MKOCT) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c
+	$(MV) -f ../Source/umf_triplet.o umf_oz_triplet_map_x.o
+	$(MKOCT) -DZINT -DFIXQ -c ../Source/umf_assemble.c
+	$(MV) -f ../Source/umf_assemble.o umf_oz_assemble_fixq.o
+	$(MKOCT) -DZINT -DDROP -c ../Source/umf_store_lu.c
+	$(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu_drop.o
+	$(MKOCT) -DZINT -c ../Source/umf_assemble.c
+	$(MV) -f ../Source/umf_assemble.o umf_oz_assemble.o
+	$(MKOCT) -DZINT -c ../Source/umf_blas3_update.c
+	$(MV) -f ../Source/umf_blas3_update.o umf_oz_blas3_update.o
+	$(MKOCT) -DZINT -c ../Source/umf_build_tuples.c
+	$(MV) -f ../Source/umf_build_tuples.o umf_oz_build_tuples.o
+	$(MKOCT) -DZINT -c ../Source/umf_create_element.c
+	$(MV) -f ../Source/umf_create_element.o umf_oz_create_element.o
+	$(MKOCT) -DZINT -c ../Source/umf_dump.c
+	$(MV) -f ../Source/umf_dump.o umf_oz_dump.o
+	$(MKOCT) -DZINT -c ../Source/umf_extend_front.c
+	$(MV) -f ../Source/umf_extend_front.o umf_oz_extend_front.o
+	$(MKOCT) -DZINT -c ../Source/umf_garbage_collection.c
+	$(MV) -f ../Source/umf_garbage_collection.o umf_oz_garbage_collection.o
+	$(MKOCT) -DZINT -c ../Source/umf_get_memory.c
+	$(MV) -f ../Source/umf_get_memory.o umf_oz_get_memory.o
+	$(MKOCT) -DZINT -c ../Source/umf_init_front.c
+	$(MV) -f ../Source/umf_init_front.o umf_oz_init_front.o
+	$(MKOCT) -DZINT -c ../Source/umf_kernel.c
+	$(MV) -f ../Source/umf_kernel.o umf_oz_kernel.o
+	$(MKOCT) -DZINT -c ../Source/umf_kernel_init.c
+	$(MV) -f ../Source/umf_kernel_init.o umf_oz_kernel_init.o
+	$(MKOCT) -DZINT -c ../Source/umf_kernel_wrapup.c
+	$(MV) -f ../Source/umf_kernel_wrapup.o umf_oz_kernel_wrapup.o
+	$(MKOCT) -DZINT -c ../Source/umf_local_search.c
+	$(MV) -f ../Source/umf_local_search.o umf_oz_local_search.o
+	$(MKOCT) -DZINT -c ../Source/umf_lsolve.c
+	$(MV) -f ../Source/umf_lsolve.o umf_oz_lsolve.o
+	$(MKOCT) -DZINT -c ../Source/umf_ltsolve.c
+	$(MV) -f ../Source/umf_ltsolve.o umf_oz_ltsolve.o
+	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_element.c
+	$(MV) -f ../Source/umf_mem_alloc_element.o umf_oz_mem_alloc_element.o
+	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_head_block.c
+	$(MV) -f ../Source/umf_mem_alloc_head_block.o umf_oz_mem_alloc_head_block.o
+	$(MKOCT) -DZINT -c ../Source/umf_mem_alloc_tail_block.c
+	$(MV) -f ../Source/umf_mem_alloc_tail_block.o umf_oz_mem_alloc_tail_block.o
+	$(MKOCT) -DZINT -c ../Source/umf_mem_free_tail_block.c
+	$(MV) -f ../Source/umf_mem_free_tail_block.o umf_oz_mem_free_tail_block.o
+	$(MKOCT) -DZINT -c ../Source/umf_mem_init_memoryspace.c
+	$(MV) -f ../Source/umf_mem_init_memoryspace.o umf_oz_mem_init_memoryspace.o
+	$(MKOCT) -DZINT -c ../Source/umf_report_vector.c
+	$(MV) -f ../Source/umf_report_vector.o umf_oz_report_vector.o
+	$(MKOCT) -DZINT -c ../Source/umf_row_search.c
+	$(MV) -f ../Source/umf_row_search.o umf_oz_row_search.o
+	$(MKOCT) -DZINT -c ../Source/umf_scale_column.c
+	$(MV) -f ../Source/umf_scale_column.o umf_oz_scale_column.o
+	$(MKOCT) -DZINT -c ../Source/umf_set_stats.c
+	$(MV) -f ../Source/umf_set_stats.o umf_oz_set_stats.o
+	$(MKOCT) -DZINT -c ../Source/umf_solve.c
+	$(MV) -f ../Source/umf_solve.o umf_oz_solve.o
+	$(MKOCT) -DZINT -c ../Source/umf_symbolic_usage.c
+	$(MV) -f ../Source/umf_symbolic_usage.o umf_oz_symbolic_usage.o
+	$(MKOCT) -DZINT -c ../Source/umf_transpose.c
+	$(MV) -f ../Source/umf_transpose.o umf_oz_transpose.o
+	$(MKOCT) -DZINT -c ../Source/umf_tuple_lengths.c
+	$(MV) -f ../Source/umf_tuple_lengths.o umf_oz_tuple_lengths.o
+	$(MKOCT) -DZINT -c ../Source/umf_usolve.c
+	$(MV) -f ../Source/umf_usolve.o umf_oz_usolve.o
+	$(MKOCT) -DZINT -c ../Source/umf_utsolve.c
+	$(MV) -f ../Source/umf_utsolve.o umf_oz_utsolve.o
+	$(MKOCT) -DZINT -c ../Source/umf_valid_numeric.c
+	$(MV) -f ../Source/umf_valid_numeric.o umf_oz_valid_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umf_valid_symbolic.c
+	$(MV) -f ../Source/umf_valid_symbolic.o umf_oz_valid_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umf_grow_front.c
+	$(MV) -f ../Source/umf_grow_front.o umf_oz_grow_front.o
+	$(MKOCT) -DZINT -c ../Source/umf_start_front.c
+	$(MV) -f ../Source/umf_start_front.o umf_oz_start_front.o
+	$(MKOCT) -DZINT -c ../Source/umf_2by2.c
+	$(MV) -f ../Source/umf_2by2.o umf_oz_2by2.o
+	$(MKOCT) -DZINT -c ../Source/umf_store_lu.c
+	$(MV) -f ../Source/umf_store_lu.o umf_oz_store_lu.o
+	$(MKOCT) -DZINT -c ../Source/umf_scale.c
+	$(MV) -f ../Source/umf_scale.o umf_oz_scale.o
+	$(MKOCT) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c
+	$(MV) -f ../Source/umfpack_solve.o umfpack_oz_wsolve.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_col_to_triplet.c
+	$(MV) -f ../Source/umfpack_col_to_triplet.o umfpack_oz_col_to_triplet.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_defaults.c
+	$(MV) -f ../Source/umfpack_defaults.o umfpack_oz_defaults.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_free_numeric.c
+	$(MV) -f ../Source/umfpack_free_numeric.o umfpack_oz_free_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_free_symbolic.c
+	$(MV) -f ../Source/umfpack_free_symbolic.o umfpack_oz_free_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_get_numeric.c
+	$(MV) -f ../Source/umfpack_get_numeric.o umfpack_oz_get_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_get_lunz.c
+	$(MV) -f ../Source/umfpack_get_lunz.o umfpack_oz_get_lunz.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_get_symbolic.c
+	$(MV) -f ../Source/umfpack_get_symbolic.o umfpack_oz_get_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_get_determinant.c
+	$(MV) -f ../Source/umfpack_get_determinant.o umfpack_oz_get_determinant.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_numeric.c
+	$(MV) -f ../Source/umfpack_numeric.o umfpack_oz_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_qsymbolic.c
+	$(MV) -f ../Source/umfpack_qsymbolic.o umfpack_oz_qsymbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_control.c
+	$(MV) -f ../Source/umfpack_report_control.o umfpack_oz_report_control.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_info.c
+	$(MV) -f ../Source/umfpack_report_info.o umfpack_oz_report_info.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_matrix.c
+	$(MV) -f ../Source/umfpack_report_matrix.o umfpack_oz_report_matrix.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_numeric.c
+	$(MV) -f ../Source/umfpack_report_numeric.o umfpack_oz_report_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_perm.c
+	$(MV) -f ../Source/umfpack_report_perm.o umfpack_oz_report_perm.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_status.c
+	$(MV) -f ../Source/umfpack_report_status.o umfpack_oz_report_status.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_symbolic.c
+	$(MV) -f ../Source/umfpack_report_symbolic.o umfpack_oz_report_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_triplet.c
+	$(MV) -f ../Source/umfpack_report_triplet.o umfpack_oz_report_triplet.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_report_vector.c
+	$(MV) -f ../Source/umfpack_report_vector.o umfpack_oz_report_vector.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_solve.c
+	$(MV) -f ../Source/umfpack_solve.o umfpack_oz_solve.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_symbolic.c
+	$(MV) -f ../Source/umfpack_symbolic.o umfpack_oz_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_transpose.c
+	$(MV) -f ../Source/umfpack_transpose.o umfpack_oz_transpose.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_triplet_to_col.c
+	$(MV) -f ../Source/umfpack_triplet_to_col.o umfpack_oz_triplet_to_col.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_scale.c
+	$(MV) -f ../Source/umfpack_scale.o umfpack_oz_scale.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_load_numeric.c
+	$(MV) -f ../Source/umfpack_load_numeric.o umfpack_oz_load_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_save_numeric.c
+	$(MV) -f ../Source/umfpack_save_numeric.o umfpack_oz_save_numeric.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_load_symbolic.c
+	$(MV) -f ../Source/umfpack_load_symbolic.o umfpack_oz_load_symbolic.o
+	$(MKOCT) -DZINT -c ../Source/umfpack_save_symbolic.c
+	$(MV) -f ../Source/umfpack_save_symbolic.o umfpack_oz_save_symbolic.o
+	$(MKOCT) -c ../Source/umfpack_timer.c
+	$(MV) -f ../Source/umfpack_timer.o umfpack_m_timer.o
+	$(MKOCT) -c ../Source/umfpack_tictoc.c
+	$(MV) -f ../Source/umfpack_tictoc.o umfpack_m_tictoc.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_aat.c
+	$(MV) -f ../../AMD/Source/amd_aat.o amd_m_aat.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_1.c
+	$(MV) -f ../../AMD/Source/amd_1.o amd_m_1.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_2.c
+	$(MV) -f ../../AMD/Source/amd_2.o amd_m_2.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_dump.c
+	$(MV) -f ../../AMD/Source/amd_dump.o amd_m_dump.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_postorder.c
+	$(MV) -f ../../AMD/Source/amd_postorder.o amd_m_postorder.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_post_tree.c
+	$(MV) -f ../../AMD/Source/amd_post_tree.o amd_m_post_tree.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_defaults.c
+	$(MV) -f ../../AMD/Source/amd_defaults.o amd_m_defaults.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_order.c
+	$(MV) -f ../../AMD/Source/amd_order.o amd_m_order.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_control.c
+	$(MV) -f ../../AMD/Source/amd_control.o amd_m_control.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_info.c
+	$(MV) -f ../../AMD/Source/amd_info.o amd_m_info.o
+	$(MKOCT) -DDINT -c ../../AMD/Source/amd_valid.c
+	$(MV) -f ../../AMD/Source/amd_valid.o amd_m_valid.o
+	$(MKOCT) -o umfpack.oct $(OCT_SPARSE_INC) umfpack.cc \
+	    umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \
+	    umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \
+	    umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \
+	    umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \
+	    umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \
+	    umf_od_triplet_map_x.o umf_od_assemble_fixq.o \
+	    umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \
+	    umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \
+	    umf_od_extend_front.o umf_od_garbage_collection.o \
+	    umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \
+	    umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \
+	    umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \
+	    umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \
+	    umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \
+	    umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \
+	    umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \
+	    umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \
+	    umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \
+	    umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \
+	    umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \
+	    umfpack_od_col_to_triplet.o umfpack_od_defaults.o \
+	    umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \
+	    umfpack_od_get_numeric.o umfpack_od_get_lunz.o \
+	    umfpack_od_get_symbolic.o umfpack_od_numeric.o \
+	    umfpack_od_qsymbolic.o umfpack_od_report_control.o \
+	    umfpack_od_report_info.o umfpack_od_report_matrix.o \
+	    umfpack_od_report_numeric.o umfpack_od_report_perm.o \
+	    umfpack_od_report_status.o umfpack_od_report_symbolic.o \
+	    umfpack_od_report_triplet.o umfpack_od_report_vector.o \
+	    umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \
+	    umfpack_od_triplet_to_col.o umfpack_od_scale.o \
+	    umfpack_od_load_numeric.o umfpack_od_save_numeric.o \
+	    umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \
+	    umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \
+	    umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \
+	    umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \
+	    umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \
+	    umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \
+	    umf_oz_extend_front.o umf_oz_garbage_collection.o \
+	    umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \
+	    umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \
+	    umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \
+	    umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \
+	    umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \
+	    umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \
+	    umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \
+	    umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \
+	    umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \
+	    umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \
+	    umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \
+	    umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \
+	    umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \
+	    umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \
+	    umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \
+	    umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \
+	    umfpack_oz_report_info.o umfpack_oz_report_matrix.o \
+	    umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \
+	    umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \
+	    umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \
+	    umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \
+	    umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \
+	    umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \
+	    umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \
+	    umfpack_o_timer.o umfpack_o_tictoc.o \
+	    amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \
+	    amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \
+	    amd_o_control.o amd_o_info.o amd_o_valid.o
+
+luflop: luflop.cc
+	$(MKOCT) luflop.cc -I$(OCT_SPARSE_INC) -o luflop.oct
+
+#----------------------------------------
+# umfpack library to link with octave
+#----------------------------------------
+
+octave: umfpack
+	ld -r -o ../../../$(OCTUMFPACK_LIB) \
+	    umf_o_analyze.o umf_o_apply_order.o umf_o_colamd.o umf_o_free.o \
+	    umf_o_fsize.o umf_o_is_permutation.o umf_o_malloc.o \
+	    umf_o_realloc.o umf_o_report_perm.o umf_o_singletons.o \
+	    umf_od_lhsolve.o umf_od_uhsolve.o umf_od_triplet_map_nox.o \
+	    umf_od_triplet_nomap_x.o umf_od_triplet_nomap_nox.o \
+	    umf_od_triplet_map_x.o umf_od_assemble_fixq.o \
+	    umf_od_store_lu_drop.o umf_od_assemble.o umf_od_blas3_update.o \
+	    umf_od_build_tuples.o umf_od_create_element.o umf_od_dump.o \
+	    umf_od_extend_front.o umf_od_garbage_collection.o \
+	    umf_od_get_memory.o umf_od_init_front.o umf_od_kernel.o \
+	    umf_od_kernel_init.o umf_od_kernel_wrapup.o umf_od_local_search.o \
+	    umf_od_lsolve.o umf_od_ltsolve.o umf_od_mem_alloc_element.o \
+	    umf_od_mem_alloc_head_block.o umf_od_mem_alloc_tail_block.o \
+	    umf_od_mem_free_tail_block.o umf_od_mem_init_memoryspace.o \
+	    umf_od_report_vector.o umf_od_row_search.o umf_od_scale_column.o \
+	    umf_od_set_stats.o umf_od_solve.o umf_od_symbolic_usage.o \
+	    umf_od_transpose.o umf_od_tuple_lengths.o umf_od_usolve.o \
+	    umf_od_utsolve.o umf_od_valid_numeric.o umf_od_valid_symbolic.o \
+	    umf_od_grow_front.o umf_od_start_front.o umf_od_2by2.o \
+	    umf_od_store_lu.o umf_od_scale.o umfpack_od_wsolve.o \
+	    umfpack_od_col_to_triplet.o umfpack_od_defaults.o \
+	    umfpack_od_free_numeric.o umfpack_od_free_symbolic.o \
+	    umfpack_od_get_numeric.o umfpack_od_get_lunz.o \
+	    umfpack_od_get_symbolic.o umfpack_od_numeric.o \
+	    umfpack_od_qsymbolic.o umfpack_od_report_control.o \
+	    umfpack_od_report_info.o umfpack_od_report_matrix.o \
+	    umfpack_od_report_numeric.o umfpack_od_report_perm.o \
+	    umfpack_od_report_status.o umfpack_od_report_symbolic.o \
+	    umfpack_od_report_triplet.o umfpack_od_report_vector.o \
+	    umfpack_od_solve.o umfpack_od_symbolic.o umfpack_od_transpose.o \
+	    umfpack_od_triplet_to_col.o umfpack_od_scale.o \
+	    umfpack_od_load_numeric.o umfpack_od_save_numeric.o \
+	    umfpack_od_load_symbolic.o umfpack_od_save_symbolic.o \
+	    umf_oz_lhsolve.o umf_oz_uhsolve.o umf_oz_triplet_map_nox.o \
+	    umf_oz_triplet_nomap_x.o umf_oz_triplet_nomap_nox.o \
+	    umf_oz_triplet_map_x.o umf_oz_assemble_fixq.o \
+	    umf_oz_store_lu_drop.o umf_oz_assemble.o umf_oz_blas3_update.o \
+	    umf_oz_build_tuples.o umf_oz_create_element.o umf_oz_dump.o \
+	    umf_oz_extend_front.o umf_oz_garbage_collection.o \
+	    umf_oz_get_memory.o umf_oz_init_front.o umf_oz_kernel.o \
+	    umf_oz_kernel_init.o umf_oz_kernel_wrapup.o umf_oz_local_search.o \
+	    umf_oz_lsolve.o umf_oz_ltsolve.o umf_oz_mem_alloc_element.o \
+	    umf_oz_mem_alloc_head_block.o umf_oz_mem_alloc_tail_block.o \
+	    umf_oz_mem_free_tail_block.o umf_oz_mem_init_memoryspace.o \
+	    umf_oz_report_vector.o umf_oz_row_search.o umf_oz_scale_column.o \
+	    umf_oz_set_stats.o umf_oz_solve.o umf_oz_symbolic_usage.o \
+	    umf_oz_transpose.o umf_oz_tuple_lengths.o umf_oz_usolve.o \
+	    umf_oz_utsolve.o umf_oz_valid_numeric.o umf_oz_valid_symbolic.o \
+	    umf_oz_grow_front.o umf_oz_start_front.o umf_oz_2by2.o \
+	    umf_oz_store_lu.o umf_oz_scale.o umfpack_oz_wsolve.o \
+	    umfpack_oz_col_to_triplet.o umfpack_oz_defaults.o \
+	    umfpack_oz_free_numeric.o umfpack_oz_free_symbolic.o \
+	    umfpack_oz_get_numeric.o umfpack_oz_get_lunz.o \
+	    umfpack_oz_get_symbolic.o umfpack_oz_numeric.o \
+	    umfpack_oz_qsymbolic.o umfpack_oz_report_control.o \
+	    umfpack_oz_report_info.o umfpack_oz_report_matrix.o \
+	    umfpack_oz_report_numeric.o umfpack_oz_report_perm.o \
+	    umfpack_oz_report_status.o umfpack_oz_report_symbolic.o \
+	    umfpack_oz_report_triplet.o umfpack_oz_report_vector.o \
+	    umfpack_oz_solve.o umfpack_oz_symbolic.o umfpack_oz_transpose.o \
+	    umfpack_oz_triplet_to_col.o umfpack_oz_scale.o \
+	    umfpack_oz_load_numeric.o umfpack_oz_save_numeric.o \
+	    umfpack_oz_load_symbolic.o umfpack_oz_save_symbolic.o \
+	    umfpack_o_timer.o umfpack_o_tictoc.o \
+	    amd_o_aat.o amd_o_1.o amd_o_2.o amd_o_dump.o \
+	    amd_o_postorder.o amd_o_post_tree.o amd_o_defaults.o amd_o_order.o \
+	    amd_o_control.o amd_o_info.o amd_o_valid.o
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) *.oct* *.dll
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/lu_normest.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,106 @@
+function rho = lu_normest (A, L, U)
+% LU_NORMEST:  estimate the 1-norm of A-L*U without computing L*U
+%
+% Usage:
+%
+%       rho = lu_normest (A, L, U)
+%
+% which estimates the computation of the 1-norm:
+%
+%       rho = norm (A-L*U, 1) 
+%
+% Authors:  William W. Hager, Math Dept., Univ. of Florida
+%       Timothy A. Davis, CISE Dept., Univ. of Florida
+%       Gainesville, FL, 32611, USA.
+%       based on normest1, contributed on November, 1997
+%
+% This code can be quite easily adapted to estimate the 1-norm of any 
+% matrix E, where E itself is dense or not explicitly represented, but the
+% computation of E (and E') times a vector is easy.  In this case, our matrix
+% of interest is:
+%
+%       E = A-L*U
+%
+% That is, L*U is the LU factorization of A, where A, L and U
+% are sparse.  This code works for dense matrices A and L too,
+% but it would not be needed in that case, since E is easy to compute
+% explicitly.  For sparse A, L, and U, computing E explicitly would be quite
+% expensive, and thus normest (A-L*U) would be prohibitive.
+%
+% For a detailed description, see Davis, T. A. and Hager, W. W.,
+% Modifying a sparse Cholesky factorization, SIAM J. Matrix Analysis and
+% Applications, 1999, vol. 20, no. 3, 606-627.
+
+% The three places that the matrix-vector multiply E*x is used are highlighted.
+% Note that E is never formed explicity.
+
+[m n] = size (A) ;
+
+if (m ~= n)
+    % pad A, L, and U with zeros so that they are all square
+    if (m < n)
+        U = [ U ; (sparse (n-m,n)) ] ;
+        L = [ L , (sparse (m,n-m)) ; (sparse (n-m,n)) ] ;
+        A = [ A ; (sparse (n-m,n)) ] ;
+    else
+        U = [ U , (sparse (n,m-n)) ; (sparse (m-n,m)) ] ;
+        L = [ L , (sparse (m,m-n)) ] ;
+        A = [ A , (sparse (m,m-n)) ] ;
+    end
+end
+
+[m n] = size (A) ;
+
+notvisited = ones (m, 1) ;  % nonvisited(j) is zero if j is visited, 1 otherwise
+rho = 0 ;    % the global rho
+
+At = A' ;
+Lt = L' ;
+
+for trial = 1:3 % {
+
+   x = notvisited ./ sum (notvisited) ;
+   rho1 = 0 ;    % the current rho for this trial
+
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   Ex1 = (A*x) - L*(U*x) ;
+   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+   rho2 = norm (Ex1, 1) ;
+
+   while rho2 > rho1 % {
+
+        rho1 = rho2 ;
+        y = 2*(Ex1 >= 0) - 1 ;
+
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%% COMPUTE z = E'*y EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        z = (A'*y) - U'*(L'*y) ;
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+        [zj, j] = max (abs (z .* notvisited)) ;
+        j = j (1) ;
+        if (abs (z (j)) > z'*x) % {
+            x = zeros (m, 1) ;
+            x (j) = 1 ;
+            notvisited (j) = 0 ;
+        else % } {
+            break ;
+        end % }
+
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%% COMPUTE Ex1 = E*x EFFICIENTLY: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        Ex1 = (A*x) - L*(U*x) ;
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+        rho2 = norm (Ex1, 1) ;
+
+    end % }
+
+    rho = max (rho, rho1) ;
+
+end % }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/luflop.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,223 @@
+/*
+
+Copyright (C) 2004 David Bateman
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/*
+
+This is the Octave interface to the UMFPACK code, which bore the following
+copyright
+
+  UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+  Davis.  All Rights Reserved.  See ../README for License.
+  email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+  web: http://www.cise.ufl.edu/research/sparse/umfpack
+
+*/
+
+
+#include <cstdlib>
+#include <string>
+
+#include <octave/config.h>
+#include <octave/ov.h>
+#include <octave/defun-dld.h>
+#include <octave/pager.h>
+#include <octave/ov-re-mat.h>
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+DEFUN_DLD (luflop, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{f} =} luflup (@var{l}, @var{u})\n\
+\n\
+Given an LU factorization, compute how many flops took to compute it. This\n\
+is the same as (assuming U has a zero-free diagonal):\n\
+\n\
+@example\n\
+@group\n\
+  Lnz = full (sum (spones (L))) - 1 ;\n\
+  Unz = full (sum (spones (U')))' - 1 ;\n\
+  f = 2*Lnz*Unz + sum (Lnz) ;\n\
+@end group\n\
+@end example\n\
+\n\
+except that no extra workspace is allocated for spones (L) and spones (U).\n\
+L and U must be sparse.\n\
+\n\
+Note: the above expression has a subtle undercount when exact numerical\n\
+cancelation occurs.  Try [L,U,P] = lu (sparse (ones (10))) and then\n\
+luflop (L,U).\n\
+@end deftypefn")
+{
+  int nargin = args.length ();
+  octave_value retval;
+
+  // These are here only so that the C++ destructors don't prematurally
+  // remove the underlying data we are interested in
+  SparseMatrix Lmatrix, Umatrix;
+  SparseComplexMatrix CLmatrix, CUmatrix;
+  int *Lp, *Li, *Up, *Ui;
+  int Lm, Ln, Um, Un;
+
+  if (nargin != 2)
+    {
+      usage ("f = luflop (L, U)");
+      return retval;
+    }
+
+  if (args(0).class_name () == "sparse")
+    {
+      if (args(0).is_complex_type ())
+	{
+	  CLmatrix = 
+	    (((const octave_sparse_complex_matrix&) args(0).get_rep ())
+	     .sparse_complex_matrix_value ());
+	  Lp = CLmatrix.cidx ();
+	  Li = CLmatrix.ridx ();
+	  Lm = CLmatrix.rows ();
+	  Ln = CLmatrix.cols ();
+	}
+      else
+	{
+	  Lmatrix = (((const octave_sparse_matrix&) args(0).get_rep ())
+	     .sparse_matrix_value ());
+	  Lp = Lmatrix.cidx ();
+	  Li = Lmatrix.ridx ();
+	  Lm = Lmatrix.rows ();
+	  Ln = Lmatrix.cols ();
+	}
+    }
+  else
+    {
+      if (args(0).is_complex_type ())
+	{
+	  CLmatrix =  SparseComplexMatrix (args(0).complex_matrix_value ());
+	  Lp = CLmatrix.cidx ();
+	  Li = CLmatrix.ridx ();
+	  Lm = CLmatrix.rows ();
+	  Ln = CLmatrix.cols ();
+	}
+      else
+	{
+	  Lmatrix = SparseMatrix (args(0).matrix_value ());
+	  Lp = Lmatrix.cidx ();
+	  Li = Lmatrix.ridx ();
+	  Lm = Lmatrix.rows ();
+	  Ln = Lmatrix.cols ();
+	}
+    }
+
+
+  if (args(0).class_name () == "sparse")
+    {
+      if (args(1).is_complex_type ())
+	{
+	  CUmatrix = 
+	    (((const octave_sparse_complex_matrix&) args(1).get_rep ())
+	     .sparse_complex_matrix_value ());
+	  Up = CUmatrix.cidx ();
+	  Ui = CUmatrix.ridx ();
+	  Um = CUmatrix.rows ();
+	  Un = CUmatrix.cols ();
+	}
+      else
+	{
+	  Umatrix = 
+	    (((const octave_sparse_matrix&) args(1).get_rep ())
+	     .sparse_matrix_value ());
+	  Up = Umatrix.cidx ();
+	  Ui = Umatrix.ridx ();
+	  Um = Umatrix.rows ();
+	  Un = Umatrix.cols ();
+	}
+    }
+  else
+    {
+      if (args(1).is_complex_type ())
+	{
+	  CUmatrix = SparseComplexMatrix (args(1).complex_matrix_value ());
+	  Up = CUmatrix.cidx ();
+	  Ui = CUmatrix.ridx ();
+	  Um = CUmatrix.rows ();
+	  Un = CUmatrix.cols ();
+	}
+      else
+	{
+	  Umatrix = SparseMatrix (args(1).matrix_value ());
+	  Up = Umatrix.cidx ();
+	  Ui = Umatrix.ridx ();
+	  Um = Umatrix.rows ();
+	  Un = Umatrix.cols ();
+	}
+    }
+
+
+  if (error_state)
+    return retval;
+
+      
+  int n = Lm;
+      
+  if (n != Ln || n != Um || n != Un)
+    error ("luflop: L and U must be square");
+  else
+    {
+	
+      OCTAVE_LOCAL_BUFFER (int, Unz, n);
+
+      // count the nonzeros in each row of U
+      for (int row = 0 ; row < n ; row++)
+	Unz [row] = 0 ;
+
+      for (int col = 0 ; col < n ; col++)
+	{
+	  for (int p = Up [col] ; p < Up [col+1] ; p++)
+	    {
+	      int row = Ui [p] ;
+	      Unz [row]++ ;
+	    }
+	}
+
+      // count the flops
+      double flop_count = 0.0 ;
+      for (int k = 0 ; k < n ; k++)
+	{
+	  /* off-diagonal nonzeros in column k of L: */
+	  int Lnz_k = Lp [k+1] - Lp [k] - 1 ;
+	  int Unz_k = Unz [k] - 1 ;
+	  flop_count += (2 * Lnz_k * Unz_k) + Lnz_k ;
+	}
+
+      // return the result
+      retval = flop_count;
+    }
+
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1399 @@
+/*
+
+Copyright (C) 2004 David Bateman
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+In addition to the terms of the GPL, you are permitted to link
+this program with any Open Source program, as defined by the
+Open Source Initiative (www.opensource.org)
+
+*/
+
+/*
+
+This is the Octave interface to the UMFPACK code, which bore the following
+copyright
+
+  UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+  Davis.  All Rights Reserved.  See ../README for License.
+  email: davis@cise.ufl.edu    CISE Department, Univ. of Florida.
+  web: http://www.cise.ufl.edu/research/sparse/umfpack
+
+*/
+
+#include <cfloat>
+#include <cstdlib>
+#include <string>
+
+#include <octave/config.h>
+#include <octave/ov.h>
+#include <octave/defun-dld.h>
+#include <octave/pager.h>
+#include <octave/ov-re-mat.h>
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// External UMFPACK functions in C
+extern "C" {
+#include "umfpack.h"
+}
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+
+// Return an error message
+static 
+void umfpack_error (const char *s, int A_is_complex, int nargout,
+		    octave_value_list retval, NDArray Control, 
+		    NDArray Info, int status, int do_info)
+{
+  if (A_is_complex)
+    {
+      umfpack_zi_report_status (Control.fortran_vec (), status) ;
+      umfpack_zi_report_info (Control.fortran_vec (), Info.fortran_vec ()) ;
+    }
+  else
+    {
+      umfpack_di_report_status (Control.fortran_vec (), status) ;
+      umfpack_di_report_info (Control.fortran_vec (), Info.fortran_vec ()) ;
+    }
+  if (do_info > 0)
+    // return Info
+    retval (do_info) = octave_value (Info);
+
+  error (s);
+}
+
+DEFUN_DLD (umfpack, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b})\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, '\\', @var{b}, @var{Control})\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', @var{b}, @var{Control})\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, '\\', b)\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', A) ;\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}) ;\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{Info}] =} umfpack (@var{b}, '/', @var{a}, @var{Qinit}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}, @var{Info}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}) ;\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{p}, @var{q}] =} umfpack (@var{a}, @var{Qinit}, @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic') ;\n\
+@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, 'symbolic', @var{Control}) ;\n\
+@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic') ;\n\
+@deftypefnx {Loadable Function} {[P1, Q1, Fr, Ch, Info] =} umfpack (@var{a}, @var{Qinit}, 'symbolic', @var{Control});\n\
+@deftypefnx {Loadable Function} {@var{Control} =} umfpack ;\n\
+\n\
+UMFPACK v4.3 is a Octave oct-file for solving sparse linear systems.\n\
+\n\
+@iftex\n\
+@tex\n\
+\\vskip 2ex\n\
+\\hfil\\vbox{\n\
+\\offinterlineskip\n\
+\\tabskip=0pt\n\
+\\halign{\n\
+\\vrule height1.75ex depth1.25ex width 0.6pt #\\tabskip=1em &\n\
+\\hfil #\\hfil &\\vrule # & \n\
+\\hfil #\\hfil &\\vrule # width 0.6pt \\tabskip=0pt\\cr\n\
+\\noalign{\\hrule height 0.6pt}\n\
+&     UMFPACK v4.3                  && OCTAVE approximate equivalent  &\\cr\n\
+\\noalign{\\hrule} \n\
+& x = umfpack (A, '\\', b) ;        &&  x = A \\ b                    &\\cr\n\
+&                                   &&                                &\\cr\n\
+&x = umfpack (b, '/', A) ;          &&  x = b / A                     &\\cr\n\
+&                                   &&                                &\\cr\n\
+&[L,U,P,Q] = umfpack (A) ;          &&  [m,n] = size (A) ;            &\\cr\n\
+&                                   &&  I = speye (n) ;               &\\cr\n\
+&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
+&                                   &&  [L,U,P] = lu (A*Q) ;          &\\cr\n\
+&                                   &&                                &\\cr\n\
+&[L,U,P,Q,R] = umfpack (A) ;        &&  [m,n] = size (A) ;            &\\cr\n\
+&                                   &&  I = speye (n) ;               &\\cr\n\
+&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
+&                                   &&  r = full (sum (abs (A), 2)) ; &\\cr\n\
+&                                   &&  r (find (r == 0)) = 1 ;       &\\cr\n\
+&                                   &&  R = spdiags (r, 0, m, m) ;    &\\cr\n\
+&                                   &&  [L,U,P] = lu ((R\\A)*Q) ;     &\\cr\n\
+&                                   &&                                &\\cr\n\
+&[P,Q,F,C] = umfpack (A, 'symbolic')&&  [m,n] = size (A) ;            &\\cr\n\
+&                                   &&  I = speye (n) ;               &\\cr\n\
+&                                   &&  Q = I (:, colamd (A)) ;       &\\cr\n\
+&                                   &&  [count,h,parent,post] = ...   &\\cr\n\
+&                                   &&  symbfact (A*Q, 'col') ;       &\\cr\n\
+\\noalign{\\hrule height 0.6pt}\n\
+}}\\hfil\n\
+\\vskip 1ex\n\
+@end tex\n\
+@end iftex\n\
+@ifinfo\n\
+@multitable @columnfractions 0.43 .02 .43\n\
+@item UMFPACK v4.3:                       @tab | \n\
+@tab OCTAVE approx. equivalent\n\
+@item -------------------------------     @tab | \n\
+@tab --------------------------------\n\
+@item x = umfpack (A, '\\', b) ;          @tab | \n\
+@tab x = A \\ b\n\
+@item                                     @tab | \n\
+@tab\n\
+@item x = umfpack (b, '/', A) ;           @tab | \n\
+@tab  x = b / A\n\
+@item                                     @tab | \n\
+@tab\n\
+@item [L,U,P,Q] = umfpack (A) ;           @tab | \n\
+@tab  [m,n] = size (A) ;\n\
+@item                                     @tab | \n\
+@tab  I = speye (n) ;\n\
+@item                                     @tab | \n\
+@tab  Q = I (:, colamd (A)) ;\n\
+@item                                     @tab | \n\
+@tab  [L,U,P] = lu (A*Q) ;\n\
+@item                                     @tab | \n\
+@tab\n\
+@item [L,U,P,Q,R] = umfpack (A) ;         @tab | \n\
+@tab  [m,n] = size (A) ;\n\
+@item                                     @tab | \n\
+@tab  I = speye (n) ;\n\
+@item                                     @tab | \n\
+@tab  Q = I (:, colamd (A)) ;\n\
+@item                                     @tab | \n\
+@tab  r = full (sum (abs (A), 2)) ;\n\
+@item                                     @tab | \n\
+@tab  r (find (r == 0)) = 1 ;\n\
+@item                                     @tab | \n\
+@tab  R = spdiags (r, 0, m, m) ;\n\
+@item                                     @tab | \n\
+@tab  [L,U,P] = lu ((R\\A)*Q) ;\n\
+@item                                     @tab | \n\
+@tab\n\
+@item [P,Q,F,C] = umfpack (A, 'symbolic') @tab | \n\
+@tab  [m,n] = size (A) ; \n\
+@item                                     @tab | \n\
+@tab  I = speye (n) ;\n\
+@item                                     @tab | \n\
+@tab  Q = I (:, colamd (A)) ;\n\
+@item                                     @tab | \n\
+@tab  [count,h,parent,post] = ...\n\
+@item                                     @tab | \n\
+@tab  symbfact (A*Q, 'col') ;\n\
+@end multitable\n\
+@end ifinfo\n\
+\n\
+A must be sparse.  It can be complex, singular, and/or rectangular.\n\
+A must be square for '/' or '\\'.  b must be a full real or complex\n\
+vector.  For @code{[@var{l}, @var{u}, @var{p}, @var{q}, @var{r}] =\n\
+umfpack (@var{a})}, the factorization is @code{@var{l} * @var{u} =\n\
+@var{p} * (@var{r} \\ @var{a}) * @var{q}}. If @var{a} has a mostly\n\
+symmetric nonzero pattern, then replace @dfn{colamd} with @dfn{amd}\n\
+in the OCTAVE-equivalent column in the table above.\n\
+\n\
+Factor or solve a sparse linear system, returning either the solution\n\
+@var{x} to @code{@var{A} * @var{x} = @var{b}} or @code{@var{A}' * @var{x}'\n\
+= @var{b}'}, the factorization LU=PAQ, or LU=P(R\\A)Q.  A must be sparse.\n\
+For the solve, A must be square and b must be a dense n-by-1 vector.  For LU\n\
+factorization, A can be rectangular.  In both cases, A and/or b can be real\n\
+or complex.\n\
+\n\
+UMFPACK analyzes the matrix and selects one of three strategies to factorize\n\
+the matrix. It first finds a set of k initial pivot entries of zero\n\
+Markowitz cost. This forms the first k rows and columns of L and U. The\n\
+remaining submatrix S is then analyzed, based on the symmetry of the nonzero\n\
+pattern of the submatrix and the values on the diagaonal.  The strategies\n\
+include:\n\
+\n\
+@table @asis\n\
+@item unsymmetric\n\
+Use a COLAMD pre-ordering, a column elimination tree\n\
+post-ordering, refine the column ordering during factorization,\n\
+and make no effort at selecting pivots on the diagonal.\n\
+@item 2-by-2\n\
+Like the symmetric strategy (see below), except that local\n\
+row permutations are first made to attempt to place large entries\n\
+on the diagonal.\n\
+@item symmetric\n\
+Use an AMD pre-ordering on the matrix @code{@var{s} + @var{s}'}, an\n\
+elimination tree post-ordering, do not refine the column ordering during\n\
+factorization, and attempt to select pivots on the diagonal.\n\
+@end table\n\
+\n\
+Each of the following uses of umfpack (except for 'Control = umfpack') is\n\
+stand-alone.  That is, no call to umfpack is required for any subsequent\n\
+call. In each usage, the Info output argument is optional.\n\
+\n\
+Usage:\n\
+\n\
+[x, Info] = umfpack (A, '\\', b) ;\n\
+[x, Info] = umfpack (A, '\\', b, Control) ;\n\
+[x, Info] = umfpack (A, Qinit, '\\', b, Control) ;\n\
+[x, Info] = umfpack (A, Qinit, '\\', b) ;\n\
+\n\
+     Solves Ax=b (similar to x = A\\b in OCTAVE).\n\
+\n\
+[x, Info] = umfpack (b, '/', A) ;\n\
+[x, Info] = umfpack (b, '/', A, Control) ;\n\
+[x, Info] = umfpack (b, '/', A, Qinit) ;\n\
+[x, Info] = umfpack (b, '/', A, Qinit, Control) ;\n\
+\n\
+     Solves A'x'=b' (similar to x = b/A in OCTAVE).\n\
+\n\
+[L, U, P, Q, R, Info] = umfpack (A) ;\n\
+[L, U, P, Q, R, Info] = umfpack (A, Control) ;\n\
+[L, U, P, Q, R, Info] = umfpack (A, Qinit) ;\n\
+[L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;\n\
+\n\
+     Returns the LU factorization of A.  P and Q are returned as permutation\n\
+     matrices.  R is a diagonal sparse matrix of scale factors for the rows\n\
+     of A, L is lower triangular, and U is upper triangular.  The\n\
+     factorization is L*U = P*(R\\A)*Q.  You can turn off scaling by setting\n\
+     Control (17) to zero (in which case R = speye (m)), or by using the\n\
+     following syntaxes (in which case Control (17) is ignored):\n\
+\n\
+[L, U, P, Q] = umfpack (A) ;\n\
+[L, U, P, Q] = umfpack (A, Control) ;\n\
+[L, U, P, Q] = umfpack (A, Qinit) ;\n\
+[L, U, P, Q] = umfpack (A, Qinit, Control) ;\n\
+\n\
+     Same as above, except that no row scaling is performed.  The Info array\n\
+     is not returned, either.\n\
+\n\
+[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;\n\
+[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic', Control) ;\n\
+[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic') ;\n\
+[P1, Q1, Fr, Ch, Info] = umfpack (A, Qinit, 'symbolic', Control);\n\
+\n\
+     Performs only the fill-reducing column pre-ordering (including the\n\
+     elimination tree post-ordering) and symbolic factorization.  Q1 is the\n\
+     initial column permutation (either from colamd, amd, or the input\n\
+     ordering Qinit), possibly followed by a column elimination tree post-\n\
+     ordering or a symmetric elimination tree post-ordering, depending on\n\
+     the strategy used.\n\
+\n\
+     For the unsymmetric strategy, P1 is the row ordering induced by Q1\n\
+     (row-merge order). For the 2-by-2 strategy, P1 is the row ordering that\n\
+     places large entries on the diagonal of P1*A*Q1.  For the symmetric\n\
+     strategy, P1 = Q1.\n\
+\n\
+     Fr is a (nfr+1)-by-4 array containing information about each frontal\n\
+     matrix, where nfr <= n is the number of frontal matrices.  Fr (:,1) is\n\
+     the number of pivot columns in each front, and Fr (:,2) is the parent\n\
+     of each front in the supercolumn elimination tree.  Fr (k,2) is zero if\n\
+     k is a root.  The first Fr (1,1) columns of P1*A*Q1 are the pivot\n\
+     columns for the first front, the next Fr (2,1) columns of P1*A*Q1\n\
+     are the pivot columns for the second front, and so on.\n\
+\n\
+     For the unsymmetric strategy, Fr (:,3) is the row index of the first\n\
+     row in P1*A*Q1 whose leftmost nonzero entry is in a pivot column for\n\
+     the kth front.  Fr (:,4) is the leftmost descendent of the kth front.\n\
+     Rows in the range Fr (Fr (k,4),3) to Fr (k+1,3)-1 form the entire set\n\
+     of candidate pivot rows for the kth front (some of these will typically\n\
+     have been selected as pivot rows of fronts Fr (k,3) to k-1, before the\n\
+     factorization reaches the kth front.  If front k is a leaf node, then\n\
+     Fr (k,4) is k.\n\
+\n\
+     Ch is a (nchains+1)-by-3 array containing information about each\n\
+     'chain' (unifrontal sequence) of frontal matrices, and where\n\
+      nchains <= nfr is the number of chains. The ith chain consists of\n\
+     frontal matrices. Chain (i,1) to Chain (i+1,1)-1, and the largest\n\
+     front in chain i is Chain (i,2)-by-Chain (i,3).\n\
+\n\
+     This use of umfpack is not required to factor or solve a linear system\n\
+     in OCTAVE.  It analyzes the matrix A and provides information only.\n\
+     The OCTAVE statement @code{treeplot (Fr (:,2)')} plots the column\n\
+     elimination tree.\n\
+\n\
+Control = umfpack ;\n\
+\n\
+      Returns a 20-by-1 vector of default parameter settings for umfpack.\n\
+\n\
+umfpack_report (Control, Info) ;\n\
+\n\
+      Prints the current Control settings, and Info\n\
+\n\
+If present, Qinit is a user-supplied 1-by-n permutation vector.  It is an\n\
+initial fill-reducing column pre-ordering for A; if not present, then colamd\n\
+or amd are used instead.  If present, Control is a user-supplied 20-by-1\n\
+array.   Control and Info are optional; if Control is not present, defaults\n\
+are used.  If a Control entry is NaN, then the default is used for that entry.\n\
+\n\
+UMFPACK Version 4.3 (Jan. 16, 2004), Copyright @copyright{} 2004 by\n\
+Timothy A. Davis.  All Rights Reserved.\n\
+\n\
+UMFPACK License:\n\
+\n\
+@example\n\
+Your use or distribution of UMFPACK or any modified version of\n\
+UMFPACK implies that you agree to this License.\n\
+\n\
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY\n\
+EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.\n\
+\n\
+Permission is hereby granted to use or copy this program, provided\n\
+that the Copyright, this License, and the Availability of the original\n\
+version is retained on all copies.  User documentation of any code that\n\
+uses UMFPACK or any modified version of UMFPACK code must cite the\n\
+Copyright, this License, the Availability note, and 'Used by permission.'\n\
+Permission to modify the code and to distribute modified code is granted,\n\
+provided the Copyright, this License, and the Availability note are\n\
+retained, and a notice that the code was modified is included.  This\n\
+software was developed with support from the National Science Foundation,\n\
+and is provided to you free of charge.\n\
+@end example\n\
+\n\
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack\n\
+@end deftypefn\n\
+@seealso{lu_normtest, colamd, amd, umfpack_solve}")
+{
+  octave_value_list retval;
+  int nargin = args.length ();
+  int op = 0;
+  std::string operation;
+  bool do_solve = false;
+  int do_info = 0;
+
+  ColumnVector User_Qinit;
+  SparseComplexMatrix CAmatrix;
+  ComplexMatrix CBmatrix;
+  SparseMatrix Amatrix;
+  Matrix Bmatrix;
+  NDArray User_Control_matrix;
+
+  bool A_is_complex = false;
+  bool B_is_complex = false;
+  bool X_is_complex = false;
+  bool transpose = false;
+  bool have_User_Qinit  = false;
+  bool have_User_Control_matrix = false;
+  bool do_numeric = true;
+  bool no_scale = false;
+
+  // find the operator
+  for (int i = 0 ; i < nargin ; i++)
+    {
+      if (args(i).is_string ())
+	{
+	  op = i;
+	  break;
+	}
+    }
+
+  if (op > 0)
+    {
+      std::string op_type = args (op).string_value ();
+
+      if (op_type == "\\")
+	{
+
+	  // matrix left divide, x = A\b 
+	  
+	  //  [x, Info] = umfpack (A, '\', b) ;
+	  //  [x, Info] = umfpack (A, '\', b, Control) ;
+	  //  [x, Info] = umfpack (A, Qinit, '\', b, Control) ;
+	  //  [x, Info] = umfpack (A, Qinit, '\', b) ;
+
+	  do_solve = true;
+	  operation = "x = A\\b";
+
+	  if (args(0).class_name () != "sparse")
+	    {
+	      error ("umfpack: input matrix A must be sparse");
+	      return retval;
+	    }
+	  
+	  if (args(0).is_complex_type ())
+	    {
+	      CAmatrix = args(0).sparse_complex_matrix_value ();
+	      A_is_complex = true;
+	    }
+	  else
+	    Amatrix = args(0).sparse_matrix_value ();
+
+
+	  if (args(op+1).is_complex_type ())
+	    {
+	      CBmatrix = args(op+1).complex_matrix_value ();
+	      B_is_complex = true;
+	    }
+	  else
+	    Bmatrix = args(op+1).matrix_value ();
+
+	  if (nargout == 2)
+	    do_info = 1;
+
+	  if (op == 2)
+	    {
+	      User_Qinit = args(1).column_vector_value ();
+	      have_User_Qinit = true;
+	    }
+
+	  if ((op == 1 && nargin == 4) || (op == 2 && nargin == 5))
+	    {
+	      User_Control_matrix = args(nargin-1).array_value ();
+	      have_User_Control_matrix = true;
+	    }
+
+	  if (error_state)
+	    {
+	      error ("umfpack: incorrect argument type");
+	      return retval;
+	    }
+
+	  if (nargin < 3 || nargin > 5 || nargout > 2)
+	    {
+	      error ("umfpack: wrong number of arguments");
+	      return retval;
+	    }
+
+	}
+      else if (op_type == "/")
+	{
+	  // matrix right divide, x = b/A
+
+	  // [x, Info] = umfpack (b, '/', A) ;
+	  // [x, Info] = umfpack (b, '/', A, Control) ;
+	  // [x, Info] = umfpack (b, '/', A, Qinit) ;
+	  // [x, Info] = umfpack (b, '/', A, Qinit, Control) ;
+
+	  do_solve = true;
+	  operation = "x = b/A" ;
+
+	  transpose = true;
+
+	  if (args(2).class_name () != "sparse")
+	    {
+	      error ("umfpack: input matrix A must be sparse");
+	      return retval;
+	    }
+
+	  if (args(2).is_complex_type ())
+	    {
+	      CAmatrix = args(2).sparse_complex_matrix_value ();
+	      A_is_complex = true;
+	    }
+	  else
+	    Amatrix = args(2).sparse_matrix_value ();
+
+	  if (args(0).is_complex_type ())
+	    {
+	      CBmatrix = args(0).complex_matrix_value ();
+	      B_is_complex = true;
+	    }
+	  else
+	    Bmatrix = args(0).matrix_value ();
+
+	  if (nargout == 2)
+	    do_info = 1;
+
+	  if (nargin == 5)
+	    {
+	      User_Qinit = args(3).column_vector_value ();
+	      User_Control_matrix = args(4).array_value ();
+	      have_User_Qinit = true;
+	      have_User_Control_matrix = true;
+	    }
+	  else if (nargin == 4)
+	    {
+	      User_Control_matrix = args(3).array_value ();
+
+	      if (User_Control_matrix.rows () == 1)
+		{
+		  User_Qinit = args(3).column_vector_value ();
+		  have_User_Qinit = true;
+		}
+	      else
+		have_User_Control_matrix = true;
+	    }
+	  else if (nargin < 3 || nargin > 5 || nargout > 2)
+	    {
+	      error ("umfpack: wrong number of arguments");
+	      return retval;
+	    }
+
+	  if (error_state)
+	    {
+	      error ("umfpack: incorrect argument type");
+	      return retval;
+	    }
+	}
+      else if (op_type == "symbolic")
+	{
+	  // symbolic factorization only
+
+	  // [P Q Fr Ch Info] = umfpack (A, 'symbolic') ;
+	  // [P Q Fr Ch Info] = umfpack (A, 'symbolic', Control) ;
+	  // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic') ;
+	  // [P Q Fr Ch Info] = umfpack (A, Qinit, 'symbolic', Control) ;
+
+	  operation = "symbolic factorization";
+	  do_numeric = false;
+
+	  if (args(0).class_name () != "sparse")
+	    {
+	      error ("umfpack: input matrix A must be sparse");
+	      return retval;
+	    }
+
+	  if (args(0).is_complex_type ())
+	    {
+	      CAmatrix = args(0).sparse_complex_matrix_value ();
+	      A_is_complex = true;
+	    }
+	  else
+	    Amatrix = args(0).sparse_matrix_value ();
+
+	  if (nargout == 5)
+	    do_info = 4 ;
+	  
+	  if (op == 2)
+	    {
+	      User_Qinit = args(1).column_vector_value ();
+	      have_User_Qinit = true;
+	    }
+	  if ((op == 1 && nargin == 3) || (op == 2 && nargin == 4))
+	    {
+	      User_Control_matrix = args(nargin-1).array_value ();
+	      have_User_Control_matrix = true;
+	    }
+
+	  if (error_state)
+	    {
+	      error ("umfpack: incorrect argument type");
+	      return retval;
+	    }
+
+	  if (nargin < 2 || nargin > 4 || nargout > 5 || nargout < 4)
+	    {
+	      error ("umfpack: wrong number of arguments") ;
+	      return retval;
+	    }
+	}
+      else
+	{
+	  error ("operator must be '/', '\\', or 'symbolic'") ;
+	  return retval;
+	}
+    }
+  else if (nargin > 0)
+    {
+      // LU factorization
+
+      // with scaling:
+      //   [L, U, P, Q, R, Info] = umfpack (A) ;
+      //   [L, U, P, Q, R, Info] = umfpack (A, Qinit) ;
+      //
+      // scaling determined by Control settings:
+      //   [L, U, P, Q, R, Info] = umfpack (A, Control) ;
+      //   [L, U, P, Q, R, Info] = umfpack (A, Qinit, Control) ;
+      //
+      // with no scaling:
+      //   [L, U, P, Q] = umfpack (A) ;
+      //   [L, U, P, Q] = umfpack (A, Control) ;
+      //   [L, U, P, Q] = umfpack (A, Qinit) ;
+      //   [L, U, P, Q] = umfpack (A, Qinit, Control) ;
+
+      operation = "numeric factorization" ;
+
+      if (args(0).is_complex_type ())
+	{
+	  CAmatrix = args(0).sparse_complex_matrix_value ();
+	  A_is_complex = true;
+	}
+      else
+	Amatrix = args(0).sparse_matrix_value ();
+
+      no_scale = nargout <= 4 ;
+
+      if (nargout == 6)
+	    do_info = 5 ;
+
+      if (nargin == 3)
+	{
+	  User_Qinit = args(1).column_vector_value ();
+	  User_Control_matrix = args(2).array_value ();
+	  have_User_Qinit = true;
+	  have_User_Control_matrix = true;
+	}
+      else if (nargin == 2)
+	{
+	  User_Control_matrix = args(1).array_value ();
+	  
+	  if (User_Control_matrix.rows () == 1)
+	    {
+	      User_Qinit = args(1).column_vector_value ();
+	      have_User_Qinit = true;
+	    }
+	  else
+	    have_User_Control_matrix = true;
+	}
+      else if (nargin > 3 || nargout > 6 || nargout < 4)
+	{
+	  error ("umfpack: wrong number of arguments") ;
+	  return retval;
+	}
+    }
+  else
+    {
+      // return default control settings
+
+      // Control = umfpack ;
+      // umfpack ;
+
+      if (nargout > 1)
+	{
+	  error ("umfpack: wrong number of arguments") ;
+	  return retval;
+	}
+      
+      NDArray user_control (dim_vector (UMFPACK_CONTROL, 1));
+      double *user_control_ptr = user_control.fortran_vec ();
+      umfpack_di_defaults (user_control_ptr);
+      retval(0) = user_control;
+      return retval;
+    }
+
+  // check inputs
+  
+  int n_row = Amatrix.rows ();
+  int n_col = Amatrix.cols ();
+  int nn = MAX (n_row, n_col) ;
+  int n_inner = MIN (n_row, n_col) ;
+  if (do_solve && n_row != n_col)
+    {
+      error ("umfpack: input matrix A must square for '\\' or '/'") ;
+      return retval;
+    }
+  if (n_row == 0 || n_col == 0)
+    {
+      error ("umfpack: input matrix A cannot have zero rows or zero columns") ;
+      return retval;
+    }
+
+  /* The real/complex status of A determines which version to use, */
+  /* (umfpack_di_* or umfpack_zi_*). */
+  const int *Ap;
+  const int *Ai;
+  const double *Ax;
+  const double *Bx;
+  
+  if (A_is_complex)
+    {
+      Ap = CAmatrix.cidx ();
+      Ai = CAmatrix.ridx ();
+      Ax = X_CAST (const double *, CAmatrix.data ());
+    }
+  else
+    {
+      Ap = Amatrix.cidx ();
+      Ai = Amatrix.ridx ();
+      Ax = Amatrix.data ();
+    }
+
+  if (B_is_complex)
+    Bx = X_CAST (const double *, CBmatrix.fortran_vec ());
+  else
+    Bx = Bmatrix.fortran_vec ();
+
+  if (do_solve)
+    {
+      int b_row = Bmatrix.rows ();
+      int b_col = Bmatrix.cols ();
+
+      if (!((transpose && b_row == 1 && b_col == nn) ||  
+	     (!transpose && b_row == nn && b_col == 1)))  
+	{
+	  error ("umfpack: b has the wrong dimensions") ;
+	  return retval;
+	}
+
+      X_is_complex = A_is_complex || B_is_complex ;
+    }
+
+  // set the Control parameters
+  NDArray Control (dim_vector (UMFPACK_CONTROL, 1));
+  double *Control_ptr = Control.fortran_vec ();
+  if (A_is_complex)
+    umfpack_zi_defaults (Control_ptr) ;
+  else
+    umfpack_di_defaults (Control_ptr) ;
+
+  if (have_User_Control_matrix)
+    {
+      int size = MIN (UMFPACK_CONTROL, User_Control_matrix.length ());
+      for (int i = 0 ; i < size ; i++)
+	Control (i) = User_Control_matrix (i) ;
+    }
+  
+  if (no_scale)
+    {
+      // turn off scaling for [L, U, P, Q] = umfpack (A) ;
+      // ignoring the input value of Control (24) for the usage
+      // [L, U, P, Q] = umfpack (A, Control) ;
+      Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE ;
+    }
+
+  int print_level;
+  if (xisnan (Control (UMFPACK_PRL)))
+    print_level = UMFPACK_DEFAULT_PRL ;
+  else
+    print_level = int (Control (UMFPACK_PRL)) ;
+
+  Control (UMFPACK_PRL) = print_level ;
+
+  // check Qinit, if present
+  int *Qinit = NULL;
+  if (have_User_Qinit)
+    {
+      if(User_Qinit.rows () != 1 || User_Qinit.cols () != n_col)
+	{
+	  error ("umfpack: Qinit must be 1-by-n_col") ;
+	  return retval;
+	}
+
+      Qinit = new int [n_col];
+      for (int i = 0; i < n_col; i++)
+	Qinit[i] = static_cast<int> (User_Qinit (i));
+    }
+
+  // report the inputs A and Qinit
+
+  if (print_level >= 2)
+    // print the operation
+    octave_stdout << "\numfpack: " << operation;
+
+  if (A_is_complex)
+    {
+      umfpack_zi_report_control (Control_ptr) ;
+
+      if (print_level >= 3) 
+	octave_stdout << "\nA: " ;
+
+      umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, Ax, NULL,
+				1, Control_ptr) ;
+      if (have_User_Qinit)
+	{
+	  if (print_level >= 3) 
+	    octave_stdout << "\nQinit: " ;
+
+	  umfpack_zi_report_perm (n_col, Qinit, Control_ptr) ;
+	}
+    }
+  else
+    {
+      umfpack_di_report_control (Control_ptr) ;
+
+      if (print_level >= 3) 
+	octave_stdout << "\nA: " ;
+
+       umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax,
+				 1, Control_ptr) ;
+       if (have_User_Qinit)
+	 {
+	   if (print_level >= 3) 
+	     octave_stdout << "\nQinit: " ;
+
+	   umfpack_di_report_perm (n_col, Qinit, Control_ptr) ;
+	 }
+    }
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+  // create the array transpose for x = b/A
+  if (transpose)
+    if (A_is_complex)
+      {
+	CAmatrix = CAmatrix.transpose ();
+	Ap = Amatrix.cidx ();
+	Ai = Amatrix.ridx ();
+	Ax = X_CAST (const double *, CAmatrix.data ());
+      }
+    else
+      {
+	Amatrix = Amatrix.transpose ();
+	Ap = Amatrix.cidx ();
+	Ai = Amatrix.ridx ();
+	Ax = Amatrix.data ();
+      }
+#endif
+
+  // perform the symbolic factorization
+  
+  NDArray InfoOut (dim_vector (1, UMFPACK_INFO));
+  double * Info = InfoOut.fortran_vec ();
+  void *Symbolic;
+  int status, status2;
+  if (A_is_complex)
+    status = umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, Ax, NULL,
+				   Qinit, &Symbolic, Control_ptr, 
+				   Info);
+  else
+    status = umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax,
+				   Qinit, &Symbolic, Control_ptr, 
+				   Info);
+  
+  if (status < 0)
+    {
+      umfpack_error ("symbolic factorization failed", A_is_complex, 
+		     nargout, retval, Control, InfoOut, status, do_info) ;
+      return retval;
+    }
+
+  if (have_User_Qinit)
+    delete [] Qinit;
+
+  // report the Symbolic object
+
+  if (A_is_complex)
+    umfpack_zi_report_symbolic (Symbolic, Control_ptr) ;
+  else
+    umfpack_di_report_symbolic (Symbolic, Control_ptr) ;
+
+  // perform numeric factorization, or just return symbolic factorization
+
+  if (do_numeric)
+    {
+      // perform the numeric factorization
+      void *Numeric;
+
+      if (A_is_complex)
+	status = umfpack_zi_numeric (Ap, Ai, Ax, NULL, Symbolic, &Numeric,
+				     Control_ptr, Info) ;
+      else
+	status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+				     Control_ptr, Info) ;
+
+      // free the symbolic factorization
+      if (A_is_complex)
+	umfpack_zi_free_symbolic (&Symbolic) ;
+      else
+	umfpack_di_free_symbolic (&Symbolic) ;
+
+      // report the Numeric object
+      if (status < 0)
+	{
+	  umfpack_error ("numeric factorization failed", A_is_complex, 
+			 nargout, retval, Control, InfoOut, status, do_info);
+	  return retval;
+	}
+
+      if (A_is_complex)
+	(void) umfpack_zi_report_numeric (Numeric, Control_ptr) ;
+      else
+	(void) umfpack_di_report_numeric (Numeric, Control_ptr) ;
+
+      // return the solution or the factorization
+
+      if (do_solve)
+	{
+	  int sys;
+	  ComplexNDArray Xcmplx;
+	  NDArray Xreal;
+
+	  // solve Ax=b or A'x'=b', and return just the solution x
+
+#ifndef NO_TRANSPOSE_FORWARD_SLASH
+	  if (transpose)
+	    {
+	      // A.'x.'=b.' gives the same x=b/A as solving A'x'=b'
+	      // since C=A.' was factorized, solve with sys = UMFPACK_A 
+	      // since x and b are vectors, x.' and b.' are implicit 
+	      if (X_is_complex)
+		Xcmplx.resize (dim_vector (1, nn));
+	      else
+		Xreal.resize (dim_vector (1, nn));
+	    }
+	  else
+	    {
+	      if (X_is_complex)
+		Xcmplx.resize (dim_vector (nn, 1));
+	      else
+		Xreal.resize (dim_vector (nn, 1));
+	    }
+
+	  sys = UMFPACK_A ;
+#else
+	  if (transpose)
+	    {
+	      // If A is real, A'x=b is the same as A.'x=b. 
+	      // x and b are vectors, so x and b are the same as x' and b'. 
+	      // If A is complex, then A.'x.'=b.' gives the same solution x 
+	      // as the complex conjugate transpose.  If we used the A'x=b 
+	      // option in umfpack_*_solve, we would have to form b' on 
+	      // input and x' on output (negating the imaginary part). 
+	      // We can save this work by just using the A.'x=b option in 
+	      // umfpack_*_solve.  Then, forming x.' and b.' is implicit, 
+	      // since x and b are just vectors anyway. 
+	      // In both cases, the system to solve is A.'x=b
+	      if (X_is_complex)
+		Xcmplx.resize (dim_vector (1, nn));
+	      else
+		Xreal.resize (dim_vector (1, nn));
+
+	      sys = UMFPACK_Aat ;
+	    }
+	  else
+	    {
+	      if (X_is_complex)
+		Xcmplx.resize (dim_vector (nn, 1));
+	      else
+		Xreal.resize (dim_vector (nn, 1));
+	      sys = UMFPACK_A ;
+	    }
+#endif
+
+	  // print the right-hand-side, B
+	  if (print_level >= 3) 
+	    octave_stdout << "\nright-hand side, b: ";
+
+	  if (B_is_complex)
+	    (void) umfpack_zi_report_vector (nn, Bx, NULL, Control_ptr) ;
+	  else
+	    (void) umfpack_di_report_vector (nn, Bx, Control_ptr) ;
+
+	  // solve the system
+	  double * Xx;
+	  if (X_is_complex)
+	    Xx = X_CAST (double *, Xcmplx.fortran_vec ());
+	  else
+	    Xx = Xreal.fortran_vec ();
+	  status2 = UMFPACK_OK ;
+
+	  if (A_is_complex)
+	    {
+	      if (!B_is_complex)
+		{
+		  OCTAVE_LOCAL_BUFFER (double, Bz, nn);
+		  for (int i = 0; i < nn; i++)
+		    Bz[i] = 0.;
+
+		  status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, 
+					     Bx, Bz, Numeric, Control_ptr, 
+					     Info);
+		}
+	      else
+		status = umfpack_zi_solve (sys, Ap, Ai, Ax, NULL, Xx, NULL, 
+					   Bx, NULL, Numeric, Control_ptr, 
+					   Info);
+	    }
+	  else
+	    {
+	      if (B_is_complex)
+		{
+		  // Ax=b when b is complex and A is sparse can be split
+		  // into two systems, A*xr=br and A*xi=bi, where r denotes
+		  // the real part and i the imaginary part of x and b.
+		  OCTAVE_LOCAL_BUFFER (double, Tx, nn);
+		  OCTAVE_LOCAL_BUFFER (double, Tz, nn);
+
+		  status = umfpack_di_solve (sys, Ap, Ai, Ax, Tx, Bx,
+					     Numeric, Control_ptr, Info);
+		  status2 = umfpack_di_solve (sys, Ap, Ai, Ax, Tz, Bx,
+					      Numeric, Control_ptr, Info) ;
+
+		  for (int i = 0; i < nn; i++)
+		    Xcmplx (i) = Complex (Tx[i], Tz[i]);
+		}
+	      else
+		status = umfpack_di_solve (sys, Ap, Ai, Ax, Xx, Bx,
+					   Numeric, Control_ptr, Info);
+	    }
+	  
+	  // free the Numeric object
+	  if (A_is_complex)
+	    umfpack_zi_free_numeric (&Numeric) ;
+	  else
+	    umfpack_di_free_numeric (&Numeric) ;
+	  
+	  // check error status
+	  if (status < 0 || status2 < 0)
+	    {
+	      umfpack_error ("solve failed", A_is_complex, nargout, 
+			     retval, Control, InfoOut, status, do_info) ;
+	      return retval;
+	    }
+
+	  // print the solution, X
+	  if (print_level >= 3) 
+	    octave_stdout << "\nsolution, x: ";
+
+	  if (X_is_complex)
+	    (void) umfpack_zi_report_vector (nn, Xx, NULL, Control_ptr);
+	  else
+	    (void) umfpack_di_report_vector (nn, Xx, Control_ptr);
+
+	  // warn about singular or near-singular matrices
+	  // no warning is given if Control (1) is zero
+	  if (Control (UMFPACK_PRL) >= 1)
+	    {
+	      if (status == UMFPACK_WARNING_singular_matrix)
+		{
+		  warning ("matrix is singular");
+		  warning ("Try increasing Control (%d) and Control (%d).",
+			   1+UMFPACK_PIVOT_TOLERANCE, 
+			   1+UMFPACK_SYM_PIVOT_TOLERANCE);
+		  warning ("(Suppress this warning with Control (%d) = 0.)",
+			   1+UMFPACK_PRL);
+		}
+	      else if (InfoOut (UMFPACK_RCOND) < DBL_EPSILON)
+		{
+		  warning ("matrix is nearly singular, rcond = %g",
+			   InfoOut (UMFPACK_RCOND));
+		  warning ("Try increasing Control (%d) and Control (%d).",
+			   1+UMFPACK_PIVOT_TOLERANCE,
+			   1+UMFPACK_SYM_PIVOT_TOLERANCE);
+		  warning ("(Suppress this warning with Control (%d) = 0.)",
+			   1+UMFPACK_PRL);
+		}
+	    }
+
+	  // Setup the return value
+	  if (X_is_complex)
+	    retval (0) = octave_value (Xcmplx);
+	  else
+	    retval (0) = octave_value (Xreal);
+	}
+      else
+	{
+	  // get L, U, P, Q, and r
+	  int lnz, unz, ignore1, ignore2, ignore3;
+
+	  if (A_is_complex)
+	    status = umfpack_zi_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					  &ignore3, Numeric) ;
+	  else
+	    status = umfpack_di_get_lunz (&lnz, &unz, &ignore1, &ignore2,
+					  &ignore3, Numeric) ;
+
+	  if (status < 0)
+	    {
+	      if (A_is_complex)
+		umfpack_zi_free_numeric (&Numeric) ;
+	      else
+		umfpack_di_free_numeric (&Numeric) ;
+
+	      umfpack_error ("extracting LU factors failed", A_is_complex, 
+			     nargout, retval, Control, InfoOut, status, 
+			     do_info);
+	      return retval;
+	    }
+
+	  // avoid malloc of zero-sized arrays
+	  lnz = MAX (lnz, 1) ;
+	  unz = MAX (unz, 1) ;
+
+	  // get space for the *** ROW *** form of L
+	  SparseMatrix Lreal;
+	  SparseComplexMatrix Limag;
+	  int *Ltp, *Ltj;
+	  double *Ltx;
+	  if (A_is_complex)
+	    {
+	      Limag = SparseComplexMatrix (n_inner, n_row, lnz);
+	      Ltp = Limag.cidx ();
+	      Ltj = Limag.ridx ();
+	      Ltx = X_CAST (double *, Limag.data ());
+	    }
+	  else
+	    {
+	      Lreal = SparseMatrix (n_inner, n_row, lnz);
+	      Ltp = Lreal.cidx ();
+	      Ltj = Lreal.ridx ();
+	      Ltx = Lreal.data ();
+	    }
+
+	  // create permanent copy of the output matrix U
+	  int *Up, *Ui;
+	  double *Ux;
+	  SparseMatrix Ureal;
+	  SparseComplexMatrix Uimag;
+
+	  if (A_is_complex)
+	    {
+	      Uimag = SparseComplexMatrix (n_inner, n_col, unz);
+	      Up = Uimag.cidx ();
+	      Ui = Uimag.ridx ();
+	      Ux = X_CAST (double *, Uimag.data ());
+	    }
+	  else
+	    {
+	      Ureal = SparseMatrix (n_inner, n_col, unz);
+	      Up = Ureal.cidx ();
+	      Ui = Ureal.ridx ();
+	      Ux = Ureal.data ();
+	    }
+
+	  // temporary space for the integer permutation vectors
+	  OCTAVE_LOCAL_BUFFER (int, P, n_row);
+	  OCTAVE_LOCAL_BUFFER (int, Q, n_col);
+
+	  // get scale factors, if requested 
+	  status2 = UMFPACK_OK ;
+	  SparseMatrix Rsout;
+	  double * Rs;
+	  if (!no_scale)
+	    {
+	      // create a diagonal sparse matrix for the scale factors 
+	      Rsout = SparseMatrix (n_row, n_row, n_row);
+	      for (int i = 0 ; i < n_row ; i++)
+		{
+		  Rsout.cidx (i) = i;
+		  Rsout.ridx (i) = i;
+		}
+	      Rsout.cidx (n_row) = n_row;
+	      Rs = Rsout.data ();
+	    }
+	  else
+	    Rs = (double *) NULL ;
+
+	  // get Lt, U, P, Q, and Rs from the numeric object
+	  int do_recip;
+	  if (A_is_complex)
+	    {
+	      status = umfpack_zi_get_numeric (Ltp, Ltj, Ltx, NULL, Up, Ui, 
+					       Ux, NULL, P, Q, 
+					       (double *) NULL, 
+					       (double *) NULL,
+					       &do_recip, Rs, Numeric) ;
+	      umfpack_zi_free_numeric (&Numeric) ;
+	    }
+	  else
+	    {
+	      status = umfpack_di_get_numeric (Ltp, Ltj, Ltx, Up, Ui,
+					       Ux, P, Q, (double *) NULL,
+					       &do_recip, Rs, Numeric) ;
+	      umfpack_di_free_numeric (&Numeric) ;
+	    }
+
+	  if (!no_scale)
+	    retval (4) = octave_vale (Rsout);
+
+	  // for the oct-file, -DNRECIPROCAL must be set,
+	  // so do_recip must be FALSE
+
+	  if (status < 0 || status2 < 0 || do_recip)
+	    {
+	      umfpack_error ("extracting LU factors failed", A_is_complex, 
+			     nargout, retval, Control, InfoOut, status, 
+			     do_info);
+	      return retval;
+	    }
+
+	  if (A_is_complex)
+	    retval (1) = octave_value (Uimag);
+	  else
+	    retval (1) = octave_valye (Ureal);
+	  
+	  // create sparse permutation matrix for P 
+	  SparseMatrix Pout (n_row, n_row, n_row);
+	  for (int k = 0 ; k < n_row ; k++)
+	    {
+	      Pout.cidx (k) = k ;
+	      Pout.ridx (P [k]) = k;
+	      Pout.data (k) = 1;
+	    }
+	  Pout.cidx (n_row) = n_row;
+	  retval (2) = octave_value (Pout);
+
+	  // create sparse permutation matrix for Q 
+	  SparseMatrix Qout (n_col, n_col, n_col);
+	  for (int k = 0 ; k < n_col ; k++)
+	    {
+	      Qout.cidx (k) = k ;
+	      Qout.ridx (k) = Q[k];
+	      Qout.data (k) = 1;
+	    }
+	  Qout.cidx (n_col) = n_col;
+	  retval (3) = octave_value (Qout);
+	  
+	  // permanent copy of L 
+	  if (A_is_complex)
+	    retval (0) = octave_value (Limag.transpose());
+	  else
+	    retval (0) = octave_value (Lreal.transpose());
+
+	  if (status < 0)
+	    {
+	      umfpack_error ("constructing L failed", A_is_complex, 
+			     nargout, retval, Control, InfoOut, status, 
+			     do_info) ;
+	      return octave_value ();
+	    }
+
+	  // print L, U, P, and Q
+	  if (A_is_complex)
+	    {
+	      if (print_level >= 3) 
+		{
+		  octave_stdout << "\nL: ";
+		  int *Lp = Limag.cidx ();
+		  int *Li = Limag.ridx ();
+		  double *Lx = X_CAST (double *, Limag.data ());
+
+		  (void) umfpack_zi_report_matrix (n_row, n_inner, Lp, Li,
+						   Lx, NULL, 1, Control_ptr) ;
+		}
+
+	      if (print_level >= 3) 
+		octave_stdout << "\nU: ";
+	      (void) umfpack_zi_report_matrix (n_inner, n_col, Up, Ui,
+					       Ux, NULL, 1, Control_ptr) ;
+	      if (print_level >= 3)
+		octave_stdout << "\nP: ";
+	      (void) umfpack_zi_report_perm (n_row, P, Control_ptr);
+	      if (print_level >= 3) 
+		octave_stdout << "\nQ: ";
+	      (void) umfpack_zi_report_perm (n_col, Q, Control_ptr);
+	    }
+	  else
+	    {
+	      if (print_level >= 3) 
+		{
+		  int *Lp = Lreal.cidx ();
+		  int *Li = Lreal.ridx ();
+		  double *Lx = Lreal.data ();
+		  octave_stdout << "\nL: ";
+		  (void) umfpack_di_report_matrix (n_row, n_inner, Lp, Li,
+						   Lx, 1, Control_ptr);
+		}
+
+	      if (print_level >= 3) 
+		octave_stdout << "\nU: ";
+	      (void) umfpack_di_report_matrix (n_inner, n_col, Up, Ui,
+					       Ux, 1, Control_ptr);
+	      if (print_level >= 3) 
+		octave_stdout << "\nP: ";
+	      (void) umfpack_di_report_perm (n_row, P, Control_ptr);
+	      if (print_level >= 3) 
+		octave_stdout << "\nQ: ";
+	      (void) umfpack_di_report_perm (n_col, Q, Control_ptr);
+	    }
+	}
+    }
+  else
+    {
+      // return the symbolic factorization
+      int ignore1, ignore2, ignore3;
+      OCTAVE_LOCAL_BUFFER (int, Q, n_col);
+      OCTAVE_LOCAL_BUFFER (int, P, n_row);
+      OCTAVE_LOCAL_BUFFER (int, Front_npivcol, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Front_parent, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Front_1strow, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Front_leftmostdesc, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Chain_start, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Chain_maxrows, nn + 1);
+      OCTAVE_LOCAL_BUFFER (int, Chain_maxcols, nn + 1);
+
+      int nz, nfronts, nchains;
+
+      if (A_is_complex)
+	{
+	  status = umfpack_zi_get_symbolic (&ignore1, &ignore2, &ignore3,
+					    &nz, &nfronts, &nchains, P, Q, 
+					    Front_npivcol, Front_parent, 
+					    Front_1strow, 
+					    Front_leftmostdesc,
+					    Chain_start, Chain_maxrows, 
+					    Chain_maxcols, Symbolic) ;
+	  umfpack_zi_free_symbolic (&Symbolic) ;
+	}
+      else
+	{
+	  status = umfpack_di_get_symbolic (&ignore1, &ignore2, &ignore3,
+					    &nz, &nfronts, &nchains, P, Q, 
+					    Front_npivcol, Front_parent, 
+					    Front_1strow, 
+					    Front_leftmostdesc,
+					    Chain_start, Chain_maxrows, 
+					    Chain_maxcols, Symbolic) ;
+	  umfpack_di_free_symbolic (&Symbolic) ;
+	}
+
+      if (status < 0)
+	{
+	  umfpack_error ("extracting symbolic factors failed", 
+			 A_is_complex, nargout, retval, Control, 
+			 InfoOut, status, do_info) ;
+	  return retval;
+	}
+      
+      // create sparse permutation matrix for P
+      SparseMatrix Pout (n_row, n_row, n_row);
+      for (int k = 0 ; k < n_row ; k++)
+	{
+	  Pout.cidx (k) = k;
+	  Pout.ridx (P [k]) = k;
+	  Pout.data (k) = 1;
+	}
+      Pout.cidx (n_row) = n_row;
+      retval (0) = octave_value (Pout);
+
+      // create sparse permutation matrix for Q 
+      SparseMatrix Qout (n_col, n_col, n_col);
+      for (int k = 0 ; k < n_col ; k++)
+	{
+	  Qout.cidx (k) = k;
+	  Qout.ridx (k) = Q[k];
+	  Qout.data (k) = 1;
+	}
+      Qout.cidx (n_col) = n_col;
+      retval (1) = octave_value (Qout);
+      
+      // create Fr 
+      Matrix Frout (nfronts + 1, 4);
+      for (int i = 0 ; i <= nfronts ; i++)
+	{
+	  // convert parent, 1strow, and leftmostdesc to 1-based 
+	  Frout (i, 0) = (double) (Front_npivcol [i]) ;
+	  Frout (i, 1) = (double) (Front_parent [i] + 1) ;
+	  Frout (i, 2) = (double) (Front_1strow [i] + 1) ;
+	  Frout (i, 3) = (double) (Front_leftmostdesc [i] + 1) ;
+	}
+      retval (2) = octave_value (Frout);
+      
+      // create Ch 
+      Matrix Chout (nchains + 1, 3);
+      for (int i = 0 ; i <= nchains ; i++)
+	{
+	  // convert to 1-based 
+	  Chout (i, 0) = (double) (Chain_start [i] + 1) ;
+	  Chout (i, 1) = (double) (Chain_maxrows [i]) ;
+	  Chout (i, 2) = (double) (Chain_maxcols [i]) ;
+	}
+      Chout (0, nchains) = (double) Chain_start [nchains] + 1 ;
+      Chout (1, nchains) = 0.;
+      Chout (2, nchains) = 0.;
+      retval (3) = octave_value (Chout);
+    }
+
+  // report Info
+  if (A_is_complex)
+    umfpack_zi_report_info (Control_ptr, Info);
+  else
+    umfpack_di_report_info (Control_ptr, Info);
+
+  if (do_info > 0)
+    retval (do_info) = InfoOut;
+
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_btf.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,129 @@
+function x = umfpack_btf (A, b, Control)
+% UMFPACK_BTF
+%
+% x = umfpack_btf (A, b, Control)
+%
+% solve Ax=b by first permuting the matrix A to block triangular form via dmperm
+% and then using UMFPACK to factorize each diagonal block.  Adjacent 1-by-1
+% blocks are merged into a single upper triangular block, and solved via
+% MATLAB's \ operator.  The Control parameter is optional (Type umfpack_details
+% and umfpack_report for details on its use).  A must be square.
+%
+% See also:  umfpack, umfpack_factorize, umfpack_details, dmperm
+
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  Type umfpack_details for License.
+
+if (nargin < 2)
+    help umfpack_btf
+    error ('Usage: x = umfpack_btf (A, b, Control)') ;
+end
+
+[m n] = size (A) ;
+if (m ~= n)
+    help umfpack_btf
+    error ('umfpack_btf:  A must be square') ;
+end
+[m1 n1] = size (b) ;
+if (m1 ~= n)
+    help umfpack_btf
+    error ('umfpack_btf:  b has the wrong dimensions') ;
+end
+
+if (nargin < 3)
+    Control = umfpack ;
+end
+
+%-------------------------------------------------------------------------------
+% find the block triangular form
+%-------------------------------------------------------------------------------
+
+[p,q,r] = dmperm (A) ;
+nblocks = length (r) - 1 ;
+
+%-------------------------------------------------------------------------------
+% solve the system
+%-------------------------------------------------------------------------------
+
+if (nblocks == 1 | sprank (A) < n)
+
+    %---------------------------------------------------------------------------
+    % matrix is irreducible or structurally singular
+    %---------------------------------------------------------------------------
+
+    x = umfpack_solve (A, '\\', b, Control) ;
+
+else
+
+    %---------------------------------------------------------------------------
+    % A (p,q) is in block triangular form
+    %---------------------------------------------------------------------------
+
+    b = b (p,:) ;
+    A = A (p,q) ;
+    x = zeros (size (b)) ;
+
+    %---------------------------------------------------------------------------
+    % merge adjacent singletons into a single upper triangular block
+    %---------------------------------------------------------------------------
+
+    [r, nblocks, is_triangular] = merge_singletons (r) ;
+
+    %---------------------------------------------------------------------------
+    % solve the system: x (q) = A\b
+    %---------------------------------------------------------------------------
+
+    for k = nblocks:-1:1
+
+	% get the kth block
+        k1 = r (k) ;
+        k2 = r (k+1) - 1 ;
+
+	% solve the system
+	x (k1:k2,:) = solver (A (k1:k2, k1:k2), b (k1:k2,:), ...
+	    is_triangular (k), Control) ;
+
+        % off-diagonal block back substitution
+        b (1:k1-1,:) = b (1:k1-1,:) - A (1:k1-1, k1:k2) * x (k1:k2,:) ;
+
+    end
+
+    x (q,:) = x ;
+
+end
+
+%-------------------------------------------------------------------------------
+% merge_singletons
+%-------------------------------------------------------------------------------
+
+function [r, nblocks, is_triangular] = merge_singletons (r)
+%
+% Given r from [p,q,r] = dmperm (A), where A is square, return a modified r that
+% reflects the merger of adjacent singletons into a single upper triangular
+% block.  is_triangular (k) is 1 if the kth block is upper triangular.  nblocks
+% is the number of new blocks.
+
+nblocks = length (r) - 1 ;
+bsize = r (2:nblocks+1) - r (1:nblocks) ;
+t = [0 (bsize == 1)] ;
+z = (t (1:nblocks) == 0 & t (2:nblocks+1) == 1) | t (2:nblocks+1) == 0 ;
+y = [(find (z)) nblocks+1] ;
+r = r (y) ;
+nblocks = length (y) - 1 ;
+is_triangular = y (2:nblocks+1) - y (1:nblocks) > 1 ;
+
+%-------------------------------------------------------------------------------
+% solve Ax=b, but check for small and/or triangular systems
+%-------------------------------------------------------------------------------
+
+function x = solver (A, b, is_triangular, Control)
+if (is_triangular)
+    % back substitution only
+    x = A \ b ;
+elseif (size (A,1) < 4)
+    % a very small matrix, solve it as a dense linear system
+    x = full (A) \ b ;
+else
+    % solve it as a sparse linear system
+    x = umfpack_solve (A, '\\', b, Control) ;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,191 @@
+function umfpack_demo
+% UMFPACK DEMO
+%
+% A demo of UMFPACK for OCTAVE.
+%
+% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
+% and umfpack_simple.
+
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  Type umfpack_details for License.
+
+%-------------------------------------------------------------------------------
+% get default control parameters
+%-------------------------------------------------------------------------------
+
+control = umfpack ;
+fprintf ('\nEnter the printing level for UMFPACK''s output statistics:\n') ;
+fprintf ('0: none, 1: errors only, 2: statistics, 4: print some of outputs\n') ;
+c = input ('5: print all output [default is 1]: ') ;
+if (isempty (c))
+    c = 1 ;
+end
+control (1) = c ;
+
+%-------------------------------------------------------------------------------
+% solve a simple system
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Factor and solve a small system, Ax=b, using default parameters\n') ;
+if (control (1) > 1)
+    fprintf ('(except for verbose printing enabled)\n') ;
+end
+
+load west0067 ;
+A = Problem.A ;
+n = size (A, 1) ;
+b = rand (n, 1) ;
+
+fprintf ('Solving Ax=b via UMFPACK:\n') ;
+[xu, info] = umfpack (A, '\\', b, control) ;
+x = xu ;
+
+fprintf ('Solving Ax=b via OCTAVE:\n') ;
+xm = A\b ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% spy the results
+%-------------------------------------------------------------------------------
+
+figure (1) ;
+clf
+
+subplot (2,3,1)
+title ('The matrix A') ;
+spy (A)
+
+subplot (2,3,2)
+[P1, Q1, Fr, Ch, Info] = umfpack (A, 'symbolic') ;
+title ('Supernodal column elimination tree') ;
+%% Disable for now !!
+%% treeplot (Fr (1:end-1,2)') ;
+
+subplot (2,3,3)
+title ('A, with initial row and column order') ;
+spy (P1 * A * Q1)
+
+subplot (2,3,4)
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nFactorizing [L, U, P, Q, R] = umfpack (A)\n') ;
+[L, U, P, Q, R] = umfpack (A) ;
+title ('A, with final row/column order') ;
+spy (P*A*Q)
+
+fprintf ('\nP * (R\\A) * Q - L*U should be zero:\n') ;
+fprintf ('norm (P*(R\\A)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
+    norm (P * (R\A) * Q - L*U, 1), lu_normest (P * (R\A) * Q,  L, U)) ;
+
+fprintf ('\nSolution to Ax=b via UMFPACK factorization:\n') ;
+fprintf ('x = Q * (U \\ (L \\ (P * (R \\ b))))\n') ;
+xu = Q * (U \ (L \ (P * (R \ b)))) ;
+x = xu ;
+
+fprintf ('\nUMFPACK flop count: %d\n', luflop (L, U)) ;
+
+subplot (2,3,5)
+title ('UMFPACK LU factors') ;
+spy (spones (L) + spones (U))
+
+subplot (2,3,6)
+fprintf ('\nFactorizing [L, U, P] = lu (A (:, q))\n') ;
+try
+    q = colamd (A) ;
+catch
+    fprintf ('\n *** colamd not found, using colmmd instead *** \n') ;
+    q = colmmd (A) ;
+end
+[L, U, P] = lu (A (:,q)) ;
+title ('OCTAVE LU factors') ;
+spy (spones (L) + spones (U))
+
+fprintf ('\nSolution to Ax=b via OCTAVE factorization:\n') ;
+fprintf ('x = U \\ (L \\ (P * b)) ; x (q) = x ;\n') ;
+xm = U \ (L \ (P * b)) ;
+xm (q) = xm ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+fprintf ('\nOCTAVE LU flop count: %d\n', luflop (L, U)) ;
+
+%-------------------------------------------------------------------------------
+% solve A'x=b
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Solve A''x=b:\n') ;
+
+fprintf ('Solving A''x=b via UMFPACK:\n') ;
+[xu, info] = umfpack (b', '/', A, control) ;
+xu = xu' ;
+
+fprintf ('Solving A''x=b via OCTAVE:\n') ;
+xm = (b'/A)' ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% factor A' and then solve Ax=b using the factors of A'
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Compute C = A'', and compute the LU factorization of C.\n') ;
+fprintf ('Factorizing A'' can sometimes be better than factorizing A itself\n');
+fprintf ('(less work and memory usage).  Solve C''x=b; the solution is the\n') ;
+fprintf ('same as the solution to Ax=b for the original A.\n');
+
+C = A' ;
+
+% factorize C (P,Q) = L*U
+[L, U, P, Q, R, info] = umfpack (C, control) ;
+
+fprintf ('\nP * (R\\C) * Q - L*U should be zero:\n') ;
+fprintf ('norm (P*(R\\C)*Q - L*U, 1) = %g (exact) %g (estimated)\n', ...
+    norm (P * (R\C) * Q - L*U, 1), lu_normest (P * (R\C) * Q,  L, U)) ;
+
+fprintf ('\nSolution to Ax=b via UMFPACK, using the factors of C:\n') ;
+fprintf ('x = R \\ (P'' * (L'' \\ (U'' \\ (Q'' * b)))) ;\n') ;
+xu = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
+x = xu ;
+
+fprintf ('Solution to Ax=b via OCTAVE:\n') ;
+xm = A\b ;
+x = xm ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (xu - xm, Inf)) ;
+
+%-------------------------------------------------------------------------------
+% solve Ax=B
+%-------------------------------------------------------------------------------
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve AX=B, where B is n-by-10, and sparse\n') ;
+B = sprandn (n, 10, 0.05) ;
+XU = umfpack_solve (A, '\\', B, control) ;
+XM = A\B ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve AX=B, where B is n-by-10, and sparse, using umfpack_btf\n') ;
+XU = umfpack_btf (A, B, control) ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('\nSolve A''X=B, where B is n-by-10, and sparse\n') ;
+XU = umfpack_solve (B', '/', A, control) ;
+XM = B'/A ;
+
+fprintf ('Difference between UMFPACK and OCTAVE solution: %g\n', ...
+    norm (XU - XM, Inf)) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_demo.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,72 @@
+>> umfpack_demo
+
+Enter the printing level for UMFPACK's output statistics:
+0: none, 1: errors only, 2: statistics, 4: print some of outputs
+5: print all output [default is 1]: 
+
+--------------------------------------------------------------
+Factor and solve a small system, Ax=b, using default parameters
+Solving Ax=b via UMFPACK:
+Solving Ax=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 1.24345e-14
+
+--------------------------------------------------------------
+
+Factorizing [L, U, P, Q, R] = umfpack (A)
+
+P * (R\A) * Q - L*U should be zero:
+norm (P*(R\A)*Q - L*U, 1) = 4.2068e-16 (exact) 3.74627e-16 (estimated)
+
+Solution to Ax=b via UMFPACK factorization:
+x = Q * (U \ (L \ (P * (R \ b))))
+
+UMFPACK flop count: 2362
+
+Factorizing [L, U, P] = lu (A (:, q))
+If you are using a version of MATLAB prior to V6.0, then the
+following statement (q = colamd (A)) may fail.  Either download
+colamd from http://www.cise.ufl.edu/research/sparse, upgrade to
+MATLAB V6.0 or later, or replace the statement with
+q = colmmd (A) ;
+
+Solution to Ax=b via MATLAB factorization:
+x = U \ (L \ (P * b)) ; x (q) = x ;
+Difference between UMFPACK and MATLAB solution: 1.37668e-14
+
+MATLAB LU flop count: 3164
+
+--------------------------------------------------------------
+Solve A'x=b:
+Solving A'x=b via UMFPACK:
+Solving A'x=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 3.10862e-15
+
+--------------------------------------------------------------
+Compute C = A', and compute the LU factorization of C.
+Factorizing A' can sometimes be better than factorizing A itself
+(less work and memory usage).  Solve C'x=b; the solution is the
+same as the solution to Ax=b for the original A.
+
+P * (R\C) * Q - L*U should be zero:
+norm (P*(R\C)*Q - L*U, 1) = 1.31839e-16 (exact) 6.41848e-17 (estimated)
+
+Solution to Ax=b via UMFPACK, using the factors of C:
+x = R \ (P' * (L' \ (U' \ (Q' * b)))) ;
+Solution to Ax=b via MATLAB:
+Difference between UMFPACK and MATLAB solution: 1.77636e-14
+
+--------------------------------------------------------------
+
+Solve AX=B, where B is n-by-10, and sparse
+Difference between UMFPACK and MATLAB solution: 2.88198e-14
+
+--------------------------------------------------------------
+
+Solve AX=B, where B is n-by-10, and sparse, using umfpack_btf
+Difference between UMFPACK and MATLAB solution: 9.79736e-14
+
+--------------------------------------------------------------
+
+Solve A'X=B, where B is n-by-10, and sparse
+Difference between UMFPACK and MATLAB solution: 1.05244e-13
+>> diary off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_make.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,356 @@
+function umfpack_make
+% UMFPACK_MAKE
+%
+% Compiles the UMFPACK mexFunction and then runs a simple demo.
+%
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  Type umfpack_details for License.
+%
+% See also: umfpack, umfpack_details, umfpack_report, umfpack_demo, and
+% umfpack_simple.
+
+help umfpack_make
+
+fprintf ('\n--------------------------------------------------------------\n') ;
+fprintf ('Now compiling the UMFPACK and AMD mexFunctions.\n') ;
+fprintf ('--------------------------------------------------------------\n') ;
+
+try
+    % ispc does not appear in MATLAB 5.3
+    pc = ispc ;
+catch
+    % if ispc fails, assume we aren't on a Windows PC.
+    pc = 0 ;
+end
+
+obj = 'o' ;
+blas_lib = '' ;
+if (pc)
+    obj = 'obj' ;
+end
+
+%-------------------------------------------------------------------------------
+% BLAS option
+%-------------------------------------------------------------------------------
+
+msg = [ ...
+    '\nUsing the BLAS is faster, but might not compile correctly.\n', ...
+    'If you get an error stating that dgemm, dgemv, dger, zgemm,\n', ...
+    'zgemv, and/or zger are not defined, then recompile without the\n', ...
+    'BLAS.  You can ignore warnings that these routines are implicitly\n', ...
+    'declared.\n\nPlease select one of the following options: \n', ...
+    '   1:  attempt to compile with the BLAS (default)\n', ...
+    '   2:  do not use the BLAS\n'] ;
+fprintf (msg) ;
+blas = input (': ') ;
+if (isempty (blas))
+    blas = 1 ;
+end
+if (blas == 1)
+    % try to link to MATLAB's built-in BLAS
+    blas = '' ;
+    if (pc)
+        % the default lcc compiler needs this library to access the BLAS
+        blas_lib = ' libmwlapack.lib' ;
+        msg = [ ...
+        '\nCheck to see if you have a file called libmwlapack.lib in the\n', ...
+        '<matlab>\\extern\\lib\\win32\\lcc\\ directory, where <matlab> is ', ...
+        'the\ndirectory where MATLAB is installed.  If a file of that ', ...
+        'name is already\nthere, then you don''t have to do anything.  ', ...
+        'Otherwise, you must first\ncopy the libmwlapack.lib file from ', ...
+        'the umfpack\\lcc_lib\\ directory to the\n', ...
+        '<matlab>\\extern\\lib\\win32\\lcc\\ directory.  Next, type\n\n', ...
+        '    mex -setup\n\n', ...
+        'at the MATLAB prompt, and ask MATLAB to select the lcc compiler.  ',...
+        'You can skip\nall of this if you have already done it, or have ', ...
+        'configured mex to use\na different compiler.  If you are using ', ...
+        'Norton anti-virus software on Windows\n98SE, then you need to ', ...
+        'exit MATLAB, turn off virus checking, and restart MATLAB\n', ...
+        'before you can use the mex command or compile UMFPACK.\n', ...
+        'You may also need to turn off virus checking in other cases.\n', ...
+        '\nHit enter to continue, or type control-C if you do not wish to '] ;
+        fprintf (msg) ;
+        input ('proceed: ') ;
+    end
+    fprintf ('\nUsing the BLAS (recommended).\n') ;
+else
+    % No BLAS
+    fprintf ('\nNot using the BLAS.  UMFPACK will be slow.\n') ;
+    blas = ' -DNBLAS' ;
+end
+
+%-------------------------------------------------------------------------------
+% -DNUTIL option (using utMalloc or mxMalloc)
+%-------------------------------------------------------------------------------
+
+utils = '' ;
+
+if (~pc)
+    msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nUMFPACK uses MATLAB''s memory allocation routines.  The internal', ...
+    '\nutMalloc, utFree, and utRealloc allow for better use of memory,', ...
+    '\nbut they are internal utility routines that are not documented.\n', ...
+    'Thus, they might not always work.  Using mxMalloc, mxFree, and\n', ...
+    'mxRealloc works, but UMFPACK might run out of memory when solving\n', ...
+    'problems that it could otherwise solve.  Try using the default.\n', ...
+    'If you get an error stating that utMalloc, utFree, and/or\n', ...
+    'utRealloc are not defined, then recompile with the mx* routines.\n', ...
+    '\nPlease select one of the following options:\n', ...
+    '    1:  attempt to use the ut* routines (default)\n', ...
+    '    2:  use the standard mx* routines\n'] ;
+    fprintf (msg) ;
+    utils = input (': ') ;
+    if (isempty (utils))
+	utils = 1 ;
+    end
+    if (utils == 2)
+        fprintf ('\nNot using utMalloc, utFree, or utRealloc\n') ;
+        utils = ' -DNUTIL' ;
+    else
+        fprintf ('\nUsing utMalloc, utFree, and utRealloc\n') ;
+        utils = '' ;
+    end
+end
+
+%-------------------------------------------------------------------------------
+% -DNPOSIX option (for sysconf and times timer routines)
+%-------------------------------------------------------------------------------
+
+posix = '' ;
+
+if (~pc)
+    msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nUMFPACK can use the POSIX routines sysconf () and times ()\n', ...
+    'to provide CPU time and wallclock time statistics.  If you do not\n', ...
+    'have a POSIX-compliant operating system, then UMFPACK won''t\n', ...
+    'compile.  If you don''t know which option to pick, try the\n', ...
+    'default.  If you get an error saying that sysconf and/or times\n', ...
+    'are not defined, then recompile with the non-POSIX option.\n', ...
+    '\nPlease select one of the following options:\n', ...
+    '    1:  use POSIX sysconf and times routines (default)\n', ...
+    '    2:  do not use POSIX routines\n'] ;
+    fprintf (msg) ;
+    posix = input (': ') ;
+    if (isempty (posix))
+	posix = 1 ;
+    end
+    if (posix == 2)
+        fprintf ('\nNot using POSIX sysconf and times routines.\n') ;
+        posix = ' -DNPOSIX' ;
+    else
+        fprintf ('\nUsing POSIX sysconf and times routines.\n') ;
+        posix = '' ;
+    end
+end
+
+%-------------------------------------------------------------------------------
+% mex command
+%-------------------------------------------------------------------------------
+
+umfdir = sprintf ('..%sSource%s', filesep, filesep) ;
+amddir = sprintf ('..%s..%sAMD%sSource%s', filesep, filesep, filesep, filesep) ;
+incdir = sprintf ( ...
+' -I..%sInclude -I..%sSource -I..%s..%sAMD%sInclude -I..%s..%sAMD%sSource', ...
+filesep,filesep,  filesep, filesep, filesep, filesep, filesep, filesep) ;
+
+mx = sprintf ('mex -inline -O%s%s%s%s', blas, utils, posix, incdir) ;
+msg = [ ...
+    '--------------------------------------------------------------\n', ...
+    '\nCompile options:\n%s\nNow compiling.  Please wait.\n'] ;
+fprintf (msg, mx) ;
+
+% The following is adapted from GNUmakefile
+
+%-------------------------------------------------------------------------------
+% source files
+%-------------------------------------------------------------------------------
+
+% non-user-callable umf_*.[ch] files:
+umfch = { 'assemble', 'blas3_update', ...
+        'build_tuples', 'create_element', ...
+        'dump', 'extend_front', 'garbage_collection', ...
+        'get_memory', 'init_front', 'kernel', ...
+        'kernel_init', 'kernel_wrapup', ...
+        'local_search', 'lsolve', 'ltsolve', ...
+        'mem_alloc_element', 'mem_alloc_head_block', ...
+        'mem_alloc_tail_block', 'mem_free_tail_block', ...
+        'mem_init_memoryspace', ...
+        'report_vector', 'row_search', 'scale_column', ...
+        'set_stats', 'solve', 'symbolic_usage', 'transpose', ...
+        'tuple_lengths', 'usolve', 'utsolve', 'valid_numeric', ...
+        'valid_symbolic', 'grow_front', 'start_front', '2by2', ...
+	'store_lu', 'scale' } ;
+
+% non-user-callable umf_*.[ch] files, int versions only (no real/complex):
+umfint = { 'analyze', 'apply_order', 'colamd', 'free', 'fsize', ...
+        'is_permutation', 'malloc', 'realloc', 'report_perm', ...
+	'singletons' } ;
+
+% non-user-callable and user-callable amd_*.[ch] files (int versions only):
+amd = { 'aat', '1', '2', 'dump', 'postorder', 'post_tree', 'defaults', ...
+        'order', 'control', 'info', 'valid' } ;
+
+% user-callable umfpack_*.[ch] files (real/complex):
+user = { 'col_to_triplet', 'defaults', 'free_numeric', ...
+        'free_symbolic', 'get_numeric', 'get_lunz', ...
+        'get_symbolic', 'numeric', 'qsymbolic', ...
+        'report_control', 'report_info', 'report_matrix', ...
+        'report_numeric', 'report_perm', 'report_status', ...
+        'report_symbolic', 'report_triplet', ...
+        'report_vector', 'solve', 'symbolic', ...
+        'transpose', 'triplet_to_col', 'scale' ...
+	'load_numeric', 'save_numeric', 'load_symbolic', 'save_symbolic' } ;
+
+% user-callable umfpack_*.[ch], only one version
+generic = { 'timer', 'tictoc' } ;
+
+M = cell (0) ;
+
+%-------------------------------------------------------------------------------
+% Create the umfpack and amd mexFunctions for MATLAB (int versions only)
+%-------------------------------------------------------------------------------
+
+for k = 1:length(umfint)
+    M = make (M, '%s -DDINT -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
+        mx, umfint {k}, umfint {k}, 'm', obj, umfdir) ;
+end
+
+rules = { [mx ' -DDINT'] , [mx ' -DZINT'] } ;
+kinds = { 'md', 'mz' } ;
+
+for what = 1:2 
+
+    rule = rules {what} ;
+    kind = kinds {what} ;
+
+    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s.%s', rule, 'ltsolve', 'lhsolve', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DCONJUGATE_SOLVE -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s.%s', rule, 'utsolve', 'uhsolve', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDO_MAP -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_map_nox.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_nomap_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s',  ...
+        'umf_%s_%s_nomap_nox.%s', rule, 'triplet', 'triplet', kind, obj, ...
+	umfdir) ;
+
+    M = make (M, '%s -DDO_MAP -DDO_VALUES -c %sumf_%s.c', 'umf_%s.%s', ...
+        'umf_%s_%s_map_x.%s', rule, 'triplet', 'triplet', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DFIXQ -c %sumf_%s.c', 'umf_%s.%s', ...
+	'umf_%s_%s_fixq.%s', rule, 'assemble', 'assemble', kind, obj, umfdir) ;
+
+    M = make (M, '%s -DDROP -c %sumf_%s.c', 'umf_%s.%s', ...
+	'umf_%s_%s_drop.%s', rule, 'store_lu', 'store_lu', kind, obj, umfdir) ;
+
+    for k = 1:length(umfch)
+        M = make (M, '%s -c %sumf_%s.c', 'umf_%s.%s', 'umf_%s_%s.%s', ...
+            rule, umfch {k}, umfch {k}, kind, obj, umfdir) ;
+    end
+
+    M = make (M, '%s -DWSOLVE -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+        'umfpack_%s_w%s.%s', rule, 'solve', 'solve', kind, obj, umfdir) ;
+
+    for k = 1:length(user)
+        M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+            'umfpack_%s_%s.%s', rule, user {k}, user {k}, kind, obj, umfdir) ;
+    end
+end
+
+for k = 1:length(generic)
+    M = make (M, '%s -c %sumfpack_%s.c', 'umfpack_%s.%s', ...
+	'umfpack_%s_%s.%s', mx, generic {k}, generic {k}, 'm', obj, umfdir) ;
+end
+
+%----------------------------------------
+% AMD routines (int only)
+%----------------------------------------
+
+for k = 1:length(amd)
+    M = make (M, '%s -DDINT -c %samd_%s.c', 'amd_%s.%s', 'amd_%s_%s.%s', ...
+        mx, amd {k}, amd {k}, 'm', obj, amddir) ;
+end
+
+%----------------------------------------
+% compile the umfpack mexFunction
+%----------------------------------------
+
+C = sprintf ('%s -output umfpack umfpackmex.c', mx) ;
+for i = 1:length (M)
+    C = [C ' ' (M {i})] ;
+end
+C = [C ' ' blas_lib] ;
+cmd (C) ;
+
+%----------------------------------------
+% delete the object files
+%----------------------------------------
+
+for i = 1:length (M)
+    rmfile (M {i}) ;
+end
+
+%----------------------------------------
+% compile the luflop mexFunction
+%----------------------------------------
+
+cmd (sprintf ('%s -output luflop luflopmex.c', mx)) ;
+
+fprintf ('\n\nCompilation has completed.  Now trying the umfpack_simple demo.\n');
+umfpack_simple
+
+%-------------------------------------------------------------------------------
+% rmfile:  delete a file, but only if it exists
+%-------------------------------------------------------------------------------
+
+function rmfile (file)
+if (length (dir (file)) > 0)
+    delete (file) ;
+end
+
+%-------------------------------------------------------------------------------
+% cpfile:  copy the src file to the filename dst, overwriting dst if it exists
+%-------------------------------------------------------------------------------
+
+function cpfile (src, dst)
+rmfile (dst)
+if (length (dir (src)) == 0)
+    help umfpack_make
+    error (sprintf ('File does not exist: %s\n', src)) ;
+end
+copyfile (src, dst) ;
+
+%-------------------------------------------------------------------------------
+% mvfile:  move the src file to the filename dst, overwriting dst if it exists
+%-------------------------------------------------------------------------------
+
+function mvfile (src, dst)
+cpfile (src, dst) ;
+rmfile (src) ;
+
+%-------------------------------------------------------------------------------
+% cmd:  display and execute a command
+%-------------------------------------------------------------------------------
+
+function cmd (s)
+fprintf ('.') ;
+eval (s) ;
+
+%-------------------------------------------------------------------------------
+% make:  execute a "make" command for a source file
+%-------------------------------------------------------------------------------
+
+function M = make (M, s, src, dst, rule, file1, file2, kind, obj, srcdir)
+cmd (sprintf (s, rule, srcdir, file1)) ;
+src = sprintf (src, file1, obj) ;
+dst = sprintf (dst, kind, file2, obj) ;
+mvfile (src, dst) ;
+M {end + 1} = dst ;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_report.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,346 @@
+function umfpack_report (Control, Info)
+% UMFPACK_REPORT
+%
+%       umfpack_report (Control, Info) ;
+%
+% Prints the current Control settings for umfpack, and the statistical
+% information returned by umfpack in the Info array.  If Control is
+% an empty matrix, then the default control settings are printed.
+%
+% Control is 20-by-1, and Info is 90-by-1.  Not all entries are used.
+%
+% Alternative usages:
+%
+%       umfpack_report ([ ], Info) ;    print the default control parameters
+%                                       and the Info array.
+%       umfpack_report (Control) ;      print the control parameters only.
+%       umfpack_report ;                print the default control parameters
+%                                       and an empty Info array.
+%
+% See also umfpack, umfpack_make, umfpack_details,
+% umfpack_demo, and umfpack_simple.
+
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  See ../README for License.
+
+%-------------------------------------------------------------------------------
+% get inputs, use defaults if input arguments not present
+%-------------------------------------------------------------------------------
+
+% The contents of Control and Info are defined in umfpack.h
+if (nargin < 1)
+    Control = [] ;
+end
+if (nargin < 2)
+    Info = [] ;
+end
+if (isempty (Control))
+    Control = umfpack ;
+end
+if (isempty (Info))
+    Info = [ 0 (-ones (1, 89)) ] ;
+end
+
+%-------------------------------------------------------------------------------
+% control settings
+%-------------------------------------------------------------------------------
+
+fprintf ('\nUMFPACK Version 4.3:  Control settings:\n\n') ;
+fprintf ('    Control (1): print level: %d\n', Control (1)) ;
+fprintf ('    Control (2): dense row parameter:    %g\n', Control (2)) ;
+fprintf ('       "dense" rows have    > max (16, (%g)*16*sqrt(n_col)) entries\n', Control (2)) ;
+fprintf ('    Control (3): dense column parameter: %g\n', Control (3)) ;
+fprintf ('       "dense" columns have > max (16, (%g)*16*sqrt(n_row)) entries\n', Control (3)) ;
+fprintf ('    Control (4): pivot tolerance: %g\n', Control (4)) ;
+fprintf ('    Control (5): max block size for dense matrix kernels: %d\n', Control (5)) ;
+prstrat ('    Control (6): strategy: %g ', Control (6)) ;
+fprintf ('    Control (7): initial allocation ratio: %g\n', Control (7)) ;
+fprintf ('    Control (8): max iterative refinement steps: %d\n', Control (8)) ;
+fprintf ('    Control (13): 2-by-2 pivot tolerance: %g\n', Control (13)) ;
+fprintf ('    Control (14): Q fixed during numeric factorization: %g ', Control (14)) ;
+if (Control (14) > 0)
+    fprintf ('(yes)\n') ;
+elseif (Control (14) < 0)
+    fprintf ('(no)\n') ;
+else
+    fprintf ('(auto)\n') ;
+end
+fprintf ('    Control (15): AMD dense row/column parameter: %g\n', Control (15)) ;
+fprintf ('       "dense" rows/columns in A+A'' have > max (16, (%g)*sqrt(n)) entries.\n', Control (15)) ;
+fprintf ('        Only used if the AMD ordering is used.\n') ;
+fprintf ('    Control (16): diagonal pivot tolerance: %g\n', Control (16)) ;
+fprintf ('        Only used if diagonal pivoting is attempted.\n') ;
+
+fprintf ('    Control (17): scaling option: %g ', Control (17)) ;
+if (Control (17) == 0)
+    fprintf ('(none)\n') ;
+elseif (Control (17) == 2)
+    fprintf ('(scale the matrix by\n') ;
+    fprintf ('        dividing each row by max. abs. value in each row)\n') ;
+else
+    fprintf ('(scale the matrix by\n') ;
+    fprintf ('        dividing each row by sum of abs. values in each row)\n') ;
+end
+
+fprintf ('    Control (18): frontal matrix allocation ratio: %g\n', Control (18)) ;
+fprintf ('    Control (19): drop tolerance: %g\n', Control (19)) ;
+fprintf ('    Control (20): AMD and COLAMD aggressive absorption: %g ', Control (20)) ;
+yes_no (Control (20)) ;
+
+% compile-time options:
+
+fprintf ('\n  The following options can only be changed at compile-time:\n') ;
+
+if (Control (9) == 1)
+    fprintf ('    Control (9): compiled to use the BLAS\n') ;
+else
+    fprintf ('    Control (9): compiled without the BLAS\n') ;
+    fprintf ('        (you will not get the best possible performance)\n') ;
+end
+
+if (Control (10) == 1)
+    fprintf ('    Control (10): compiled for MATLAB\n') ;
+elseif (Control (10) == 2)
+    fprintf ('    Control (10): compiled for MATLAB\n') ;
+    fprintf ('        Uses internal utMalloc, utFree, utRealloc, utPrintf\n') ;
+    fprintf ('        utDivideComplex, and utFdlibm_hypot routines.\n') ;
+else
+    fprintf ('    Control (10): not compiled for MATLAB\n') ;
+    fprintf ('        Uses ANSI C malloc, free, realloc, and printf\n') ;
+    fprintf ('        instead of mxMalloc, mxFree, mxRealloc, and mexPrintf.\n') ;
+    fprintf ('        Printing will be in terms of 0-based matrix indexing,\n') ;
+    fprintf ('        not 1-based as is expected in MATLAB.  Diary output may\n') ;
+    fprintf ('        not be properly recorded.\n') ;
+end
+
+if (Control (11) == 2)
+    fprintf ('    Control (11): uses POSIX times ( ) to get CPU time and wallclock time.\n') ;
+elseif (Control (11) == 1)
+    fprintf ('    Control (11): uses getrusage to get CPU time.\n') ;
+else
+    fprintf ('    Control (11): uses ANSI C clock to get CPU time.\n') ;
+    fprintf ('        The CPU time may wrap around, type "help cputime".\n') ;
+end
+
+if (Control (12) == 1)
+    fprintf ('    Control (12): compiled with debugging enabled\n') ;
+    fprintf ('        ###########################################\n') ;
+    fprintf ('        ### This will be exceedingly slow! ########\n') ;
+    fprintf ('        ###########################################\n') ;
+    if (Control (10) == 1)
+        fprintf ('        Uses mxAssert.\n') ;
+    elseif (Control (10) == 2)
+        fprintf ('        Uses utAssert.\n') ;
+    else
+        fprintf ('        Uses ANSI C assert instead of mxAssert.\n') ;
+    end
+else
+    fprintf ('    Control (12): compiled for normal operation (no debugging)\n') ;
+end
+
+%-------------------------------------------------------------------------------
+% Info:
+%-------------------------------------------------------------------------------
+
+if (nargin == 1)
+    return
+end
+
+status = Info (1) ;
+fprintf ('\nUMFPACK status:  Info (1): %d, ', status) ;
+
+if (status == 0)
+    fprintf ('OK\n') ;
+elseif (status == 1)
+    fprintf ('WARNING  matrix is singular\n') ;
+elseif (status == -1)
+    fprintf ('ERROR    out of memory\n') ;
+elseif (status == -3)
+    fprintf ('ERROR    numeric LU factorization is invalid\n') ;
+elseif (status == -4)
+    fprintf ('ERROR    symbolic LU factorization is invalid\n') ;
+elseif (status == -5)
+    fprintf ('ERROR    required argument is missing\n') ;
+elseif (status == -6)
+    fprintf ('ERROR    n <= 0\n') ;
+elseif (status <= -7 & status >= -12 | status == -14)
+    fprintf ('ERROR    matrix A is corrupted\n') ;
+elseif (status == -13)
+    fprintf ('ERROR    invalid system\n') ;
+elseif (status == -15)
+    fprintf ('ERROR    invalid permutation\n') ;
+elseif (status == -911)
+    fprintf ('ERROR    internal error!\n') ;
+    fprintf ('Please report this error to Tim Davis (davis@cise.ufl.edu)\n') ;
+else
+    fprintf ('ERROR    unrecognized error.  Info array corrupted\n') ;
+end
+
+fprintf ('    (a -1 means the entry has not been computed):\n') ;
+
+fprintf ('\n  Basic statistics:\n') ;
+fprintf ('    Info (2):  %d, # of rows of A\n', Info (2)) ;
+fprintf ('    Info (17): %d, # of columns of A\n', Info (17)) ;
+fprintf ('    Info (3): %d, nnz (A)\n', Info (3)) ;
+fprintf ('    Info (4): %d, Unit size, in bytes, for memory usage reported below\n', Info (4)) ;
+fprintf ('    Info (5): %d, size of int (in bytes)\n', Info (5)) ;
+fprintf ('    Info (6): %d, size of long (in bytes)\n', Info (6)) ;
+fprintf ('    Info (7): %d, size of pointer (in bytes)\n', Info (7)) ;
+fprintf ('    Info (8): %d, size of numerical entry (in bytes)\n', Info (8)) ;
+
+fprintf ('\n  Pivots with zero Markowitz cost removed to obtain submatrix S:\n') ;
+fprintf ('    Info (57): %d, # of pivots with one entry in pivot column\n', Info (57)) ;
+fprintf ('    Info (58): %d, # of pivots with one entry in pivot row\n', Info (58)) ;
+fprintf ('    Info (59): %d, # of rows/columns in submatrix S (if square)\n', Info (59)) ;
+fprintf ('    Info (60): %d ') ;
+if (Info (60) > 0)
+    fprintf ('submatrix S square and diagonal preserved\n') ;
+elseif (Info  (60) == 0)
+    fprintf ('submatrix S not square or diagonal not preserved\n') ;
+else
+    fprintf ('\n') ;
+end
+fprintf ('    Info (9):  %d, # of "dense" rows in S\n', Info (9)) ;
+fprintf ('    Info (10): %d, # of empty rows in S\n', Info (10)) ;
+fprintf ('    Info (11): %d, # of "dense" columns in S\n', Info (11)) ;
+fprintf ('    Info (12): %d, # of empty columns in S\n', Info (12)) ;
+fprintf ('    Info (34): %g, symmetry of pattern of S\n', Info (34)) ;
+fprintf ('    Info (35): %d, # of off-diagonal nonzeros in S+S''\n', Info (35)) ;
+fprintf ('    Info (36): %d, nnz (diag (S))\n', Info (36)) ;
+
+fprintf ('\n  2-by-2 pivoting to place large entries on diagonal:\n') ;
+fprintf ('    Info (52): %d, # of small diagonal entries of S\n', Info (52)) ;
+fprintf ('    Info (53): %d, # of unmatched small diagonal entries\n', Info (53)) ;
+fprintf ('    Info (54): %g, symmetry of P2*S\n', Info (54)) ;
+fprintf ('    Info (55): %d, # of off-diagonal entries in (P2*S)+(P2*S)''\n', Info (55)) ;
+fprintf ('    Info (56): %d, nnz (diag (P2*S))\n', Info (56)) ;
+
+fprintf ('\n  AMD results, for strict diagonal pivoting:\n') ;
+fprintf ('    Info (37): %d, est. nz in L and U\n', Info (37)) ;
+fprintf ('    Info (38): %g, est. flop count\n', Info (38)) ;
+fprintf ('    Info (39): %g, # of "dense" rows in S+S''\n', Info (39)) ;
+fprintf ('    Info (40): %g, est. max. nz in any column of L\n', Info (40)) ;
+
+fprintf ('\n  Final strategy selection, based on the analysis above:\n') ;
+prstrat ('    Info (19): %d, strategy used ', Info (19)) ;
+fprintf ('    Info (20): %d, ordering used ', Info (20)) ;
+if (Info (20) == 0)
+    fprintf ('(COLAMD on A)\n') ;
+elseif (Info (20) == 1)
+    fprintf ('(AMD on A+A'')\n') ;
+elseif (Info (20) == 2)
+    fprintf ('(provided by user)\n') ;
+else
+    fprintf ('(undefined ordering option)\n') ;
+end
+fprintf ('    Info (32): %d, Q fixed during numeric factorization: ', Info (32)) ;
+yes_no (Info (32)) ;
+fprintf ('    Info (33): %d, prefer diagonal pivoting: ', Info (33)) ;
+yes_no (Info (33)) ;
+
+fprintf ('\n  symbolic analysis time and memory usage:\n') ;
+fprintf ('    Info (13): %d, defragmentations during symbolic analysis\n', Info (13)) ;
+fprintf ('    Info (14): %d, memory used during symbolic analysis (Units)\n', Info (14)) ;
+fprintf ('    Info (15): %d, final size of symbolic factors (Units)\n', Info (15)) ;
+fprintf ('    Info (16): %.2f, symbolic analysis CPU time (seconds)\n', Info (16)) ;
+fprintf ('    Info (18): %.2f, symbolic analysis wall clock time (seconds)\n', Info (18)) ;
+
+fprintf ('\n  Estimates computed in the symbolic analysis:\n') ;
+fprintf ('    Info (21): %d, est. size of LU factors (Units)\n', Info (21)) ;
+fprintf ('    Info (22): %d, est. total peak memory usage (Units)\n', Info (22)) ;
+fprintf ('    Info (23): %d, est. factorization flop count\n', Info (23)) ;
+fprintf ('    Info (24): %d, est. nnz (L)\n', Info (24)) ;
+fprintf ('    Info (25): %d, est. nnz (U)\n', Info (25)) ;
+fprintf ('    Info (26): %d, est. initial size, variable-part of LU (Units)\n', Info (26)) ;
+fprintf ('    Info (27): %d, est. peak size, of variable-part of LU (Units)\n', Info (27)) ;
+fprintf ('    Info (28): %d, est. final size, of variable-part of LU (Units)\n', Info (28)) ;
+fprintf ('    Info (29): %d, est. max frontal matrix size (# of entries)\n', Info (29)) ;
+fprintf ('    Info (30): %d, est. max # of rows in frontal matrix\n', Info (30)) ;
+fprintf ('    Info (31): %d, est. max # of columns in frontal matrix\n', Info (31)) ;
+
+fprintf ('\n  Computed in the numeric factorization (estimates shown above):\n') ;
+fprintf ('    Info (41): %d, size of LU factors (Units)\n', Info (41)) ;
+fprintf ('    Info (42): %d, total peak memory usage (Units)\n', Info (42)) ;
+fprintf ('    Info (43): %d, factorization flop count\n', Info (43)) ;
+fprintf ('    Info (44): %d, nnz (L)\n', Info (44)) ;
+fprintf ('    Info (45): %d, nnz (U)\n', Info (45)) ;
+fprintf ('    Info (46): %d, initial size of variable-part of LU (Units)\n', Info (46)) ;
+fprintf ('    Info (47): %d, peak size of variable-part of LU (Units)\n', Info (47)) ;
+fprintf ('    Info (48): %d, final size of variable-part of LU (Units)\n', Info (48)) ;
+fprintf ('    Info (49): %d, max frontal matrix size (# of numerical entries)\n', Info (49)) ;
+fprintf ('    Info (50): %d, max # of rows in frontal matrix\n', Info (50)) ;
+fprintf ('    Info (51): %d, max # of columns in frontal matrix\n', Info (51)) ;
+
+fprintf ('\n  Computed in the numeric factorization (no estimates computed a priori):\n') ;
+fprintf ('    Info (61): %d, defragmentations during numeric factorization\n', Info (61)) ;
+fprintf ('    Info (62): %d, reallocations during numeric factorization\n', Info (62)) ;
+fprintf ('    Info (63): %d, costly reallocations during numeric factorization\n', Info (63)) ;
+fprintf ('    Info (64): %d, integer indices in compressed pattern of L and U\n', Info (64)) ;
+fprintf ('    Info (65): %d, numerical values stored in L and U\n', Info (65)) ;
+fprintf ('    Info (66): %.2f, numeric factorization CPU time (seconds)\n', Info (66)) ;
+fprintf ('    Info (76): %.2f, numeric factorization wall clock time (seconds)\n', Info (76)) ;
+if (Info (66) > 0.05 & Info (43) > 0)
+fprintf ('    mflops in numeric factorization phase: %.2f\n', 1e-6 * Info (43) / Info (66)) ;
+end
+fprintf ('    Info (67): %d, nnz (diag (U))\n', Info (67)) ;
+fprintf ('    Info (68): %g, reciprocal condition number estimate\n', Info (68)) ;
+fprintf ('    Info (69): %g, matrix was ', Info (69)) ;
+if (Info (69) == 0)
+    fprintf ('not scaled\n') ;
+elseif (Info (69) == 2)
+    fprintf ('scaled (row max)\n') ;
+else
+    fprintf ('scaled (row sum)\n') ;
+end
+fprintf ('    Info (70): %g, min. scale factor of rows of A\n', Info (70)) ;
+fprintf ('    Info (71): %g, max. scale factor of rows of A\n', Info (71)) ;
+fprintf ('    Info (72): %g, min. abs. on diagonal of U\n', Info (72)) ;
+fprintf ('    Info (73): %g, max. abs. on diagonal of U\n', Info (73)) ;
+fprintf ('    Info (74): %g, initial allocation parameter used\n', Info (74)) ;
+fprintf ('    Info (75): %g, # of forced updates due to frontal growth\n', Info (75)) ;
+fprintf ('    Info (77): %d, # of off-diaogonal pivots\n', Info (77)) ;
+fprintf ('    Info (78): %d, nnz (L), if no small entries dropped\n', Info (78)) ;
+fprintf ('    Info (79): %d, nnz (U), if no small entries dropped\n', Info (79)) ;
+fprintf ('    Info (80): %d, # of small entries dropped\n', Info (80)) ;
+
+fprintf ('\n  Computed in the solve step:\n') ;
+fprintf ('    Info (81): %d, iterative refinement steps taken\n', Info (81)) ;
+fprintf ('    Info (82): %d, iterative refinement steps attempted\n', Info (82)) ;
+fprintf ('    Info (83): %g, omega(1), sparse-backward error estimate\n', Info (83)) ;
+fprintf ('    Info (84): %g, omega(2), sparse-backward error estimate\n', Info (84)) ;
+fprintf ('    Info (85): %d, solve flop count\n', Info (85)) ;
+fprintf ('    Info (86): %.2f, solve CPU time (seconds)\n', Info (86)) ;
+fprintf ('    Info (87): %.2f, solve wall clock time (seconds)\n', Info (87)) ;
+
+fprintf ('\n    Info (88:90): unused\n\n') ;
+
+%-------------------------------------------------------------------------------
+
+function prstrat (fmt, strategy)
+fprintf (fmt, strategy) ;
+if (strategy == 1)
+    fprintf ('(unsymmetric)\n') ;
+    fprintf ('        Q = COLAMD (A), Q refined during numerical\n') ;
+    fprintf ('        factorization, and no attempt at diagonal pivoting.\n') ;
+elseif (strategy == 2)
+    fprintf ('(symmetric, with 2-by-2 pivoting)\n') ;
+    fprintf ('        P2 = row permutation to place large values on the diagonal\n') ;
+    fprintf ('        Q = AMD (P2*A+(P2*A)''), Q not refined during numeric factorization,\n') ;
+    fprintf ('        and diagonal pivoting attempted.\n') ;
+elseif (strategy == 3)
+    fprintf ('(symmetric)\n') ;
+    fprintf ('        Q = AMD (A+A''), Q not refined during numeric factorization,\n') ;
+    fprintf ('        and diagonal pivoting (P=Q'') attempted.\n') ;
+else
+    strategy = 0 ;
+    fprintf ('(auto)\n') ;
+end
+
+%-------------------------------------------------------------------------------
+
+function yes_no (s)
+if (s == 0)
+    fprintf ('(no)\n') ;
+else
+    fprintf ('(yes)\n') ;
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,61 @@
+% umfpack_simple:  a simple demo of UMFPACK
+%
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.
+% 
+% UMFPACK License:
+% 
+%     Your use or distribution of UMFPACK or any modified version of
+%     UMFPACK implies that you agree to this License.
+% 
+%     THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+%     EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+% 
+%     Permission is hereby granted to use or copy this program, provided
+%     that the Copyright, this License, and the Availability of the original
+%     version is retained on all copies.  User documentation of any code that
+%     uses UMFPACK or any modified version of UMFPACK code must cite the
+%     Copyright, this License, the Availability note, and "Used by permission."
+%     Permission to modify the code and to distribute modified code is granted,
+%     provided the Copyright, this License, and the Availability note are
+%     retained, and a notice that the code was modified is included.  This
+%     software was developed with support from the National Science Foundation,
+%     and is provided to you free of charge.
+% 
+% Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+%
+% See also: umfpack, umfpack_details
+
+help umfpack_simple
+i = input ('Hit enter to agree to the above License: ', 's') ;
+if (~isempty (i))
+    error ('terminating') ;
+end
+
+format short
+
+A = [
+ 2  3  0  0  0
+ 3  0  4  0  6
+ 0 -1 -3  2  0
+ 0  0  1  0  0
+ 0  4  2  0  1
+]
+
+A = sparse (A) ;
+
+b = [8 45 -3 3 19]'
+
+fprintf ('Solution to Ax=b via UMFPACK:\n') ;
+fprintf ('x1 = umfpack (A, ''\\'', b)\n') ;
+
+x1 = umfpack (A, '\\', b)
+
+fprintf ('Solution to Ax=b via OCTAVE:\n') ;
+fprintf ('x2 = A\\b\n') ;
+
+x2 = A\b
+
+fprintf ('norm (x1-x2) should be small: %g\n', norm (x1-x2)) ;
+
+fprintf ('Type ''umfpack_demo'' for a full demo of UMFPACK\n') ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_simple.m.out	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,79 @@
+octave:4> umfpack_simple
+umfpack_simple is the file: /home/dbateman/octave/devel/octave-sparse/UMFPACKv4.3/UMFPACK/OCTAVE/umfpack_simple.m
+
+umfpack_simple:  a simple demo of UMFPACK
+
+UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+Davis.  All Rights Reserved.
+
+UMFPACK License:
+
+    Your use or distribution of UMFPACK or any modified version of
+    UMFPACK implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses UMFPACK or any modified version of UMFPACK code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability: http://www.cise.ufl.edu/research/sparse/umfpack
+
+See also: umfpack, umfpack_details
+
+
+Additional help for built-in functions, operators, and variables
+is available in the on-line version of the manual.  Use the command
+`help -i <topic>' to search the manual index.
+
+Help and information about Octave is also available on the WWW
+at http://www.octave.org and via the help@octave.org
+mailing list.
+Hit enter to agree to the above License: 
+A =
+
+   2   3   0   0   0
+   3   0   4   0   6
+   0  -1  -3   2   0
+   0   0   1   0   0
+   0   4   2   0   1
+
+b =
+
+    8
+   45
+   -3
+    3
+   19
+
+Solution to Ax=b via UMFPACK:
+x1 = umfpack (A, '\', b)
+x1 =
+
+  1.00000
+  2.00000
+  3.00000
+  4.00000
+  5.00000
+
+Solution to Ax=b via OCTAVE:
+x2 = A\b
+x2 =
+
+  1.00000
+  2.00000
+  3.00000
+  4.00000
+  5.00000
+
+norm (x1-x2) should be small: 0
+Type 'umfpack_demo' for a full demo of UMFPACK
+octave:5> diary off
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/OCTAVE/umfpack_solve.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,97 @@
+function x = umfpack_solve (arg1, op, arg2, Control)
+% UMFPACK_SOLVE
+%
+% x = umfpack_solve (A, '\', b, Control)
+% x = umfpack_solve (b, '/', A, Control)
+%
+% Computes x = A\b, or b/A, where A is square.  Uses UMFPACK if A is sparse.
+% The Control argument is optional.
+%
+% See also umfpack, umfpack_make, umfpack_details, umfpack_report,
+% and umfpack_simple.
+
+% UMFPACK Version 4.3 (Jan. 16, 2004), Copyright (c) 2004 by Timothy A.
+% Davis.  All Rights Reserved.  Type umfpack_details for License.
+
+%-------------------------------------------------------------------------------
+% check inputs and get default control parameters
+%-------------------------------------------------------------------------------
+
+if (op == '\\')
+    A = arg1 ;
+    b = arg2 ;
+elseif (op == '/')
+    A = arg2 ;
+    b = arg1 ;
+else
+    help umfack_solve
+    error ('umfpack_solve:  unrecognized operator') ;
+end
+
+[m n] = size (A) ;
+if (m ~= n)
+    help umfpack_solve
+    error ('umfpack_solve:  A must be square') ;
+end
+
+[m1 n1] = size (b) ;
+if ((op == '\\' & n ~= m1) | (op == '/' & n1 ~= m))
+    help umfpack_solve
+    error ('umfpack_solve:  b has the wrong dimensions') ;
+end
+
+if (nargin < 4)
+    Control = umfpack ;
+end
+
+%-------------------------------------------------------------------------------
+% solve the system
+%-------------------------------------------------------------------------------
+
+if (op == '\\')
+
+    if (~issparse (A))
+
+	% A is not sparse, so just use MATLAB
+	x = A\b ;
+
+    elseif (n1 == 1 & ~issparse (b))
+
+	% the UMFPACK '\' requires b to be a dense column vector
+	x = umfpack (A, '\\', b, Control) ;
+
+    else
+
+	% factorize with UMFPACK and do the forward/back solves in MATLAB 
+	[L, U, P, Q, R] = umfpack (A, Control) ;
+	keyboard
+	x = Q * (U \ (L \ (P * (R \ b)))) ;
+
+    end
+
+else
+
+    if (~issparse (A))
+
+	% A is not sparse, so just use MATLAB
+	x = b/A ;
+
+    elseif (m1 == 1 & ~issparse (b))
+
+	% the UMFPACK '/' requires b to be a dense column vector
+	x = umfpack (b, '/', A, Control) ;
+
+    else
+
+	% factorize with UMFPACK and do the forward/back solves in MATLAB
+	% this mimics the behavior of x = b/A, except for the row scaling
+	[L, U, P, Q, R] = umfpack (A.', Control) ;
+	x = (Q * (U \ (L \ (P * (R \ (b.')))))).' ;
+
+	% an alternative method:
+	% [L, U, P, Q, r] = umfpack (A, Control) ;
+	% x = (R \ (P' * (L.' \ (U.' \ (Q' * b.'))))).' ;
+
+    end
+
+end
Binary file liboctave/UMFPACK/UMFPACK/OCTAVE/west0067.mat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/README.txt	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,394 @@
+UMFPACK Version 4.4:  a set of routines solving sparse linear systems via LU
+    factorization.  Requires two other packages:  the BLAS (dense matrix
+    operations) and AMD (sparse matrix minimum degree ordering).  Includes
+    a C-callable and MATLAB interface, and a basic FORTRAN 77 interface to
+    a subset of the C-callable routines.
+
+Quick start (Unix, or Windows with Cygwin):
+
+    To compile, test, and install both UMFPACK and AMD, the UMFPACK and AMD
+    directories must be in the same parent directory.  To configure, edit
+    UMFPACK/Make/Make.include and AMD/Make/Make.include (otherwise the BLAS
+    will not be used, and UMFPACK will be slow).  cd to this directory (UMFPACK)
+    and type "make" (or "make lib" if you do not have MATLAB).  To compile and
+    run a demo program for Harwell/Boeing matrices, type "make hb".  To compile
+    a FORTRAN main program that calls the 32-bit C-callable UMFPACK library,
+    type "make fortran".  When done, type "make clean" to remove unused *.o
+    files (keeps the compiled libraries and demo programs).  See the User Guide
+    (Doc/UserGuide.pdf), or UMFPACK/Make/Make.include, for more details
+    (including options for compiling 64-bit mode).
+
+Quick start (for MATLAB users):
+
+    To compile, test, and install the UMFPACK mexFunction, cd to the
+    UMFPACK/MATLAB directory and type umfpack_make at the MATLAB prompt.
+    This works on any system supported by MATLAB.
+
+--------------------------------------------------------------------------------
+
+UMFPACK Version 4.4 (Jan. 28, 2005),  Copyright (c) 2005 by Timothy A.
+Davis.  All Rights Reserved.
+
+UMFPACK License:
+
+    Your use or distribution of UMFPACK or any modified version of
+    UMFPACK implies that you agree to this License.
+
+    THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+    EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+
+    Permission is hereby granted to use or copy this program, provided
+    that the Copyright, this License, and the Availability of the original
+    version is retained on all copies.  User documentation of any code that
+    uses UMFPACK or any modified version of UMFPACK code must cite the
+    Copyright, this License, the Availability note, and "Used by permission."
+    Permission to modify the code and to distribute modified code is granted,
+    provided the Copyright, this License, and the Availability note are
+    retained, and a notice that the code was modified is included.  This
+    software was developed with support from the National Science Foundation,
+    and is provided to you free of charge.
+
+Availability:
+
+    http://www.cise.ufl.edu/research/sparse/umfpack
+
+    UMFPACK (including versions 2.2.1 and earlier, in Fortran) is available at
+    http://www.cise.ufl.edu/research/sparse.  MA38 is available in the Harwell
+    Subroutine Library.  This version of UMFPACK includes a modified form of
+    COLAMD Version 2.0, originally released on Jan. 31, 2000, also available at
+    http://www.cise.ufl.edu/research/sparse.  COLAMD V2.0 is also incorporated
+    as a built-in function in MATLAB version 6.1, by The MathWorks, Inc.
+    (http://www.mathworks.com).  COLAMD V1.0 appears as a column-preordering
+    in SuperLU (SuperLU is available at http://www.netlib.org).
+    UMFPACK v4.0 is a built-in routine in MATLAB 6.5.
+    UMFPACK v4.3 is a built-in routine in MATLAB 7.1.
+
+--------------------------------------------------------------------------------
+
+Refer to ../AMD/README for the License for AMD, which is a separate
+package for ordering sparse matrices that is required by UMFPACK.
+UMFPACK v4.4 can use either AMD v1.0 or v1.1.
+
+--------------------------------------------------------------------------------
+
+This is the UMFPACK README.txt file.  It is a terse overview of UMFPACK.
+Refer to the User Guide (Doc/UserGuide.pdf) for how to install and use UMFPACK,
+or to the Quick Start Guide, QuickStart.pdf.
+
+Description:
+
+    UMFPACK is a set of routines for solving unsymmetric sparse linear systems,
+    Ax=b, using the Unsymmetric MultiFrontal method.  Written in ANSI/ISO C,
+    with a MATLAB (Version 6.0 or later) interface.
+
+    For best performance, UMFPACK requires an optimized BLAS library.  It can
+    also be compiled without any BLAS at all.  UMFPACK requires AMD Version 1.0
+    or Version 1.1
+
+Authors:
+
+    Timothy A. Davis (davis@cise.ufl.edu), University of Florida.
+
+    Includes a modified version of COLAMD V2.0, by Stefan I. Larimore and
+    Timothy A. Davis, University of Florida.  The COLAMD algorithm was developed
+    in collaboration with John Gilbert, Xerox Palo Alto Research Center, and
+    Esmond Ng, Lawrence Berkeley National Laboratory.
+
+    Includes AMD, by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff.
+
+    UMFPACK Version 2.2.1 (MA38 in the Harwell Subroutine Library) is
+    co-authored with Iain S. Duff, Rutherford Appleton Laboratory.
+
+Acknowledgements:
+
+    This work was supported by the National Science Foundation, under
+    grants DMS-9504974, DMS-9803599, and CCR-0203270.
+
+    Portions of this work were done while on sabbatical at Stanford University
+    and Lawrence Berkeley National Laboratory (with funding from the SciDAC
+    program).  I would like to thank Gene Golub, Esmond Ng, and Horst Simon
+    for making this sabbatical possible.
+
+    I would also like to thank the many researchers who provided sparse
+    matrices from a wide range of domains and used earlier versions of UMFPACK/
+    MA38 in their applications, and thus assisted in the practical development
+    of the algorithm (see http://www.cise.ufl.edu/research/sparse, future
+    contributions of matrices are always welcome).
+
+    The MathWorks, Inc., provided a pre-release of MATLAB V6 which allowed me
+    to release the first umfpack mexFunction (v3.0) about 6 months earlier than
+    I had originally planned.  They also supported the extension of UMFPACK to
+    complex, singular, and rectangular matrices (UMFPACK v4.0).
+
+    Penny Anderson (The MathWorks, Inc.), Anshul Gupta (IBM), and Friedrich
+    Grund (WAIS) assisted in porting UMFPACK to different platforms.  Penny
+    Anderson also incorporated UMFPACK v4.0 into MATLAB, for lu, backslash (\),
+    and forward slash (/).
+
+    David Bateman (Motorola) wrote the initial version of the packed complex
+    input option, and umfpack_get_determinant.
+
+--------------------------------------------------------------------------------
+Files and directories in the UMFPACK distribution:
+--------------------------------------------------------------------------------
+
+    ----------------------------------------------------------------------------
+    Subdirectories of the UMFPACK directory:
+    ----------------------------------------------------------------------------
+
+    Doc		documentation
+    Make	for compiling UMFPACK (a symbolic link to ../AMD/Make)
+    Source	primary source code
+    Include	include files for use in your code that calls UMFPACK
+    Demo	demo programs.  also serves as test of the UMFPACK installation.
+    MATLAB	UMFPACK mexFunction for MATLAB, and supporting m-files
+    Lib		where the compiled C-callable UMFPACK library is placed.
+
+    ----------------------------------------------------------------------------
+    Files in the UMFPACK directory:
+    ----------------------------------------------------------------------------
+
+    Makefile	top-level Makefile for GNU make or original make.
+		Windows users would require Cygwin to use "make"
+
+    README.txt	this file
+
+    ----------------------------------------------------------------------------
+    Doc directory: documentation
+    ----------------------------------------------------------------------------
+
+    ChangeLog			change log
+    License			the UMFPACK License
+    Makefile			for creating the documentation
+    QuickStart.tex		Quick Start guide (source)
+    QuickStart.pdf		Quick Start guide (PDF)
+    UserGuide.bib		User Guide (references)
+    UserGuide.sed1		sed script for processing UserGuide.stex
+    UserGuide.sed2		sed script for processing UserGuide.stex
+    UserGuide.stex		User Guide (LaTeX)
+    UserGuide.pdf		User Guide (PDF)
+
+    ----------------------------------------------------------------------------
+    Make directory: for compiling the UMFPACK library (Lib/libumfpack.a)
+    ----------------------------------------------------------------------------
+
+    This is a symbolic link to the ../AMD/Make directory.  Refer to the
+    ../AMD/README file for a list of its contents.
+
+    ----------------------------------------------------------------------------
+    Source directory:
+    ----------------------------------------------------------------------------
+
+    GNUmakefile			a nice Makefile, for GNU make
+    Makefile			an ugly Unix Makefile (for older make's)
+
+    umfpack_col_to_triplet.c	convert col form to triplet
+    umfpack_defaults.c		set Control defaults
+    umfpack_free_numeric.c	free Numeric object
+    umfpack_free_symbolic.c	free Symbolic object
+    umfpack_get_determinant.c	compute determinant from Numeric object
+    umfpack_get_lunz.c		get nz's in L and U
+    umfpack_get_numeric.c	get Numeric object
+    umfpack_get_symbolic.c	get Symbolic object
+    umfpack_load_numeric.c	load Numeric object from file
+    umfpack_load_symbolic.c	load Symbolic object from file
+    umfpack_numeric.c		numeric factorization
+    umfpack_qsymbolic.c		symbolic factorization, user Q
+    umfpack_report_control.c	print Control settings
+    umfpack_report_info.c	print Info statistics
+    umfpack_report_matrix.c	print col or row-form sparse matrix
+    umfpack_report_numeric.c	print Numeric object
+    umfpack_report_perm.c	print permutation
+    umfpack_report_status.c	print return status
+    umfpack_report_symbolic.c	print Symbolic object
+    umfpack_report_triplet.c	print triplet matrix
+    umfpack_report_vector.c	print dense vector
+    umfpack_save_numeric.c	save Numeric object to file
+    umfpack_save_symbolic.c	save Symbolic object to file
+    umfpack_scale.c		scale a vector
+    umfpack_solve.c		solve a linear system
+    umfpack_symbolic.c		symbolic factorization
+    umfpack_tictoc.c		timer
+    umfpack_timer.c		timer
+    umfpack_transpose.c		transpose a matrix
+    umfpack_triplet_to_col.c	convert triplet to col form
+
+    umf_config.h		configuration file (BLAS, memory, timer)
+    umf_internal.h		definitions internal to UMFPACK
+    umf_version.h		version definitions (int/long, real/complex)
+
+    umf_2by2.[ch]
+    umf_analyze.[ch]		symbolic factorization of A'*A
+    umf_apply_order.[ch]	apply column etree postorder
+    umf_assemble.[ch]		assemble elements into current front
+    umf_blas3_update.[ch]	rank-k update.  Uses level-3 BLAS
+    umf_build_tuples.[ch]	construct tuples for elements
+    umf_colamd.[ch]		COLAMD pre-ordering, modified for UMFPACK
+    umf_create_element.[ch]	create a new element
+    umf_dump.[ch]		debugging routines, not normally active
+    umf_extend_front.[ch]	extend the current frontal matrix
+    umf_free.[ch]		free memory
+    umf_fsize.[ch]		determine largest front in each subtree
+    umf_garbage_collection.[ch]	compact Numeric->Memory
+    umf_get_memory.[ch]		make Numeric->Memory bigger
+    umf_grow_front.[ch]		make current frontal matrix bigger
+    umf_init_front.[ch]		initialize a new frontal matrix
+    umf_is_permutation.[ch]	checks the validity of a permutation vector
+    umf_kernel.[ch]		the main numeric factorization kernel
+    umf_kernel_init.[ch]	initializations for umf_kernel
+    umf_kernel_wrapup.[ch]	wrapup for umf_kernel
+    umf_local_search.[ch]	local row and column pivot search
+    umf_lsolve.[ch]		solve Lx=b
+    umf_ltsolve.[ch]		solve L'x=b and L.'x=b
+    umf_malloc.[ch]		malloc some memory
+    umf_mem_alloc_element.[ch]		allocate element in Numeric->Memory
+    umf_mem_alloc_head_block.[ch]	alloc. block at head of Numeric->Memory
+    umf_mem_alloc_tail_block.[ch]	alloc. block at tail of Numeric->Memory
+    umf_mem_free_tail_block.[ch]	free block at tail of Numeric->Memory
+    umf_mem_init_memoryspace.[ch]	initialize Numeric->Memory
+    umf_realloc.[ch]		realloc memory
+    umf_report_perm.[ch]	print a permutation vector
+    umf_report_vector.[ch]	print a double vector
+    umf_row_search.[ch]		look for a pivot row
+    umf_scale.[ch]		scale the pivot column
+    umf_scale_column.[ch]	move pivot row & column into place, log P and Q
+    umf_set_stats.[ch]		set statistics (final or estimates)
+    umf_singletons.[ch]		find all zero-cost pivots
+    umf_solve.[ch]		solve a linear system
+    umf_start_front.[ch]	start a new frontal matrix for one frontal chain
+    umf_store_lu.[ch]		store LU factors of current front
+    umf_symbolic_usage.[ch]	determine memory usage for Symbolic object
+    umf_transpose.[ch]		transpose a matrix in row or col form
+    umf_triplet.[ch]		convert triplet to column form
+    umf_tuple_lengths.[ch]	determine the tuple list lengths
+    umf_usolve.[ch]		solve Ux=b
+    umf_utsolve.[ch]		solve U'x=b and U.'x=b
+    umf_valid_numeric.[ch]	checks the validity of a Numeric object
+    umf_valid_symbolic.[ch]	check the validity of a Symbolic object
+
+    ----------------------------------------------------------------------------
+    Include directory:
+    ----------------------------------------------------------------------------
+
+    umfpack.h			include file for user programs.  Includes all of
+				the following files.  This serves are source-
+				code level documenation.  These files are also
+				used to construct the User Guide.
+
+    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_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		note that there is no umfpack_wsolve.c.  The
+				umfpack_*_wsolve routines are created from the
+				umfpack_solve.c file.
+
+    ----------------------------------------------------------------------------
+    Demo directory:
+    ----------------------------------------------------------------------------
+
+    Makefile			for GNU make or original make
+
+    umfpack_simple.c		a simple demo
+    umpack_xx_demo.c		template to create the demo codes below
+
+    umfpack_di_demo.sed		for creating umfpack_di_demo.c
+    umfpack_dl_demo.sed		for creating umfpack_dl_demo.c
+    umfpack_zi_demo.sed		for creating umfpack_zi_demo.c
+    umfpack_zl_demo.sed		for creating umfpack_zl_demo.c
+
+    umfpack_di_demo.c		a full demo (real/int version)
+    umfpack_dl_demo.c		a full demo (real/long version)
+    umfpack_zi_demo.c		a full demo (complex/int version)
+    umfpack_zl_demo.c		a full demo (complex/long version)
+
+    umfpack_di_demo.out		umfpack_di_demo output, unmodified Make.include
+    umfpack_dl_demo.out		umfpack_dl_demo output, unmodified Make.include
+    umfpack_zi_demo.out		umfpack_zi_demo output, unmodified Make.include
+    umfpack_zl_demo.out		umfpack_zl_demo output, unmodified Make.include
+
+    umf4.c			a demo (real/int) for Harwell/Boeing matrices
+    umf4.out			output of "make hb", unmodified Make.include
+    HB				directory of sample Harwell/Boeing matrices
+    readhb.f			reads HB matrices, keeps zero entries
+    readhb_nozeros.f		reads HB matrices, removes zero entries
+    readhb_size.f		reads HB matrix dimension, nnz
+    tmp				empty directory for umf4.c demo
+
+    umf4_f77wrapper.c		a simple FORTRAN interface for UMFPACK.
+				compile with "make fortran"
+    umf4hb.f			a demo of the FORTRAN interface
+    umf4hb.out			output of "make fortran"
+
+    umf4_f77zwrapper.c		a simple FORTRAN interface for the complex
+				UMFPACK routines.  compile with "make fortran"
+    umf4zhb.f			a demo of the FORTRAN interface (complex)
+    umf4zhb.out			output of umf4zhb with HB/qc324.cua
+
+    umf4hb64.f			64-bit version of umf4hb.f
+
+    simple_compile		a single command that compiles the double/int
+				version of UMFPACK (useful prototype for
+				Microsoft Visual Studio project)
+
+    ----------------------------------------------------------------------------
+    MATLAB directory:
+    ----------------------------------------------------------------------------
+
+    Contents.m			for "help umfpack" listing of toolbox contents
+    GNUmakefile			a nice Makefile, for GNU make
+    Makefile			an ugly Unix Makefile (for older make's)
+
+    lu_normest.m		1-norm estimate of A-L*U (by Hager & Davis).
+    luflop.m			for "help luflop"
+    luflopmex.c			luflop mexFunction, for computing LU flop count
+    umfpack.m			for "help umfpack"
+    umfpack_btf.m		solve Ax=b using umfpack and dmperm
+    umfpack_demo.m		a full umfpack demo
+    umfpack_details.m		the details of how to use umfpack
+    umfpack_make.m		compile the umfpack mexFunction within MATLAB
+    umfpack_report.m		report statistics
+    umfpack_simple.m		a simple umfpack demo
+    umfpack_solve.m		x=A\b or b/A for arbitrary b
+    umfpack_test.m		extensive test, requires UF sparse matrices
+    umfpackmex.c		the umfpack mexFunction
+    west0067.mat		sparse matrix for umfpack_demo.m
+
+    umfpack_demo.m.out		output of umfpack_demo.m
+    umfpack_simple.m.out	output of umfpack_simple
+
+    lcc_lib/lapacksyms.def	LAPACK definitions for lcc compiler (Windows)
+    lcc_lib/libmwlapack.lib	LAPACK definitions for lcc compiler (Windows)
+
+    ----------------------------------------------------------------------------
+    Lib directory:  libumfpack.a library placed here
+    ----------------------------------------------------------------------------
+
+    libumfpack.def		UMPFACK definitions for Windows
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/GNUmakefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,253 @@
+#-------------------------------------------------------------------------------
+# UMFPACK Makefile for compiling on Unix systems (for GNU Make)
+#-------------------------------------------------------------------------------
+
+all: ../Lib/libumfpack.a
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include -I../../AMD/Source
+
+#-------------------------------------------------------------------------------
+# source files
+#-------------------------------------------------------------------------------
+
+# 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/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/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/long and real/complex versions:
+UMF = $(UMF_CREATED) $(UMFCH)
+
+# user-callable umfpack_*.[ch] files (int/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/long and real/complex versions:
+UMFPACKW = umfpack_wsolve
+
+USER = $(UMFPACKW) $(UMFPACK)
+
+# user-callable, only one version for int/long, real/complex, *.[ch] files:
+GENERIC = umfpack_timer umfpack_tictoc
+
+#-------------------------------------------------------------------------------
+# include files:
+#-------------------------------------------------------------------------------
+
+INC = ../Include/umfpack.h \
+	umf_config.h umf_version.h umf_internal.h umf_triplet.h \
+	$(addsuffix .h,$(UMFCH)) \
+	$(addsuffix .h,$(UMFINT)) \
+	$(addprefix ../Include/, $(addsuffix .h,$(USER))) \
+	$(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \
+	../../AMD/Source/amd_internal.h ../../AMD/Include/amd.h
+
+#-------------------------------------------------------------------------------
+# object files for each version
+#-------------------------------------------------------------------------------
+
+DI = $(addsuffix .o, $(subst umf_,umf_di_,$(UMF)) $(subst umfpack_,umfpack_di_,$(USER)))
+DL = $(addsuffix .o, $(subst umf_,umf_dl_,$(UMF)) $(subst umfpack_,umfpack_dl_,$(USER)))
+ZI = $(addsuffix .o, $(subst umf_,umf_zi_,$(UMF)) $(subst umfpack_,umfpack_zi_,$(USER)))
+ZL = $(addsuffix .o, $(subst umf_,umf_zl_,$(UMF)) $(subst umfpack_,umfpack_zl_,$(USER)))
+I  = $(addsuffix .o, $(subst umf_,umf_i_,$(UMFINT)))
+L  = $(addsuffix .o, $(subst umf_,umf_l_,$(UMFINT)))
+GN = $(addsuffix .o, $(subst umfpack_,umfpack_gn_,$(GENERIC)))
+
+#-------------------------------------------------------------------------------
+# compile each int and long routine (with no real/complex version)
+#-------------------------------------------------------------------------------
+
+umf_i_%.o: umf_%.c $(INC)
+	$(C) -DDINT -c $< -o $@
+
+umf_l_%.o: umf_%.c $(INC)
+	$(C) -DDLONG -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# compile each routine in the DI version
+#-------------------------------------------------------------------------------
+
+umf_di_%.o: umf_%.c $(INC)
+	$(C) -DDINT -c $< -o $@
+
+umf_di_%hsolve.o: umf_%tsolve.c $(INC)
+	$(C) -DDINT -DCONJUGATE_SOLVE -c $< -o $@
+
+umf_di_triplet_map_x.o: umf_triplet.c $(INC)
+	$(C) -DDINT -DDO_MAP -DDO_VALUES -c $< -o $@
+
+umf_di_triplet_map_nox.o: umf_triplet.c $(INC)
+	$(C) -DDINT -DDO_MAP -c $< -o $@
+
+umf_di_triplet_nomap_x.o: umf_triplet.c $(INC)
+	$(C) -DDINT -DDO_VALUES -c $< -o $@
+
+umf_di_triplet_nomap_nox.o: umf_triplet.c $(INC)
+	$(C) -DDINT -c $< -o $@
+
+umf_di_assemble_fixq.o: umf_assemble.c $(INC)
+	$(C) -DDINT -DFIXQ -c $< -o $@
+
+umf_di_store_lu_drop.o: umf_store_lu.c $(INC)
+	$(C) -DDINT -DDROP -c $< -o $@
+
+umfpack_di_wsolve.o: umfpack_solve.c $(INC)
+	$(C) -DDINT -DWSOLVE -c $< -o $@
+
+umfpack_di_%.o: umfpack_%.c $(INC)
+	$(C) -DDINT -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# compile each routine in the DL version
+#-------------------------------------------------------------------------------
+
+umf_dl_%.o: umf_%.c $(INC)
+	$(C) -DDLONG -c $< -o $@
+
+umf_dl_%hsolve.o: umf_%tsolve.c $(INC)
+	$(C) -DDLONG -DCONJUGATE_SOLVE -c $< -o $@
+
+umf_dl_triplet_map_x.o: umf_triplet.c $(INC)
+	$(C) -DDLONG -DDO_MAP -DDO_VALUES -c $< -o $@
+
+umf_dl_triplet_map_nox.o: umf_triplet.c $(INC)
+	$(C) -DDLONG -DDO_MAP -c $< -o $@
+
+umf_dl_triplet_nomap_x.o: umf_triplet.c $(INC)
+	$(C) -DDLONG -DDO_VALUES -c $< -o $@
+
+umf_dl_triplet_nomap_nox.o: umf_triplet.c $(INC)
+	$(C) -DDLONG -c $< -o $@
+
+umf_dl_assemble_fixq.o: umf_assemble.c $(INC)
+	$(C) -DDLONG -DFIXQ -c $< -o $@
+
+umf_dl_store_lu_drop.o: umf_store_lu.c $(INC)
+	$(C) -DDLONG -DDROP -c $< -o $@
+
+umfpack_dl_wsolve.o: umfpack_solve.c $(INC)
+	$(C) -DDLONG -DWSOLVE -c $< -o $@
+
+umfpack_dl_%.o: umfpack_%.c $(INC)
+	$(C) -DDLONG -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# compile each routine in the ZI version
+#-------------------------------------------------------------------------------
+
+umf_zi_%.o: umf_%.c $(INC)
+	$(C) -DZINT -c $< -o $@
+
+umf_zi_%hsolve.o: umf_%tsolve.c $(INC)
+	$(C) -DZINT -DCONJUGATE_SOLVE -c $< -o $@
+
+umf_zi_triplet_map_x.o: umf_triplet.c $(INC)
+	$(C) -DZINT -DDO_MAP -DDO_VALUES -c $< -o $@
+
+umf_zi_triplet_map_nox.o: umf_triplet.c $(INC)
+	$(C) -DZINT -DDO_MAP -c $< -o $@
+
+umf_zi_triplet_nomap_x.o: umf_triplet.c $(INC)
+	$(C) -DZINT -DDO_VALUES -c $< -o $@
+
+umf_zi_triplet_nomap_nox.o: umf_triplet.c $(INC)
+	$(C) -DZINT -c $< -o $@
+
+umf_zi_assemble_fixq.o: umf_assemble.c $(INC)
+	$(C) -DZINT -DFIXQ -c $< -o $@
+
+umf_zi_store_lu_drop.o: umf_store_lu.c $(INC)
+	$(C) -DZINT -DDROP -c $< -o $@
+
+umfpack_zi_wsolve.o: umfpack_solve.c $(INC)
+	$(C) -DZINT -DWSOLVE -c $< -o $@
+
+umfpack_zi_%.o: umfpack_%.c $(INC)
+	$(C) -DZINT -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# compile each routine in the ZL version
+#-------------------------------------------------------------------------------
+
+umf_zl_%.o: umf_%.c $(INC)
+	$(C) -DZLONG -c $< -o $@
+
+umf_zl_%hsolve.o: umf_%tsolve.c $(INC)
+	$(C) -DZLONG -DCONJUGATE_SOLVE -c $< -o $@
+
+umf_zl_triplet_map_x.o: umf_triplet.c $(INC)
+	$(C) -DZLONG -DDO_MAP -DDO_VALUES -c $< -o $@
+
+umf_zl_triplet_map_nox.o: umf_triplet.c $(INC)
+	$(C) -DZLONG -DDO_MAP -c $< -o $@
+
+umf_zl_triplet_nomap_x.o: umf_triplet.c $(INC)
+	$(C) -DZLONG -DDO_VALUES -c $< -o $@
+
+umf_zl_triplet_nomap_nox.o: umf_triplet.c $(INC)
+	$(C) -DZLONG -c $< -o $@
+
+umf_zl_assemble_fixq.o: umf_assemble.c $(INC)
+	$(C) -DZLONG -DFIXQ -c $< -o $@
+
+umf_zl_store_lu_drop.o: umf_store_lu.c $(INC)
+	$(C) -DZLONG -DDROP -c $< -o $@
+
+umfpack_zl_wsolve.o: umfpack_solve.c $(INC)
+	$(C) -DZLONG -DWSOLVE -c $< -o $@
+
+umfpack_zl_%.o: umfpack_%.c $(INC)
+	$(C) -DZLONG -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# Create the generic routines (GN) using a generic rule
+#-------------------------------------------------------------------------------
+
+umfpack_gn_%.o: umfpack_%.c $(INC)
+	$(C) -c $< -o $@
+
+#-------------------------------------------------------------------------------
+# Create the libumfpack.a library
+#-------------------------------------------------------------------------------
+
+../Lib/libumfpack.a: $(I) $(L) $(GN) $(DI) $(DL) $(ZI) $(ZL)
+	$(AR) cr ../Lib/libumfpack.a $^
+	- $(RANLIB) ../Lib/libumfpack.a
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) ../Lib/libumfpack.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/Makefile	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,479 @@
+#-------------------------------------------------------------------------------
+# UMFPACK Makefile for compiling on Unix systems (for original make only)
+#-------------------------------------------------------------------------------
+
+# This is a very ugly Makefile, and is only provided for those who do not
+# have GNU make.  Note that it is not used if you have GNU make.  It ignores
+# dependency checking and just compiles everything.  It was created
+# automatically, via make -n using the GNUmakefile.  That way, I don't have
+# maintain two Makefiles.
+
+all: everything
+
+include ../Make/Make.include
+
+C = $(CC) $(CFLAGS) $(CONFIG) -I../Include -I../../AMD/Include -I../../AMD/Source
+
+everything:
+	$(C) -DDINT -c umf_analyze.c -o umf_i_analyze.o
+	$(C) -DDINT -c umf_apply_order.c -o umf_i_apply_order.o
+	$(C) -DDINT -c umf_colamd.c -o umf_i_colamd.o
+	$(C) -DDINT -c umf_free.c -o umf_i_free.o
+	$(C) -DDINT -c umf_fsize.c -o umf_i_fsize.o
+	$(C) -DDINT -c umf_is_permutation.c -o umf_i_is_permutation.o
+	$(C) -DDINT -c umf_malloc.c -o umf_i_malloc.o
+	$(C) -DDINT -c umf_realloc.c -o umf_i_realloc.o
+	$(C) -DDINT -c umf_report_perm.c -o umf_i_report_perm.o
+	$(C) -DDINT -c umf_singletons.c -o umf_i_singletons.o
+	$(C) -DDLONG -c umf_analyze.c -o umf_l_analyze.o
+	$(C) -DDLONG -c umf_apply_order.c -o umf_l_apply_order.o
+	$(C) -DDLONG -c umf_colamd.c -o umf_l_colamd.o
+	$(C) -DDLONG -c umf_free.c -o umf_l_free.o
+	$(C) -DDLONG -c umf_fsize.c -o umf_l_fsize.o
+	$(C) -DDLONG -c umf_is_permutation.c -o umf_l_is_permutation.o
+	$(C) -DDLONG -c umf_malloc.c -o umf_l_malloc.o
+	$(C) -DDLONG -c umf_realloc.c -o umf_l_realloc.o
+	$(C) -DDLONG -c umf_report_perm.c -o umf_l_report_perm.o
+	$(C) -DDLONG -c umf_singletons.c -o umf_l_singletons.o
+	$(C) -c umfpack_timer.c -o umfpack_gn_timer.o
+	$(C) -c umfpack_tictoc.c -o umfpack_gn_tictoc.o
+	$(C) -DDINT -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_di_lhsolve.o
+	$(C) -DDINT -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_di_uhsolve.o
+	$(C) -DDINT -DDO_MAP -c umf_triplet.c -o umf_di_triplet_map_nox.o
+	$(C) -DDINT -DDO_VALUES -c umf_triplet.c -o umf_di_triplet_nomap_x.o
+	$(C) -DDINT -c umf_triplet.c -o umf_di_triplet_nomap_nox.o
+	$(C) -DDINT -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_di_triplet_map_x.o
+	$(C) -DDINT -DFIXQ -c umf_assemble.c -o umf_di_assemble_fixq.o
+	$(C) -DDINT -DDROP -c umf_store_lu.c -o umf_di_store_lu_drop.o
+	$(C) -DDINT -c umf_assemble.c -o umf_di_assemble.o
+	$(C) -DDINT -c umf_blas3_update.c -o umf_di_blas3_update.o
+	$(C) -DDINT -c umf_build_tuples.c -o umf_di_build_tuples.o
+	$(C) -DDINT -c umf_create_element.c -o umf_di_create_element.o
+	$(C) -DDINT -c umf_dump.c -o umf_di_dump.o
+	$(C) -DDINT -c umf_extend_front.c -o umf_di_extend_front.o
+	$(C) -DDINT -c umf_garbage_collection.c -o umf_di_garbage_collection.o
+	$(C) -DDINT -c umf_get_memory.c -o umf_di_get_memory.o
+	$(C) -DDINT -c umf_init_front.c -o umf_di_init_front.o
+	$(C) -DDINT -c umf_kernel.c -o umf_di_kernel.o
+	$(C) -DDINT -c umf_kernel_init.c -o umf_di_kernel_init.o
+	$(C) -DDINT -c umf_kernel_wrapup.c -o umf_di_kernel_wrapup.o
+	$(C) -DDINT -c umf_local_search.c -o umf_di_local_search.o
+	$(C) -DDINT -c umf_lsolve.c -o umf_di_lsolve.o
+	$(C) -DDINT -c umf_ltsolve.c -o umf_di_ltsolve.o
+	$(C) -DDINT -c umf_mem_alloc_element.c -o umf_di_mem_alloc_element.o
+	$(C) -DDINT -c umf_mem_alloc_head_block.c -o umf_di_mem_alloc_head_block.o
+	$(C) -DDINT -c umf_mem_alloc_tail_block.c -o umf_di_mem_alloc_tail_block.o
+	$(C) -DDINT -c umf_mem_free_tail_block.c -o umf_di_mem_free_tail_block.o
+	$(C) -DDINT -c umf_mem_init_memoryspace.c -o umf_di_mem_init_memoryspace.o
+	$(C) -DDINT -c umf_report_vector.c -o umf_di_report_vector.o
+	$(C) -DDINT -c umf_row_search.c -o umf_di_row_search.o
+	$(C) -DDINT -c umf_scale_column.c -o umf_di_scale_column.o
+	$(C) -DDINT -c umf_set_stats.c -o umf_di_set_stats.o
+	$(C) -DDINT -c umf_solve.c -o umf_di_solve.o
+	$(C) -DDINT -c umf_symbolic_usage.c -o umf_di_symbolic_usage.o
+	$(C) -DDINT -c umf_transpose.c -o umf_di_transpose.o
+	$(C) -DDINT -c umf_tuple_lengths.c -o umf_di_tuple_lengths.o
+	$(C) -DDINT -c umf_usolve.c -o umf_di_usolve.o
+	$(C) -DDINT -c umf_utsolve.c -o umf_di_utsolve.o
+	$(C) -DDINT -c umf_valid_numeric.c -o umf_di_valid_numeric.o
+	$(C) -DDINT -c umf_valid_symbolic.c -o umf_di_valid_symbolic.o
+	$(C) -DDINT -c umf_grow_front.c -o umf_di_grow_front.o
+	$(C) -DDINT -c umf_start_front.c -o umf_di_start_front.o
+	$(C) -DDINT -c umf_2by2.c -o umf_di_2by2.o
+	$(C) -DDINT -c umf_store_lu.c -o umf_di_store_lu.o
+	$(C) -DDINT -c umf_scale.c -o umf_di_scale.o
+	$(C) -DDINT -DWSOLVE -c umfpack_solve.c -o umfpack_di_wsolve.o
+	$(C) -DDINT -c umfpack_col_to_triplet.c -o umfpack_di_col_to_triplet.o
+	$(C) -DDINT -c umfpack_defaults.c -o umfpack_di_defaults.o
+	$(C) -DDINT -c umfpack_free_numeric.c -o umfpack_di_free_numeric.o
+	$(C) -DDINT -c umfpack_free_symbolic.c -o umfpack_di_free_symbolic.o
+	$(C) -DDINT -c umfpack_get_numeric.c -o umfpack_di_get_numeric.o
+	$(C) -DDINT -c umfpack_get_lunz.c -o umfpack_di_get_lunz.o
+	$(C) -DDINT -c umfpack_get_symbolic.c -o umfpack_di_get_symbolic.o
+	$(C) -DDINT -c umfpack_get_determinant.c -o umfpack_di_get_determinant.o
+	$(C) -DDINT -c umfpack_numeric.c -o umfpack_di_numeric.o
+	$(C) -DDINT -c umfpack_qsymbolic.c -o umfpack_di_qsymbolic.o
+	$(C) -DDINT -c umfpack_report_control.c -o umfpack_di_report_control.o
+	$(C) -DDINT -c umfpack_report_info.c -o umfpack_di_report_info.o
+	$(C) -DDINT -c umfpack_report_matrix.c -o umfpack_di_report_matrix.o
+	$(C) -DDINT -c umfpack_report_numeric.c -o umfpack_di_report_numeric.o
+	$(C) -DDINT -c umfpack_report_perm.c -o umfpack_di_report_perm.o
+	$(C) -DDINT -c umfpack_report_status.c -o umfpack_di_report_status.o
+	$(C) -DDINT -c umfpack_report_symbolic.c -o umfpack_di_report_symbolic.o
+	$(C) -DDINT -c umfpack_report_triplet.c -o umfpack_di_report_triplet.o
+	$(C) -DDINT -c umfpack_report_vector.c -o umfpack_di_report_vector.o
+	$(C) -DDINT -c umfpack_solve.c -o umfpack_di_solve.o
+	$(C) -DDINT -c umfpack_symbolic.c -o umfpack_di_symbolic.o
+	$(C) -DDINT -c umfpack_transpose.c -o umfpack_di_transpose.o
+	$(C) -DDINT -c umfpack_triplet_to_col.c -o umfpack_di_triplet_to_col.o
+	$(C) -DDINT -c umfpack_scale.c -o umfpack_di_scale.o
+	$(C) -DDINT -c umfpack_load_numeric.c -o umfpack_di_load_numeric.o
+	$(C) -DDINT -c umfpack_save_numeric.c -o umfpack_di_save_numeric.o
+	$(C) -DDINT -c umfpack_load_symbolic.c -o umfpack_di_load_symbolic.o
+	$(C) -DDINT -c umfpack_save_symbolic.c -o umfpack_di_save_symbolic.o
+	$(C) -DDLONG -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_dl_lhsolve.o
+	$(C) -DDLONG -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_dl_uhsolve.o
+	$(C) -DDLONG -DDO_MAP -c umf_triplet.c -o umf_dl_triplet_map_nox.o
+	$(C) -DDLONG -DDO_VALUES -c umf_triplet.c -o umf_dl_triplet_nomap_x.o
+	$(C) -DDLONG -c umf_triplet.c -o umf_dl_triplet_nomap_nox.o
+	$(C) -DDLONG -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_dl_triplet_map_x.o
+	$(C) -DDLONG -DFIXQ -c umf_assemble.c -o umf_dl_assemble_fixq.o
+	$(C) -DDLONG -DDROP -c umf_store_lu.c -o umf_dl_store_lu_drop.o
+	$(C) -DDLONG -c umf_assemble.c -o umf_dl_assemble.o
+	$(C) -DDLONG -c umf_blas3_update.c -o umf_dl_blas3_update.o
+	$(C) -DDLONG -c umf_build_tuples.c -o umf_dl_build_tuples.o
+	$(C) -DDLONG -c umf_create_element.c -o umf_dl_create_element.o
+	$(C) -DDLONG -c umf_dump.c -o umf_dl_dump.o
+	$(C) -DDLONG -c umf_extend_front.c -o umf_dl_extend_front.o
+	$(C) -DDLONG -c umf_garbage_collection.c -o umf_dl_garbage_collection.o
+	$(C) -DDLONG -c umf_get_memory.c -o umf_dl_get_memory.o
+	$(C) -DDLONG -c umf_init_front.c -o umf_dl_init_front.o
+	$(C) -DDLONG -c umf_kernel.c -o umf_dl_kernel.o
+	$(C) -DDLONG -c umf_kernel_init.c -o umf_dl_kernel_init.o
+	$(C) -DDLONG -c umf_kernel_wrapup.c -o umf_dl_kernel_wrapup.o
+	$(C) -DDLONG -c umf_local_search.c -o umf_dl_local_search.o
+	$(C) -DDLONG -c umf_lsolve.c -o umf_dl_lsolve.o
+	$(C) -DDLONG -c umf_ltsolve.c -o umf_dl_ltsolve.o
+	$(C) -DDLONG -c umf_mem_alloc_element.c -o umf_dl_mem_alloc_element.o
+	$(C) -DDLONG -c umf_mem_alloc_head_block.c -o umf_dl_mem_alloc_head_block.o
+	$(C) -DDLONG -c umf_mem_alloc_tail_block.c -o umf_dl_mem_alloc_tail_block.o
+	$(C) -DDLONG -c umf_mem_free_tail_block.c -o umf_dl_mem_free_tail_block.o
+	$(C) -DDLONG -c umf_mem_init_memoryspace.c -o umf_dl_mem_init_memoryspace.o
+	$(C) -DDLONG -c umf_report_vector.c -o umf_dl_report_vector.o
+	$(C) -DDLONG -c umf_row_search.c -o umf_dl_row_search.o
+	$(C) -DDLONG -c umf_scale_column.c -o umf_dl_scale_column.o
+	$(C) -DDLONG -c umf_set_stats.c -o umf_dl_set_stats.o
+	$(C) -DDLONG -c umf_solve.c -o umf_dl_solve.o
+	$(C) -DDLONG -c umf_symbolic_usage.c -o umf_dl_symbolic_usage.o
+	$(C) -DDLONG -c umf_transpose.c -o umf_dl_transpose.o
+	$(C) -DDLONG -c umf_tuple_lengths.c -o umf_dl_tuple_lengths.o
+	$(C) -DDLONG -c umf_usolve.c -o umf_dl_usolve.o
+	$(C) -DDLONG -c umf_utsolve.c -o umf_dl_utsolve.o
+	$(C) -DDLONG -c umf_valid_numeric.c -o umf_dl_valid_numeric.o
+	$(C) -DDLONG -c umf_valid_symbolic.c -o umf_dl_valid_symbolic.o
+	$(C) -DDLONG -c umf_grow_front.c -o umf_dl_grow_front.o
+	$(C) -DDLONG -c umf_start_front.c -o umf_dl_start_front.o
+	$(C) -DDLONG -c umf_2by2.c -o umf_dl_2by2.o
+	$(C) -DDLONG -c umf_store_lu.c -o umf_dl_store_lu.o
+	$(C) -DDLONG -c umf_scale.c -o umf_dl_scale.o
+	$(C) -DDLONG -DWSOLVE -c umfpack_solve.c -o umfpack_dl_wsolve.o
+	$(C) -DDLONG -c umfpack_col_to_triplet.c -o umfpack_dl_col_to_triplet.o
+	$(C) -DDLONG -c umfpack_defaults.c -o umfpack_dl_defaults.o
+	$(C) -DDLONG -c umfpack_free_numeric.c -o umfpack_dl_free_numeric.o
+	$(C) -DDLONG -c umfpack_free_symbolic.c -o umfpack_dl_free_symbolic.o
+	$(C) -DDLONG -c umfpack_get_numeric.c -o umfpack_dl_get_numeric.o
+	$(C) -DDLONG -c umfpack_get_lunz.c -o umfpack_dl_get_lunz.o
+	$(C) -DDLONG -c umfpack_get_symbolic.c -o umfpack_dl_get_symbolic.o
+	$(C) -DDLONG -c umfpack_get_determinant.c -o umfpack_dl_get_determinant.o
+	$(C) -DDLONG -c umfpack_numeric.c -o umfpack_dl_numeric.o
+	$(C) -DDLONG -c umfpack_qsymbolic.c -o umfpack_dl_qsymbolic.o
+	$(C) -DDLONG -c umfpack_report_control.c -o umfpack_dl_report_control.o
+	$(C) -DDLONG -c umfpack_report_info.c -o umfpack_dl_report_info.o
+	$(C) -DDLONG -c umfpack_report_matrix.c -o umfpack_dl_report_matrix.o
+	$(C) -DDLONG -c umfpack_report_numeric.c -o umfpack_dl_report_numeric.o
+	$(C) -DDLONG -c umfpack_report_perm.c -o umfpack_dl_report_perm.o
+	$(C) -DDLONG -c umfpack_report_status.c -o umfpack_dl_report_status.o
+	$(C) -DDLONG -c umfpack_report_symbolic.c -o umfpack_dl_report_symbolic.o
+	$(C) -DDLONG -c umfpack_report_triplet.c -o umfpack_dl_report_triplet.o
+	$(C) -DDLONG -c umfpack_report_vector.c -o umfpack_dl_report_vector.o
+	$(C) -DDLONG -c umfpack_solve.c -o umfpack_dl_solve.o
+	$(C) -DDLONG -c umfpack_symbolic.c -o umfpack_dl_symbolic.o
+	$(C) -DDLONG -c umfpack_transpose.c -o umfpack_dl_transpose.o
+	$(C) -DDLONG -c umfpack_triplet_to_col.c -o umfpack_dl_triplet_to_col.o
+	$(C) -DDLONG -c umfpack_scale.c -o umfpack_dl_scale.o
+	$(C) -DDLONG -c umfpack_load_numeric.c -o umfpack_dl_load_numeric.o
+	$(C) -DDLONG -c umfpack_save_numeric.c -o umfpack_dl_save_numeric.o
+	$(C) -DDLONG -c umfpack_load_symbolic.c -o umfpack_dl_load_symbolic.o
+	$(C) -DDLONG -c umfpack_save_symbolic.c -o umfpack_dl_save_symbolic.o
+	$(C) -DZINT -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_zi_lhsolve.o
+	$(C) -DZINT -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_zi_uhsolve.o
+	$(C) -DZINT -DDO_MAP -c umf_triplet.c -o umf_zi_triplet_map_nox.o
+	$(C) -DZINT -DDO_VALUES -c umf_triplet.c -o umf_zi_triplet_nomap_x.o
+	$(C) -DZINT -c umf_triplet.c -o umf_zi_triplet_nomap_nox.o
+	$(C) -DZINT -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_zi_triplet_map_x.o
+	$(C) -DZINT -DFIXQ -c umf_assemble.c -o umf_zi_assemble_fixq.o
+	$(C) -DZINT -DDROP -c umf_store_lu.c -o umf_zi_store_lu_drop.o
+	$(C) -DZINT -c umf_assemble.c -o umf_zi_assemble.o
+	$(C) -DZINT -c umf_blas3_update.c -o umf_zi_blas3_update.o
+	$(C) -DZINT -c umf_build_tuples.c -o umf_zi_build_tuples.o
+	$(C) -DZINT -c umf_create_element.c -o umf_zi_create_element.o
+	$(C) -DZINT -c umf_dump.c -o umf_zi_dump.o
+	$(C) -DZINT -c umf_extend_front.c -o umf_zi_extend_front.o
+	$(C) -DZINT -c umf_garbage_collection.c -o umf_zi_garbage_collection.o
+	$(C) -DZINT -c umf_get_memory.c -o umf_zi_get_memory.o
+	$(C) -DZINT -c umf_init_front.c -o umf_zi_init_front.o
+	$(C) -DZINT -c umf_kernel.c -o umf_zi_kernel.o
+	$(C) -DZINT -c umf_kernel_init.c -o umf_zi_kernel_init.o
+	$(C) -DZINT -c umf_kernel_wrapup.c -o umf_zi_kernel_wrapup.o
+	$(C) -DZINT -c umf_local_search.c -o umf_zi_local_search.o
+	$(C) -DZINT -c umf_lsolve.c -o umf_zi_lsolve.o
+	$(C) -DZINT -c umf_ltsolve.c -o umf_zi_ltsolve.o
+	$(C) -DZINT -c umf_mem_alloc_element.c -o umf_zi_mem_alloc_element.o
+	$(C) -DZINT -c umf_mem_alloc_head_block.c -o umf_zi_mem_alloc_head_block.o
+	$(C) -DZINT -c umf_mem_alloc_tail_block.c -o umf_zi_mem_alloc_tail_block.o
+	$(C) -DZINT -c umf_mem_free_tail_block.c -o umf_zi_mem_free_tail_block.o
+	$(C) -DZINT -c umf_mem_init_memoryspace.c -o umf_zi_mem_init_memoryspace.o
+	$(C) -DZINT -c umf_report_vector.c -o umf_zi_report_vector.o
+	$(C) -DZINT -c umf_row_search.c -o umf_zi_row_search.o
+	$(C) -DZINT -c umf_scale_column.c -o umf_zi_scale_column.o
+	$(C) -DZINT -c umf_set_stats.c -o umf_zi_set_stats.o
+	$(C) -DZINT -c umf_solve.c -o umf_zi_solve.o
+	$(C) -DZINT -c umf_symbolic_usage.c -o umf_zi_symbolic_usage.o
+	$(C) -DZINT -c umf_transpose.c -o umf_zi_transpose.o
+	$(C) -DZINT -c umf_tuple_lengths.c -o umf_zi_tuple_lengths.o
+	$(C) -DZINT -c umf_usolve.c -o umf_zi_usolve.o
+	$(C) -DZINT -c umf_utsolve.c -o umf_zi_utsolve.o
+	$(C) -DZINT -c umf_valid_numeric.c -o umf_zi_valid_numeric.o
+	$(C) -DZINT -c umf_valid_symbolic.c -o umf_zi_valid_symbolic.o
+	$(C) -DZINT -c umf_grow_front.c -o umf_zi_grow_front.o
+	$(C) -DZINT -c umf_start_front.c -o umf_zi_start_front.o
+	$(C) -DZINT -c umf_2by2.c -o umf_zi_2by2.o
+	$(C) -DZINT -c umf_store_lu.c -o umf_zi_store_lu.o
+	$(C) -DZINT -c umf_scale.c -o umf_zi_scale.o
+	$(C) -DZINT -DWSOLVE -c umfpack_solve.c -o umfpack_zi_wsolve.o
+	$(C) -DZINT -c umfpack_col_to_triplet.c -o umfpack_zi_col_to_triplet.o
+	$(C) -DZINT -c umfpack_defaults.c -o umfpack_zi_defaults.o
+	$(C) -DZINT -c umfpack_free_numeric.c -o umfpack_zi_free_numeric.o
+	$(C) -DZINT -c umfpack_free_symbolic.c -o umfpack_zi_free_symbolic.o
+	$(C) -DZINT -c umfpack_get_numeric.c -o umfpack_zi_get_numeric.o
+	$(C) -DZINT -c umfpack_get_lunz.c -o umfpack_zi_get_lunz.o
+	$(C) -DZINT -c umfpack_get_symbolic.c -o umfpack_zi_get_symbolic.o
+	$(C) -DZINT -c umfpack_get_determinant.c -o umfpack_zi_get_determinant.o
+	$(C) -DZINT -c umfpack_numeric.c -o umfpack_zi_numeric.o
+	$(C) -DZINT -c umfpack_qsymbolic.c -o umfpack_zi_qsymbolic.o
+	$(C) -DZINT -c umfpack_report_control.c -o umfpack_zi_report_control.o
+	$(C) -DZINT -c umfpack_report_info.c -o umfpack_zi_report_info.o
+	$(C) -DZINT -c umfpack_report_matrix.c -o umfpack_zi_report_matrix.o
+	$(C) -DZINT -c umfpack_report_numeric.c -o umfpack_zi_report_numeric.o
+	$(C) -DZINT -c umfpack_report_perm.c -o umfpack_zi_report_perm.o
+	$(C) -DZINT -c umfpack_report_status.c -o umfpack_zi_report_status.o
+	$(C) -DZINT -c umfpack_report_symbolic.c -o umfpack_zi_report_symbolic.o
+	$(C) -DZINT -c umfpack_report_triplet.c -o umfpack_zi_report_triplet.o
+	$(C) -DZINT -c umfpack_report_vector.c -o umfpack_zi_report_vector.o
+	$(C) -DZINT -c umfpack_solve.c -o umfpack_zi_solve.o
+	$(C) -DZINT -c umfpack_symbolic.c -o umfpack_zi_symbolic.o
+	$(C) -DZINT -c umfpack_transpose.c -o umfpack_zi_transpose.o
+	$(C) -DZINT -c umfpack_triplet_to_col.c -o umfpack_zi_triplet_to_col.o
+	$(C) -DZINT -c umfpack_scale.c -o umfpack_zi_scale.o
+	$(C) -DZINT -c umfpack_load_numeric.c -o umfpack_zi_load_numeric.o
+	$(C) -DZINT -c umfpack_save_numeric.c -o umfpack_zi_save_numeric.o
+	$(C) -DZINT -c umfpack_load_symbolic.c -o umfpack_zi_load_symbolic.o
+	$(C) -DZINT -c umfpack_save_symbolic.c -o umfpack_zi_save_symbolic.o
+	$(C) -DZLONG -DCONJUGATE_SOLVE -c umf_ltsolve.c -o umf_zl_lhsolve.o
+	$(C) -DZLONG -DCONJUGATE_SOLVE -c umf_utsolve.c -o umf_zl_uhsolve.o
+	$(C) -DZLONG -DDO_MAP -c umf_triplet.c -o umf_zl_triplet_map_nox.o
+	$(C) -DZLONG -DDO_VALUES -c umf_triplet.c -o umf_zl_triplet_nomap_x.o
+	$(C) -DZLONG -c umf_triplet.c -o umf_zl_triplet_nomap_nox.o
+	$(C) -DZLONG -DDO_MAP -DDO_VALUES -c umf_triplet.c -o umf_zl_triplet_map_x.o
+	$(C) -DZLONG -DFIXQ -c umf_assemble.c -o umf_zl_assemble_fixq.o
+	$(C) -DZLONG -DDROP -c umf_store_lu.c -o umf_zl_store_lu_drop.o
+	$(C) -DZLONG -c umf_assemble.c -o umf_zl_assemble.o
+	$(C) -DZLONG -c umf_blas3_update.c -o umf_zl_blas3_update.o
+	$(C) -DZLONG -c umf_build_tuples.c -o umf_zl_build_tuples.o
+	$(C) -DZLONG -c umf_create_element.c -o umf_zl_create_element.o
+	$(C) -DZLONG -c umf_dump.c -o umf_zl_dump.o
+	$(C) -DZLONG -c umf_extend_front.c -o umf_zl_extend_front.o
+	$(C) -DZLONG -c umf_garbage_collection.c -o umf_zl_garbage_collection.o
+	$(C) -DZLONG -c umf_get_memory.c -o umf_zl_get_memory.o
+	$(C) -DZLONG -c umf_init_front.c -o umf_zl_init_front.o
+	$(C) -DZLONG -c umf_kernel.c -o umf_zl_kernel.o
+	$(C) -DZLONG -c umf_kernel_init.c -o umf_zl_kernel_init.o
+	$(C) -DZLONG -c umf_kernel_wrapup.c -o umf_zl_kernel_wrapup.o
+	$(C) -DZLONG -c umf_local_search.c -o umf_zl_local_search.o
+	$(C) -DZLONG -c umf_lsolve.c -o umf_zl_lsolve.o
+	$(C) -DZLONG -c umf_ltsolve.c -o umf_zl_ltsolve.o
+	$(C) -DZLONG -c umf_mem_alloc_element.c -o umf_zl_mem_alloc_element.o
+	$(C) -DZLONG -c umf_mem_alloc_head_block.c -o umf_zl_mem_alloc_head_block.o
+	$(C) -DZLONG -c umf_mem_alloc_tail_block.c -o umf_zl_mem_alloc_tail_block.o
+	$(C) -DZLONG -c umf_mem_free_tail_block.c -o umf_zl_mem_free_tail_block.o
+	$(C) -DZLONG -c umf_mem_init_memoryspace.c -o umf_zl_mem_init_memoryspace.o
+	$(C) -DZLONG -c umf_report_vector.c -o umf_zl_report_vector.o
+	$(C) -DZLONG -c umf_row_search.c -o umf_zl_row_search.o
+	$(C) -DZLONG -c umf_scale_column.c -o umf_zl_scale_column.o
+	$(C) -DZLONG -c umf_set_stats.c -o umf_zl_set_stats.o
+	$(C) -DZLONG -c umf_solve.c -o umf_zl_solve.o
+	$(C) -DZLONG -c umf_symbolic_usage.c -o umf_zl_symbolic_usage.o
+	$(C) -DZLONG -c umf_transpose.c -o umf_zl_transpose.o
+	$(C) -DZLONG -c umf_tuple_lengths.c -o umf_zl_tuple_lengths.o
+	$(C) -DZLONG -c umf_usolve.c -o umf_zl_usolve.o
+	$(C) -DZLONG -c umf_utsolve.c -o umf_zl_utsolve.o
+	$(C) -DZLONG -c umf_valid_numeric.c -o umf_zl_valid_numeric.o
+	$(C) -DZLONG -c umf_valid_symbolic.c -o umf_zl_valid_symbolic.o
+	$(C) -DZLONG -c umf_grow_front.c -o umf_zl_grow_front.o
+	$(C) -DZLONG -c umf_start_front.c -o umf_zl_start_front.o
+	$(C) -DZLONG -c umf_2by2.c -o umf_zl_2by2.o
+	$(C) -DZLONG -c umf_store_lu.c -o umf_zl_store_lu.o
+	$(C) -DZLONG -c umf_scale.c -o umf_zl_scale.o
+	$(C) -DZLONG -DWSOLVE -c umfpack_solve.c -o umfpack_zl_wsolve.o
+	$(C) -DZLONG -c umfpack_col_to_triplet.c -o umfpack_zl_col_to_triplet.o
+	$(C) -DZLONG -c umfpack_defaults.c -o umfpack_zl_defaults.o
+	$(C) -DZLONG -c umfpack_free_numeric.c -o umfpack_zl_free_numeric.o
+	$(C) -DZLONG -c umfpack_free_symbolic.c -o umfpack_zl_free_symbolic.o
+	$(C) -DZLONG -c umfpack_get_numeric.c -o umfpack_zl_get_numeric.o
+	$(C) -DZLONG -c umfpack_get_lunz.c -o umfpack_zl_get_lunz.o
+	$(C) -DZLONG -c umfpack_get_symbolic.c -o umfpack_zl_get_symbolic.o
+	$(C) -DZLONG -c umfpack_get_determinant.c -o umfpack_zl_get_determinant.o
+	$(C) -DZLONG -c umfpack_numeric.c -o umfpack_zl_numeric.o
+	$(C) -DZLONG -c umfpack_qsymbolic.c -o umfpack_zl_qsymbolic.o
+	$(C) -DZLONG -c umfpack_report_control.c -o umfpack_zl_report_control.o
+	$(C) -DZLONG -c umfpack_report_info.c -o umfpack_zl_report_info.o
+	$(C) -DZLONG -c umfpack_report_matrix.c -o umfpack_zl_report_matrix.o
+	$(C) -DZLONG -c umfpack_report_numeric.c -o umfpack_zl_report_numeric.o
+	$(C) -DZLONG -c umfpack_report_perm.c -o umfpack_zl_report_perm.o
+	$(C) -DZLONG -c umfpack_report_status.c -o umfpack_zl_report_status.o
+	$(C) -DZLONG -c umfpack_report_symbolic.c -o umfpack_zl_report_symbolic.o
+	$(C) -DZLONG -c umfpack_report_triplet.c -o umfpack_zl_report_triplet.o
+	$(C) -DZLONG -c umfpack_report_vector.c -o umfpack_zl_report_vector.o
+	$(C) -DZLONG -c umfpack_solve.c -o umfpack_zl_solve.o
+	$(C) -DZLONG -c umfpack_symbolic.c -o umfpack_zl_symbolic.o
+	$(C) -DZLONG -c umfpack_transpose.c -o umfpack_zl_transpose.o
+	$(C) -DZLONG -c umfpack_triplet_to_col.c -o umfpack_zl_triplet_to_col.o
+	$(C) -DZLONG -c umfpack_scale.c -o umfpack_zl_scale.o
+	$(C) -DZLONG -c umfpack_load_numeric.c -o umfpack_zl_load_numeric.o
+	$(C) -DZLONG -c umfpack_save_numeric.c -o umfpack_zl_save_numeric.o
+	$(C) -DZLONG -c umfpack_load_symbolic.c -o umfpack_zl_load_symbolic.o
+	$(C) -DZLONG -c umfpack_save_symbolic.c -o umfpack_zl_save_symbolic.o
+	$(AR) cr ../Lib/libumfpack.a \
+	    umf_i_analyze.o umf_i_apply_order.o umf_i_colamd.o umf_i_free.o \
+	    umf_i_fsize.o umf_i_is_permutation.o umf_i_malloc.o umf_i_realloc.o \
+	    umf_i_report_perm.o umf_i_singletons.o \
+	    umf_l_analyze.o umf_l_apply_order.o umf_l_colamd.o umf_l_free.o \
+	    umf_l_fsize.o umf_l_is_permutation.o umf_l_malloc.o umf_l_realloc.o \
+	    umf_l_report_perm.o umf_l_singletons.o \
+	    umfpack_gn_timer.o umfpack_gn_tictoc.o \
+	    umf_di_lhsolve.o \
+	    umf_di_uhsolve.o umf_di_triplet_map_nox.o umf_di_triplet_nomap_x.o \
+	    umf_di_triplet_nomap_nox.o umf_di_triplet_map_x.o \
+	    umf_di_assemble_fixq.o umf_di_store_lu_drop.o umf_di_assemble.o \
+	    umf_di_blas3_update.o umf_di_build_tuples.o \
+	    umf_di_create_element.o umf_di_dump.o umf_di_extend_front.o \
+	    umf_di_garbage_collection.o umf_di_get_memory.o \
+	    umf_di_init_front.o umf_di_kernel.o umf_di_kernel_init.o \
+	    umf_di_kernel_wrapup.o umf_di_local_search.o umf_di_lsolve.o \
+	    umf_di_ltsolve.o umf_di_mem_alloc_element.o \
+	    umf_di_mem_alloc_head_block.o umf_di_mem_alloc_tail_block.o \
+	    umf_di_mem_free_tail_block.o umf_di_mem_init_memoryspace.o \
+	    umf_di_report_vector.o umf_di_row_search.o umf_di_scale_column.o \
+	    umf_di_set_stats.o umf_di_solve.o umf_di_symbolic_usage.o \
+	    umf_di_transpose.o umf_di_tuple_lengths.o umf_di_usolve.o \
+	    umf_di_utsolve.o umf_di_valid_numeric.o umf_di_valid_symbolic.o \
+	    umf_di_grow_front.o umf_di_start_front.o umf_di_2by2.o \
+	    umf_di_store_lu.o umf_di_scale.o umfpack_di_wsolve.o \
+	    umfpack_di_col_to_triplet.o umfpack_di_defaults.o \
+	    umfpack_di_free_numeric.o umfpack_di_free_symbolic.o \
+	    umfpack_di_get_numeric.o umfpack_di_get_lunz.o \
+	    umfpack_di_get_symbolic.o umfpack_di_get_determinant.o \
+	    umfpack_di_numeric.o \
+	    umfpack_di_qsymbolic.o umfpack_di_report_control.o \
+	    umfpack_di_report_info.o umfpack_di_report_matrix.o \
+	    umfpack_di_report_numeric.o umfpack_di_report_perm.o \
+	    umfpack_di_report_status.o umfpack_di_report_symbolic.o \
+	    umfpack_di_report_triplet.o umfpack_di_report_vector.o \
+	    umfpack_di_solve.o umfpack_di_symbolic.o umfpack_di_transpose.o \
+	    umfpack_di_triplet_to_col.o umfpack_di_scale.o \
+	    umfpack_di_load_numeric.o umfpack_di_save_numeric.o \
+	    umfpack_di_load_symbolic.o umfpack_di_save_symbolic.o \
+	    umf_dl_lhsolve.o \
+	    umf_dl_uhsolve.o umf_dl_triplet_map_nox.o umf_dl_triplet_nomap_x.o \
+	    umf_dl_triplet_nomap_nox.o umf_dl_triplet_map_x.o \
+	    umf_dl_assemble_fixq.o umf_dl_store_lu_drop.o umf_dl_assemble.o \
+	    umf_dl_blas3_update.o umf_dl_build_tuples.o \
+	    umf_dl_create_element.o umf_dl_dump.o umf_dl_extend_front.o \
+	    umf_dl_garbage_collection.o umf_dl_get_memory.o \
+	    umf_dl_init_front.o umf_dl_kernel.o umf_dl_kernel_init.o \
+	    umf_dl_kernel_wrapup.o umf_dl_local_search.o umf_dl_lsolve.o \
+	    umf_dl_ltsolve.o umf_dl_mem_alloc_element.o \
+	    umf_dl_mem_alloc_head_block.o umf_dl_mem_alloc_tail_block.o \
+	    umf_dl_mem_free_tail_block.o umf_dl_mem_init_memoryspace.o \
+	    umf_dl_report_vector.o umf_dl_row_search.o umf_dl_scale_column.o \
+	    umf_dl_set_stats.o umf_dl_solve.o umf_dl_symbolic_usage.o \
+	    umf_dl_transpose.o umf_dl_tuple_lengths.o umf_dl_usolve.o \
+	    umf_dl_utsolve.o umf_dl_valid_numeric.o umf_dl_valid_symbolic.o \
+	    umf_dl_grow_front.o umf_dl_start_front.o umf_dl_2by2.o \
+	    umf_dl_store_lu.o umf_dl_scale.o umfpack_dl_wsolve.o \
+	    umfpack_dl_col_to_triplet.o umfpack_dl_defaults.o \
+	    umfpack_dl_free_numeric.o umfpack_dl_free_symbolic.o \
+	    umfpack_dl_get_numeric.o umfpack_dl_get_lunz.o \
+	    umfpack_dl_get_symbolic.o umfpack_dl_get_determinant.o \
+	    umfpack_dl_numeric.o \
+	    umfpack_dl_qsymbolic.o umfpack_dl_report_control.o \
+	    umfpack_dl_report_info.o umfpack_dl_report_matrix.o \
+	    umfpack_dl_report_numeric.o umfpack_dl_report_perm.o \
+	    umfpack_dl_report_status.o umfpack_dl_report_symbolic.o \
+	    umfpack_dl_report_triplet.o umfpack_dl_report_vector.o \
+	    umfpack_dl_solve.o umfpack_dl_symbolic.o umfpack_dl_transpose.o \
+	    umfpack_dl_triplet_to_col.o umfpack_dl_scale.o \
+	    umfpack_dl_load_numeric.o umfpack_dl_save_numeric.o \
+	    umfpack_dl_load_symbolic.o umfpack_dl_save_symbolic.o \
+	    umf_zi_lhsolve.o \
+	    umf_zi_uhsolve.o umf_zi_triplet_map_nox.o umf_zi_triplet_nomap_x.o \
+	    umf_zi_triplet_nomap_nox.o umf_zi_triplet_map_x.o \
+	    umf_zi_assemble_fixq.o umf_zi_store_lu_drop.o umf_zi_assemble.o \
+	    umf_zi_blas3_update.o umf_zi_build_tuples.o \
+	    umf_zi_create_element.o umf_zi_dump.o umf_zi_extend_front.o \
+	    umf_zi_garbage_collection.o umf_zi_get_memory.o \
+	    umf_zi_init_front.o umf_zi_kernel.o umf_zi_kernel_init.o \
+	    umf_zi_kernel_wrapup.o umf_zi_local_search.o umf_zi_lsolve.o \
+	    umf_zi_ltsolve.o umf_zi_mem_alloc_element.o \
+	    umf_zi_mem_alloc_head_block.o umf_zi_mem_alloc_tail_block.o \
+	    umf_zi_mem_free_tail_block.o umf_zi_mem_init_memoryspace.o \
+	    umf_zi_report_vector.o umf_zi_row_search.o umf_zi_scale_column.o \
+	    umf_zi_set_stats.o umf_zi_solve.o umf_zi_symbolic_usage.o \
+	    umf_zi_transpose.o umf_zi_tuple_lengths.o umf_zi_usolve.o \
+	    umf_zi_utsolve.o umf_zi_valid_numeric.o umf_zi_valid_symbolic.o \
+	    umf_zi_grow_front.o umf_zi_start_front.o umf_zi_2by2.o \
+	    umf_zi_store_lu.o umf_zi_scale.o umfpack_zi_wsolve.o \
+	    umfpack_zi_col_to_triplet.o umfpack_zi_defaults.o \
+	    umfpack_zi_free_numeric.o umfpack_zi_free_symbolic.o \
+	    umfpack_zi_get_numeric.o umfpack_zi_get_lunz.o \
+	    umfpack_zi_get_symbolic.o umfpack_zi_get_determinant.o \
+	    umfpack_zi_numeric.o \
+	    umfpack_zi_qsymbolic.o umfpack_zi_report_control.o \
+	    umfpack_zi_report_info.o umfpack_zi_report_matrix.o \
+	    umfpack_zi_report_numeric.o umfpack_zi_report_perm.o \
+	    umfpack_zi_report_status.o umfpack_zi_report_symbolic.o \
+	    umfpack_zi_report_triplet.o umfpack_zi_report_vector.o \
+	    umfpack_zi_solve.o umfpack_zi_symbolic.o umfpack_zi_transpose.o \
+	    umfpack_zi_triplet_to_col.o umfpack_zi_scale.o \
+	    umfpack_zi_load_numeric.o umfpack_zi_save_numeric.o \
+	    umfpack_zi_load_symbolic.o umfpack_zi_save_symbolic.o \
+	    umf_zl_lhsolve.o \
+	    umf_zl_uhsolve.o umf_zl_triplet_map_nox.o umf_zl_triplet_nomap_x.o \
+	    umf_zl_triplet_nomap_nox.o umf_zl_triplet_map_x.o \
+	    umf_zl_assemble_fixq.o umf_zl_store_lu_drop.o umf_zl_assemble.o \
+	    umf_zl_blas3_update.o umf_zl_build_tuples.o \
+	    umf_zl_create_element.o umf_zl_dump.o umf_zl_extend_front.o \
+	    umf_zl_garbage_collection.o umf_zl_get_memory.o \
+	    umf_zl_init_front.o umf_zl_kernel.o umf_zl_kernel_init.o \
+	    umf_zl_kernel_wrapup.o umf_zl_local_search.o umf_zl_lsolve.o \
+	    umf_zl_ltsolve.o umf_zl_mem_alloc_element.o \
+	    umf_zl_mem_alloc_head_block.o umf_zl_mem_alloc_tail_block.o \
+	    umf_zl_mem_free_tail_block.o umf_zl_mem_init_memoryspace.o \
+	    umf_zl_report_vector.o umf_zl_row_search.o umf_zl_scale_column.o \
+	    umf_zl_set_stats.o umf_zl_solve.o umf_zl_symbolic_usage.o \
+	    umf_zl_transpose.o umf_zl_tuple_lengths.o umf_zl_usolve.o \
+	    umf_zl_utsolve.o umf_zl_valid_numeric.o umf_zl_valid_symbolic.o \
+	    umf_zl_grow_front.o umf_zl_start_front.o umf_zl_2by2.o \
+	    umf_zl_store_lu.o umf_zl_scale.o umfpack_zl_wsolve.o \
+	    umfpack_zl_col_to_triplet.o umfpack_zl_defaults.o \
+	    umfpack_zl_free_numeric.o umfpack_zl_free_symbolic.o \
+	    umfpack_zl_get_numeric.o umfpack_zl_get_lunz.o \
+	    umfpack_zl_get_symbolic.o umfpack_zl_get_determinant.o \
+	    umfpack_zl_numeric.o \
+	    umfpack_zl_qsymbolic.o umfpack_zl_report_control.o \
+	    umfpack_zl_report_info.o umfpack_zl_report_matrix.o \
+	    umfpack_zl_report_numeric.o umfpack_zl_report_perm.o \
+	    umfpack_zl_report_status.o umfpack_zl_report_symbolic.o \
+	    umfpack_zl_report_triplet.o umfpack_zl_report_vector.o \
+	    umfpack_zl_solve.o umfpack_zl_symbolic.o umfpack_zl_transpose.o \
+	    umfpack_zl_triplet_to_col.o umfpack_zl_scale.o \
+	    umfpack_zl_load_numeric.o umfpack_zl_save_numeric.o \
+	    umfpack_zl_load_symbolic.o umfpack_zl_save_symbolic.o
+	- $(RANLIB) ../Lib/libumfpack.a
+
+#-------------------------------------------------------------------------------
+# Remove all but the files in the original distribution
+#-------------------------------------------------------------------------------
+
+purge: clean
+	- $(RM) ../Lib/libumfpack.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_2by2.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,859 @@
+/* ========================================================================== */
+/* === UMF_2by2 ============================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  Not user-callable.  Computes a row permutation P so that A (P,:) has a
+ *  mostly zero-free diagonal, with large entries on the diagonal.  It does this
+ *  by swapping pairs of rows.  Once a row is swapped it is not swapped again.
+ *  This is a "cheap" assignment, not a complete max. transversal or
+ *  bi-partite matching.  It is only a partial matching.  For most matrices
+ *  for which this algorithm is used, however, the matching is complete (in
+ *  UMFPACK this algorithm is used for matrices with roughly symmetric pattern,
+ *  and these matrices typically have a mostly-zero-free diagonal to begin with.
+ *  This algorithm is not meant to be used on arbitrary unsymmetric matrices
+ *  (for those matrices, UMFPACK uses its unsymmetric strategy and does not
+ *  use this algorithm).
+ *
+ *  Even if incomplete, the matching is usually good enough for UMFPACK's
+ *  symmetric strategy, which can easily pivot off the diagonal during numerical
+ *  factorization if it finds a weak diagonal entry.
+ *
+ *  The algorithms works as follows.  First, row scaling factors are computed,
+ *  and weak diagonal entries are found.  A weak entry is a value A(k,k) whose
+ *  absolute value is < tol * max (abs (A (:,k))).  For each weak diagonal k in
+ *  increasing order of degree in A+A', the algorithm finds an index j such
+ *  that A (k,j) and A (j,k) are "large" (greater than or equal to tol times
+ *  the largest magnitude in their columns).  Row j must also not have already
+ *  been swapped.  Rows j and k are then swapped.  If we come to a diagonal k
+ *  that has already been swapped, then it is not modified.  This case occurs
+ *  for "oxo" pivots:
+ *
+ *    k j
+ *  k o x
+ *  j x o
+ *
+ *  which are swapped once to obtain
+ *
+ *    k j
+ *  j x o
+ *  k o x
+ *
+ *  These two rows are then not modified any further (A (j,j) was weak, but
+ *  after one swap the permuted the jth diagonal entry is strong.
+ *
+ *  This algorithm only works on square matrices (real, complex, or pattern-
+ *  only).  The numerical values are optional.  If not present, each entry is
+ *  treated as numerically acceptable (tol is ignored), and the algorithm
+ *  operates by just using the pattern, not the values.  Each column of the
+ *  input matrix A must be sorted, with no duplicate entries.  The matrix A
+ *  can be optionally scaled prior to the numerical test.  The matrix A (:,P)
+ *  has the same diagonal entries as A (:,P), except in different order.  So
+ *  the output permutation P can also be used to swap the columns of A.
+ */
+
+#include "umf_internal.h"
+
+#ifndef NDEBUG
+#include "umf_is_permutation.h"
+#endif
+
+/* x is "weak" if it is less than ctol.  If x or ctol are NaN, then define
+ * x as not "weak".  This is a rather arbitrary choice, made to simplify the
+ * computation.  On all but a PC with Microsoft C/C++, this test becomes
+ * ((x) - ctol < 0). */
+#define WEAK(x,ctol) (SCALAR_IS_LTZERO ((x)-(ctol)))
+
+/* For flag value in Next [col] */
+#define IS_WEAK -2
+
+/* ========================================================================== */
+/* === two_by_two =========================================================== */
+/* ========================================================================== */
+
+PRIVATE Int two_by_two	    /* returns # unmatched weak diagonals */
+(
+    /* input, not modified */
+    Int n2,		/* C is n2-by-n2 */
+    Int Cp [ ],		/* size n2+1, column pointers for C */
+    Int Ci [ ],		/* size snz = Cp [n2], row indices for C */
+    Int Degree [ ],	/* Degree [i] = degree of row i of C+C' */
+
+    /* input, not defined on output */
+    Int Next [ ],	/* Next [k] == IS_WEAK if k is a weak diagonal */
+    Int Ri [ ],		/* Ri [i] is the length of row i in C */
+
+    /* output, not defined on input */
+    Int P [ ],
+
+    /* workspace, not defined on input or output */
+    Int Rp [ ],
+    Int Head [ ]
+)
+{
+    Int deg, newcol, row, col, p, p2, unmatched, k, j, j2, j_best, best, jdiff,
+	jdiff_best, jdeg, jdeg_best, cp, cp1, cp2, rp, rp1, rp2, maxdeg,
+	mindeg ;
+
+    /* ---------------------------------------------------------------------- */
+    /* place weak diagonals in the degree lists */
+    /* ---------------------------------------------------------------------- */
+
+    for (deg = 0 ; deg < n2 ; deg++)
+    {
+	Head [deg] = EMPTY ;
+    }
+
+    maxdeg = 0 ;
+    mindeg = Int_MAX ;
+    for (newcol = n2-1 ; newcol >= 0 ; newcol--)
+    {
+	if (Next [newcol] == IS_WEAK)
+	{
+	    /* add this column to the list of weak nodes */
+	    DEBUGm1 (("    newcol "ID" has a weak diagonal deg "ID"\n",
+		newcol, deg)) ;
+	    deg = Degree [newcol] ;
+	    ASSERT (deg >= 0 && deg < n2) ;
+	    Next [newcol] = Head [deg] ;
+	    Head [deg] = newcol ;
+	    maxdeg = MAX (maxdeg, deg) ;
+	    mindeg = MIN (mindeg, deg) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct R = C' (C = strong entries in pruned submatrix) */
+    /* ---------------------------------------------------------------------- */
+
+    /* Ri [0..n2-1] is the length of each row of R */
+    /* use P as temporary pointer into the row form of R [ */
+    Rp [0] = 0 ;
+    for (row = 0 ; row < n2 ; row++)
+    {
+	Rp [row+1] = Rp [row] + Ri [row] ;
+	P [row] = Rp [row] ;
+    }
+    /* Ri no longer needed for row counts */
+
+    /* all entries in C are strong */
+    for (col = 0 ; col < n2 ; col++)
+    {
+	p2 = Cp [col+1] ;
+	for (p = Cp [col] ; p < p2 ; p++)
+	{
+	    /* place the column index in row = Ci [p] */
+	    Ri [P [Ci [p]]++] = col ;
+	}
+    }
+
+    /* contents of P no longer needed ] */
+
+#ifndef NDEBUG
+    DEBUG0 (("==================R: row form of strong entries in A:\n")) ;
+    UMF_dump_col_matrix ((double *) NULL,
+#ifdef COMPLEX
+	    (double *) NULL,
+#endif
+	    Ri, Rp, n2, n2, Rp [n2]) ;
+#endif
+    ASSERT (AMD_valid (n2, n2, Rp, Ri)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* for each weak diagonal, find a pair of strong off-diagonal entries */
+    /* ---------------------------------------------------------------------- */
+
+    for (row = 0 ; row < n2 ; row++)
+    {
+	P [row] = EMPTY ;
+    }
+
+    unmatched = 0 ;
+    best = EMPTY ;
+    jdiff = EMPTY ;
+    jdeg = EMPTY ;
+
+    for (deg = mindeg ; deg <= maxdeg ; deg++)
+    {
+	/* find the next weak diagonal of lowest degree */
+	DEBUGm2 (("---------------------------------- Deg: "ID"\n", deg)) ;
+	for (k = Head [deg] ; k != EMPTY ; k = Next [k])
+	{
+	    DEBUGm2 (("k: "ID"\n", k)) ;
+	    if (P [k] == EMPTY)
+	    {
+		/* C (k,k) is a weak diagonal entry.  Find an index j != k such
+		 * that C (j,k) and C (k,j) are both strong, and also such
+		 * that Degree [j] is minimized.  In case of a tie, pick
+		 * the smallest index j.  C and R contain the pattern of
+		 * strong entries only.
+		 *
+		 * Note that row k of R and column k of C are both sorted. */
+
+		DEBUGm4 (("===== Weak diagonal k = "ID"\n", k)) ;
+		DEBUG1 (("Column k of C:\n")) ;
+		for (p = Cp [k] ; p < Cp [k+1] ; p++)
+		{
+		    DEBUG1 (("    "ID": deg "ID"\n", Ci [p], Degree [Ci [p]]));
+		}
+		DEBUG1 (("Row k of R (strong entries only):\n")) ;
+		for (p = Rp [k] ; p < Rp [k+1] ; p++)
+		{
+		    DEBUG1 (("    "ID": deg "ID"\n", Ri [p], Degree [Ri [p]]));
+		}
+
+		/* no (C (k,j), C (j,k)) pair exists yet */
+		j_best = EMPTY ;
+		jdiff_best = Int_MAX ;
+		jdeg_best = Int_MAX ;
+
+		/* pointers into column k (including values) */
+		cp1 = Cp [k] ;
+		cp2 = Cp [k+1] ;
+		cp = cp1 ;
+
+		/* pointers into row k (strong entries only, no values) */
+		rp1 = Rp [k] ;
+		rp2 = Rp [k+1] ;
+		rp = rp1 ;
+
+		/* while entries searched in column k and row k */
+		while (TRUE)
+		{
+
+		    if (cp >= cp2)
+		    {
+			/* no more entries in this column */
+			break ;
+		    }
+
+		    /* get C (j,k), which is strong */
+		    j = Ci [cp] ;
+
+		    if (rp >= rp2)
+		    {
+			/* no more entries in this column */
+			break ;
+		    }
+
+		    /* get R (k,j2), which is strong */
+		    j2 = Ri [rp] ;
+
+		    if (j < j2)
+		    {
+			/* C (j,k) is strong, but R (k,j) is not strong */
+			cp++ ;
+			continue ;
+		    }
+
+		    if (j2 < j)
+		    {
+			/* C (k,j2) is strong, but R (j2,k) is not strong */
+			rp++ ;
+			continue ;
+		    }
+
+		    /* j == j2: C (j,k) is strong and R (k,j) is strong */
+
+		    best = FALSE ;
+
+		    if (P [j] == EMPTY)
+		    {
+			/* j has not yet been matched */
+			jdeg = Degree [j] ;
+			jdiff = SCALAR_ABS (k-j) ;
+
+			DEBUG1 (("Try candidate j "ID" deg "ID" diff "ID
+				    "\n", j, jdeg, jdiff)) ;
+
+			if (j_best == EMPTY)
+			{
+			    /* this is the first candidate seen */
+			    DEBUG1 (("   first\n")) ;
+			    best = TRUE ;
+			}
+			else
+			{
+			    if (jdeg < jdeg_best)
+			    {
+				/* the degree of j is best seen so far. */
+				DEBUG1 (("   least degree\n")) ;
+				best = TRUE ;
+			    }
+			    else if (jdeg == jdeg_best)
+			    {
+				/* degree of j and j_best are the same */
+				/* tie break by nearest node number */
+				if (jdiff < jdiff_best)
+				{
+				    DEBUG1 (("   tie degree, closer\n")) ;
+				    best = TRUE ;
+				}
+				else if (jdiff == jdiff_best)
+				{
+				    /* |j-k| = |j_best-k|.  For any given k
+				     * and j_best there is only one other j
+				     * than can be just as close as j_best.
+				     * Tie break by picking the smaller of
+				     * j and j_best */
+				    DEBUG1 (("   tie degree, as close\n"));
+				    best = j < j_best ;
+				}
+			    }
+			    else
+			    {
+				/* j has higher degree than best so far */
+				best = FALSE ;
+			    }
+			}
+		    }
+
+		    if (best)
+		    {
+			/* j is best match for k */
+			/* found a strong pair, A (j,k) and A (k,j) */
+			DEBUG1 ((" --- Found pair k: "ID" j: " ID
+			    " jdeg: "ID" jdiff: "ID"\n",
+			    k, j, jdeg, jdiff)) ;
+			ASSERT (jdiff != EMPTY) ;
+			ASSERT (jdeg != EMPTY) ;
+			j_best = j ;
+			jdeg_best = jdeg ;
+			jdiff_best = jdiff ;
+		    }
+
+		    /* get the next entries in column k and row k */
+		    cp++ ;
+		    rp++ ;
+		}
+
+		/* save the pair (j,k), if we found one */
+		if (j_best != EMPTY)
+		{
+		    j = j_best ;
+		    DEBUGm4 ((" --- best pair j: "ID" for k: "ID"\n", j, k)) ;
+		    P [k] = j ;
+		    P [j] = k ;
+		}
+		else
+		{
+		    /* no match was found for k */
+		    unmatched++ ;
+		}
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* finalize the row permutation, P */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n2 ; k++)
+    {
+	if (P [k] == EMPTY)
+	{
+	    P [k] = k ;
+	}
+    }
+    ASSERT (UMF_is_permutation (P, Rp, n2, n2)) ;
+
+    return (unmatched) ;
+}
+
+
+/* ========================================================================== */
+/* === UMF_2by2 ============================================================= */
+/* ========================================================================== */
+
+GLOBAL void UMF_2by2
+(
+    /* input, not modified: */
+    Int n,		    /* A is n-by-n */
+    const Int Ap [ ],	    /* size n+1 */
+    const Int Ai [ ],	    /* size nz = Ap [n] */
+    const double Ax [ ],    /* size nz if present */
+#ifdef COMPLEX
+    const double Az [ ],    /* size nz if present */
+#endif
+    double tol,		/* tolerance for determining whether or not an
+			 * entry is numerically acceptable.  If tol <= 0
+			 * then all numerical values ignored. */
+    Int scale,		/* scaling to perform (none, sum, or max) */
+    Int Cperm1 [ ],	/* singleton permutations */
+#ifndef NDEBUG
+    Int Rperm1 [ ],	/* not needed, since Rperm1 = Cperm1 for submatrix S */
+#endif
+    Int InvRperm1 [ ],	/* inverse of Rperm1 */
+    Int n1,		/* number of singletons */
+    Int nempty,		/* number of empty rows/cols */
+
+    /* input, contents undefined on output: */
+    Int Degree [ ],	/* Degree [j] is the number of off-diagonal
+			 * entries in row/column j of S+S', where
+			 * where S = A (Cperm1 [n1..], Rperm1 [n1..]).
+			 * Note that S is not used, nor formed. */
+
+    /* output: */
+    Int P [ ],		/* P [k] = i means original row i is kth row in S(P,:)
+			 * where S = A (Cperm1 [n1..], Rperm1 [n1..]) */
+    Int *p_nweak,
+    Int *p_unmatched,
+
+    /* workspace (not defined on input or output): */
+    Int Ri [ ],		/* of size >= max (nz, n) */
+    Int Rp [ ],		/* of size n+1 */
+    double Rs [ ],	/* of size n if present.  Rs = sum (abs (A),2) or
+			 * max (abs (A),2), the sum or max of each row.  Unused
+			 * if scale is equal to UMFPACK_SCALE_NONE. */
+    Int Head [ ],	/* of size n.  Head pointers for bucket sort */
+    Int Next [ ],	/* of size n.  Next pointers for bucket sort */
+    Int Ci [ ],		/* size nz */
+    Int Cp [ ]		/* size n+1 */
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry aij ;
+    double cmax, value, rs, ctol, dvalue ;
+    Int k, p, row, col, do_values, do_sum, do_max, do_scale, nweak, weak,
+	p1, p2, dfound, unmatched, n2, oldrow, newrow, oldcol, newcol, pp ;
+#ifdef COMPLEX
+    Int split = SPLIT (Az) ;
+#endif
+#ifndef NRECIPROCAL
+    Int do_recip = FALSE ;
+#endif
+
+#ifndef NDEBUG
+    /* UMF_debug += 99 ; */
+    DEBUGm3 (("\n ==================================UMF_2by2: tol %g\n", tol)) ;
+    ASSERT (AMD_valid (n, n, Ap, Ai)) ;
+    for (k = n1 ; k < n - nempty ; k++)
+    {
+	ASSERT (Cperm1 [k] == Rperm1 [k]) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* determine scaling options */
+    /* ---------------------------------------------------------------------- */
+
+    /* use the values, but only if they are present */
+    /* ignore the values if tol <= 0 */
+    do_values = (tol > 0) && (Ax != (double *) NULL) ;
+    if (do_values && (Rs != (double *) NULL))
+    {
+	do_sum = (scale == UMFPACK_SCALE_SUM) ;
+	do_max = (scale == UMFPACK_SCALE_MAX) ;
+    }
+    else
+    {
+	/* no scaling */
+	do_sum = FALSE ;
+	do_max = FALSE ;
+    }
+    do_scale = do_max || do_sum ;
+    DEBUGm3 (("do_values "ID" do_sum "ID" do_max "ID" do_scale "ID"\n",
+	do_values, do_sum, do_max, do_scale)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the row scaling, if requested */
+    /* ---------------------------------------------------------------------- */
+
+    /* see also umf_kernel_init */
+
+    if (do_scale)
+    {
+#ifndef NRECIPROCAL
+	double rsmin ;
+#endif
+	for (row = 0 ; row < n ; row++)
+	{
+	    Rs [row] = 0.0 ;
+	}
+	for (col = 0 ; col < n ; col++)
+	{
+	    p2 = Ap [col+1] ;
+	    for (p = Ap [col] ; p < p2 ; p++)
+	    {
+		row = Ai [p] ;
+		ASSIGN (aij, Ax, Az, p, split) ;
+		APPROX_ABS (value, aij) ;
+		rs = Rs [row] ;
+		if (!SCALAR_IS_NAN (rs))
+		{
+		    if (SCALAR_IS_NAN (value))
+		    {
+			/* if any entry in a row is NaN, then the scale factor
+			 * for the row is NaN.  It will be set to 1 later. */
+			Rs [row] = value ;
+		    }
+		    else if (do_max)
+		    {
+			Rs [row] = MAX (rs, value) ;
+		    }
+		    else
+		    {
+			Rs [row] += value ;
+		    }
+		}
+	    }
+	}
+#ifndef NRECIPROCAL
+	rsmin = Rs [0] ;
+	if (SCALAR_IS_ZERO (rsmin) || SCALAR_IS_NAN (rsmin))
+	{
+	    rsmin = 1.0 ;
+	}
+#endif
+	for (row = 0 ; row < n ; row++)
+	{
+	    /* do not scale an empty row, or a row with a NaN */
+	    rs = Rs [row] ;
+	    if (SCALAR_IS_ZERO (rs) || SCALAR_IS_NAN (rs))
+	    {
+		Rs [row] = 1.0 ;
+	    }
+#ifndef NRECIPROCAL
+	    rsmin = MIN (rsmin, Rs [row]) ;
+#endif
+	}
+
+#ifndef NRECIPROCAL
+	/* multiply by the reciprocal if Rs is not too small */
+	do_recip = (rsmin >= RECIPROCAL_TOLERANCE) ;
+	if (do_recip)
+	{
+	    /* invert the scale factors */
+	    for (row = 0 ; row < n ; row++)
+	    {
+		Rs [row] = 1.0 / Rs [row] ;
+	    }
+	}
+#endif
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the max in each column and find diagonal */
+    /* ---------------------------------------------------------------------- */
+
+    nweak = 0 ;
+
+#ifndef NDEBUG
+    for (k = 0 ; k < n ; k++)
+    {
+	ASSERT (Rperm1 [k] >= 0 && Rperm1 [k] < n) ;
+	ASSERT (InvRperm1 [Rperm1 [k]] == k) ;
+    }
+#endif
+
+    n2 = n - n1 - nempty ;
+
+    /* use Ri to count the number of strong entries in each row */
+    for (row = 0 ; row < n2 ; row++)
+    {
+	Ri [row] = 0 ;
+    }
+
+    pp = 0 ;
+    ctol = 0 ;
+    dvalue = 1 ;
+
+    /* construct C = pruned submatrix, strong values only, column form */
+
+    for (k = n1 ; k < n - nempty ; k++)
+    {
+	oldcol = Cperm1 [k] ;
+	newcol = k - n1 ;
+	Next [newcol] = EMPTY ;
+	DEBUGm1 (("Column "ID" newcol "ID" oldcol "ID"\n", k, newcol, oldcol)) ;
+
+	Cp [newcol] = pp ;
+
+	dfound = FALSE ;
+	p1 = Ap [oldcol] ;
+	p2 = Ap [oldcol+1] ;
+	if (do_values)
+	{
+	    cmax = 0 ;
+	    dvalue = 0 ;
+
+	    if (!do_scale)
+	    {
+		/* no scaling */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    ASSERT (oldrow >= 0 && oldrow < n) ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    ASSERT (newrow >= -n1 && newrow < n2) ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    /* if either cmax or value is NaN, define cmax as NaN */
+		    if (!SCALAR_IS_NAN (cmax))
+		    {
+			if (SCALAR_IS_NAN (value))
+			{
+			    cmax = value ;
+			}
+			else
+			{
+			    cmax = MAX (cmax, value) ;
+			}
+		    }
+		    if (oldrow == oldcol)
+		    {
+			/* we found the diagonal entry in this column */
+			dvalue = value ;
+			dfound = TRUE ;
+			ASSERT (newrow == newcol) ;
+		    }
+		}
+	    }
+#ifndef NRECIPROCAL
+	    else if (do_recip)
+	    {
+		/* multiply by the reciprocal */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    ASSERT (oldrow >= 0 && oldrow < n) ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    ASSERT (newrow >= -n1 && newrow < n2) ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    value *= Rs [oldrow] ;
+		    /* if either cmax or value is NaN, define cmax as NaN */
+		    if (!SCALAR_IS_NAN (cmax))
+		    {
+			if (SCALAR_IS_NAN (value))
+			{
+			    cmax = value ;
+			}
+			else
+			{
+			    cmax = MAX (cmax, value) ;
+			}
+		    }
+		    if (oldrow == oldcol)
+		    {
+			/* we found the diagonal entry in this column */
+			dvalue = value ;
+			dfound = TRUE ;
+			ASSERT (newrow == newcol) ;
+		    }
+		}
+	    }
+#endif
+	    else
+	    {
+		/* divide instead */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    ASSERT (oldrow >= 0 && oldrow < n) ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    ASSERT (newrow >= -n1 && newrow < n2) ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    value /= Rs [oldrow] ;
+		    /* if either cmax or value is NaN, define cmax as NaN */
+		    if (!SCALAR_IS_NAN (cmax))
+		    {
+			if (SCALAR_IS_NAN (value))
+			{
+			    cmax = value ;
+			}
+			else
+			{
+			    cmax = MAX (cmax, value) ;
+			}
+		    }
+		    if (oldrow == oldcol)
+		    {
+			/* we found the diagonal entry in this column */
+			dvalue = value ;
+			dfound = TRUE ;
+			ASSERT (newrow == newcol) ;
+		    }
+		}
+	    }
+
+	    ctol = tol * cmax ;
+	    DEBUGm1 (("    cmax col "ID" %g  ctol %g\n", oldcol, cmax, ctol)) ;
+	}
+	else
+	{
+	    for (p = p1 ; p < p2 ; p++)
+	    {
+		oldrow = Ai [p] ;
+		ASSERT (oldrow >= 0 && oldrow < n) ;
+		newrow = InvRperm1 [oldrow] - n1 ;
+		ASSERT (newrow >= -n1 && newrow < n2) ;
+		if (newrow < 0) continue ;
+		Ci [pp++] = newrow ;
+		if (oldrow == oldcol)
+		{
+		    /* we found the diagonal entry in this column */
+		    ASSERT (newrow == newcol) ;
+		    dfound = TRUE ;
+		}
+		/* count the entries in each column */
+		Ri [newrow]++ ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* flag the weak diagonals */
+	/* ------------------------------------------------------------------ */
+
+	if (!dfound)
+	{
+	    /* no diagonal entry present */
+	    weak = TRUE ;
+	}
+	else
+	{
+	    /* diagonal entry is present, check its value */
+	    weak = (do_values) ?  WEAK (dvalue, ctol) : FALSE ;
+	}
+	if (weak)
+	{
+	    /* flag this column as weak */
+	    DEBUG0 (("Weak!\n")) ;
+	    Next [newcol] = IS_WEAK ;
+	    nweak++ ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* count entries in each row that are not numerically weak */
+	/* ------------------------------------------------------------------ */
+
+	if (do_values)
+	{
+	    if (!do_scale)
+	    {
+		/* no scaling */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    weak = WEAK (value, ctol) ;
+		    if (!weak)
+		    {
+			DEBUG0 (("    strong: row "ID": %g\n", oldrow, value)) ;
+			Ci [pp++] = newrow ;
+			Ri [newrow]++ ;
+		    }
+		}
+	    }
+#ifndef NRECIPROCAL
+	    else if (do_recip)
+	    {
+		/* multiply by the reciprocal */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    value *= Rs [oldrow] ;
+		    weak = WEAK (value, ctol) ;
+		    if (!weak)
+		    {
+			DEBUG0 (("    strong: row "ID": %g\n", oldrow, value)) ;
+			Ci [pp++] = newrow ;
+			Ri [newrow]++ ;
+		    }
+		}
+	    }
+#endif
+	    else
+	    {
+		/* divide instead */
+		for (p = p1 ; p < p2 ; p++)
+		{
+		    oldrow = Ai [p] ;
+		    newrow = InvRperm1 [oldrow] - n1 ;
+		    if (newrow < 0) continue ;
+		    ASSIGN (aij, Ax, Az, p, split) ;
+		    APPROX_ABS (value, aij) ;
+		    value /= Rs [oldrow] ;
+		    weak = WEAK (value, ctol) ;
+		    if (!weak)
+		    {
+			DEBUG0 (("    strong: row "ID": %g\n", oldrow, value)) ;
+			Ci [pp++] = newrow ;
+			Ri [newrow]++ ;
+		    }
+		}
+	    }
+	}
+    }
+    Cp [n2] = pp ;
+    ASSERT (AMD_valid (n2, n2, Cp, Ci)) ;
+
+    if (nweak == 0)
+    {
+	/* nothing to do, quick return */
+	DEBUGm2 (("\n =============================UMF_2by2: quick return\n")) ;
+	for (k = 0 ; k < n ; k++)
+	{
+	    P [k] = k ;
+	}
+	*p_nweak = 0 ;
+	*p_unmatched = 0 ;
+	return ;
+    }
+
+#ifndef NDEBUG
+    for (k = 0 ; k < n2 ; k++)
+    {
+	P [k] = EMPTY ;
+    }
+    for (k = 0 ; k < n2 ; k++)
+    {
+	ASSERT (Degree [k] >= 0 && Degree [k] < n2) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* find the 2-by-2 permutation */
+    /* ---------------------------------------------------------------------- */
+
+    /* The matrix S is now mapped to the index range 0 to n2-1.  We have
+     * S = A (Rperm [n1 .. n-nempty-1], Cperm [n1 .. n-nempty-1]), and then
+     * C = pattern of strong entries in S.  A weak diagonal k in S is marked
+     * with Next [k] = IS_WEAK. */
+
+    unmatched = two_by_two (n2, Cp, Ci, Degree, Next, Ri, P, Rp, Head) ;
+
+    /* ---------------------------------------------------------------------- */
+
+    *p_nweak = nweak ;
+    *p_unmatched = unmatched ;
+
+#ifndef NDEBUG
+    DEBUGm4 (("UMF_2by2: weak "ID"  unmatched "ID"\n", nweak, unmatched)) ;
+    for (row = 0 ; row < n ; row++)
+    {
+	DEBUGm2 (("P ["ID"] = "ID"\n", row, P [row])) ;
+    }
+    DEBUGm2 (("\n =============================UMF_2by2: done\n\n")) ;
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_2by2.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,36 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_2by2
+(
+    Int n,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    double tol,
+    Int scale,
+    Int Cperm1 [ ],
+#ifndef NDEBUG
+    Int Rperm1 [ ],
+#endif
+    Int InvRperm [ ],
+    Int n1,
+    Int nempty,
+    Int Degree [ ],
+    Int P [ ],
+    Int *p_nweak,
+    Int *p_nmatched,
+    Int Ri [ ],
+    Int Rp [ ],
+    double Rs [ ],
+    Int Head [ ],
+    Int Next [ ],
+    Int Si [ ],
+    Int Sp [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_analyze.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,704 @@
+/* ========================================================================== */
+/* === UMF_analyze ========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Symbolic LL' factorization of A'*A, to get upper bounds on the size of
+    L and U for LU = PAQ, and to determine the frontal matrices and
+    (supernodal) column elimination tree.  No fill-reducing column pre-ordering
+    is used.
+
+    Returns TRUE if successful, FALSE if out of memory.  UMF_analyze can only
+    run out of memory if anzmax (which is Ap [n_row]) is too small.
+
+    Uses workspace of size O(nonzeros in A).  On input, the matrix A is
+    stored in row-form at the tail end of Ai.  It is destroyed on output.
+    The rows of A must be sorted by increasing first column index.
+    The matrix is assumed to be valid.
+
+    Empty rows and columns have already been removed.
+
+*/
+
+#include "umf_internal.h"
+#include "umf_apply_order.h"
+#include "umf_fsize.h"
+
+/* ========================================================================== */
+
+GLOBAL Int UMF_analyze
+(
+    Int n_row,		/* A is n_row-by-n_col */
+    Int n_col,
+    Int Ai [ ],		/* Ai [Ap [0]..Ap[n_row]-1]: column indices */
+			/* destroyed on output.  Note that this is NOT the */
+			/* user's Ai that was passed to UMFPACK_*symbolic */
+			/* size of Ai, Ap [n_row] = anzmax >= anz + n_col */
+			/* Ap [0] must be => n_col.  The space to the */
+			/* front of Ai is used as workspace. */
+
+    Int Ap [ ],		/* of size MAX (n_row, n_col) + 1 */
+			/* Ap [0..n_row]: row pointers */
+			/* Row i is in Ai [Ap [i] ... Ap [i+1]-1] */
+
+			/* rows must have smallest col index first, or be */
+			/* in sorted form.  Used as workspace of size n_col */
+			/* and destroyed. */
+
+			/* Note that this is NOT the */
+			/* user's Ap that was passed to UMFPACK_*symbolic */
+
+    Int Up [ ],		/* workspace of size n_col, and output column perm.
+			 * for column etree postorder. */
+
+    Int fixQ,
+
+    /* temporary workspaces: */
+    Int W [ ],		/* W [0..n_col-1] */
+    Int Link [ ],	/* Link [0..n_col-1] */
+
+    /* output: information about each frontal matrix: */
+    Int Front_ncols [ ],	/* size n_col */
+    Int Front_nrows [ ],	/* of size n_col */
+    Int Front_npivcol [ ],	/* of size n_col */
+    Int Front_parent [ ],	/* of size n_col */
+    Int *nfr_out,
+
+    Int *p_ncompactions		/* number of compactions in UMF_analyze */
+)
+{
+    /* ====================================================================== */
+    /* ==== local variables ================================================= */
+    /* ====================================================================== */
+
+    Int j, j3, col, k, row, parent, j2, pdest, p, p2, thickness, npivots, nfr,
+	i, *Winv, kk, npiv, jnext, krow, knext, pfirst, jlast, ncompactions,
+	*Front_stack, *Front_order, *Front_child, *Front_sibling,
+	Wflag, npivcol, fallrows, fallcols, fpiv, frows, fcols, *Front_size ;
+
+    nfr = 0 ;
+    DEBUG0 (("UMF_analyze: anzmax "ID" anrow "ID" ancol "ID"\n",
+	Ap [n_row], n_row, n_col)) ;
+
+    /* ====================================================================== */
+    /* ==== initializations ================================================= */
+    /* ====================================================================== */
+
+#pragma ivdep
+    for (j = 0 ; j < n_col ; j++)
+    {
+	Link [j] = EMPTY ;
+	W [j] = EMPTY ;
+	Up [j] = EMPTY ;
+
+	/* Frontal matrix data structure: */
+	Front_npivcol [j] = 0 ;		/* number of pivot columns */
+	Front_nrows [j] = 0 ;		/* number of rows, incl. pivot rows */
+	Front_ncols [j] = 0 ;		/* number of cols, incl. pivot cols */
+	Front_parent [j] = EMPTY ;	/* parent front */
+	/* Note that only non-pivotal columns are stored in a front (a "row" */
+	/* of U) during elimination. */
+    }
+
+    /* the rows must be sorted by increasing min col */
+    krow = 0 ;
+    pfirst = Ap [0] ;
+    jlast = EMPTY ;
+    jnext = EMPTY ;
+    Wflag = 0 ;
+
+    /* this test requires the size of Ai to be >= n_col + nz */
+    ASSERT (pfirst >= n_col) ;	/* Ai must be large enough */
+
+    /* pdest points to the first free space in Ai */
+    pdest = 0 ;
+    ncompactions = 0 ;
+
+    /* ====================================================================== */
+    /* === compute symbolic LL' factorization (unsorted) ==================== */
+    /* ====================================================================== */
+
+    for (j = 0 ; j < n_col ; j = jnext)
+    {
+	DEBUG1 (("\n\n============Front "ID" starting. nfr = "ID"\n", j, nfr)) ;
+
+	/* ================================================================== */
+	/* === garbage collection =========================================== */
+	/* ================================================================== */
+
+	if (pdest + (n_col-j) > pfirst)
+	{
+	    /* we might run out ... compact the rows of U */
+
+#ifndef NDEBUG
+	    DEBUG0 (("UMF_analyze COMPACTION, j="ID" pfirst="ID"\n",
+		j, pfirst)) ;
+	    for (row = 0 ; row < j ; row++)
+	    {
+		if (Up [row] != EMPTY)
+		{
+		    /* this is a live row of U */
+		    DEBUG1 (("Live row: "ID" cols: ", row)) ;
+		    p = Up [row] ;
+		    ASSERT (Front_ncols [row] > Front_npivcol [row]) ;
+		    p2 = p + (Front_ncols [row] - Front_npivcol [row]) ;
+		    for ( ; p < p2 ; p++)
+		    {
+			DEBUG1 ((ID, Ai [p])) ;
+			ASSERT (p < pfirst) ;
+			ASSERT (Ai [p] > row && Ai [p] < n_col) ;
+		    }
+		    DEBUG1 (("\n")) ;
+		}
+	    }
+	    DEBUG1 (("\nStarting to compact:\n")) ;
+#endif
+
+	    pdest = 0 ;
+	    ncompactions++ ;
+	    for (row = 0 ; row < j ; row++)
+	    {
+		if (Up [row] != EMPTY)
+		{
+		    /* this is a live row of U */
+		    DEBUG1 (("Live row: "ID" cols: ", row)) ;
+		    ASSERT (row < n_col) ;
+		    p = Up [row] ;
+		    ASSERT (Front_ncols [row] > Front_npivcol [row]) ;
+		    p2 = p + (Front_ncols [row] - Front_npivcol [row]) ;
+		    Up [row] = pdest ;
+		    for ( ; p < p2 ; p++)
+		    {
+			DEBUG1 ((ID, Ai [p])) ;
+			ASSERT (p < pfirst) ;
+			ASSERT (Ai [p] > row && Ai [p] < n_col) ;
+			Ai [pdest++] = Ai [p] ;
+			ASSERT (pdest <= pfirst) ;
+		    }
+		    DEBUG1 (("\n")) ;
+		}
+	    }
+
+#ifndef NDEBUG
+	    DEBUG1 (("\nAFTER COMPACTION, j="ID" pfirst="ID"\n", j, pfirst)) ;
+	    for (row = 0 ; row < j ; row++)
+	    {
+		if (Up [row] != EMPTY)
+		{
+		    /* this is a live row of U */
+		    DEBUG1 (("Live row: "ID" cols: ", row)) ;
+		    p = Up [row] ;
+		    ASSERT (Front_ncols [row] > Front_npivcol [row]) ;
+		    p2 = p + (Front_ncols [row] - Front_npivcol [row]) ;
+		    for ( ; p < p2 ; p++)
+		    {
+			DEBUG1 ((ID, Ai [p])) ;
+			ASSERT (p < pfirst) ;
+			ASSERT (Ai [p] > row && Ai [p] < n_col) ;
+		    }
+		    DEBUG1 (("\n")) ;
+		}
+	    }
+#endif
+
+	}
+
+	if (pdest + (n_col-j) > pfirst)
+	{
+	    /* :: out of memory in umf_analyze :: */
+	    /* it can't happen, if pfirst >= n_col */
+	    return (FALSE) ;	/* internal error! */
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* is the last front a child of this one? */
+	/* ------------------------------------------------------------------ */
+
+	if (jlast != EMPTY && Link [j] == jlast)
+	{
+	    /* yes - create row j by appending to jlast */
+	    DEBUG1 (("GOT:last front is child of this one: j "ID" jlast "ID"\n",
+		j, jlast)) ;
+	    ASSERT (jlast >= 0 && jlast < j) ;
+
+	    Up [j] = Up [jlast] ;
+	    Up [jlast] = EMPTY ;
+
+	    /* find the parent, delete column j, and update W */
+	    parent = n_col ;
+	    for (p = Up [j] ; p < pdest ; )
+	    {
+		j3 = Ai [p] ;
+		DEBUG1 (("Initial row of U: col "ID" ", j3)) ;
+		ASSERT (j3 >= 0 && j3 < n_col) ;
+		DEBUG1 (("W: "ID" \n", W [j3])) ;
+		ASSERT (W [j3] == Wflag) ;
+		if (j == j3)
+		{
+		    DEBUG1 (("Found column j at p = "ID"\n", p)) ;
+		    Ai [p] = Ai [--pdest] ;
+		}
+		else
+		{
+		    if (j3 < parent)
+		    {
+			parent = j3 ;
+		    }
+		    p++ ;
+		}
+	    }
+
+	    /* delete jlast from the link list of j */
+	    Link [j] = Link [jlast] ;
+
+	    ASSERT (Front_nrows [jlast] > Front_npivcol [jlast]) ;
+	    thickness = (Front_nrows [jlast] - Front_npivcol [jlast]) ;
+	    DEBUG1 (("initial thickness: "ID"\n", thickness)) ;
+
+	}
+	else
+	{
+	    Up [j] = pdest ;
+	    parent = n_col ;
+	    /* thickness: number of (nonpivotal) rows in frontal matrix j */
+	    thickness = 0 ;
+	    Wflag = j ;
+	}
+
+	/* ================================================================== */
+	/* === compute row j of A*A' ======================================== */
+	/* ================================================================== */
+
+	/* ------------------------------------------------------------------ */
+	/* flag the diagonal entry in row U, but do not add to pattern */
+	/* ------------------------------------------------------------------ */
+
+	ASSERT (pdest <= pfirst) ;
+	W [j] = Wflag ;
+
+	DEBUG1 (("\nComputing row "ID" of A'*A\n", j)) ;
+	DEBUG2 (("	col: "ID" (diagonal)\n", j)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* find the rows the contribute to this column j */
+	/* ------------------------------------------------------------------ */
+
+	jnext = n_col ;
+	for (knext = krow ; knext < n_row ; knext++)
+	{
+	    ASSERT (Ap [knext] < Ap [knext+1]) ;
+	    ASSERT (Ap [knext] >= pfirst && Ap [knext] <= Ap [n_row]) ;
+	    jnext = Ai [Ap [knext]] ;
+	    ASSERT (jnext >= j) ;
+	    if (jnext != j)
+	    {
+		break ;
+	    }
+	}
+
+	/* rows krow ... knext-1 all have first column index of j */
+	/* (or are empty) */
+
+	/* row knext has first column index of jnext */
+	/* if knext = n_row, then jnext is n_col */
+	if (knext == n_row)
+	{
+	    jnext = n_col ;
+	}
+
+	ASSERT (jnext > j) ;
+	ASSERT (jnext <= n_col) ;
+
+	/* ------------------------------------------------------------------ */
+	/* for each nonzero A (k,j) in column j of A do: */
+	/* ------------------------------------------------------------------ */
+
+	for (k = krow ; k < knext ; k++)
+	{
+	    p = Ap [k] ;
+	    p2 = Ap [k+1] ;
+	    ASSERT (p < p2) ;
+
+	    /* merge row k of A into W */
+	    DEBUG2 (("	---- A row "ID" ", k)) ;
+	    ASSERT (k >= 0 && k < n_row) ;
+	    ASSERT (Ai [p] == j) ;
+	    DEBUG2 (("  p "ID" p2 "ID"\n        cols:", p, p2)) ;
+	    ASSERT (p  >= pfirst && p  < Ap [n_row]) ;
+	    ASSERT (p2 >  pfirst && p2 <= Ap [n_row]) ;
+	    for ( ; p < p2 ; p++)
+	    {
+		/* add to pattern if seen for the first time */
+		col = Ai [p] ;
+		ASSERT (col >= j && col < n_col) ;
+		DEBUG3 ((" "ID, col)) ;
+		if (W [col] != Wflag)
+		{
+		    Ai [pdest++] = col ;
+		    ASSERT (pdest <= pfirst) ;
+		    /* flag this column has having been seen for row j */
+		    W [col] = Wflag ;
+		    if (col < parent)
+		    {
+			parent = col ;
+		    }
+		}
+	    }
+	    DEBUG2 (("\n")) ;
+	    thickness++ ;
+	}
+
+#ifndef NDEBUG
+	DEBUG3 (("\nRow "ID" of A'A:\n", j)) ;
+	for (p = Up [j] ; p < pdest ; p++)
+	{
+	    DEBUG3 ((" "ID, Ai [p])) ;
+	}
+	DEBUG3 (("\n")) ;
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* delete rows up to but not including knext */
+	/* ------------------------------------------------------------------ */
+
+	krow = knext ;
+	pfirst = Ap [knext] ;
+
+	/* we can now use Ai [0..pfirst-1] as workspace for rows of U */
+
+	/* ================================================================== */
+	/* === compute jth row of U ========================================= */
+	/* ================================================================== */
+
+	/* for each nonzero U (k,j) in column j of U (1:j-1,:) do */
+	for (k = Link [j] ; k != EMPTY ; k = Link [k])
+	{
+	    /* merge row k of U into W */
+	    DEBUG2 (("	---- U row "ID, k)) ;
+	    ASSERT (k >= 0 && k < n_col) ;
+	    ASSERT (Up [k] != EMPTY) ;
+	    p = Up [k] ;
+	    ASSERT (Front_ncols [k] > Front_npivcol [k]) ;
+	    p2 = p + (Front_ncols [k] - Front_npivcol [k]) ;
+	    DEBUG2 (("  p "ID" p2 "ID"\n        cols:", p, p2)) ;
+	    ASSERT (p <= pfirst) ;
+	    ASSERT (p2 <= pfirst) ;
+	    for ( ; p < p2 ; p++)
+	    {
+		/* add to pattern if seen for the first time */
+		col = Ai [p] ;
+		ASSERT (col >= j && col < n_col) ;
+		DEBUG3 ((" "ID, col)) ;
+		if (W [col] != Wflag)
+		{
+		    Ai [pdest++] = col ;
+		    ASSERT (pdest <= pfirst) ;
+		    /* flag this col has having been seen for row j */
+		    W [col] = Wflag ;
+		    if (col < parent)
+		    {
+			parent = col ;
+		    }
+		}
+	    }
+	    DEBUG2 (("\n")) ;
+
+	    /* mark the row k as deleted */
+	    Up [k] = EMPTY ;
+
+	    ASSERT (Front_nrows [k] > Front_npivcol [k]) ;
+	    thickness += (Front_nrows [k] - Front_npivcol [k]) ;
+	    ASSERT (Front_parent [k] == j) ;
+	}
+
+#ifndef NDEBUG
+	DEBUG3 (("\nRow "ID" of U prior to supercolumn detection:\n", j));
+	for (p = Up [j] ; p < pdest ; p++)
+	{
+	    DEBUG3 ((" "ID, Ai [p])) ;
+	}
+	DEBUG3 (("\n")) ;
+	DEBUG1 (("thickness, prior to supercol detect: "ID"\n", thickness)) ;
+#endif
+
+	/* ================================================================== */
+	/* === quicky mass elimination ====================================== */
+	/* ================================================================== */
+
+	/* this code detects some supernodes, but it might miss */
+	/* some because the elimination tree (created on the fly) */
+	/* is not yet post-ordered, and because the pattern of A'*A */
+	/* is also computed on the fly. */
+
+	/* j2 is incremented because the pivot columns are not stored */
+
+	for (j2 = j+1 ; j2 < jnext ; j2++)
+	{
+	    ASSERT (j2 >= 0 && j2 < n_col) ;
+	    if (W [j2] != Wflag || Link [j2] != EMPTY)
+	    {
+		break ;
+	    }
+	}
+
+	/* the loop above terminated with j2 at the first non-supernode */
+	DEBUG1 (("jnext = "ID"\n", jnext)) ;
+	ASSERT (j2 <= jnext) ;
+	jnext = j2 ;
+	j2-- ;
+	DEBUG1 (("j2 = "ID"\n", j2)) ;
+	ASSERT (j2 < n_col) ;
+
+	npivots = j2-j+1 ;
+	DEBUG1 (("Number of pivot columns: "ID"\n", npivots)) ;
+
+	/* rows j:j2 have the same nonzero pattern, except for columns j:j2-1 */
+
+	if (j2 > j)
+	{
+	    /* supernode detected, prune the pattern of new row j */
+	    ASSERT (parent == j+1) ;
+	    ASSERT (j2 < n_col) ;
+	    DEBUG1 (("Supernode detected, j "ID" to j2 "ID"\n", j, j2)) ;
+
+	    parent = n_col ;
+	    p2 = pdest ;
+	    pdest = Up [j] ;
+	    for (p = Up [j] ; p < p2 ; p++)
+	    {
+		col = Ai [p] ;
+		ASSERT (col >= 0 && col < n_col) ;
+		ASSERT (W [col] == Wflag) ;
+		if (col > j2)
+		{
+		    /* keep this col in the pattern of the new row j */
+		    Ai [pdest++] = col ;
+		    if (col < parent)
+		    {
+			parent = col ;
+		    }
+		}
+	    }
+	}
+
+	DEBUG1 (("Parent ["ID"] = "ID"\n", j, parent)) ;
+	ASSERT (parent > j2) ;
+
+	if (parent == n_col)
+	{
+	    /* this front has no parent - it is the root of a subtree */
+	    parent = EMPTY ;
+	}
+
+#ifndef NDEBUG
+	DEBUG3 (("\nFinal row "ID" of U after supercolumn detection:\n", j)) ;
+	for (p = Up [j] ; p < pdest ; p++)
+	{
+	    ASSERT (Ai [p] >= 0 && Ai [p] < n_col) ;
+	    DEBUG3 ((" "ID" ("ID")", Ai [p], W [Ai [p]])) ;
+	    ASSERT (W [Ai [p]] == Wflag) ;
+	}
+	DEBUG3 (("\n")) ;
+#endif
+
+	/* ================================================================== */
+	/* === frontal matrix =============================================== */
+	/* ================================================================== */
+
+	/* front has Front_npivcol [j] pivot columns */
+	/* entire front is Front_nrows [j] -by- Front_ncols [j] */
+	/* j is first column in the front */
+
+	npivcol = npivots ;
+	fallrows = thickness ;
+	fallcols = npivots + pdest - Up [j] ;
+
+	/* number of pivots in the front (rows and columns) */
+	fpiv = MIN (npivcol, fallrows) ;
+
+	/* size of contribution block */
+	frows = fallrows - fpiv ;
+	fcols = fallcols - fpiv ;
+
+	if (frows == 0 || fcols == 0)
+	{
+	    /* front has no contribution block and thus needs no parent */
+	    DEBUG1 (("Frontal matrix evaporation\n")) ;
+	    Up [j] = EMPTY ;
+	    parent = EMPTY ;
+	}
+
+	Front_npivcol [j] = npivots ;
+	Front_nrows [j] = fallrows ;
+	Front_ncols [j] = fallcols ;
+	Front_parent [j] = parent ;
+	ASSERT (npivots > 0) ;
+
+	/* Front_parent [j] is the first column of the parent frontal matrix */
+
+	DEBUG1 (("\n\n==== Front "ID", nfr "ID" pivot columns "ID":"ID
+	    " all front: "ID"-by-"ID" Parent: "ID"\n", j, nfr, j,j+npivots-1,
+	    Front_nrows [j], Front_ncols [j], Front_parent [j])) ;
+	nfr++ ;
+
+	/* ================================================================== */
+	/* === prepare this row for its parent ============================== */
+	/* ================================================================== */
+
+	if (parent != EMPTY)
+	{
+	    Link [j] = Link [parent] ;
+	    Link [parent] = j ;
+	}
+
+	ASSERT (jnext > j) ;
+
+	jlast = j ;
+    }
+
+    /* ====================================================================== */
+    /* === postorder the fronts ============================================= */
+    /* ====================================================================== */
+
+    *nfr_out = nfr ;
+
+    Front_order = W ;	/* use W for Front_order [ */
+
+    if (fixQ)
+    {
+	/* do not postorder the fronts if Q is fixed */
+	DEBUG1 (("\nNo postorder (Q is fixed)\n")) ;
+	k = 0 ;
+	/* Pragma added May 14, 2003.  The Intel compiler icl 6.0 (an old
+	 * version) incorrectly vectorizes this loop. */
+#pragma novector
+	for (j = 0 ; j < n_col ; j++)
+	{
+	    if (Front_npivcol [j] > 0)
+	    {
+		Front_order [j] = k++ ;
+		DEBUG1 (("Front order of j: "ID" is:"ID"\n", j,
+		    Front_order [j])) ;
+	    }
+	    else
+	    {
+		Front_order [j] = EMPTY ;
+	    }
+	}
+    }
+    else
+    {
+
+	/* use Ap for Front_child and use Link for Front_sibling [ */
+	Front_child = Ap ;
+	Front_sibling = Link ;
+
+	/* use Ai for Front_stack, size of Ai is >= 2*n_col */
+	Front_stack = Ai ;
+	Front_size = Front_stack + n_col ;
+
+	UMF_fsize (n_col, Front_size, Front_nrows, Front_ncols,
+	    Front_parent, Front_npivcol) ;
+
+	AMD_postorder (n_col, Front_parent, Front_npivcol, Front_size,
+	    Front_order, Front_child, Front_sibling, Front_stack) ;
+
+	/* done with Front_child, Front_sibling, Front_size, and Front_stack ]*/
+
+	/* ------------------------------------------------------------------ */
+	/* construct the column permutation (return in Up) */
+	/* ------------------------------------------------------------------ */
+
+	/* Front_order [i] = k means that front i is kth front in the new order.
+	 * i is in the range 0 to n_col-1, and k is in the range 0 to nfr-1 */
+
+	/* Use Ai as workspace for Winv [ */
+	Winv = Ai ;
+	for (k = 0 ; k < nfr ; k++)
+	{
+	    Winv [k] = EMPTY ;
+	}
+
+	/* compute the inverse of Front_order, so that Winv [k] = i */
+	/* if Front_order [i] = k */
+
+	DEBUG1 (("\n\nComputing output column permutation:\n")) ;
+	for (i = 0 ; i < n_col ; i++)
+	{
+	    k = Front_order [i] ;
+	    if (k != EMPTY)
+	    {
+		DEBUG1 (("Front "ID" new order: "ID"\n", i, k)) ;
+		ASSERT (k >= 0 && k < nfr) ;
+		ASSERT (Winv [k] == EMPTY) ;
+		Winv [k] = i ;
+	    }
+	}
+
+	/* Use Up as output permutation */
+	kk = 0 ;
+	for (k = 0 ; k < nfr ; k++)
+	{
+	    i = Winv [k] ;
+	    DEBUG1 (("Old Front "ID" New Front "ID" npivots "ID" nrows "ID
+		" ncols "ID"\n",
+		i, k, Front_npivcol [i], Front_nrows [i], Front_ncols [i])) ;
+	    ASSERT (i >= 0 && i < n_col) ;
+	    ASSERT (Front_npivcol [i] > 0) ;
+	    for (npiv = 0 ; npiv < Front_npivcol [i] ; npiv++)
+	    {
+		Up [kk] = i + npiv ;
+		DEBUG1 (("    Cperm ["ID"] = "ID"\n", kk, Up [kk])) ;
+		kk++ ;
+	    }
+	}
+	ASSERT (kk == n_col) ;
+
+	/* Winv no longer needed ] */
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* apply the postorder traversal to renumber the frontal matrices */
+    /* (or pack them in same order, if fixQ) */
+    /* ---------------------------------------------------------------------- */
+
+    /* use Ai as workspace */
+
+    UMF_apply_order (Front_npivcol, Front_order, Ai, n_col, nfr) ;
+    UMF_apply_order (Front_nrows,   Front_order, Ai, n_col, nfr) ;
+    UMF_apply_order (Front_ncols,   Front_order, Ai, n_col, nfr) ;
+    UMF_apply_order (Front_parent,  Front_order, Ai, n_col, nfr) ;
+
+    /* fix the parent to refer to the new numbering */
+    for (i = 0 ; i < nfr ; i++)
+    {
+	parent = Front_parent [i] ;
+	if (parent != EMPTY)
+	{
+	    ASSERT (parent >= 0 && parent < n_col) ;
+	    ASSERT (Front_order [parent] >= 0 && Front_order [parent] < nfr) ;
+	    Front_parent [i] = Front_order [parent] ;
+	}
+    }
+
+    /* Front_order longer needed ] */
+
+#ifndef NDEBUG
+    DEBUG1 (("\nFinal frontal matrices:\n")) ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	DEBUG1 (("Final front "ID": npiv "ID" nrows "ID" ncols "ID" parent "
+	    ID"\n", i, Front_npivcol [i], Front_nrows [i],
+	    Front_ncols [i], Front_parent [i])) ;
+    }
+#endif
+
+    *p_ncompactions = ncompactions ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_analyze.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,23 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_analyze
+(
+    Int n_row,
+    Int n_col,
+    Int Ai [ ],
+    Int Ap [ ],
+    Int Up [ ],
+    Int fixQ,
+    Int Front_ncols [ ],
+    Int W [ ],
+    Int Link [ ],
+    Int Front_nrows [ ],
+    Int Front_npivcol [ ],
+    Int Front_parent [ ],
+    Int *nfr_out,
+    Int *p_ncompactions
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,43 @@
+/* ========================================================================== */
+/* === UMF_apply_order ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Apply post-ordering of supernodal elimination tree.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_apply_order
+(
+    Int Front [ ],	    /* of size nn on input, size nfr on output */
+    const Int Order [ ],    /* Order [i] = k, i in the range 0..nn-1,
+			     * and k in the range 0..nfr-1, means that node
+			     * i is the kth node in the postordered tree. */
+    Int Temp [ ],	    /* workspace of size nfr */
+    Int nn,		    /* nodes are numbered in the range 0..nn-1 */
+    Int nfr		    /* the number of nodes actually in use */
+)
+{
+    Int i, k ;
+    for (i = 0 ; i < nn ; i++)
+    {
+	k = Order [i] ;
+	ASSERT (k >= EMPTY && k < nfr) ;
+	if (k != EMPTY)
+	{
+	    Temp [k] = Front [i] ;
+	}
+    }
+
+    for (k = 0 ; k < nfr ; k++)
+    {
+	Front [k] = Temp [k] ;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_apply_order.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,14 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_apply_order
+(
+    Int Front [ ],
+    const Int Order [ ],
+    Int Temp [ ],
+    Int n_col,
+    Int nfr
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_assemble.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1215 @@
+/* ========================================================================== */
+/* === UMF_assemble ========================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  Degree update and numerical assembly.  This is compiled twice (with and
+ *  without FIXQ) for each real/complex int/long version, for a total of 8
+ *  versions.*/
+
+#include "umf_internal.h"
+#include "umf_mem_free_tail_block.h"
+
+/* ========================================================================== */
+/* === row_assemble ========================================================= */
+/* ========================================================================== */
+
+PRIVATE void row_assemble
+(
+    Int row,
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+
+    Entry *S, *Fcblock, *Frow ;
+    Int tpi, e, *E, *Fcpos, *Frpos, *Row_degree, *Row_tuples, *Row_tlen, rdeg0,
+	f, nrows, ncols, *Rows, *Cols, col, ncolsleft, j ;
+    Tuple *tp, *tp1, *tp2, *tpend ;
+    Unit *Memory, *p ;
+    Element *ep ;
+
+#ifndef FIXQ
+    Int *Col_degree ;
+    Col_degree = Numeric->Cperm ;
+#endif
+
+    Row_tuples = Numeric->Uip ;
+    tpi = Row_tuples [row] ;
+    if (!tpi) return ;
+
+    Memory = Numeric->Memory ;
+    E = Work->E ;
+    Fcpos = Work->Fcpos ;
+    Frpos = Work->Frpos ;
+    Row_degree = Numeric->Rperm ;
+    Row_tlen   = Numeric->Uilen ;
+    E = Work->E ;
+    Memory = Numeric->Memory ;
+    rdeg0 = Work->rdeg0 ;
+    Fcblock = Work->Fcblock ;
+
+#ifndef NDEBUG
+    DEBUG6 (("SCAN2-row: "ID"\n", row)) ;
+    UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ;
+#endif
+
+    ASSERT (NON_PIVOTAL_ROW (row)) ;
+
+    tp = (Tuple *) (Memory + tpi) ;
+    tp1 = tp ;
+    tp2 = tp ;
+    tpend = tp + Row_tlen [row] ;
+    for ( ; tp < tpend ; tp++)
+    {
+	e = tp->e ;
+	ASSERT (e > 0 && e <= Work->nel) ;
+	if (!E [e]) continue ;	/* element already deallocated */
+	f = tp->f ;
+	p = Memory + E [e] ;
+	ep = (Element *) p ;
+	p += UNITS (Element, 1) ;
+	Cols = (Int *) p ;
+	Rows = Cols + ep->ncols ;
+	if (Rows [f] == EMPTY) continue ;   /* row already assembled */
+	ASSERT (row == Rows [f] && row >= 0 && row < Work->n_row) ;
+
+	if (ep->rdeg == rdeg0)
+	{
+	    /* ------------------------------------------------------ */
+	    /* this is an old Lson - assemble just one row */
+	    /* ------------------------------------------------------ */
+
+	    /* flag the row as assembled from the Lson */
+	    Rows [f] = EMPTY ;
+
+	    nrows = ep->nrows ;
+	    ncols = ep->ncols ;
+
+	    p += UNITS (Int, ncols + nrows) ;
+	    S = ((Entry *) p) + f ;
+
+	    DEBUG6 (("Old LSON: "ID"\n", e)) ;
+#ifndef NDEBUG
+	    UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+
+	    ncolsleft = ep->ncolsleft ;
+
+	    Frow = Fcblock + Frpos [row] ;
+	    DEBUG6 (("LSON found (in scan2-row): "ID"\n", e)) ;
+
+	    Row_degree [row] -= ncolsleft ;
+
+	    if (ncols == ncolsleft)
+	    {
+		/* -------------------------------------------------- */
+		/* no columns assembled out this Lson yet */
+		/* -------------------------------------------------- */
+
+#pragma ivdep
+		for (j = 0 ; j < ncols ; j++)
+		{
+		    col = Cols [j] ;
+		    ASSERT (col >= 0 && col < Work->n_col) ;
+#ifndef FIXQ
+		    Col_degree [col] -- ;
+#endif
+		    /* Frow [Fcpos [col]] += *S ; */
+		    ASSEMBLE (Frow [Fcpos [col]], *S) ;
+		    S += nrows ;
+		}
+
+	    }
+	    else
+	    {
+		/* -------------------------------------------------- */
+		/* some columns have been assembled out of this Lson */
+		/* -------------------------------------------------- */
+
+#pragma ivdep
+		for (j = 0 ; j < ncols ; j++)
+		{
+		    col = Cols [j] ;
+		    if (col >= 0)
+		    {
+			ASSERT (col < Work->n_col) ;
+#ifndef FIXQ
+			Col_degree [col] -- ;
+#endif
+			/* Frow [Fcpos [col]] += *S ; */
+			ASSEMBLE (Frow [Fcpos [col]], *S) ;
+		    }
+		    S += nrows ;
+		}
+
+	    }
+	    ep->nrowsleft-- ;
+	    ASSERT (ep->nrowsleft > 0) ;
+	}
+	else
+	{
+	    *tp2++ = *tp ;	/* leave the tuple in the list */
+	}
+    }
+    Row_tlen [row] = tp2 - tp1 ;
+
+#ifndef NDEBUG
+    DEBUG7 (("row assembled in scan2-row: "ID"\n", row)) ;
+    UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ;
+    DEBUG7 (("Current frontal matrix: (scan 1b)\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+}
+
+/* ========================================================================== */
+/* === col_assemble ========================================================= */
+/* ========================================================================== */
+
+PRIVATE void col_assemble
+(
+    Int col,
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+
+    Entry *S, *Fcblock, *Fcol ;
+    Int tpi, e, *E, *Fcpos, *Frpos, *Row_degree, *Col_tuples, *Col_tlen, cdeg0,
+	f, nrows, ncols, *Rows, *Cols, row, nrowsleft, i ;
+    Tuple *tp, *tp1, *tp2, *tpend ;
+    Unit *Memory, *p ;
+    Element *ep ;
+
+#if !defined (FIXQ) || !defined (NDEBUG)
+    Int *Col_degree ;
+    Col_degree = Numeric->Cperm ;
+#endif
+
+    Col_tuples = Numeric->Lip ;
+    tpi = Col_tuples [col] ;
+    if (!tpi) return ;
+
+    Memory = Numeric->Memory ;
+    E = Work->E ;
+    Fcpos = Work->Fcpos ;
+    Frpos = Work->Frpos ;
+    Row_degree = Numeric->Rperm ;
+    Col_tlen   = Numeric->Lilen ;
+    E = Work->E ;
+    Memory = Numeric->Memory ;
+    cdeg0 = Work->cdeg0 ;
+    Fcblock = Work->Fcblock ;
+
+    DEBUG6 (("SCAN2-col: "ID"\n", col)) ;
+#ifndef NDEBUG
+    UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+#endif
+
+    ASSERT (NON_PIVOTAL_COL (col)) ;
+    tp = (Tuple *) (Memory + tpi) ;
+    tp1 = tp ;
+    tp2 = tp ;
+    tpend = tp + Col_tlen [col] ;
+    for ( ; tp < tpend ; tp++)
+    {
+	e = tp->e ;
+	ASSERT (e > 0 && e <= Work->nel) ;
+	if (!E [e]) continue ;	/* element already deallocated */
+	f = tp->f ;
+	p = Memory + E [e] ;
+	ep = (Element *) p ;
+	p += UNITS (Element, 1) ;
+	Cols = (Int *) p ;
+
+	if (Cols [f] == EMPTY) continue ;   /* col already assembled */
+	ASSERT (col == Cols [f] && col >= 0 && col < Work->n_col) ;
+
+	if (ep->cdeg == cdeg0)
+	{
+	    /* ------------------------------------------------------ */
+	    /* this is an old Uson - assemble just one col */
+	    /* ------------------------------------------------------ */
+
+	    /* flag the col as assembled from the Uson */
+	    Cols [f] = EMPTY ;
+
+	    nrows = ep->nrows ;
+	    ncols = ep->ncols ;
+	    Rows = Cols + ncols ;
+	    p += UNITS (Int, ncols + nrows) ;
+	    S = ((Entry *) p) + f * nrows ;
+
+	    DEBUG6 (("Old USON: "ID"\n", e)) ;
+#ifndef NDEBUG
+	    UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+
+	    nrowsleft = ep->nrowsleft ;
+
+	    Fcol = Fcblock + Fcpos [col] ;
+	    DEBUG6 (("USON found (in scan2-col): "ID"\n", e)) ;
+#ifndef FIXQ
+	    Col_degree [col] -= nrowsleft ;
+#endif
+	    if (nrows == nrowsleft)
+	    {
+		/* -------------------------------------------------- */
+		/* no rows assembled out of this Uson yet */
+		/* -------------------------------------------------- */
+
+#pragma ivdep
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    ASSERT (row >= 0 && row < Work->n_row) ;
+		    Row_degree [row]-- ;
+		    /* Fcol [Frpos [row]] += S [i] ; */
+		    ASSEMBLE (Fcol [Frpos [row]], S [i]) ;
+		}
+	    }
+	    else
+	    {
+		/* -------------------------------------------------- */
+		/* some rows have been assembled out of this Uson */
+		/* -------------------------------------------------- */
+
+#pragma ivdep
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    if (row >= 0)
+		    {
+			ASSERT (row < Work->n_row) ;
+			Row_degree [row]-- ;
+			/* Fcol [Frpos [row]] += S [i] ; */
+			ASSEMBLE (Fcol [Frpos [row]], S [i]) ;
+		    }
+		}
+	    }
+	    ep->ncolsleft-- ;
+	    ASSERT (ep->ncolsleft > 0) ;
+	}
+	else
+	{
+	    *tp2++ = *tp ;	/* leave the tuple in the list */
+	}
+    }
+    Col_tlen [col] = tp2 - tp1 ;
+
+#ifndef NDEBUG
+    DEBUG7 (("Column assembled in scan2-col: "ID"\n", col)) ;
+    UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+    DEBUG7 (("Current frontal matrix: after scan2-col\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+}
+
+
+/* ========================================================================== */
+/* === UMF_assemble / UMF_assemble_fixq ===================================== */
+/* ========================================================================== */
+
+#ifndef FIXQ
+GLOBAL void UMF_assemble
+#else
+GLOBAL void UMF_assemble_fixq
+#endif
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int e, i, row, col, i2, nrows, ncols, f, tpi, extcdeg, extrdeg, rdeg0,
+	cdeg0, son_list, next, nrows_to_assemble,
+	ncols_to_assemble, ngetrows, j, j2,
+	nrowsleft,	/* number of rows remaining in S */
+	ncolsleft,	/* number of columns remaining in S */
+	prior_Lson, prior_Uson, *E, *Cols, *Rows, *Wm, *Woo,
+	*Row_tuples, *Row_degree, *Row_tlen,
+	*Col_tuples, *Col_tlen ;
+    Unit *Memory, *p ;
+    Element *ep ;
+    Tuple *tp, *tp1, *tp2, *tpend ;
+    Entry
+	*S,		/* a pointer into the contribution block of a son */
+	*Fcblock,	/* current contribution block */
+	*Fcol ;		/* a column of FC */
+    Int *Frpos,
+	*Fcpos,
+	fnrows,		/* number of rows in contribution block in F */
+	fncols ;	/* number of columns in contribution block in F */
+
+#if !defined (FIXQ) || !defined (NDEBUG)
+    Int *Col_degree ;
+#endif
+
+#ifndef NDEBUG
+    Int n_row, n_col ;
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    DEBUG3 (("::Assemble SCANS 1-4\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+#if !defined (FIXQ) || !defined (NDEBUG)
+    Col_degree = Numeric->Cperm ;   /* not updated if FIXQ is true */
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    fncols = Work->fncols ;
+    fnrows = Work->fnrows ;
+    Fcpos = Work->Fcpos ;
+    Frpos = Work->Frpos ;
+    Row_degree = Numeric->Rperm ;
+    Row_tuples = Numeric->Uip ;
+    Row_tlen   = Numeric->Uilen ;
+    Col_tuples = Numeric->Lip ;
+    Col_tlen   = Numeric->Lilen ;
+    E = Work->E ;
+    Memory = Numeric->Memory ;
+    Wm = Work->Wm ;
+    Woo = Work->Woo ;
+    rdeg0 = Work->rdeg0 ;
+    cdeg0 = Work->cdeg0 ;
+
+#ifndef NDEBUG
+    DEBUG6 (("============================================\n")) ;
+    DEBUG6 (("Degree update, assembly.\n")) ;
+    DEBUG6 (("pivot row pattern:  fncols="ID"\n", fncols)) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	col = Work->Fcols [j] ;
+	DEBUG6 ((ID" ", col)) ;
+	ASSERT (Fcpos [col] == j * Work->fnr_curr) ;
+	ASSERT (NON_PIVOTAL_COL (col)) ;
+    }
+    ASSERT (Fcpos [Work->pivcol] >= 0) ;
+    DEBUG6 (("pivcol: "ID" pos "ID" fnr_curr "ID" fncols "ID"\n",
+	Work->pivcol, Fcpos [Work->pivcol], Work->fnr_curr, fncols)) ;
+    ASSERT (Fcpos [Work->pivcol] <  fncols * Work->fnr_curr) ;
+    DEBUG6 (("\npivot col pattern:  fnrows="ID"\n", fnrows)) ;
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	row = Work->Frows [i] ;
+	DEBUG6 ((ID" ", row)) ;
+	ASSERT (Frpos [row] == i) ;
+	ASSERT (NON_PIVOTAL_ROW (row)) ;
+    }
+    DEBUG6 (("\n")) ;
+    ASSERT (Frpos [Work->pivrow] >= 0) ;
+    ASSERT (Frpos [Work->pivrow] < fnrows) ;
+    ASSERT (Work->Flublock == (Entry *) (Numeric->Memory + E [0])) ;
+    ASSERT (Work->Fcblock == Work->Flublock + Work->nb *
+	(Work->nb + Work->fnr_curr + Work->fnc_curr)) ;
+#endif
+
+    Fcblock = Work->Fcblock ;
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the largest actual frontal matrix size (for Info only) */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (fnrows == Work->fnrows_new + 1) ;
+    ASSERT (fncols == Work->fncols_new + 1) ;
+
+    Numeric->maxnrows = MAX (Numeric->maxnrows, fnrows) ;
+    Numeric->maxncols = MAX (Numeric->maxncols, fncols) ;
+
+    /* this is safe from integer overflow, since the current frontal matrix
+     * is already allocated. */
+    Numeric->maxfrsize = MAX (Numeric->maxfrsize, fnrows * fncols) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* assemble from prior elements into the current frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG2 (("New assemble start [prior_element:"ID"\n", Work->prior_element)) ;
+
+    /* Currently no rows or columns are marked.  No elements are scanned, */
+    /* that is, (ep->next == EMPTY) is true for all elements */
+
+    son_list = 0 ;	/* start creating son_list [ */
+
+    /* ---------------------------------------------------------------------- */
+    /* determine if most recent element is Lson or Uson of current front */
+    /* ---------------------------------------------------------------------- */
+
+    if (!Work->do_extend)
+    {
+	prior_Uson = ( Work->pivcol_in_front && !Work->pivrow_in_front) ;
+	prior_Lson = (!Work->pivcol_in_front &&  Work->pivrow_in_front) ;
+	if (prior_Uson || prior_Lson)
+	{
+	    e = Work->prior_element ;
+	    if (e != EMPTY)
+	    {
+		ASSERT (E [e]) ;
+		p = Memory + E [e] ;
+		ep = (Element *) p ;
+		ep->next = son_list ;
+		son_list = e ;
+#ifndef NDEBUG
+		DEBUG2 (("e "ID" is Prior son "ID" "ID"\n",
+		    e, prior_Uson, prior_Lson)) ;
+		UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+		ASSERT (E [e]) ;
+	    }
+	}
+    }
+    Work->prior_element = EMPTY ;
+
+    /* ---------------------------------------------------------------------- */
+    /* SCAN1-row:  scan the element lists of each new row in the pivot col */
+    /* and compute the external column degree for each frontal */
+    /* ---------------------------------------------------------------------- */
+
+    for (i2 = Work->fscan_row ; i2 < fnrows ; i2++)
+    {
+	/* Get a row */
+	row = Work->NewRows [i2] ;
+	if (row < 0) row = FLIP (row) ;
+	ASSERT (row >= 0 && row < n_row) ;
+
+	DEBUG6 (("SCAN1-row: "ID"\n", row)) ;
+#ifndef NDEBUG
+	UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ;
+#endif
+
+	ASSERT (NON_PIVOTAL_ROW (row)) ;
+	tpi = Row_tuples [row] ;
+	if (!tpi) continue ;
+	tp = (Tuple *) (Memory + tpi) ;
+	tp1 = tp ;
+	tp2 = tp ;
+	tpend = tp + Row_tlen [row] ;
+	for ( ; tp < tpend ; tp++)
+	{
+	    e = tp->e ;
+	    ASSERT (e > 0 && e <= Work->nel) ;
+	    if (!E [e]) continue ;	/* element already deallocated */
+	    f = tp->f ;
+	    p = Memory + E [e] ;
+	    ep = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Rows = ((Int *) p) + ep->ncols ;
+	    if (Rows [f] == EMPTY) continue ;	/* row already assembled */
+	    ASSERT (row == Rows [f]) ;
+
+	    if (ep->cdeg < cdeg0)
+	    {
+		/* first time seen in scan1-row */
+		ep->cdeg = ep->nrowsleft + cdeg0 ;
+		DEBUG6 (("e "ID" First seen: cdeg: "ID" ", e, ep->cdeg-cdeg0)) ;
+		ASSERT (ep->ncolsleft > 0 && ep->nrowsleft > 0) ;
+	    }
+
+	    ep->cdeg-- ;	/* decrement external column degree */
+	    DEBUG6 (("e "ID" New ext col deg: "ID"\n", e, ep->cdeg - cdeg0)) ;
+
+	    /* this element is not yet in the new son list */
+	    if (ep->cdeg == cdeg0 && ep->next == EMPTY)
+	    {
+		/* A new LUson or Uson has been found */
+		ep->next = son_list ;
+		son_list = e ;
+	    }
+
+	    ASSERT (ep->cdeg >= cdeg0) ;
+	    *tp2++ = *tp ;	/* leave the tuple in the list */
+	}
+	Row_tlen [row] = tp2 - tp1 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* SCAN1-col:  scan the element lists of each new col in the pivot row */
+    /*	 and compute the external row degree for each frontal */
+    /* ---------------------------------------------------------------------- */
+
+    for (j2 = Work->fscan_col ; j2 < fncols ; j2++)
+    {
+	/* Get a column */
+	col = Work->NewCols [j2] ;
+	if (col < 0) col = FLIP (col) ;
+	ASSERT (col >= 0 && col < n_col) ;
+
+	DEBUG6 (("SCAN 1-col: "ID"\n", col)) ;
+#ifndef NDEBUG
+	UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+#endif
+
+	ASSERT (NON_PIVOTAL_COL (col)) ;
+	tpi = Col_tuples [col] ;
+	if (!tpi) continue ;
+	tp = (Tuple *) (Memory + tpi) ;
+	tp1 = tp ;
+	tp2 = tp ;
+	tpend = tp + Col_tlen [col] ;
+	for ( ; tp < tpend ; tp++)
+	{
+	    e = tp->e ;
+	    ASSERT (e > 0 && e <= Work->nel) ;
+	    if (!E [e]) continue ;	/* element already deallocated */
+	    f = tp->f ;
+	    p = Memory + E [e] ;
+	    ep = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Cols = (Int *) p ;
+	    if (Cols [f] == EMPTY) continue ;	/* column already assembled */
+	    ASSERT (col == Cols [f]) ;
+
+	    if (ep->rdeg < rdeg0)
+	    {
+		/* first time seen in scan1-col */
+		ep->rdeg = ep->ncolsleft + rdeg0 ;
+		DEBUG6 (("e "ID" First seen: rdeg: "ID" ", e, ep->rdeg-rdeg0)) ;
+		ASSERT (ep->ncolsleft > 0 && ep->nrowsleft > 0) ;
+	    }
+
+	    ep->rdeg-- ;	/* decrement external row degree */
+	    DEBUG6 (("e "ID" New ext row degree: "ID"\n", e, ep->rdeg-rdeg0)) ;
+
+	    if (ep->rdeg == rdeg0 && ep->next == EMPTY)
+	    {
+		/* A new LUson or Lson has been found */
+		ep->next = son_list ;
+		son_list = e ;
+	    }
+
+	    ASSERT (ep->rdeg >= rdeg0) ;
+	    *tp2++ = *tp ;	/* leave the tuple in the list */
+	}
+	Col_tlen [col] = tp2 - tp1 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* assemble new sons via full scans */
+    /* ---------------------------------------------------------------------- */
+
+    next = EMPTY ;
+
+    for (e = son_list ; e > 0 ; e = next)
+    {
+	ASSERT (e > 0 && e <= Work->nel && E [e]) ;
+	p = Memory + E [e] ;
+	DEBUG2 (("New son: "ID"\n", e)) ;
+#ifndef NDEBUG
+	UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+	GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, S) ;
+	nrowsleft = ep->nrowsleft ;
+	ncolsleft = ep->ncolsleft ;
+	next = ep->next ;
+	ep->next = EMPTY ;
+
+	extrdeg = (ep->rdeg < rdeg0) ? ncolsleft : (ep->rdeg - rdeg0) ;
+	extcdeg = (ep->cdeg < cdeg0) ? nrowsleft : (ep->cdeg - cdeg0) ;
+	ncols_to_assemble = ncolsleft - extrdeg ;
+	nrows_to_assemble = nrowsleft - extcdeg ;
+	DEBUG2 (("extrdeg "ID" extcdeg "ID"\n", extrdeg, extcdeg)) ;
+
+	if (extrdeg == 0 && extcdeg == 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* this is an LUson - assemble an entire contribution block */
+	    /* -------------------------------------------------------------- */
+
+	    DEBUG6 (("LUson found: "ID"\n", e)) ;
+
+	    if (nrows == nrowsleft)
+	    {
+		/* ---------------------------------------------------------- */
+		/* no rows assembled out of this LUson yet */
+		/* ---------------------------------------------------------- */
+
+		/* compute the compressed column offset vector*/
+		/* [ use Wm [0..nrows-1] for offsets */
+#pragma ivdep
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    Row_degree [row] -= ncolsleft ;
+		    Wm [i] = Frpos [row] ;
+		}
+
+		if (ncols == ncolsleft)
+		{
+		    /* ------------------------------------------------------ */
+		    /* no rows or cols assembled out of LUson yet */
+		    /* ------------------------------------------------------ */
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+#ifndef FIXQ
+			Col_degree [col] -= nrowsleft ;
+#endif
+			Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+			for (i = 0 ; i < nrows ; i++)
+			{
+			    /* Fcol [Wm [i]] += S [i] ; */
+			    ASSEMBLE (Fcol [Wm [i]], S [i]) ;
+			}
+			S += nrows ;
+		    }
+
+
+		}
+		else
+		{
+		    /* ------------------------------------------------------ */
+		    /* only cols have been assembled out of LUson */
+		    /* ------------------------------------------------------ */
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+			if (col >= 0)
+			{
+#ifndef FIXQ
+			    Col_degree [col] -= nrowsleft ;
+#endif
+			    Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+			    for (i = 0 ; i < nrows ; i++)
+			    {
+				/* Fcol [Wm [i]] += S [i] ; */
+				ASSEMBLE (Fcol [Wm [i]], S [i]) ;
+			    }
+			}
+			S += nrows ;
+		    }
+
+		}
+		/* ] done using Wm [0..nrows-1] for offsets */
+	    }
+	    else
+	    {
+		/* ---------------------------------------------------------- */
+		/* some rows have been assembled out of this LUson */
+		/* ---------------------------------------------------------- */
+
+		/* compute the compressed column offset vector*/
+		/* [ use Woo,Wm [0..nrowsleft-1] for offsets */
+		ngetrows = 0 ;
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    if (row >= 0)
+		    {
+			Row_degree [row] -= ncolsleft ;
+			Woo [ngetrows] = i ;
+			Wm [ngetrows++] = Frpos [row] ;
+		    }
+		}
+		ASSERT (ngetrows == nrowsleft) ;
+
+		if (ncols == ncolsleft)
+		{
+		    /* ------------------------------------------------------ */
+		    /* only rows have been assembled out of this LUson */
+		    /* ------------------------------------------------------ */
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+#ifndef FIXQ
+			Col_degree [col] -= nrowsleft ;
+#endif
+			Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+			for (i = 0 ; i < nrowsleft ; i++)
+			{
+			    /* Fcol [Wm [i]] += S [Woo [i]] ; */
+			    ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ;
+			}
+			S += nrows ;
+		    }
+
+		}
+		else
+		{
+		    /* ------------------------------------------------------ */
+		    /* both rows and columns have been assembled out of LUson */
+		    /* ------------------------------------------------------ */
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+			if (col >= 0)
+			{
+#ifndef FIXQ
+			    Col_degree [col] -= nrowsleft ;
+#endif
+			    Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+			    for (i = 0 ; i < nrowsleft ; i++)
+			    {
+				/* Fcol [Wm [i]] += S [Woo [i]] ; */
+				ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ;
+			    }
+			}
+			S += nrows ;
+		    }
+
+		}
+		/* ] done using Woo,Wm [0..nrowsleft-1] */
+	    }
+
+	    /* deallocate the element: remove from ordered list */
+	    UMF_mem_free_tail_block (Numeric, E [e]) ;
+	    E [e] = 0 ;
+
+	}
+	else if (extcdeg == 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* this is a Uson - assemble all possible columns */
+	    /* -------------------------------------------------------------- */
+
+	    DEBUG6 (("New USON: "ID"\n", e)) ;
+	    ASSERT (extrdeg > 0) ;
+
+	    DEBUG6 (("New uson "ID" cols to do "ID"\n", e, ncols_to_assemble)) ;
+
+	    if (ncols_to_assemble > 0)
+	    {
+
+		Int skip = FALSE ;
+		if (ncols_to_assemble * 16 < ncols && nrows == 1)
+		{
+		    /* this is a tall and thin frontal matrix consisting of
+		     * only one column (most likely an original column). Do
+		     * not assemble it.   It cannot be the pivot column, since
+		     * the pivot column element would be an LU son, not an Lson,
+		     * of the current frontal matrix. */
+		    ASSERT (nrowsleft == 1) ;
+		    ASSERT (Rows [0] >= 0 && Rows [0] < Work->n_row) ;
+		    skip = TRUE ;
+		    Work->any_skip = TRUE ;
+		}
+
+		if (!skip)
+		{
+
+		    if (nrows == nrowsleft)
+		    {
+			/* -------------------------------------------------- */
+			/* no rows have been assembled out of this Uson yet */
+			/* -------------------------------------------------- */
+
+			/* compute the compressed column offset vector */
+			/* [ use Wm [0..nrows-1] for offsets */
+#pragma ivdep
+			for (i = 0 ; i < nrows ; i++)
+			{
+			    row = Rows [i] ;
+			    ASSERT (row >= 0 && row < n_row) ;
+			    Row_degree [row] -= ncols_to_assemble ;
+			    Wm [i] = Frpos [row] ;
+			}
+
+			for (j = 0 ; j < ncols ; j++)
+			{
+			    col = Cols [j] ;
+			    if ((col >= 0) && (Fcpos [col] >= 0))
+			    {
+#ifndef FIXQ
+				Col_degree [col] -= nrowsleft ;
+#endif
+				Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+				for (i = 0 ; i < nrows ; i++)
+				{
+				    /* Fcol [Wm [i]] += S [i] ; */
+				    ASSEMBLE (Fcol [Wm [i]], S [i]) ;
+				}
+				/* flag the column as assembled from Uson */
+				Cols [j] = EMPTY ;
+			    }
+			    S += nrows ;
+			}
+
+
+			/* ] done using Wm [0..nrows-1] for offsets */
+		    }
+		    else
+		    {
+			/* -------------------------------------------------- */
+			/* some rows have been assembled out of this Uson */
+			/* -------------------------------------------------- */
+
+			/* compute the compressed column offset vector*/
+			/* [ use Woo,Wm [0..nrows-1] for offsets */
+			ngetrows = 0 ;
+			for (i = 0 ; i < nrows ; i++)
+			{
+			    row = Rows [i] ;
+			    if (row >= 0)
+			    {
+				Row_degree [row] -= ncols_to_assemble ;
+				ASSERT (row < n_row && Frpos [row] >= 0) ;
+				Woo [ngetrows] = i ;
+				Wm [ngetrows++] = Frpos [row] ;
+			    }
+			}
+			ASSERT (ngetrows == nrowsleft) ;
+
+			for (j = 0 ; j < ncols ; j++)
+			{
+			    col = Cols [j] ;
+			    if ((col >= 0) && (Fcpos [col] >= 0))
+			    {
+#ifndef FIXQ
+				Col_degree [col] -= nrowsleft ;
+#endif
+				Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+				for (i = 0 ; i < nrowsleft ; i++)
+				{
+				    /* Fcol [Wm [i]] += S [Woo [i]] ; */
+				    ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ;
+				}
+				/* flag the column as assembled from Uson */
+				Cols [j] = EMPTY ;
+			    }
+			    S += nrows ;
+			}
+
+			/* ] done using Woo,Wm */
+		    }
+		    ep->ncolsleft = extrdeg ;
+		}
+	    }
+
+	}
+	else
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* this is an Lson - assemble all possible rows */
+	    /* -------------------------------------------------------------- */
+
+	    DEBUG6 (("New LSON: "ID"\n", e)) ;
+	    ASSERT (extrdeg == 0 && extcdeg > 0) ;
+
+	    DEBUG6 (("New lson "ID" rows to do "ID"\n", e, nrows_to_assemble)) ;
+
+	    if (nrows_to_assemble > 0)
+	    {
+
+		Int skip = FALSE ;
+		if (nrows_to_assemble * 16 < nrows && ncols == 1)
+		{
+		    /* this is a tall and thin frontal matrix consisting of
+		     * only one column (most likely an original column). Do
+		     * not assemble it.   It cannot be the pivot column, since
+		     * the pivot column element would be an LU son, not an Lson,
+		     * of the current frontal matrix. */
+		    ASSERT (ncolsleft == 1) ;
+		    ASSERT (Cols [0] >= 0 && Cols [0] < Work->n_col) ;
+		    Work->any_skip = TRUE ;
+		    skip = TRUE ;
+		}
+
+		if (!skip)
+		{
+
+		    /* compute the compressed column offset vector */
+		    /* [ use Woo,Wm [0..nrows-1] for offsets */
+		    ngetrows = 0 ;
+		    for (i = 0 ; i < nrows ; i++)
+		    {
+			row = Rows [i] ;
+			if ((row >= 0) && (Frpos [row] >= 0))
+			{
+			    ASSERT (row < n_row) ;
+			    Row_degree [row] -= ncolsleft ;
+			    Woo [ngetrows] = i ;
+			    Wm [ngetrows++] = Frpos [row] ;
+			    /* flag the row as assembled from the Lson */
+			    Rows [i] = EMPTY ;
+			}
+		    }
+		    ASSERT (nrowsleft - ngetrows == extcdeg) ;
+		    ASSERT (ngetrows == nrows_to_assemble) ;
+
+		    if (ncols == ncolsleft)
+		    {
+			/* -------------------------------------------------- */
+			/* no columns assembled out this Lson yet */
+			/* -------------------------------------------------- */
+
+			for (j = 0 ; j < ncols ; j++)
+			{
+			    col = Cols [j] ;
+			    ASSERT (col >= 0 && col < n_col) ;
+#ifndef FIXQ
+			    Col_degree [col] -= nrows_to_assemble ;
+#endif
+			    Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+			    for (i = 0 ; i < nrows_to_assemble ; i++)
+			    {
+				/* Fcol [Wm [i]] += S [Woo [i]] ; */
+				ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ;
+			    }
+			    S += nrows ;
+			}
+
+
+		    }
+		    else
+		    {
+			/* -------------------------------------------------- */
+			/* some columns have been assembled out of this Lson */
+			/* -------------------------------------------------- */
+
+			for (j = 0 ; j < ncols ; j++)
+			{
+			    col = Cols [j] ;
+			    ASSERT (col < n_col) ;
+			    if (col >= 0)
+			    {
+#ifndef FIXQ
+				Col_degree [col] -= nrows_to_assemble ;
+#endif
+				Fcol = Fcblock + Fcpos [col] ;
+#pragma ivdep
+				for (i = 0 ; i < nrows_to_assemble ; i++)
+				{
+				    /* Fcol [Wm [i]] += S [Woo [i]] ; */
+				    ASSEMBLE (Fcol [Wm [i]], S [Woo [i]]) ;
+				}
+			    }
+			    S += nrows ;
+			}
+
+		    }
+
+		    /* ] done using Woo,Wm */
+
+		    ep->nrowsleft = extcdeg ;
+		}
+	    }
+	}
+    }
+
+    /* Note that garbage collection, and build tuples */
+    /* both destroy the son list. */
+
+    /* ] son_list now empty */
+
+    /* ---------------------------------------------------------------------- */
+    /* If frontal matrix extended, assemble old L/Usons from new rows/cols */
+    /* ---------------------------------------------------------------------- */
+
+    /* ---------------------------------------------------------------------- */
+    /* SCAN2-row:  assemble rows of old Lsons from the new rows */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG7 (("Current frontal matrix: (prior to scan2-row)\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+    /* rescan the pivot row */
+    if (Work->any_skip)
+    {
+	row_assemble (Work->pivrow, Numeric, Work) ;
+    }
+
+    if (Work->do_scan2row)
+    {
+	for (i2 = Work->fscan_row ; i2 < fnrows ; i2++)
+	{
+	    /* Get a row */
+	    row = Work->NewRows [i2] ;
+	    if (row < 0) row = FLIP (row) ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    if (!(row == Work->pivrow && Work->any_skip))
+	    {
+		/* assemble it */
+		row_assemble (row, Numeric, Work) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* SCAN2-col:  assemble columns of old Usons from the new columns */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG7 (("Current frontal matrix: (prior to scan2-col)\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+    /* rescan the pivot col */
+    if (Work->any_skip)
+    {
+	col_assemble (Work->pivcol, Numeric, Work) ;
+    }
+
+    if (Work->do_scan2col)
+    {
+
+	for (j2 = Work->fscan_col ; j2 < fncols ; j2++)
+	{
+	    /* Get a column */
+	    col = Work->NewCols [j2] ;
+	    if (col < 0) col = FLIP (col) ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    if (!(col == Work->pivcol && Work->any_skip))
+	    {
+		/* assemble it */
+		col_assemble (col, Numeric, Work) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* done.  the remainder of this routine is used only when in debug mode */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+
+    /* ---------------------------------------------------------------------- */
+    /* when debugging: make sure the assembly did everything that it could */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG3 (("::Assemble done\n")) ;
+
+    for (i2 = 0 ; i2 < fnrows ; i2++)
+    {
+	/* Get a row */
+	row = Work->Frows [i2] ;
+	ASSERT (row >= 0 && row < n_row) ;
+
+	DEBUG6 (("DEBUG SCAN 1: "ID"\n", row)) ;
+	UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ;
+
+	ASSERT (NON_PIVOTAL_ROW (row)) ;
+	tpi = Row_tuples [row] ;
+	if (!tpi) continue ;
+	tp = (Tuple *) (Memory + tpi) ;
+	tpend = tp + Row_tlen [row] ;
+	for ( ; tp < tpend ; tp++)
+	{
+	    e = tp->e ;
+	    ASSERT (e > 0 && e <= Work->nel) ;
+	    if (!E [e]) continue ;	/* element already deallocated */
+	    f = tp->f ;
+	    p = Memory + E [e] ;
+	    ep = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Cols = (Int *) p ;
+	    Rows = ((Int *) p) + ep->ncols ;
+	    if (Rows [f] == EMPTY) continue ;	/* row already assembled */
+	    ASSERT (row == Rows [f]) ;
+	    extrdeg = (ep->rdeg < rdeg0) ? ep->ncolsleft : (ep->rdeg - rdeg0) ;
+	    extcdeg = (ep->cdeg < cdeg0) ? ep->nrowsleft : (ep->cdeg - cdeg0) ;
+	    DEBUG6 ((
+		"e "ID" After assembly ext row deg: "ID" ext col degree "ID"\n",
+		e, extrdeg, extcdeg)) ;
+
+	    if (Work->any_skip)
+	    {
+		/* no Lsons in any row, except for very tall and thin ones */
+		ASSERT (extrdeg >= 0) ;
+		if (extrdeg == 0)
+		{
+		    /* this is an unassemble Lson */
+		    ASSERT (ep->ncols == 1) ;
+		    ASSERT (ep->ncolsleft == 1) ;
+		    col = Cols [0] ;
+		    ASSERT (col != Work->pivcol) ;
+		}
+	    }
+	    else
+	    {
+		/* no Lsons in any row */
+		ASSERT (extrdeg > 0) ;
+		/* Uson external row degree is = number of cols left */
+		ASSERT (IMPLIES (extcdeg == 0, extrdeg == ep->ncolsleft)) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+
+    for (j2 = 0 ; j2 < fncols ; j2++)
+    {
+	/* Get a column */
+	col = Work->Fcols [j2] ;
+	ASSERT (col >= 0 && col < n_col) ;
+
+	DEBUG6 (("DEBUG SCAN 2: "ID"\n", col)) ;
+#ifndef FIXQ
+	UMF_dump_rowcol (1, Numeric, Work, col, TRUE) ;
+#else
+	UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+#endif
+
+	ASSERT (NON_PIVOTAL_COL (col)) ;
+	tpi = Col_tuples [col] ;
+	if (!tpi) continue ;
+	tp = (Tuple *) (Memory + tpi) ;
+	tpend = tp + Col_tlen [col] ;
+	for ( ; tp < tpend ; tp++)
+	{
+	    e = tp->e ;
+	    ASSERT (e > 0 && e <= Work->nel) ;
+	    if (!E [e]) continue ;	/* element already deallocated */
+	    f = tp->f ;
+	    p = Memory + E [e] ;
+	    ep = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Cols = (Int *) p ;
+	    Rows = ((Int *) p) + ep->ncols ;
+	    if (Cols [f] == EMPTY) continue ;	/* column already assembled */
+	    ASSERT (col == Cols [f]) ;
+	    extrdeg = (ep->rdeg < rdeg0) ? ep->ncolsleft : (ep->rdeg - rdeg0) ;
+	    extcdeg = (ep->cdeg < cdeg0) ? ep->nrowsleft : (ep->cdeg - cdeg0) ;
+	    DEBUG6 (("e "ID" After assembly ext col deg: "ID"\n", e, extcdeg)) ;
+
+	    if (Work->any_skip)
+	    {
+		/* no Usons in any column, except for very tall and thin ones */
+		ASSERT (extcdeg >= 0) ;
+		if (extcdeg == 0)
+		{
+		    /* this is an unassemble Uson */
+		    ASSERT (ep->nrows == 1) ;
+		    ASSERT (ep->nrowsleft == 1) ;
+		    row = Rows [0] ;
+		    ASSERT (row != Work->pivrow) ;
+		}
+	    }
+	    else
+	    {
+		/* no Usons in any column */
+		ASSERT (extcdeg > 0) ;
+		/* Lson external column degree is = number of rows left */
+		ASSERT (IMPLIES (extrdeg == 0, extcdeg == ep->nrowsleft)) ;
+	    }
+	}
+    }
+#endif /* NDEBUG */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_assemble.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,17 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_assemble
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
+
+GLOBAL void UMF_assemble_fixq
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,164 @@
+/* ========================================================================== */
+/* === UMF_blas3_update ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_blas3_update
+(
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry *L, *U, *C, *LU ;
+    Int k, m, n, d, nb, dc ;
+
+    DEBUG5 (("In UMF_blas3_update "ID" "ID" "ID"\n",
+	Work->fnpiv, Work->fnrows, Work->fncols)) ;
+
+    k = Work->fnpiv ;
+    if (k == 0)
+    {
+	/* no work to do */
+	return ;
+    }
+
+    m = Work->fnrows ;
+    n = Work->fncols ;
+
+    d = Work->fnr_curr ;
+    dc = Work->fnc_curr ;
+    nb = Work->nb ;
+    ASSERT (d >= 0 && (d % 2) == 1) ;
+    C = Work->Fcblock ;	    /* ldc is fnr_curr */
+    L =	Work->Flblock ;	    /* ldl is fnr_curr */
+    U = Work->Fublock ;	    /* ldu is fnc_curr, stored by rows */
+    LU = Work->Flublock ;   /* nb-by-nb */
+
+#ifndef NDEBUG
+    DEBUG5 (("DO RANK-NB UPDATE of frontal:\n")) ;
+    DEBUG5 (("DGEMM : "ID" "ID" "ID"\n", k, m, n)) ;
+    DEBUG7 (("C  block: ")) ; UMF_dump_dense (C,  d, m, n) ;
+    DEBUG7 (("A  block: ")) ; UMF_dump_dense (L,  d, m, k) ;
+    DEBUG7 (("B' block: ")) ; UMF_dump_dense (U, dc, n, k) ;
+    DEBUG7 (("LU block: ")) ; UMF_dump_dense (LU, nb, k, k) ;
+#endif
+
+    if (k == 1)
+    {
+
+#ifdef USE_NO_BLAS
+
+	/* no BLAS available - use plain C code instead */
+	Int i, j ;
+
+	/* rank-1 outer product to update the C block */
+	for (j = 0 ; j < n ; j++)
+	{
+	    Entry u_j = U [j] ;
+	    if (IS_NONZERO (u_j))
+	    {
+		Entry *c_ij, *l_is ;
+		c_ij = & C [j*d] ;
+		l_is = & L [0] ;
+#pragma ivdep
+		for (i = 0 ; i < m ; i++)
+		{
+		    /* C [i+j*d]-= L [i] * U [j] */
+		    MULT_SUB (*c_ij, *l_is, u_j) ;
+		    c_ij++ ;
+		    l_is++ ;
+		}
+	    }
+	}
+
+#else
+	BLAS_GER (m, n, L, U, C, d) ;
+
+#endif /* USE_NO_BLAS */
+
+    }
+    else
+    {
+
+#ifdef USE_NO_BLAS
+
+	/* no BLAS available - use plain C code instead */
+	Int i, j, s ;
+
+	/* triangular solve to update the U block */
+	for (s = 0 ; s < k ; s++)
+	{
+	    for (i = s+1 ; i < k ; i++)
+	    {
+		Entry l_is = LU [i+s*nb] ;
+		if (IS_NONZERO (l_is))
+		{
+		    Entry *u_ij, *u_sj ;
+		    u_ij = & U [i*dc] ;
+		    u_sj = & U [s*dc] ;
+#pragma ivdep
+		    for (j = 0 ; j < n ; j++)
+		    {
+			/* U [i*dc+j] -= LU [i+s*nb] * U [s*dc+j] ; */
+			MULT_SUB (*u_ij, l_is, *u_sj) ;
+			u_ij++ ;
+			u_sj++ ;
+		    }
+		}
+	    }
+	}
+
+	/* rank-k outer product to update the C block */
+	/* C = C - L*U' (U is stored by rows, not columns) */
+	for (s = 0 ; s < k ; s++)
+	{
+	    for (j = 0 ; j < n ; j++)
+	    {
+		Entry u_sj = U [j+s*dc] ;
+		if (IS_NONZERO (u_sj))
+		{
+		    Entry *c_ij, *l_is ;
+		    c_ij = & C [j*d] ;
+		    l_is = & L [s*d] ;
+#pragma ivdep
+		    for (i = 0 ; i < m ; i++)
+		    {
+			/* C [i+j*d]-= L [i+s*d] * U [s*dc+j] */
+			MULT_SUB (*c_ij, *l_is, u_sj) ;
+			c_ij++ ;
+			l_is++ ;
+		    }
+		}
+	    }
+	}
+
+#else
+
+	BLAS_TRSM_RIGHT (n, k, LU, nb, U, dc) ;
+	BLAS_GEMM (m, n, k, L, U, dc, C, d) ;
+
+#endif /* USE_NO_BLAS */
+
+    }
+
+#ifndef NDEBUG
+    DEBUG5 (("RANK-NB UPDATE of frontal done:\n")) ;
+    DEBUG5 (("DGEMM : "ID" "ID" "ID"\n", k, m, n)) ;
+    DEBUG7 (("C  block: ")) ; UMF_dump_dense (C,  d, m, n) ;
+    DEBUG7 (("A  block: ")) ; UMF_dump_dense (L,  d, m, k) ;
+    DEBUG7 (("B' block: ")) ; UMF_dump_dense (U, dc, n, k) ;
+    DEBUG7 (("LU block: ")) ; UMF_dump_dense (LU, nb, k, k) ;
+#endif
+
+    DEBUG2 (("blas3 "ID" "ID" "ID"\n", k, Work->fnrows, Work->fncols)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_blas3_update.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,10 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_blas3_update
+(
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,159 @@
+/* ========================================================================== */
+/* === UMF_build_tuples ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Construct the tuple lists from a set of packed elements (no holes in
+    elements, no internal or external fragmentation, and a packed (0..Work->nel)
+    element name space).  Assume no tuple lists are currently allocated, but
+    that the tuple lengths have been initialized by UMF_tuple_lengths.
+
+    Returns TRUE if successful, FALSE if not enough memory.
+*/
+
+#include "umf_internal.h"
+#include "umf_mem_alloc_tail_block.h"
+
+GLOBAL Int UMF_build_tuples
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int e, nrows, ncols, nel, *Rows, *Cols, row, col, n_row, n_col, *E,
+	*Row_tuples, *Row_degree, *Row_tlen,
+	*Col_tuples, *Col_degree, *Col_tlen, n1 ;
+    Element *ep ;
+    Unit *p ;
+    Tuple tuple, *tp ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    E = Work->E ;
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+    Row_tuples = Numeric->Uip ;
+    Row_tlen   = Numeric->Uilen ;
+    Col_tuples = Numeric->Lip ;
+    Col_tlen   = Numeric->Lilen ;
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    nel = Work->nel ;
+    n1 = Work->n1 ;
+
+    DEBUG3 (("BUILD_TUPLES: n_row "ID" n_col "ID" nel "ID"\n",
+	n_row, n_col, nel)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate space for the tuple lists */
+    /* ---------------------------------------------------------------------- */
+
+    /* Garbage collection and memory reallocation have already attempted to */
+    /* ensure that there is enough memory for all the tuple lists.  If */
+    /* memory allocation fails here, then there is nothing more to be done. */
+
+    for (row = n1 ; row < n_row ; row++)
+    {
+	if (NON_PIVOTAL_ROW (row))
+	{
+	    Row_tuples [row] = UMF_mem_alloc_tail_block (Numeric,
+		UNITS (Tuple, TUPLES (Row_tlen [row]))) ;
+	    if (!Row_tuples [row])
+	    {
+		/* :: out of memory for row tuples :: */
+		DEBUGm4 (("out of memory: build row tuples\n")) ;
+		return (FALSE) ;	/* out of memory for row tuples */
+	    }
+	    Row_tlen [row] = 0 ;
+	}
+    }
+
+    /* push on stack in reverse order, so column tuples are in the order */
+    /* that they will be deleted. */
+    for (col = n_col-1 ; col >= n1 ; col--)
+    {
+	if (NON_PIVOTAL_COL (col))
+	{
+	    Col_tuples [col] = UMF_mem_alloc_tail_block (Numeric,
+		UNITS (Tuple, TUPLES (Col_tlen [col]))) ;
+	    if (!Col_tuples [col])
+	    {
+		/* :: out of memory for col tuples :: */
+		DEBUGm4 (("out of memory: build col tuples\n")) ;
+		return (FALSE) ;	/* out of memory for col tuples */
+	    }
+	    Col_tlen [col] = 0 ;
+	}
+    }
+
+#ifndef NDEBUG
+    UMF_dump_memory (Numeric) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* create the tuple lists (exclude element 0) */
+    /* ---------------------------------------------------------------------- */
+
+    /* for all elements, in order of creation */
+    for (e = 1 ; e <= nel ; e++)
+    {
+	DEBUG9 (("Adding tuples for element: "ID" at "ID"\n", e, E [e])) ;
+	ASSERT (E [e]) ;	/* no external fragmentation */
+	p = Numeric->Memory + E [e] ;
+	GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncols) ;
+	nrows = ep->nrows ;
+	ASSERT (e != 0) ;
+	ASSERT (e == 0 || nrows == ep->nrowsleft) ;
+	ASSERT (e == 0 || ncols == ep->ncolsleft) ;
+	tuple.e = e ;
+	for (tuple.f = 0 ; tuple.f < ncols ; tuple.f++)
+	{
+	    col = Cols [tuple.f] ;
+	    ASSERT (col >= n1 && col < n_col) ;
+	    ASSERT (NON_PIVOTAL_COL (col)) ;
+	    ASSERT (Col_tuples [col]) ;
+	    tp = ((Tuple *) (Numeric->Memory + Col_tuples [col]))
+		+ Col_tlen [col]++ ;
+	    *tp = tuple ;
+#ifndef NDEBUG
+	    UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+#endif
+	}
+	for (tuple.f = 0 ; tuple.f < nrows ; tuple.f++)
+	{
+	    row = Rows [tuple.f] ;
+	    ASSERT (row >= n1 && row < n_row) ;
+	    ASSERT (NON_PIVOTAL_COL (col)) ;
+	    ASSERT (Row_tuples [row]) ;
+	    tp = ((Tuple *) (Numeric->Memory + Row_tuples [row]))
+		+ Row_tlen [row]++ ;
+	    *tp = tuple ;
+#ifndef NDEBUG
+	    UMF_dump_rowcol (0, Numeric, Work, row, FALSE) ;
+#endif
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* the tuple lists are now valid, and can be scanned */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_dump_memory (Numeric) ;
+    UMF_dump_matrix (Numeric, Work, FALSE) ;
+#endif
+    DEBUG3 (("BUILD_TUPLES: done\n")) ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_build_tuples.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_build_tuples
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_colamd.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,3139 @@
+/* ========================================================================== */
+/* === UMF_colamd =========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+UMF_colamd:  an approximate minimum degree column ordering algorithm,
+    used as a preordering for UMFPACK.
+
+NOTE: if this routine is used outside of UMFPACK, for a sparse Cholesky
+factorization of (AQ)'*(AQ) or a QR factorization of A, then one line should
+be removed (the "&& pivot_row_thickness > 0" expression).  See the comment
+regarding the Cholesky factorization, below.
+
+Purpose:
+
+    Colamd computes a permutation Q such that the Cholesky factorization of
+    (AQ)'(AQ) has less fill-in and requires fewer floating point operations
+    than A'A.  This also provides a good ordering for sparse partial
+    pivoting methods, P(AQ) = LU, where Q is computed prior to numerical
+    factorization, and P is computed during numerical factorization via
+    conventional partial pivoting with row interchanges.  Colamd is the
+    column ordering method used in SuperLU, part of the ScaLAPACK library.
+    It is also available as built-in function in MATLAB Version 6,
+    available from MathWorks, Inc. (http://www.mathworks.com).  This
+    routine can be used in place of colmmd in MATLAB.  By default, the \
+    and / operators in MATLAB perform a column ordering (using colmmd
+    or colamd) prior to LU factorization using sparse partial pivoting,
+    in the built-in MATLAB lu(A) routine.
+
+    This code is derived from Colamd Version 2.0.
+
+Authors:
+
+    The authors of the COLAMD code itself are Stefan I. Larimore and Timothy A.
+    Davis, University of Florida.  The algorithm was developed in collaboration
+    with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory.
+    The AMD metric on which this is based is by Patrick Amestoy, T. Davis,
+    and Iain Duff.
+
+Date:
+
+    UMFPACK Version: see above.
+    COLAMD Version 2.0 was released on January 31, 2000.
+
+Acknowledgements:
+
+    This work was supported by the National Science Foundation, under
+    grants DMS-9504974, DMS-9803599, and CCR-0203270.
+
+UMFPACK:  Copyright (c) 2003 by Timothy A. Davis.  All Rights Reserved.
+
+See the UMFPACK README file for the License for your use of this code.
+
+Availability:
+
+    Both UMFPACK and the original unmodified colamd/symamd library are
+    available at http://www.cise.ufl.edu/research/sparse.
+
+Changes for inclusion in UMFPACK:
+
+    * symamd, symamd_report, and colamd_report removed
+
+    * additional terms added to RowInfo, ColInfo, and stats
+
+    * Frontal matrix information computed for UMFPACK
+
+    * routines renamed
+
+    * column elimination tree post-ordering incorporated.  In the original
+	version 2.0, this was performed in colamd.m.
+
+For more information, see:
+
+	Amestoy, P. R. and Davis, T. A. and Duff, I. S.,
+	An approximate minimum degree ordering algorithm,
+	SIAM J. Matrix Analysis and Applic, vol 17, no 4., pp 886-905, 1996.
+
+	Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.,
+	A column approximate minimum degree ordering algorithm,
+	Univ. of Florida, CISE Dept., TR-00-005, Gainesville, FL
+	Oct. 2000.  Submitted to ACM Trans. Math. Softw.
+
+*/
+
+/* ========================================================================== */
+/* === Description of user-callable routines ================================ */
+/* ========================================================================== */
+
+/*
+    ----------------------------------------------------------------------------
+    colamd_recommended: removed for UMFPACK
+    ----------------------------------------------------------------------------
+
+    ----------------------------------------------------------------------------
+    colamd_set_defaults:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    colamd_set_defaults (double knobs [COLAMD_KNOBS]) ;
+
+	Purpose:
+
+	    Sets the default parameters.  The use of this routine is optional.
+
+	Arguments:
+
+	    double knobs [COLAMD_KNOBS] ;	Output only.
+
+		Let c = knobs [COLAMD_DENSE_COL], r = knobs [COLAMD_DENSE_ROW].
+		Colamd: rows with more than max (16, r*16*sqrt(n_col))
+		entries are removed prior to ordering.  Columns with more than
+		max (16, c*16*sqrt(n_row)) entries are removed prior to
+		ordering, and placed last in the output column ordering.
+
+		Symamd: removed for UMFPACK.
+
+		COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1,
+		respectively, in colamd.h.  Default values of these two knobs
+		are both 0.5.  Currently, only knobs [0] and knobs [1] are
+		used, but future versions may use more knobs.  If so, they will
+		be properly set to their defaults by the future version of
+		colamd_set_defaults, so that the code that calls colamd will
+		not need to change, assuming that you either use
+		colamd_set_defaults, or pass a (double *) NULL pointer as the
+		knobs array to colamd or symamd.
+
+		knobs [COLAMD_AGGRESSIVE]: if nonzero, then perform aggressive
+		absorption.  Otherwise, do not.  This version does aggressive
+		absorption by default.  COLAMD v2.1 (in MATLAB) always
+		does aggressive absorption (it doesn't have an option to turn
+		it off).
+
+    ----------------------------------------------------------------------------
+    colamd:
+    ----------------------------------------------------------------------------
+
+	C syntax:
+
+	    #include "colamd.h"
+	    Int UMF_colamd (Int n_row, Int n_col, Int Alen, Int *A, Int *p,
+		double knobs [COLAMD_KNOBS], Int stats [COLAMD_STATS]) ;
+
+	Purpose:
+
+	    Computes a column ordering (Q) of A such that P(AQ)=LU or
+	    (AQ)'AQ=LL' have less fill-in and require fewer floating point
+	    operations than factorizing the unpermuted matrix A or A'A,
+	    respectively.
+
+	Returns:
+
+	    TRUE (1) if successful, FALSE (0) otherwise.
+
+	Arguments:
+
+	    Int n_row ;		Input argument.
+
+		Number of rows in the matrix A.
+		Restriction:  n_row >= 0.
+		Colamd returns FALSE if n_row is negative.
+
+	    Int n_col ;		Input argument.
+
+		Number of columns in the matrix A.
+		Restriction:  n_col >= 0.
+		Colamd returns FALSE if n_col is negative.
+
+	    Int Alen ;		Input argument.
+
+		Restriction (see note):
+		Alen >= 2*nnz + 8*(n_col+1) + 6*(n_row+1) + n_col
+		Colamd returns FALSE if these conditions are not met.
+
+		Note:  this restriction makes an modest assumption regarding
+		the size of the two typedef's structures in colamd.h.
+		We do, however, guarantee that
+
+			Alen >= UMF_COLAMD_RECOMMENDED (nnz, n_row, n_col)
+
+		will be sufficient.
+
+	    Int A [Alen] ;	Input and output argument.
+
+		A is an integer array of size Alen.  Alen must be at least as
+		large as the bare minimum value given above, but this is very
+		low, and can result in excessive run time.  For best
+		performance, we recommend that Alen be greater than or equal to
+		UMF_COLAMD_RECOMMENDED (nnz, n_row, n_col), which adds
+		nnz/5 to the bare minimum value given above.
+
+		On input, the row indices of the entries in column c of the
+		matrix are held in A [(p [c]) ... (p [c+1]-1)].  The row indices
+		in a given column c need not be in ascending order, and
+		duplicate row indices may be be present.  However, colamd will
+		work a little faster if both of these conditions are met
+		(Colamd puts the matrix into this format, if it finds that the
+		the conditions are not met).
+
+		The matrix is 0-based.  That is, rows are in the range 0 to
+		n_row-1, and columns are in the range 0 to n_col-1.  Colamd
+		returns FALSE if any row index is out of range.
+
+		A holds the inverse permutation on output.
+
+	    Int p [n_col+1] ;	Both input and output argument.
+
+		p is an integer array of size n_col+1.  On input, it holds the
+		"pointers" for the column form of the matrix A.  Column c of
+		the matrix A is held in A [(p [c]) ... (p [c+1]-1)].  The first
+		entry, p [0], must be zero, and p [c] <= p [c+1] must hold
+		for all c in the range 0 to n_col-1.  The value p [n_col] is
+		thus the total number of entries in the pattern of the matrix A.
+		Colamd returns FALSE if these conditions are not met.
+
+		On output, if colamd returns TRUE, the array p holds the column
+		permutation (Q, for P(AQ)=LU or (AQ)'(AQ)=LL'), where p [0] is
+		the first column index in the new ordering, and p [n_col-1] is
+		the last.  That is, p [k] = j means that column j of A is the
+		kth pivot column, in AQ, where k is in the range 0 to n_col-1
+		(p [0] = j means that column j of A is the first column in AQ).
+
+		If colamd returns FALSE, then no permutation is returned, and
+		p is undefined on output.
+
+	    double knobs [COLAMD_KNOBS] ;	Input argument.
+
+		See colamd_set_defaults for a description.
+		The behavior is undefined if knobs contains NaN's.
+		(UMFPACK does not call umf_colamd with NaN-valued knobs).
+
+	    Int stats [COLAMD_STATS] ;		Output argument.
+
+		Statistics on the ordering, and error status.
+		See colamd.h for related definitions.
+		Colamd returns FALSE if stats is not present.
+
+		stats [0]:  number of dense or empty rows ignored.
+
+		stats [1]:  number of dense or empty columns ignored (and
+				ordered last in the output permutation p)
+				Note that a row can become "empty" if it
+				contains only "dense" and/or "empty" columns,
+				and similarly a column can become "empty" if it
+				only contains "dense" and/or "empty" rows.
+
+		stats [2]:  number of garbage collections performed.
+				This can be excessively high if Alen is close
+				to the minimum required value.
+
+		stats [3]:  status code.  < 0 is an error code.
+			    > 1 is a warning or notice.
+
+			0	OK.  Each column of the input matrix contained
+				row indices in increasing order, with no
+				duplicates.
+
+			-11	Columns of input matrix jumbled
+				(unsorted columns or duplicate entries).
+
+					stats [4]: the bad column index
+					stats [5]: the bad row index
+
+			-1	A is a null pointer
+
+			-2	p is a null pointer
+
+			-3	n_row is negative
+
+					stats [4]: n_row
+
+			-4	n_col is negative
+
+					stats [4]: n_col
+
+			-5	number of nonzeros in matrix is negative
+
+					stats [4]: number of nonzeros, p [n_col]
+
+			-6	p [0] is nonzero
+
+					stats [4]: p [0]
+
+			-7	A is too small
+
+					stats [4]: required size
+					stats [5]: actual size (Alen)
+
+			-8	a column has a zero or negative number of
+				entries (changed for UMFPACK)
+
+					stats [4]: column with <= 0 entries
+					stats [5]: number of entries in col
+
+			-9	a row index is out of bounds
+
+					stats [4]: column with bad row index
+					stats [5]: bad row index
+					stats [6]: n_row, # of rows of matrx
+
+			-10	unused
+
+			-999	(unused; see symamd.c)
+
+		Future versions may return more statistics in the stats array.
+
+	Example:
+
+	    See http://www.cise.ufl.edu/~davis/colamd/example.c
+	    for a complete example.
+
+	    To order the columns of a 5-by-4 matrix with 11 nonzero entries in
+	    the following nonzero pattern
+
+		x 0 x 0
+		x 0 x x
+		0 x x 0
+		0 0 x x
+		x x 0 0
+
+	    with default knobs and no output statistics, do the following:
+
+		#include "colamd.h"
+		#define ALEN UMF_COLAMD_RECOMMENDED (11, 5, 4)
+		Int A [ALEN] = {1, 2, 5, 3, 5, 1, 2, 3, 4, 2, 4} ;
+		Int p [ ] = {0, 3, 5, 9, 11} ;
+		Int stats [COLAMD_STATS] ;
+		UMF_colamd (5, 4, ALEN, A, p, (double *) NULL, stats) ;
+
+	    The permutation is returned in the array p, and A is destroyed.
+
+
+    ----------------------------------------------------------------------------
+    symamd:  does not appear in this version for UMFPACK
+    ----------------------------------------------------------------------------
+
+    ----------------------------------------------------------------------------
+    colamd_report: does not appear in this version for UMFPACK
+    ----------------------------------------------------------------------------
+
+    ----------------------------------------------------------------------------
+    symamd_report: does not appear in this version for UMFPACK
+    ----------------------------------------------------------------------------
+
+*/
+
+/* ========================================================================== */
+/* === Scaffolding code definitions  ======================================== */
+/* ========================================================================== */
+
+/* UMFPACK debugging control moved to amd_internal.h */
+
+/*
+   Our "scaffolding code" philosophy:  In our opinion, well-written library
+   code should keep its "debugging" code, and just normally have it turned off
+   by the compiler so as not to interfere with performance.  This serves
+   several purposes:
+
+   (1) assertions act as comments to the reader, telling you what the code
+	expects at that point.  All assertions will always be true (unless
+	there really is a bug, of course).
+
+   (2) leaving in the scaffolding code assists anyone who would like to modify
+	the code, or understand the algorithm (by reading the debugging output,
+	one can get a glimpse into what the code is doing).
+
+   (3) (gasp!) for actually finding bugs.  This code has been heavily tested
+	and "should" be fully functional and bug-free ... but you never know...
+
+    To enable debugging, comment out the "#define NDEBUG" above.  For a MATLAB
+    mexFunction, you will also need to modify mexopts.sh to remove the -DNDEBUG
+    definition.  The code will become outrageously slow when debugging is
+    enabled.  To control the level of debugging output, set an environment
+    variable D to 0 (little), 1 (some), 2, 3, or 4 (lots).  When debugging,
+    you should see the following message on the standard output:
+
+	colamd: debug version, D = 1 (THIS WILL BE SLOW!)
+
+    or a similar message for symamd.  If you don't, then debugging has not
+    been enabled.
+
+*/
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+/* ------------------ */
+/* modified for UMFPACK: */
+#include "umf_internal.h"
+#include "umf_colamd.h"
+#include "umf_apply_order.h"
+#include "umf_fsize.h"
+/* ------------------ */
+
+/* ========================================================================== */
+/* === Definitions ========================================================== */
+/* ========================================================================== */
+
+/* ------------------ */
+/* UMFPACK: duplicate definitions moved to umf_internal.h */
+/* ------------------ */
+
+/* Row and column status */
+#define ALIVE	(0)
+#define DEAD	(-1)
+
+/* Column status */
+#define DEAD_PRINCIPAL		(-1)
+#define DEAD_NON_PRINCIPAL	(-2)
+
+/* Macros for row and column status update and checking. */
+#define ROW_IS_DEAD(r)			ROW_IS_MARKED_DEAD (Row[r].shared2.mark)
+#define ROW_IS_MARKED_DEAD(row_mark)	(row_mark < ALIVE)
+#define ROW_IS_ALIVE(r)			(Row [r].shared2.mark >= ALIVE)
+#define COL_IS_DEAD(c)			(Col [c].start < ALIVE)
+#define COL_IS_ALIVE(c)			(Col [c].start >= ALIVE)
+#define COL_IS_DEAD_PRINCIPAL(c)	(Col [c].start == DEAD_PRINCIPAL)
+#define KILL_ROW(r)			{ Row [r].shared2.mark = DEAD ; }
+#define KILL_PRINCIPAL_COL(c)		{ Col [c].start = DEAD_PRINCIPAL ; }
+#define KILL_NON_PRINCIPAL_COL(c)	{ Col [c].start = DEAD_NON_PRINCIPAL ; }
+
+/* ------------------ */
+/* UMFPACK: Colamd reporting mechanism moved to umf_internal.h */
+/* ------------------ */
+
+/* ========================================================================== */
+/* === Prototypes of PRIVATE routines ======================================= */
+/* ========================================================================== */
+
+PRIVATE Int init_rows_cols
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int p []
+    /* Int stats [COLAMD_STATS] */
+) ;
+
+PRIVATE void init_scoring
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int head [],
+    double knobs [COLAMD_KNOBS],
+    Int *p_n_row2,
+    Int *p_n_col2,
+    Int *p_max_deg
+    /* ------------------ */
+    /* added for UMFPACK */
+    , Int *p_ndense_row		/* number of dense rows */
+    , Int *p_nempty_row		/* number of original empty rows */
+    , Int *p_nnewlyempty_row	/* number of newly empty rows */
+    , Int *p_ndense_col		/* number of dense cols (excl "empty" cols) */
+    , Int *p_nempty_col		/* number of original empty cols */
+    , Int *p_nnewlyempty_col	/* number of newly empty cols */
+) ;
+
+PRIVATE Int find_ordering
+(
+    Int n_row,
+    Int n_col,
+    Int Alen,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int head [],
+    Int n_col2,
+    Int max_deg,
+    Int pfree
+    /* ------------------ */
+    /* added for UMFPACK: */
+    , Int Front_npivcol [ ]
+    , Int Front_nrows [ ]
+    , Int Front_ncols [ ]
+    , Int Front_parent [ ]
+    , Int Front_cols [ ]
+    , Int *p_nfr
+    , Int aggressive
+    , Int InFront [ ]
+    /* ------------------ */
+) ;
+
+/* ------------------ */
+/* order_children deleted for UMFPACK: */
+/* ------------------ */
+
+PRIVATE void detect_super_cols
+(
+
+#ifndef NDEBUG
+    Int n_col,
+    Colamd_Row Row [],
+#endif /* NDEBUG */
+
+    Colamd_Col Col [],
+    Int A [],
+    Int head [],
+    Int row_start,
+    Int row_length
+) ;
+
+PRIVATE Int garbage_collection
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int *pfree
+) ;
+
+PRIVATE Int clear_mark
+(
+    Int n_row,
+    Colamd_Row Row []
+) ;
+
+/* ------------------ */
+/* print_report deleted for UMFPACK */
+/* ------------------ */
+
+/* ========================================================================== */
+/* === Debugging prototypes and definitions ================================= */
+/* ========================================================================== */
+
+#ifndef NDEBUG
+
+/* ------------------ */
+/* debugging macros moved for UMFPACK */
+/* ------------------ */
+
+PRIVATE void debug_deg_lists
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int head [],
+    Int min_score,
+    Int should,
+    Int max_deg
+) ;
+
+PRIVATE void debug_mark
+(
+    Int n_row,
+    Colamd_Row Row [],
+    Int tag_mark,
+    Int max_mark
+) ;
+
+PRIVATE void debug_matrix
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A []
+) ;
+
+PRIVATE void debug_structures
+(
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int n_col2
+) ;
+
+/* ------------------ */
+/* dump_super added for UMFPACK: */
+PRIVATE void dump_super
+(
+    Int super_c,
+    Colamd_Col Col [],
+    Int n_col
+) ;
+/* ------------------ */
+
+#endif /* NDEBUG */
+
+/* ========================================================================== */
+
+
+
+/* ========================================================================== */
+/* === USER-CALLABLE ROUTINES: ============================================== */
+/* ========================================================================== */
+
+
+/* ========================================================================== */
+/* === colamd_set_defaults ================================================== */
+/* ========================================================================== */
+
+/*
+    The colamd_set_defaults routine sets the default values of the user-
+    controllable parameters for colamd:
+
+	knobs [0]	rows with knobs[0]*n_col entries or more are removed
+			prior to ordering in colamd.  Rows and columns with
+			knobs[0]*n_col entries or more are removed prior to
+			ordering in symamd and placed last in the output
+			ordering.
+
+	knobs [1]	columns with knobs[1]*n_row entries or more are removed
+			prior to ordering in colamd, and placed last in the
+			column permutation.  Symamd ignores this knob.
+
+	knobs [2]	if nonzero, then perform aggressive absorption.
+
+	knobs [3..19]	unused, but future versions might use this
+*/
+
+GLOBAL void UMF_colamd_set_defaults
+(
+    /* === Parameters ======================================================= */
+
+    double knobs [COLAMD_KNOBS]		/* knob array */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int i ;
+
+#if 0
+    if (!knobs)
+    {
+	return ;			/* UMFPACK always passes knobs array */
+    }
+#endif
+    for (i = 0 ; i < COLAMD_KNOBS ; i++)
+    {
+	knobs [i] = 0 ;
+    }
+    knobs [COLAMD_DENSE_ROW] = 0.2 ;	/* default changed for UMFPACK */
+    knobs [COLAMD_DENSE_COL] = 0.2 ;	/* default changed for UMFPACK */
+    knobs [COLAMD_AGGRESSIVE] = TRUE ;	/* default is to do aggressive
+					 * absorption */
+}
+
+
+/* ========================================================================== */
+/* === symamd removed for UMFPACK =========================================== */
+/* ========================================================================== */
+
+
+
+/* ========================================================================== */
+/* === colamd =============================================================== */
+/* ========================================================================== */
+
+/*
+    The colamd routine computes a column ordering Q of a sparse matrix
+    A such that the LU factorization P(AQ) = LU remains sparse, where P is
+    selected via partial pivoting.   The routine can also be viewed as
+    providing a permutation Q such that the Cholesky factorization
+    (AQ)'(AQ) = LL' remains sparse.
+*/
+
+/* For UMFPACK: colamd always returns TRUE */
+
+GLOBAL Int UMF_colamd		/* returns TRUE if successful, FALSE otherwise*/
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,			/* number of rows in A */
+    Int n_col,			/* number of columns in A */
+    Int Alen,			/* length of A */
+    Int A [],			/* row indices of A */
+    Int p [],			/* pointers to columns in A */
+    double knobs [COLAMD_KNOBS],/* parameters (uses defaults if NULL) */
+    Int stats [COLAMD_STATS]	/* output statistics and error codes */
+
+    /* ------------------ */
+    /* added for UMFPACK: each Front_ array is of size n_col+1 */
+    , Int Front_npivcol [ ]	/* # pivot cols in each front */
+    , Int Front_nrows [ ]	/* # of rows in each front (incl. pivot rows) */
+    , Int Front_ncols [ ]	/* # of cols in each front (incl. pivot cols) */
+    , Int Front_parent [ ]	/* parent of each front */
+    , Int Front_cols [ ]	/* link list of pivot columns for each front */
+    , Int *p_nfr		/* total number of frontal matrices */
+    , Int InFront [ ]		/* InFront [row] = f if the original row was
+				 * absorbed into front f.  EMPTY if the row was
+				 * empty, dense, or not absorbed.  This array
+				 * has size n_row+1 */
+    /* ------------------ */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int row ;			/* row index */
+    Int i ;			/* loop index */
+    Int nnz ;			/* nonzeros in A */
+    Int Row_size ;		/* size of Row [], in integers */
+    Int Col_size ;		/* size of Col [], in integers */
+#if 0
+    Int need ;			/* minimum required length of A */
+#endif
+    Colamd_Row *Row ;		/* pointer into A of Row [0..n_row] array */
+    Colamd_Col *Col ;		/* pointer into A of Col [0..n_col] array */
+    Int n_col2 ;		/* number of non-dense, non-empty columns */
+    Int n_row2 ;		/* number of non-dense, non-empty rows */
+    Int ngarbage ;		/* number of garbage collections performed */
+    Int max_deg ;		/* maximum row degree */
+    Int aggressive ;		/* TRUE if doing aggressive absorption */
+#if 0
+    double default_knobs [COLAMD_KNOBS] ;	/* default knobs array */
+#endif
+
+    /* ------------------ */
+    /* debugging initializations moved for UMFPACK */
+    /* ------------------ */
+
+    /* ------------------ */
+    /* added for UMFPACK: */
+    Int ndense_row, nempty_row, parent, ndense_col,
+	nempty_col, k, col, nfr, *Front_child, *Front_sibling, *Front_stack,
+	*Front_order, *Front_size ;
+    Int nnewlyempty_col, nnewlyempty_row ;
+    /* ------------------ */
+
+    /* === Check the input arguments ======================================== */
+
+#if 0
+    if (!stats)
+    {
+	DEBUG0 (("colamd: stats not present\n")) ;
+	return (FALSE) ;	/* UMFPACK:  always passes stats [ ] */
+    }
+#endif
+
+    ASSERT (stats != (Int *) NULL) ;
+
+    for (i = 0 ; i < COLAMD_STATS ; i++)
+    {
+	stats [i] = 0 ;
+    }
+    stats [COLAMD_STATUS] = COLAMD_OK ;
+    stats [COLAMD_INFO1] = -1 ;
+    stats [COLAMD_INFO2] = -1 ;
+
+#if 0
+    if (!A)		/* A is not present */
+    {
+	/* UMFPACK:  always passes A [ ] */
+	DEBUG0 (("colamd: A not present\n")) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;
+	return (FALSE) ;
+    }
+
+    if (!p)		/* p is not present */
+    {
+	/* UMFPACK:  always passes p [ ] */
+	DEBUG0 (("colamd: p not present\n")) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;
+	return (FALSE) ;
+    }
+
+    if (n_row < 0)	/* n_row must be >= 0 */
+    {
+	/* UMFPACK:  does not call UMF_colamd if n <= 0 */
+	DEBUG0 (("colamd: nrow negative "ID"\n", n_row)) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ;
+	stats [COLAMD_INFO1] = n_row ;
+	return (FALSE) ;
+    }
+
+    if (n_col < 0)	/* n_col must be >= 0 */
+    {
+	/* UMFPACK:  does not call UMF_colamd if n <= 0 */
+	DEBUG0 (("colamd: ncol negative "ID"\n", n_col)) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;
+	stats [COLAMD_INFO1] = n_col ;
+	return (FALSE) ;
+    }
+#endif
+
+    ASSERT (A != (Int *) NULL) ;
+    ASSERT (p != (Int *) NULL) ;
+    ASSERT (n_row >= 0) ;
+    ASSERT (n_col >= 0) ;
+
+    nnz = p [n_col] ;
+
+#if 0
+    if (nnz < 0)	/* nnz must be >= 0 */
+    {
+	/* UMFPACK:  does not call UMF_colamd if nnz < 0 */
+	DEBUG0 (("colamd: number of entries negative "ID"\n", nnz)) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;
+	stats [COLAMD_INFO1] = nnz ;
+	return (FALSE) ;
+    }
+
+    if (p [0] != 0)	/* p [0] must be exactly zero */
+    {
+	DEBUG0 (("colamd: p[0] not zero "ID"\n", p [0])) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero	;
+	stats [COLAMD_INFO1] = p [0] ;
+	return (FALSE) ;
+    }
+#endif
+
+    ASSERT (nnz >= 0) ;
+    ASSERT (p [0] == 0) ;
+
+    /* === If no knobs, set default knobs =================================== */
+
+#if 0
+    if (!knobs)
+    {
+	/* UMFPACK:  always passes the knobs */
+	UMF_colamd_set_defaults (default_knobs) ;
+	knobs = default_knobs ;
+    }
+#endif
+
+    ASSERT (knobs != (double *) NULL) ;
+
+    /* --------------------- */
+    /* added for UMFPACK v4.1: */
+    aggressive = (knobs [COLAMD_AGGRESSIVE] != 0) ;
+    /* --------------------- */
+
+    /* === Allocate the Row and Col arrays from array A ===================== */
+
+    Col_size = UMF_COLAMD_C (n_col) ;
+    Row_size = UMF_COLAMD_R (n_row) ;
+
+#if 0
+    need = MAX (2*nnz, 4*n_col) + n_col + Col_size + Row_size ;
+    if (need > Alen)
+    {
+	/* UMFPACK: always passes enough space */
+	/* not enough space in array A to perform the ordering */
+	DEBUG0 (("colamd: Need Alen >= "ID", given only Alen = "ID"\n",
+	    need, Alen)) ;
+	stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ;
+	stats [COLAMD_INFO1] = need ;
+	stats [COLAMD_INFO2] = Alen ;
+	return (FALSE) ;
+    }
+#endif
+
+    Alen -= Col_size + Row_size ;
+    Col = (Colamd_Col *) &A [Alen] ;
+    Row = (Colamd_Row *) &A [Alen + Col_size] ;
+
+    /* Size of A is now Alen >= MAX (2*nnz, 4*n_col) + n_col.  The ordering
+     * requires Alen >= 2*nnz + n_col, and the postorder requires
+     * Alen >= 5*n_col. */
+
+    /* === Construct the row and column data structures ===================== */
+
+    i = init_rows_cols (n_row, n_col, Row, Col, A, p) ;
+
+#if 0
+    if (!i)
+    {
+	/* input matrix is invalid */
+	DEBUG0 (("colamd: Matrix invalid\n")) ;
+	return (FALSE) ;
+    }
+#endif
+
+    ASSERT (i) ;
+
+    /* === UMFPACK: Initialize front info =================================== */
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	Front_npivcol [col] = 0 ;
+	Front_nrows [col] = 0 ;
+	Front_ncols [col] = 0 ;
+	Front_parent [col] = EMPTY ;
+	Front_cols [col] = EMPTY ;
+    }
+
+    /* === Initialize scores, kill dense rows/columns ======================= */
+
+    init_scoring (n_row, n_col, Row, Col, A, p, knobs,
+	&n_row2, &n_col2, &max_deg
+	/* ------------------ */
+	/* added for UMFPACK: */
+	, &ndense_row, &nempty_row, &nnewlyempty_row
+	, &ndense_col, &nempty_col, &nnewlyempty_col
+	/* ------------------ */
+	) ;
+    ASSERT (n_row2 == n_row - nempty_row - nnewlyempty_row - ndense_row) ;
+    ASSERT (n_col2 == n_col - nempty_col - nnewlyempty_col - ndense_col) ;
+
+    /* === Order the supercolumns =========================================== */
+
+    ngarbage = find_ordering (n_row, n_col, Alen, Row, Col, A, p,
+	n_col2, max_deg, 2*nnz
+	/* ------------------ */
+	/* added for UMFPACK: */
+	, Front_npivcol, Front_nrows, Front_ncols, Front_parent, Front_cols
+	, &nfr, aggressive, InFront
+	/* ------------------ */
+	) ;
+
+    /* ------------------ */
+    /* changed for UMFPACK: */
+
+    /* A is no longer needed, so use A [0..5*nfr-1] as workspace [ [ */
+    /* This step requires Alen >= 5*n_col */
+    Front_child   = A ;
+    Front_sibling = Front_child + nfr ;
+    Front_stack   = Front_sibling + nfr ;
+    Front_order   = Front_stack + nfr ;
+    Front_size    = Front_order + nfr ;
+
+    UMF_fsize (nfr, Front_size, Front_nrows, Front_ncols,
+	    Front_parent, Front_npivcol) ;
+
+    AMD_postorder (nfr, Front_parent, Front_npivcol, Front_size,
+	Front_order, Front_child, Front_sibling, Front_stack) ;
+
+    /* Front_size, Front_stack, Front_child, Front_sibling no longer needed ] */
+
+    /* use A [0..nfr-1] as workspace */
+    UMF_apply_order (Front_npivcol, Front_order, A, nfr, nfr) ;
+    UMF_apply_order (Front_nrows,   Front_order, A, nfr, nfr) ;
+    UMF_apply_order (Front_ncols,   Front_order, A, nfr, nfr) ;
+    UMF_apply_order (Front_parent,  Front_order, A, nfr, nfr) ;
+    UMF_apply_order (Front_cols,    Front_order, A, nfr, nfr) ;
+
+    /* fix the parent to refer to the new numbering */
+    for (i = 0 ; i < nfr ; i++)
+    {
+	parent = Front_parent [i] ;
+	if (parent != EMPTY)
+	{
+	    Front_parent [i] = Front_order [parent] ;
+	}
+    }
+
+    /* fix InFront to refer to the new numbering */
+    for (row = 0 ; row < n_row ; row++)
+    {
+	i = InFront [row] ;
+	ASSERT (i >= EMPTY && i < nfr) ;
+	if (i != EMPTY)
+	{
+	    InFront [row] = Front_order [i] ;
+	}
+    }
+
+    /* Front_order longer needed ] */
+
+    /* === Order the columns in the fronts ================================== */
+
+    /* use A [0..n_col-1] as inverse permutation */
+    for (i = 0 ; i < n_col ; i++)
+    {
+	A [i] = EMPTY ;
+    }
+    k = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	ASSERT (Front_npivcol [i] > 0) ;
+	for (col = Front_cols [i] ; col != EMPTY ; col = Col [col].nextcol)
+	{
+	    ASSERT (col >= 0 && col < n_col) ;
+	    DEBUG1 (("Colamd output ordering: k "ID" col "ID"\n", k, col)) ;
+	    p [k] = col ;
+	    ASSERT (A [col] == EMPTY) ;
+	    A [col] = k ;
+	    k++ ;
+	}
+    }
+
+    /* === Order the "dense" and null columns =============================== */
+
+    ASSERT (k == n_col2) ;
+    if (n_col2 < n_col)
+    {
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    if (A [col] == EMPTY)
+	    {
+		k = Col [col].shared2.order ;
+		ASSERT (k >= n_col2 && k < n_col) ;
+		DEBUG1 (("Colamd output ordering: k "ID" col "ID
+		    " (dense or null col)\n", k, col)) ;
+		p [k] = col ;
+		A [col] = k ;
+	    }
+	}
+    }
+
+    /* ------------------ */
+
+    /* === Return statistics in stats ======================================= */
+
+    /* ------------------ */
+    /* modified for UMFPACK */
+    stats [COLAMD_DENSE_ROW] = ndense_row ;
+    stats [COLAMD_EMPTY_ROW] = nempty_row ;
+    stats [COLAMD_NEWLY_EMPTY_ROW] = nnewlyempty_row ;
+    stats [COLAMD_DENSE_COL] = ndense_col ;
+    stats [COLAMD_EMPTY_COL] = nempty_col ;
+    stats [COLAMD_NEWLY_EMPTY_COL] = nnewlyempty_col ;
+    ASSERT (ndense_col + nempty_col + nnewlyempty_col == n_col - n_col2) ;
+    /* ------------------ */
+    stats [COLAMD_DEFRAG_COUNT] = ngarbage ;
+    *p_nfr = nfr ;
+    DEBUG1 (("colamd: done.\n")) ;
+    return (TRUE) ;
+}
+
+
+
+
+/* ========================================================================== */
+/* === colamd_report removed for UMFPACK ==================================== */
+/* ========================================================================== */
+
+/* ========================================================================== */
+/* === symamd_report removed for UMFPACK ==================================== */
+/* ========================================================================== */
+
+
+
+/* ========================================================================== */
+/* === NON-USER-CALLABLE ROUTINES: ========================================== */
+/* ========================================================================== */
+
+/* There are no user-callable routines beyond this point in the file */
+
+
+/* ========================================================================== */
+/* === init_rows_cols ======================================================= */
+/* ========================================================================== */
+
+/*
+    Takes the column form of the matrix in A and creates the row form of the
+    matrix.  Also, row and column attributes are stored in the Col and Row
+    structs.  If the columns are un-sorted or contain duplicate row indices,
+    this routine will also sort and remove duplicate row indices from the
+    column form of the matrix.  Returns FALSE if the matrix is invalid,
+    TRUE otherwise.  Not user-callable.
+*/
+
+/* For UMFPACK, this always returns TRUE */
+
+PRIVATE Int init_rows_cols	/* returns TRUE if OK, or FALSE otherwise */
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,			/* number of rows of A */
+    Int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    Int A [],			/* row indices of A, of size Alen */
+    Int p []			/* pointers to columns in A, of size n_col+1 */
+/*
+    Int stats [COLAMD_STATS]	colamd statistics, removed for UMFPACK
+*/
+)
+{
+    /* === Local variables ================================================== */
+
+    Int col ;			/* a column index */
+    Int row ;			/* a row index */
+    Int *cp ;			/* a column pointer */
+    Int *cp_end ;		/* a pointer to the end of a column */
+
+    /* === Initialize columns, and check column pointers ==================== */
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	Col [col].start = p [col] ;
+	Col [col].length = p [col+1] - p [col] ;
+
+#if 0
+	if (Col [col].length < 0)
+	{
+	    /* column pointers must be non-decreasing */
+	    stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;
+	    stats [COLAMD_INFO1] = col ;
+	    stats [COLAMD_INFO2] = Col [col].length ;
+	    DEBUG0 (("colamd: col "ID" length "ID" <= 0\n",
+		col, Col [col].length));
+	    return (FALSE) ;
+	}
+#endif
+
+	ASSERT (Col [col].length >= 0) ;
+
+	/* added for UMFPACK v4.1 */
+	ASSERT (Col [col].length > 0) ;
+
+	Col [col].shared1.thickness = 1 ;
+	Col [col].shared2.score = 0 ;
+	Col [col].shared3.prev = EMPTY ;
+	Col [col].shared4.degree_next = EMPTY ;
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	Col [col].nextcol = EMPTY ;
+	Col [col].lastcol = col ;
+	/* ------------------ */
+    }
+
+    /* p [0..n_col] no longer needed, used as "head" in subsequent routines */
+
+    /* === Scan columns, compute row degrees, and check row indices ========= */
+
+    /* ------------------ */
+    /* stats [COLAMD_INFO3] = 0 ; */
+    /* number of duplicate or unsorted row indices - not computed in UMFPACK */
+    /* ------------------ */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Row [row].length = 0 ;
+	/* ------------------ */
+	/* removed for UMFPACK */
+	/* Row [row].shared2.mark = -1 ; */
+	/* ------------------ */
+	/* ------------------ */
+	/* added for UMFPACK: */
+	Row [row].thickness = 1 ;
+	Row [row].front = EMPTY ;
+	/* ------------------ */
+    }
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+#ifndef NDEBUG
+	Int last_row = -1 ;
+#endif
+
+	cp = &A [p [col]] ;
+	cp_end = &A [p [col+1]] ;
+
+	while (cp < cp_end)
+	{
+	    row = *cp++ ;
+
+#if 0
+	    /* make sure row indices within range */
+	    if (row < 0 || row >= n_row)
+	    {
+		stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;
+		stats [COLAMD_INFO1] = col ;
+		stats [COLAMD_INFO2] = row ;
+		/* ------------------ */
+		/* not needed in UMFPACK: */
+		/* stats [COLAMD_INFO3] = n_row ; */
+		/* ------------------ */
+		DEBUG0 (("colamd: row "ID" col "ID" out of bounds\n", row,col));
+		return (FALSE) ;
+	    }
+#endif
+
+	    ASSERT (row >= 0 && row < n_row) ;
+
+#if 0
+	    /* ------------------ */
+	    /* changed for UMFPACK */
+	    if (row <= last_row)
+	    {
+		/* row index are unsorted or repeated (or both), thus col */
+		/* is jumbled.  This is an error condition for UMFPACK */
+		stats [COLAMD_STATUS] = COLAMD_ERROR_jumbled_matrix ;
+		stats [COLAMD_INFO1] = col ;
+		stats [COLAMD_INFO2] = row ;
+		DEBUG1 (("colamd: row "ID" col "ID" unsorted/duplicate\n",
+		    row, col)) ;
+		return (FALSE) ;
+	    }
+	    /* ------------------ */
+#endif
+
+	    ASSERT (row > last_row) ;
+
+	    /* ------------------ */
+	    /* changed for UMFPACK - jumbled columns not tolerated */
+	    Row [row].length++ ;
+	    /* ------------------ */
+
+#ifndef NDEBUG
+	    last_row = row ;
+#endif
+	}
+    }
+
+    /* === Compute row pointers ============================================= */
+
+    /* row form of the matrix starts directly after the column */
+    /* form of matrix in A */
+    Row [0].start = p [n_col] ;
+    Row [0].shared1.p = Row [0].start ;
+    /* ------------------ */
+    /* removed for UMFPACK */
+    /* Row [0].shared2.mark = -1 ; */
+    /* ------------------ */
+    for (row = 1 ; row < n_row ; row++)
+    {
+	Row [row].start = Row [row-1].start + Row [row-1].length ;
+	Row [row].shared1.p = Row [row].start ;
+	/* ------------------ */
+	/* removed for UMFPACK */
+	/* Row [row].shared2.mark = -1 ; */
+	/* ------------------ */
+    }
+
+    /* === Create row form ================================================== */
+
+    /* ------------------ */
+    /* jumbled matrix case removed for UMFPACK */
+    /* ------------------ */
+
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    cp = &A [p [col]] ;
+	    cp_end = &A [p [col+1]] ;
+	    while (cp < cp_end)
+	    {
+		A [(Row [*cp++].shared1.p)++] = col ;
+	    }
+	}
+
+    /* === Clear the row marks and set row degrees ========================== */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Row [row].shared2.mark = 0 ;
+	Row [row].shared1.degree = Row [row].length ;
+    }
+
+    /* ------------------ */
+    /* recreate columns for jumbled matrix case removed for UMFPACK */
+    /* ------------------ */
+
+    return (TRUE) ;
+}
+
+
+/* ========================================================================== */
+/* === init_scoring ========================================================= */
+/* ========================================================================== */
+
+/*
+    Kills dense or empty columns and rows, calculates an initial score for
+    each column, and places all columns in the degree lists.  Not user-callable.
+*/
+
+PRIVATE void init_scoring
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,			/* number of rows of A */
+    Int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    Int A [],			/* column form and row form of A */
+    Int head [],		/* of size n_col+1 */
+    double knobs [COLAMD_KNOBS],/* parameters */
+    Int *p_n_row2,		/* number of non-dense, non-empty rows */
+    Int *p_n_col2,		/* number of non-dense, non-empty columns */
+    Int *p_max_deg		/* maximum row degree */
+    /* ------------------ */
+    /* added for UMFPACK */
+    , Int *p_ndense_row		/* number of dense rows */
+    , Int *p_nempty_row		/* number of original empty rows */
+    , Int *p_nnewlyempty_row	/* number of newly empty rows */
+    , Int *p_ndense_col		/* number of dense cols (excl "empty" cols) */
+    , Int *p_nempty_col		/* number of original empty cols */
+    , Int *p_nnewlyempty_col	/* number of newly empty cols */
+    /* ------------------ */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int c ;			/* a column index */
+    Int r, row ;		/* a row index */
+    Int *cp ;			/* a column pointer */
+    Int deg ;			/* degree of a row or column */
+    Int *cp_end ;		/* a pointer to the end of a column */
+    Int *new_cp ;		/* new column pointer */
+    Int col_length ;		/* length of pruned column */
+    Int score ;			/* current column score */
+    Int n_col2 ;		/* number of non-dense, non-empty columns */
+    Int n_row2 ;		/* number of non-dense, non-empty rows */
+    Int dense_row_count ;	/* remove rows with more entries than this */
+    Int dense_col_count ;	/* remove cols with more entries than this */
+    Int min_score ;		/* smallest column score */
+    Int max_deg ;		/* maximum row degree */
+    Int next_col ;		/* Used to add to degree list.*/
+
+    /* ------------------ */
+    /* added for UMFPACK */
+    Int ndense_row ;		/* number of dense rows */
+    Int nempty_row ;		/* number of empty rows */
+    Int nnewlyempty_row ;	/* number of newly empty rows */
+    Int ndense_col ;		/* number of dense cols (excl "empty" cols) */
+    Int nempty_col ;		/* number of original empty cols */
+    Int nnewlyempty_col ;	/* number of newly empty cols */
+    Int ne ;
+    /* ------------------ */
+
+#ifndef NDEBUG
+    Int debug_count ;		/* debug only. */
+#endif /* NDEBUG */
+
+    /* === Extract knobs ==================================================== */
+
+    /* --------------------- */
+    /* old dense row/column knobs:
+    dense_row_count = MAX (0, MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ;
+    dense_col_count = MAX (0, MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ;
+    */
+    /* new, for UMFPACK: */
+    /* Note: if knobs contains a NaN, this is undefined: */
+    dense_row_count =
+	UMFPACK_DENSE_DEGREE_THRESHOLD (knobs [COLAMD_DENSE_ROW], n_col) ;
+    dense_col_count =
+	UMFPACK_DENSE_DEGREE_THRESHOLD (knobs [COLAMD_DENSE_COL], n_row) ;
+    /* Make sure dense_*_count is between 0 and n: */
+    dense_row_count = MAX (0, MIN (dense_row_count, n_col)) ;
+    dense_col_count = MAX (0, MIN (dense_col_count, n_row)) ;
+    /* --------------------- */
+
+    DEBUG1 (("colamd: densecount: "ID" "ID"\n",
+	dense_row_count, dense_col_count)) ;
+    max_deg = 0 ;
+    n_col2 = n_col ;
+    n_row2 = n_row ;
+
+    /* --------------------- */
+    /* added for UMFPACK */
+    ndense_col = 0 ;
+    nempty_col = 0 ;
+    nnewlyempty_col = 0 ;
+    ndense_row = 0 ;
+    nempty_row = 0 ;
+    nnewlyempty_row = 0 ;
+    /* --------------------- */
+
+    /* === Kill empty columns =============================================== */
+
+    /* removed for UMFPACK v4.1.  prune_singletons has already removed empty
+     * columns and empty rows */
+
+#if 0
+    /* Put the empty columns at the end in their natural order, so that LU */
+    /* factorization can proceed as far as possible. */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	deg = Col [c].length ;
+	if (deg == 0)
+	{
+	    /* this is a empty column, kill and order it last */
+	    Col [c].shared2.order = --n_col2 ;
+	    KILL_PRINCIPAL_COL (c) ;
+	    /* --------------------- */
+	    /* added for UMFPACK */
+	    nempty_col++ ;
+	    /* --------------------- */
+	}
+    }
+    DEBUG1 (("colamd: null columns killed: "ID"\n", n_col - n_col2)) ;
+#endif
+
+#ifndef NDEBUG
+    for (c = 0 ; c < n_col ; c++)
+    {
+	ASSERT (Col [c].length > 0) ;
+    }
+#endif
+
+    /* === Count null rows ================================================== */
+
+#if 0
+    for (r = 0 ; r < n_row ; r++)
+    {
+	deg = Row [r].shared1.degree ;
+	if (deg == 0)
+	{
+	    /* this is an original empty row */
+	    nempty_row++ ;
+	}
+    }
+#endif
+
+#ifndef NDEBUG
+    for (r = 0 ; r < n_row ; r++)
+    {
+	ASSERT (Row [r].shared1.degree > 0) ;
+	ASSERT (Row [r].length > 0) ;
+    }
+#endif
+
+    /* === Kill dense columns =============================================== */
+
+    /* Put the dense columns at the end, in their natural order */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+
+	/* ----------------------------------------------------------------- */
+#if 0
+	/* removed for UMFPACK v4.1: no empty columns */
+	/* skip any dead columns */
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+#endif
+	ASSERT (COL_IS_ALIVE (c)) ;
+	ASSERT (Col [c].length > 0) ;
+	/* ----------------------------------------------------------------- */
+
+	deg = Col [c].length ;
+	if (deg > dense_col_count)
+	{
+	    /* this is a dense column, kill and order it last */
+	    Col [c].shared2.order = --n_col2 ;
+	    /* --------------------- */
+	    /* added for UMFPACK */
+	    ndense_col++ ;
+	    /* --------------------- */
+	    /* decrement the row degrees */
+	    cp = &A [Col [c].start] ;
+	    cp_end = cp + Col [c].length ;
+	    while (cp < cp_end)
+	    {
+		Row [*cp++].shared1.degree-- ;
+	    }
+	    KILL_PRINCIPAL_COL (c) ;
+	}
+    }
+    DEBUG1 (("colamd: Dense and null columns killed: "ID"\n", n_col - n_col2)) ;
+
+    /* === Kill dense and empty rows ======================================== */
+
+    /* Note that there can now be empty rows, since dense columns have
+     * been deleted.  These are "newly" empty rows. */
+
+    ne = 0 ;
+    for (r = 0 ; r < n_row ; r++)
+    {
+	deg = Row [r].shared1.degree ;
+	ASSERT (deg >= 0 && deg <= n_col) ;
+	/* --------------------- */
+	/* added for UMFPACK */
+	if (deg > dense_row_count)
+	{
+	    /* There is at least one dense row.  Continue ordering, but */
+	    /* symbolic factorization will be redone after UMF_colamd is done.*/
+	    ndense_row++ ;
+	}
+	if (deg == 0)
+	{
+	    /* this is a newly empty row, or original empty row */
+	    ne++ ;
+	}
+	/* --------------------- */
+	if (deg > dense_row_count || deg == 0)
+	{
+	    /* kill a dense or empty row */
+	    KILL_ROW (r) ;
+	    /* --------------------- */
+	    /* added for UMFPACK */
+	    Row [r].thickness = 0 ;
+	    /* --------------------- */
+	    --n_row2 ;
+	}
+	else
+	{
+	    /* keep track of max degree of remaining rows */
+	    max_deg = MAX (max_deg, deg) ;
+	}
+    }
+    nnewlyempty_row = ne - nempty_row ;
+    DEBUG1 (("colamd: Dense rows killed: "ID"\n", ndense_row)) ;
+    DEBUG1 (("colamd: Dense and null rows killed: "ID"\n", n_row - n_row2)) ;
+
+    /* === Compute initial column scores ==================================== */
+
+    /* At this point the row degrees are accurate.  They reflect the number */
+    /* of "live" (non-dense) columns in each row.  No empty rows exist. */
+    /* Some "live" columns may contain only dead rows, however.  These are */
+    /* pruned in the code below. */
+
+    /* now find the initial matlab score for each column */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	/* skip dead column */
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+	score = 0 ;
+	cp = &A [Col [c].start] ;
+	new_cp = cp ;
+	cp_end = cp + Col [c].length ;
+	while (cp < cp_end)
+	{
+	    /* get a row */
+	    row = *cp++ ;
+	    /* skip if dead */
+	    if (ROW_IS_DEAD (row))
+	    {
+		continue ;
+	    }
+	    /* compact the column */
+	    *new_cp++ = row ;
+	    /* add row's external degree */
+	    score += Row [row].shared1.degree - 1 ;
+	    /* guard against integer overflow */
+	    score = MIN (score, n_col) ;
+	}
+	/* determine pruned column length */
+	col_length = (Int) (new_cp - &A [Col [c].start]) ;
+	if (col_length == 0)
+	{
+	    /* a newly-made null column (all rows in this col are "dense" */
+	    /* and have already been killed) */
+	    DEBUG2 (("Newly null killed: "ID"\n", c)) ;
+	    Col [c].shared2.order = --n_col2 ;
+	    KILL_PRINCIPAL_COL (c) ;
+	    /* --------------------- */
+	    /* added for UMFPACK */
+	    nnewlyempty_col++ ;
+	    /* --------------------- */
+	}
+	else
+	{
+	    /* set column length and set score */
+	    ASSERT (score >= 0) ;
+	    ASSERT (score <= n_col) ;
+	    Col [c].length = col_length ;
+	    Col [c].shared2.score = score ;
+	}
+    }
+    DEBUG1 (("colamd: Dense, null, and newly-null columns killed: "ID"\n",
+	n_col-n_col2)) ;
+
+    /* At this point, all empty rows and columns are dead.  All live columns */
+    /* are "clean" (containing no dead rows) and simplicial (no supercolumns */
+    /* yet).  Rows may contain dead columns, but all live rows contain at */
+    /* least one live column. */
+
+#ifndef NDEBUG
+    debug_structures (n_row, n_col, Row, Col, A, n_col2) ;
+#endif /* NDEBUG */
+
+    /* === Initialize degree lists ========================================== */
+
+#ifndef NDEBUG
+    debug_count = 0 ;
+#endif /* NDEBUG */
+
+    /* clear the hash buckets */
+    for (c = 0 ; c <= n_col ; c++)
+    {
+	head [c] = EMPTY ;
+    }
+    min_score = n_col ;
+    /* place in reverse order, so low column indices are at the front */
+    /* of the lists.  This is to encourage natural tie-breaking */
+    for (c = n_col-1 ; c >= 0 ; c--)
+    {
+	/* only add principal columns to degree lists */
+	if (COL_IS_ALIVE (c))
+	{
+	    DEBUG4 (("place "ID" score "ID" minscore "ID" ncol "ID"\n",
+		c, Col [c].shared2.score, min_score, n_col)) ;
+
+	    /* === Add columns score to DList =============================== */
+
+	    score = Col [c].shared2.score ;
+
+	    ASSERT (min_score >= 0) ;
+	    ASSERT (min_score <= n_col) ;
+	    ASSERT (score >= 0) ;
+	    ASSERT (score <= n_col) ;
+	    ASSERT (head [score] >= EMPTY) ;
+
+	    /* now add this column to dList at proper score location */
+	    next_col = head [score] ;
+	    Col [c].shared3.prev = EMPTY ;
+	    Col [c].shared4.degree_next = next_col ;
+
+	    /* if there already was a column with the same score, set its */
+	    /* previous pointer to this new column */
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = c ;
+	    }
+	    head [score] = c ;
+
+	    /* see if this score is less than current min */
+	    min_score = MIN (min_score, score) ;
+
+#ifndef NDEBUG
+	    debug_count++ ;
+#endif /* NDEBUG */
+
+	}
+    }
+
+#ifndef NDEBUG
+    DEBUG1 (("colamd: Live cols "ID" out of "ID", non-princ: "ID"\n",
+	debug_count, n_col, n_col-debug_count)) ;
+    ASSERT (debug_count == n_col2) ;
+    debug_deg_lists (n_row, n_col, Row, Col, head, min_score, n_col2, max_deg) ;
+#endif /* NDEBUG */
+
+    /* === Return number of remaining columns, and max row degree =========== */
+
+    *p_n_col2 = n_col2 ;
+    *p_n_row2 = n_row2 ;
+    *p_max_deg = max_deg ;
+
+    /* --------------------- */
+    /* added for UMFPACK */
+    *p_ndense_row = ndense_row ;
+    *p_nempty_row = nempty_row ;	/* original empty rows */
+    *p_nnewlyempty_row = nnewlyempty_row ;
+    *p_ndense_col = ndense_col ;
+    *p_nempty_col = nempty_col ;	/* original empty cols */
+    *p_nnewlyempty_col = nnewlyempty_col ;
+    /* --------------------- */
+}
+
+
+/* ========================================================================== */
+/* === find_ordering ======================================================== */
+/* ========================================================================== */
+
+/*
+    Order the principal columns of the supercolumn form of the matrix
+    (no supercolumns on input).  Uses a minimum approximate column minimum
+    degree ordering method.  Not user-callable.
+*/
+
+PRIVATE Int find_ordering	/* return the number of garbage collections */
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,			/* number of rows of A */
+    Int n_col,			/* number of columns of A */
+    Int Alen,			/* size of A, 2*nnz + n_col or larger */
+    Colamd_Row Row [],		/* of size n_row+1 */
+    Colamd_Col Col [],		/* of size n_col+1 */
+    Int A [],			/* column form and row form of A */
+    Int head [],		/* of size n_col+1 */
+    Int n_col2,			/* Remaining columns to order */
+    Int max_deg,		/* Maximum row degree */
+    Int pfree			/* index of first free slot (2*nnz on entry) */
+    /* ------------------ */
+    /* added for UMFPACK: */
+    , Int Front_npivcol [ ]
+    , Int Front_nrows [ ]
+    , Int Front_ncols [ ]
+    , Int Front_parent [ ]
+    , Int Front_cols [ ]
+    , Int *p_nfr		/* number of fronts */
+    , Int aggressive
+    , Int InFront [ ]
+    /* ------------------ */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int k ;			/* current pivot ordering step */
+    Int pivot_col ;		/* current pivot column */
+    Int *cp ;			/* a column pointer */
+    Int *rp ;			/* a row pointer */
+    Int pivot_row ;		/* current pivot row */
+    Int *new_cp ;		/* modified column pointer */
+    Int *new_rp ;		/* modified row pointer */
+    Int pivot_row_start ;	/* pointer to start of pivot row */
+    Int pivot_row_degree ;	/* number of columns in pivot row */
+    Int pivot_row_length ;	/* number of supercolumns in pivot row */
+    Int pivot_col_score ;	/* score of pivot column */
+    Int needed_memory ;		/* free space needed for pivot row */
+    Int *cp_end ;		/* pointer to the end of a column */
+    Int *rp_end ;		/* pointer to the end of a row */
+    Int row ;			/* a row index */
+    Int col ;			/* a column index */
+    Int max_score ;		/* maximum possible score */
+    Int cur_score ;		/* score of current column */
+    unsigned Int hash ;		/* hash value for supernode detection */
+    Int head_column ;		/* head of hash bucket */
+    Int first_col ;		/* first column in hash bucket */
+    Int tag_mark ;		/* marker value for mark array */
+    Int row_mark ;		/* Row [row].shared2.mark */
+    Int set_difference ;	/* set difference size of row with pivot row */
+    Int min_score ;		/* smallest column score */
+    Int col_thickness ;		/* "thickness" (no. of columns in a supercol) */
+    Int max_mark ;		/* maximum value of tag_mark */
+    Int pivot_col_thickness ;	/* number of columns represented by pivot col */
+    Int prev_col ;		/* Used by Dlist operations. */
+    Int next_col ;		/* Used by Dlist operations. */
+    Int ngarbage ;		/* number of garbage collections performed */
+
+#ifndef NDEBUG
+    Int debug_d ;		/* debug loop counter */
+    Int debug_step = 0 ;	/* debug loop counter */
+#endif /* NDEBUG */
+
+    /* ------------------ */
+    /* added for UMFPACK: */
+    Int pivot_row_thickness ;	/* number of rows represented by pivot row */
+    Int nfr = 0 ;		/* number of fronts */
+    Int child ;
+    /* ------------------ */
+
+    /* === Initialization and clear mark ==================================== */
+
+    max_mark = MAX_MARK (n_col) ;	/* defined in umfpack.h */
+    tag_mark = clear_mark (n_row, Row) ;
+    min_score = 0 ;
+    ngarbage = 0 ;
+    DEBUG1 (("colamd: Ordering, n_col2="ID"\n", n_col2)) ;
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	InFront [row] = EMPTY ;
+    }
+
+    /* === Order the columns ================================================ */
+
+    for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)
+    {
+
+#ifndef NDEBUG
+	if (debug_step % 100 == 0)
+	{
+	    DEBUG2 (("\n...  Step k: "ID" out of n_col2: "ID"\n", k, n_col2)) ;
+	}
+	else
+	{
+	    DEBUG3 (("\n-----Step k: "ID" out of n_col2: "ID"\n", k, n_col2)) ;
+	}
+	debug_step++ ;
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k, max_deg) ;
+	debug_matrix (n_row, n_col, Row, Col, A) ;
+#endif /* NDEBUG */
+
+	/* === Select pivot column, and order it ============================ */
+
+	/* make sure degree list isn't empty */
+	ASSERT (min_score >= 0) ;
+	ASSERT (min_score <= n_col) ;
+	ASSERT (head [min_score] >= EMPTY) ;
+
+#ifndef NDEBUG
+	for (debug_d = 0 ; debug_d < min_score ; debug_d++)
+	{
+	    ASSERT (head [debug_d] == EMPTY) ;
+	}
+#endif /* NDEBUG */
+
+	/* get pivot column from head of minimum degree list */
+	while (head [min_score] == EMPTY && min_score < n_col)
+	{
+	    min_score++ ;
+	}
+	pivot_col = head [min_score] ;
+	ASSERT (pivot_col >= 0 && pivot_col <= n_col) ;
+	next_col = Col [pivot_col].shared4.degree_next ;
+	head [min_score] = next_col ;
+	if (next_col != EMPTY)
+	{
+	    Col [next_col].shared3.prev = EMPTY ;
+	}
+
+	ASSERT (COL_IS_ALIVE (pivot_col)) ;
+	DEBUG3 (("Pivot col: "ID"\n", pivot_col)) ;
+
+	/* remember score for defrag check */
+	pivot_col_score = Col [pivot_col].shared2.score ;
+
+	/* the pivot column is the kth column in the pivot order */
+	Col [pivot_col].shared2.order = k ;
+
+	/* increment order count by column thickness */
+	pivot_col_thickness = Col [pivot_col].shared1.thickness ;
+	/* ------------------ */
+	/* changed for UMFPACK: */
+	k += pivot_col_thickness ;
+	/* ------------------ */
+	ASSERT (pivot_col_thickness > 0) ;
+
+	/* === Garbage_collection, if necessary ============================= */
+
+	needed_memory = MIN (pivot_col_score, n_col - k) ;
+	if (pfree + needed_memory >= Alen)
+	{
+	    pfree = garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;
+	    ngarbage++ ;
+	    /* after garbage collection we will have enough */
+	    ASSERT (pfree + needed_memory < Alen) ;
+	    /* garbage collection has wiped out the Row[].shared2.mark array */
+	    tag_mark = clear_mark (n_row, Row) ;
+
+#ifndef NDEBUG
+	    debug_matrix (n_row, n_col, Row, Col, A) ;
+#endif /* NDEBUG */
+	}
+
+	/* === Compute pivot row pattern ==================================== */
+
+	/* get starting location for this new merged row */
+	pivot_row_start = pfree ;
+
+	/* initialize new row counts to zero */
+	pivot_row_degree = 0 ;
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	pivot_row_thickness = 0 ;
+	/* ------------------ */
+
+	/* [ tag pivot column as having been visited so it isn't included */
+	/* in merged pivot row */
+	Col [pivot_col].shared1.thickness = -pivot_col_thickness ;
+
+	/* pivot row is the union of all rows in the pivot column pattern */
+	cp = &A [Col [pivot_col].start] ;
+	cp_end = cp + Col [pivot_col].length ;
+	while (cp < cp_end)
+	{
+	    /* get a row */
+	    row = *cp++ ;
+	    DEBUG4 (("Pivot col pattern %d "ID"\n", ROW_IS_ALIVE(row), row)) ;
+	    /* skip if row is dead */
+	    if (ROW_IS_DEAD (row))
+	    {
+		continue ;
+	    }
+
+	    /* ------------------ */
+	    /* added for UMFPACK: */
+	    /* sum the thicknesses of all the rows */
+	    /* ASSERT (Row [row].thickness > 0) ; */
+	    pivot_row_thickness += Row [row].thickness ;
+	    /* ------------------ */
+
+	    rp = &A [Row [row].start] ;
+	    rp_end = rp + Row [row].length ;
+	    while (rp < rp_end)
+	    {
+		/* get a column */
+		col = *rp++ ;
+		/* add the column, if alive and untagged */
+		col_thickness = Col [col].shared1.thickness ;
+		if (col_thickness > 0 && COL_IS_ALIVE (col))
+		{
+		    /* tag column in pivot row */
+		    Col [col].shared1.thickness = -col_thickness ;
+		    ASSERT (pfree < Alen) ;
+		    /* place column in pivot row */
+		    A [pfree++] = col ;
+		    pivot_row_degree += col_thickness ;
+		    /* ------------------ */
+		    /* added for UMFPACK: */
+		    DEBUG4 (("\t\t\tNew live column in pivot row: "ID"\n",col));
+		    /* ------------------ */
+		}
+		/* ------------------ */
+		/* added for UMFPACK */
+#ifndef NDEBUG
+		if (col_thickness < 0 && COL_IS_ALIVE (col))
+		{
+		    DEBUG4 (("\t\t\tOld live column in pivot row: "ID"\n",col));
+		}
+#endif
+		/* ------------------ */
+	    }
+	}
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	/* pivot_row_thickness is the number of rows in frontal matrix */
+	/* both pivotal rows and nonpivotal rows */
+	/* ------------------ */
+
+	/* clear tag on pivot column */
+	Col [pivot_col].shared1.thickness = pivot_col_thickness ;	/* ] */
+	max_deg = MAX (max_deg, pivot_row_degree) ;
+
+#ifndef NDEBUG
+	DEBUG3 (("check2\n")) ;
+	debug_mark (n_row, Row, tag_mark, max_mark) ;
+#endif /* NDEBUG */
+
+	/* === Kill all rows used to construct pivot row ==================== */
+
+	/* also kill pivot row, temporarily */
+	cp = &A [Col [pivot_col].start] ;
+	cp_end = cp + Col [pivot_col].length ;
+	while (cp < cp_end)
+	{
+	    /* may be killing an already dead row */
+	    row = *cp++ ;
+
+	    DEBUG2 (("Kill row in pivot col: "ID" alive? %d, front "ID"\n",
+		row, ROW_IS_ALIVE (row), Row [row].front)) ;
+
+	    /* added for UMFPACK: */
+	    if (ROW_IS_ALIVE (row))
+	    {
+		if (Row [row].front != EMPTY)
+		{
+		    /* This row represents a frontal matrix. */
+		    /* Row [row].front is a child of current front */
+		    child = Row [row].front ;
+		    Front_parent [child] = nfr ;
+		    DEBUG1 (("Front "ID" => front "ID", normal\n", child, nfr));
+		}
+		else
+		{
+		    /* This is an original row.  Keep track of which front
+		     * is its parent in the row-merge tree. */
+		    InFront [row] = nfr ;
+		    DEBUG1 (("Row "ID" => front "ID", normal\n", row, nfr)) ;
+		}
+	    }
+
+	    KILL_ROW (row) ;
+
+	    /* ------------------ */
+	    /* added for UMFPACK: */
+	    Row [row].thickness = 0 ;
+	    /* ------------------ */
+	}
+
+	/* === Select a row index to use as the new pivot row =============== */
+
+	pivot_row_length = pfree - pivot_row_start ;
+	if (pivot_row_length > 0)
+	{
+	    /* pick the "pivot" row arbitrarily (first row in col) */
+	    pivot_row = A [Col [pivot_col].start] ;
+	    DEBUG3 (("Pivotal row is "ID"\n", pivot_row)) ;
+	}
+	else
+	{
+	    /* there is no pivot row, since it is of zero length */
+	    pivot_row = EMPTY ;
+	    ASSERT (pivot_row_length == 0) ;
+	}
+	ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;
+
+	/* === Approximate degree computation =============================== */
+
+	/* Here begins the computation of the approximate degree.  The column */
+	/* score is the sum of the pivot row "length", plus the size of the */
+	/* set differences of each row in the column minus the pattern of the */
+	/* pivot row itself.  The column ("thickness") itself is also */
+	/* excluded from the column score (we thus use an approximate */
+	/* external degree). */
+
+	/* The time taken by the following code (compute set differences, and */
+	/* add them up) is proportional to the size of the data structure */
+	/* being scanned - that is, the sum of the sizes of each column in */
+	/* the pivot row.  Thus, the amortized time to compute a column score */
+	/* is proportional to the size of that column (where size, in this */
+	/* context, is the column "length", or the number of row indices */
+	/* in that column).  The number of row indices in a column is */
+	/* monotonically non-decreasing, from the length of the original */
+	/* column on input to colamd. */
+
+	/* === Compute set differences ====================================== */
+
+	DEBUG3 (("** Computing set differences phase. **\n")) ;
+
+	/* pivot row is currently dead - it will be revived later. */
+
+	DEBUG3 (("Pivot row: \n")) ;
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    col = *rp++ ;
+	    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+	    DEBUG3 (("    Col: "ID"\n", col)) ;
+
+	    /* clear tags used to construct pivot row pattern */
+	    col_thickness = -Col [col].shared1.thickness ;
+	    ASSERT (col_thickness > 0) ;
+	    Col [col].shared1.thickness = col_thickness ;
+
+	    /* === Remove column from degree list =========================== */
+
+	    cur_score = Col [col].shared2.score ;
+	    prev_col = Col [col].shared3.prev ;
+	    next_col = Col [col].shared4.degree_next ;
+	    ASSERT (cur_score >= 0) ;
+	    ASSERT (cur_score <= n_col) ;
+	    ASSERT (cur_score >= EMPTY) ;
+	    if (prev_col == EMPTY)
+	    {
+		head [cur_score] = next_col ;
+	    }
+	    else
+	    {
+		Col [prev_col].shared4.degree_next = next_col ;
+	    }
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = prev_col ;
+	    }
+
+	    /* === Scan the column ========================================== */
+
+	    cp = &A [Col [col].start] ;
+	    cp_end = cp + Col [col].length ;
+	    while (cp < cp_end)
+	    {
+		/* get a row */
+		row = *cp++ ;
+		row_mark = Row [row].shared2.mark ;
+		/* skip if dead */
+		if (ROW_IS_MARKED_DEAD (row_mark))
+		{
+		    continue ;
+		}
+		ASSERT (row != pivot_row) ;
+		set_difference = row_mark - tag_mark ;
+		/* check if the row has been seen yet */
+		if (set_difference < 0)
+		{
+		    ASSERT (Row [row].shared1.degree <= max_deg) ;
+		    set_difference = Row [row].shared1.degree ;
+		}
+		/* subtract column thickness from this row's set difference */
+		set_difference -= col_thickness ;
+		ASSERT (set_difference >= 0) ;
+		ASSERT (ROW_IS_ALIVE (row)) ;
+
+		/* absorb this row if the set difference becomes zero */
+		if (set_difference == 0 && aggressive)
+		{
+		    /* v4.1: do aggressive absorption */
+		    DEBUG3 (("aggressive absorption. Row: "ID"\n", row)) ;
+
+		    if (Row [row].front != EMPTY)
+		    {
+			/* Row [row].front is a child of current front. */
+			child = Row [row].front ;
+			Front_parent [child] = nfr ;
+			DEBUG1 (("Front "ID" => front "ID", aggressive\n",
+				    child, nfr)) ;
+		    }
+		    else
+		    {
+			/* this is an original row.  Keep track of which front
+			 * assembles it, for the row-merge tree */
+			InFront [row] = nfr ;
+			DEBUG1 (("Row "ID" => front "ID", aggressive\n",
+				    row, nfr)) ;
+		    }
+
+		    KILL_ROW (row) ;
+
+		    /* sum the thicknesses of all the rows */
+		    /* ASSERT (Row [row].thickness > 0) ; */
+		    pivot_row_thickness += Row [row].thickness ;
+		    Row [row].thickness = 0 ;
+
+		}
+		else
+		{
+		    /* save the new mark */
+		    Row [row].shared2.mark = set_difference + tag_mark ;
+		}
+	    }
+	}
+
+#ifndef NDEBUG
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k-pivot_row_degree, max_deg) ;
+#endif /* NDEBUG */
+
+	/* === Add up set differences for each column ======================= */
+
+	DEBUG3 (("** Adding set differences phase. **\n")) ;
+
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    /* get a column */
+	    col = *rp++ ;
+	    ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+	    hash = 0 ;
+	    cur_score = 0 ;
+	    cp = &A [Col [col].start] ;
+	    /* compact the column */
+	    new_cp = cp ;
+	    cp_end = cp + Col [col].length ;
+
+	    DEBUG4 (("Adding set diffs for Col: "ID".\n", col)) ;
+
+	    while (cp < cp_end)
+	    {
+		/* get a row */
+		row = *cp++ ;
+		ASSERT(row >= 0 && row < n_row) ;
+		row_mark = Row [row].shared2.mark ;
+		/* skip if dead */
+		if (ROW_IS_MARKED_DEAD (row_mark))
+		{
+		    /* ------------------ */
+		    /* changed for UMFPACK: */
+		    DEBUG4 ((" Row "ID", dead\n", row)) ;
+		    /* ------------------ */
+		    continue ;
+		}
+		/* ------------------ */
+		/* changed for UMFPACK: */
+		/* ASSERT (row_mark > tag_mark) ; */
+		DEBUG4 ((" Row "ID", set diff "ID"\n", row, row_mark-tag_mark));
+		ASSERT (row_mark >= tag_mark) ;
+		/* ------------------ */
+		/* compact the column */
+		*new_cp++ = row ;
+		/* compute hash function */
+		hash += row ;
+		/* add set difference */
+		cur_score += row_mark - tag_mark ;
+		/* integer overflow... */
+		cur_score = MIN (cur_score, n_col) ;
+	    }
+
+	    /* recompute the column's length */
+	    Col [col].length = (Int) (new_cp - &A [Col [col].start]) ;
+
+	    /* === Further mass elimination ================================= */
+
+	    if (Col [col].length == 0)
+	    {
+		DEBUG4 (("further mass elimination. Col: "ID"\n", col)) ;
+		/* nothing left but the pivot row in this column */
+		KILL_PRINCIPAL_COL (col) ;
+		pivot_row_degree -= Col [col].shared1.thickness ;
+		ASSERT (pivot_row_degree >= 0) ;
+		/* order it */
+		Col [col].shared2.order = k ;
+		/* increment order count by column thickness */
+		k += Col [col].shared1.thickness ;
+
+		/* ------------------ */
+		/* added for UMFPACK: */
+		pivot_col_thickness += Col [col].shared1.thickness ;
+
+		/* add to column list of front ... */
+#ifndef NDEBUG
+		DEBUG1 (("Mass")) ;
+		dump_super (col, Col, n_col) ;
+#endif
+		Col [Col [col].lastcol].nextcol = Front_cols [nfr] ;
+		Front_cols [nfr] = col ;
+		/* ------------------ */
+
+	    }
+	    else
+	    {
+		/* === Prepare for supercolumn detection ==================== */
+
+		DEBUG4 (("Preparing supercol detection for Col: "ID".\n", col));
+
+		/* save score so far */
+		Col [col].shared2.score = cur_score ;
+
+		/* add column to hash table, for supercolumn detection */
+		/* NOTE: hash is an unsigned Int to avoid a problem in ANSI C.
+		 * The sign of the expression a % b is not defined when a and/or
+		 * b are negative.  Since hash is unsigned and n_col >= 0,
+		 * this problem is avoided. */
+		hash %= n_col + 1 ;
+
+		DEBUG4 ((" Hash = "ID", n_col = "ID".\n", (Int) hash, n_col)) ;
+		ASSERT (((Int) hash) <= n_col) ;
+
+		head_column = head [hash] ;
+		if (head_column > EMPTY)
+		{
+		    /* degree list "hash" is non-empty, use prev (shared3) of */
+		    /* first column in degree list as head of hash bucket */
+		    first_col = Col [head_column].shared3.headhash ;
+		    Col [head_column].shared3.headhash = col ;
+		}
+		else
+		{
+		    /* degree list "hash" is empty, use head as hash bucket */
+		    first_col = - (head_column + 2) ;
+		    head [hash] = - (col + 2) ;
+		}
+		Col [col].shared4.hash_next = first_col ;
+
+		/* save hash function in Col [col].shared3.hash */
+		Col [col].shared3.hash = (Int) hash ;
+		ASSERT (COL_IS_ALIVE (col)) ;
+	    }
+	}
+
+	/* The approximate external column degree is now computed.  */
+
+	/* === Supercolumn detection ======================================== */
+
+	DEBUG3 (("** Supercolumn detection phase. **\n")) ;
+
+	detect_super_cols (
+
+#ifndef NDEBUG
+		n_col, Row,
+#endif /* NDEBUG */
+
+		Col, A, head, pivot_row_start, pivot_row_length) ;
+
+	/* === Kill the pivotal column ====================================== */
+
+	KILL_PRINCIPAL_COL (pivot_col) ;
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	/* add columns to column list of front */
+#ifndef NDEBUG
+	DEBUG1 (("Pivot")) ;
+	dump_super (pivot_col, Col, n_col) ;
+#endif
+	Col [Col [pivot_col].lastcol].nextcol = Front_cols [nfr] ;
+	Front_cols [nfr] = pivot_col ;
+	/* ------------------ */
+
+	/* === Clear mark =================================================== */
+
+	tag_mark += (max_deg + 1) ;
+	if (tag_mark >= max_mark)
+	{
+	    DEBUG2 (("clearing tag_mark\n")) ;
+	    tag_mark = clear_mark (n_row, Row) ;
+	}
+
+#ifndef NDEBUG
+	DEBUG3 (("check3\n")) ;
+	debug_mark (n_row, Row, tag_mark, max_mark) ;
+#endif /* NDEBUG */
+
+	/* === Finalize the new pivot row, and column scores ================ */
+
+	DEBUG3 (("** Finalize scores phase. **\n")) ;
+	DEBUG3 (("pivot_row_degree "ID"\n", pivot_row_degree)) ;
+
+	/* for each column in pivot row */
+	rp = &A [pivot_row_start] ;
+	/* compact the pivot row */
+	new_rp = rp ;
+	rp_end = rp + pivot_row_length ;
+	while (rp < rp_end)
+	{
+	    col = *rp++ ;
+	    DEBUG3 (("Col "ID" \n", col)) ;
+	    /* skip dead columns */
+	    if (COL_IS_DEAD (col))
+	    {
+		DEBUG3 (("dead\n")) ;
+		continue ;
+	    }
+	    *new_rp++ = col ;
+	    /* add new pivot row to column */
+	    A [Col [col].start + (Col [col].length++)] = pivot_row ;
+
+	    /* retrieve score so far and add on pivot row's degree. */
+	    /* (we wait until here for this in case the pivot */
+	    /* row's degree was reduced due to mass elimination). */
+	    cur_score = Col [col].shared2.score + pivot_row_degree ;
+	    DEBUG3 ((" cur_score "ID" ", cur_score)) ;
+
+	    /* calculate the max possible score as the number of */
+	    /* external columns minus the 'k' value minus the */
+	    /* columns thickness */
+	    max_score = n_col - k - Col [col].shared1.thickness ;
+	    DEBUG3 ((" max_score "ID" ", max_score)) ;
+
+	    /* make the score the external degree of the union-of-rows */
+	    cur_score -= Col [col].shared1.thickness ;
+	    DEBUG3 ((" cur_score "ID" ", cur_score)) ;
+
+	    /* make sure score is less or equal than the max score */
+	    cur_score = MIN (cur_score, max_score) ;
+	    ASSERT (cur_score >= 0) ;
+
+	    /* store updated score */
+	    Col [col].shared2.score = cur_score ;
+	    DEBUG3 ((" "ID"\n", cur_score)) ;
+
+	    /* === Place column back in degree list ========================= */
+
+	    ASSERT (min_score >= 0) ;
+	    ASSERT (min_score <= n_col) ;
+	    ASSERT (cur_score >= 0) ;
+	    ASSERT (cur_score <= n_col) ;
+	    ASSERT (head [cur_score] >= EMPTY) ;
+	    next_col = head [cur_score] ;
+	    Col [col].shared4.degree_next = next_col ;
+	    Col [col].shared3.prev = EMPTY ;
+	    if (next_col != EMPTY)
+	    {
+		Col [next_col].shared3.prev = col ;
+	    }
+	    head [cur_score] = col ;
+
+	    /* see if this score is less than current min */
+	    min_score = MIN (min_score, cur_score) ;
+
+	}
+
+#ifndef NDEBUG
+	debug_deg_lists (n_row, n_col, Row, Col, head,
+		min_score, n_col2-k, max_deg) ;
+#endif /* NDEBUG */
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	/* frontal matrix can have more pivot cols than pivot rows for */
+	/* singular matrices. */
+
+	/* number of candidate pivot columns */
+	Front_npivcol [nfr] = pivot_col_thickness ;
+
+	/* all rows (not just size of contrib. block) */
+	Front_nrows [nfr] = pivot_row_thickness ;
+
+	/* all cols */
+	Front_ncols [nfr] = pivot_col_thickness + pivot_row_degree ;
+
+	Front_parent [nfr] = EMPTY ;
+
+	pivot_row_thickness -= pivot_col_thickness ;
+	DEBUG1 (("Front "ID" Pivot_row_thickness after pivot cols elim: "ID"\n",
+	    nfr, pivot_row_thickness)) ;
+	pivot_row_thickness = MAX (0, pivot_row_thickness) ;
+	/* ------------------ */
+
+	/* === Resurrect the new pivot row ================================== */
+
+	if (pivot_row_degree > 0
+	/* ------------------ */
+	/* added for UMFPACK.  Note that this part of the expression should be
+	 * removed if this routine is used outside of UMFPACK, for a Cholesky
+	 * factorization of (AQ)'(AQ) */
+	&& pivot_row_thickness > 0
+	/* ------------------ */
+	)
+	{
+	    /* update pivot row length to reflect any cols that were killed */
+	    /* during super-col detection and mass elimination */
+	    Row [pivot_row].start  = pivot_row_start ;
+	    Row [pivot_row].length = (Int) (new_rp - &A[pivot_row_start]) ;
+	    ASSERT (Row [pivot_row].length > 0) ;
+	    Row [pivot_row].shared1.degree = pivot_row_degree ;
+	    Row [pivot_row].shared2.mark = 0 ;
+	    /* ------------------ */
+	    /* added for UMFPACK: */
+	    Row [pivot_row].thickness = pivot_row_thickness ;
+	    Row [pivot_row].front = nfr ;
+	    /* ------------------ */
+	    /* pivot row is no longer dead */
+	}
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+
+#ifndef NDEBUG
+	DEBUG1 (("Front "ID" : "ID" "ID" "ID" ", nfr,
+		Front_npivcol [nfr], Front_nrows [nfr], Front_ncols [nfr])) ;
+	DEBUG1 ((" cols:[ ")) ;
+	debug_d = 0 ;
+	for (col = Front_cols [nfr] ; col != EMPTY ; col = Col [col].nextcol)
+	{
+	    DEBUG1 ((" "ID, col)) ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    ASSERT (COL_IS_DEAD (col)) ;
+	    debug_d++ ;
+	    ASSERT (debug_d <= pivot_col_thickness) ;
+	}
+	ASSERT (debug_d == pivot_col_thickness) ;
+	DEBUG1 ((" ]\n ")) ;
+#endif
+	nfr++ ; /* one more front */
+	/* ------------------ */
+
+    }
+
+    /* === All principal columns have now been ordered ====================== */
+
+    /* ------------------ */
+    /* added for UMFPACK: */
+    *p_nfr = nfr ;
+    /* ------------------ */
+
+    return (ngarbage) ;
+}
+
+
+/* ========================================================================== */
+/* === order_children deleted for UMFPACK =================================== */
+/* ========================================================================== */
+
+/* ========================================================================== */
+/* === detect_super_cols ==================================================== */
+/* ========================================================================== */
+
+/*
+    Detects supercolumns by finding matches between columns in the hash buckets.
+    Check amongst columns in the set A [row_start ... row_start + row_length-1].
+    The columns under consideration are currently *not* in the degree lists,
+    and have already been placed in the hash buckets.
+
+    The hash bucket for columns whose hash function is equal to h is stored
+    as follows:
+
+	if head [h] is >= 0, then head [h] contains a degree list, so:
+
+		head [h] is the first column in degree bucket h.
+		Col [head [h]].headhash gives the first column in hash bucket h.
+
+	otherwise, the degree list is empty, and:
+
+		-(head [h] + 2) is the first column in hash bucket h.
+
+    For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous
+    column" pointer.  Col [c].shared3.hash is used instead as the hash number
+    for that column.  The value of Col [c].shared4.hash_next is the next column
+    in the same hash bucket.
+
+    Assuming no, or "few" hash collisions, the time taken by this routine is
+    linear in the sum of the sizes (lengths) of each column whose score has
+    just been computed in the approximate degree computation.
+    Not user-callable.
+*/
+
+PRIVATE void detect_super_cols
+(
+    /* === Parameters ======================================================= */
+
+#ifndef NDEBUG
+    /* these two parameters are only needed when debugging is enabled: */
+    Int n_col,			/* number of columns of A */
+    Colamd_Row Row [],		/* of size n_row+1 */
+#endif /* NDEBUG */
+
+    Colamd_Col Col [],		/* of size n_col+1 */
+    Int A [],			/* row indices of A */
+    Int head [],		/* head of degree lists and hash buckets */
+    Int row_start,		/* pointer to set of columns to check */
+    Int row_length		/* number of columns to check */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int hash ;			/* hash value for a column */
+    Int *rp ;			/* pointer to a row */
+    Int c ;			/* a column index */
+    Int super_c ;		/* column index of the column to absorb into */
+    Int *cp1 ;			/* column pointer for column super_c */
+    Int *cp2 ;			/* column pointer for column c */
+    Int length ;		/* length of column super_c */
+    Int prev_c ;		/* column preceding c in hash bucket */
+    Int i ;			/* loop counter */
+    Int *rp_end ;		/* pointer to the end of the row */
+    Int col ;			/* a column index in the row to check */
+    Int head_column ;		/* first column in hash bucket or degree list */
+    Int first_col ;		/* first column in hash bucket */
+
+    /* === Consider each column in the row ================================== */
+
+    rp = &A [row_start] ;
+    rp_end = rp + row_length ;
+    while (rp < rp_end)
+    {
+	col = *rp++ ;
+	if (COL_IS_DEAD (col))
+	{
+	    continue ;
+	}
+
+	/* get hash number for this column */
+	hash = Col [col].shared3.hash ;
+	ASSERT (hash <= n_col) ;
+
+	/* === Get the first column in this hash bucket ===================== */
+
+	head_column = head [hash] ;
+	if (head_column > EMPTY)
+	{
+	    first_col = Col [head_column].shared3.headhash ;
+	}
+	else
+	{
+	    first_col = - (head_column + 2) ;
+	}
+
+	/* === Consider each column in the hash bucket ====================== */
+
+	for (super_c = first_col ; super_c != EMPTY ;
+	    super_c = Col [super_c].shared4.hash_next)
+	{
+	    ASSERT (COL_IS_ALIVE (super_c)) ;
+	    ASSERT (Col [super_c].shared3.hash == hash) ;
+	    length = Col [super_c].length ;
+
+	    /* prev_c is the column preceding column c in the hash bucket */
+	    prev_c = super_c ;
+
+	    /* === Compare super_c with all columns after it ================ */
+
+	    for (c = Col [super_c].shared4.hash_next ;
+		c != EMPTY ; c = Col [c].shared4.hash_next)
+	    {
+		ASSERT (c != super_c) ;
+		ASSERT (COL_IS_ALIVE (c)) ;
+		ASSERT (Col [c].shared3.hash == hash) ;
+
+		/* not identical if lengths or scores are different */
+		if (Col [c].length != length ||
+		    Col [c].shared2.score != Col [super_c].shared2.score)
+		{
+		    prev_c = c ;
+		    continue ;
+		}
+
+		/* compare the two columns */
+		cp1 = &A [Col [super_c].start] ;
+		cp2 = &A [Col [c].start] ;
+
+		for (i = 0 ; i < length ; i++)
+		{
+		    /* the columns are "clean" (no dead rows) */
+		    ASSERT (ROW_IS_ALIVE (*cp1))  ;
+		    ASSERT (ROW_IS_ALIVE (*cp2))  ;
+		    /* row indices will same order for both supercols, */
+		    /* no gather scatter nessasary */
+		    if (*cp1++ != *cp2++)
+		    {
+			break ;
+		    }
+		}
+
+		/* the two columns are different if the for-loop "broke" */
+		if (i != length)
+		{
+		    prev_c = c ;
+		    continue ;
+		}
+
+		/* === Got it!  two columns are identical =================== */
+
+		ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;
+
+		Col [super_c].shared1.thickness += Col [c].shared1.thickness ;
+		Col [c].shared1.parent = super_c ;
+		KILL_NON_PRINCIPAL_COL (c) ;
+
+		Col [c].shared2.order = EMPTY ;
+		/* remove c from hash bucket */
+		Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;
+
+		/* ------------------ */
+		/* added for UMFPACK: */
+		/* add c to end of list of super_c */
+		ASSERT (Col [super_c].lastcol >= 0) ;
+		ASSERT (Col [super_c].lastcol < n_col) ;
+		Col [Col [super_c].lastcol].nextcol = c ;
+		Col [super_c].lastcol = Col [c].lastcol ;
+#ifndef NDEBUG
+		/* dump the supercolumn */
+		DEBUG1 (("Super")) ;
+		dump_super (super_c, Col, n_col) ;
+#endif
+		/* ------------------ */
+
+	    }
+	}
+
+	/* === Empty this hash bucket ======================================= */
+
+	if (head_column > EMPTY)
+	{
+	    /* corresponding degree list "hash" is not empty */
+	    Col [head_column].shared3.headhash = EMPTY ;
+	}
+	else
+	{
+	    /* corresponding degree list "hash" is empty */
+	    head [hash] = EMPTY ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === garbage_collection =================================================== */
+/* ========================================================================== */
+
+/*
+    Defragments and compacts columns and rows in the workspace A.  Used when
+    all avaliable memory has been used while performing row merging.  Returns
+    the index of the first free position in A, after garbage collection.  The
+    time taken by this routine is linear is the size of the array A, which is
+    itself linear in the number of nonzeros in the input matrix.
+    Not user-callable.
+*/
+
+PRIVATE Int garbage_collection  /* returns the new value of pfree */
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,			/* number of rows */
+    Int n_col,			/* number of columns */
+    Colamd_Row Row [],		/* row info */
+    Colamd_Col Col [],		/* column info */
+    Int A [],			/* A [0 ... Alen-1] holds the matrix */
+    Int *pfree			/* &A [0] ... pfree is in use */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int *psrc ;			/* source pointer */
+    Int *pdest ;		/* destination pointer */
+    Int j ;			/* counter */
+    Int r ;			/* a row index */
+    Int c ;			/* a column index */
+    Int length ;		/* length of a row or column */
+
+#ifndef NDEBUG
+    Int debug_rows ;
+    DEBUG2 (("Defrag..\n")) ;
+    for (psrc = &A[0] ; psrc < pfree ; psrc++) ASSERT (*psrc >= 0) ;
+    debug_rows = 0 ;
+#endif /* NDEBUG */
+
+    /* === Defragment the columns =========================================== */
+
+    pdest = &A[0] ;
+    for (c = 0 ; c < n_col ; c++)
+    {
+	if (COL_IS_ALIVE (c))
+	{
+	    psrc = &A [Col [c].start] ;
+
+	    /* move and compact the column */
+	    ASSERT (pdest <= psrc) ;
+	    Col [c].start = (Int) (pdest - &A [0]) ;
+	    length = Col [c].length ;
+	    for (j = 0 ; j < length ; j++)
+	    {
+		r = *psrc++ ;
+		if (ROW_IS_ALIVE (r))
+		{
+		    *pdest++ = r ;
+		}
+	    }
+	    Col [c].length = (Int) (pdest - &A [Col [c].start]) ;
+	}
+    }
+
+    /* === Prepare to defragment the rows =================================== */
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    if (Row [r].length == 0)
+	    {
+		/* :: defrag row kill :: */
+		/* This row is of zero length.  cannot compact it, so kill it.
+		 * NOTE: in the current version, there are no zero-length live
+		 * rows when garbage_collection is called.  So this code will
+		 * never trigger.  However, if the code is modified, or if
+		 * garbage_collection is called at a different place, then rows
+		 * can be of zero length.  So this test is kept, just in case.
+		 */
+		DEBUGm4 (("Defrag row kill\n")) ;
+		KILL_ROW (r) ;
+	    }
+	    else
+	    {
+		/* save first column index in Row [r].shared2.first_column */
+		psrc = &A [Row [r].start] ;
+		Row [r].shared2.first_column = *psrc ;
+		ASSERT (ROW_IS_ALIVE (r)) ;
+		/* flag the start of the row with the one's complement of row */
+		*psrc = ONES_COMPLEMENT (r) ;
+#ifndef NDEBUG
+		debug_rows++ ;
+#endif /* NDEBUG */
+	    }
+	}
+    }
+
+    /* === Defragment the rows ============================================== */
+
+    psrc = pdest ;
+    while (psrc < pfree)
+    {
+	/* find a negative number ... the start of a row */
+	if (*psrc++ < 0)
+	{
+	    psrc-- ;
+	    /* get the row index */
+	    r = ONES_COMPLEMENT (*psrc) ;
+	    ASSERT (r >= 0 && r < n_row) ;
+	    /* restore first column index */
+	    *psrc = Row [r].shared2.first_column ;
+	    ASSERT (ROW_IS_ALIVE (r)) ;
+
+	    /* move and compact the row */
+	    ASSERT (pdest <= psrc) ;
+	    Row [r].start = (Int) (pdest - &A [0]) ;
+	    length = Row [r].length ;
+	    for (j = 0 ; j < length ; j++)
+	    {
+		c = *psrc++ ;
+		if (COL_IS_ALIVE (c))
+		{
+		    *pdest++ = c ;
+		}
+	    }
+	    Row [r].length = (Int) (pdest - &A [Row [r].start]) ;
+
+#ifndef NDEBUG
+	    debug_rows-- ;
+#endif /* NDEBUG */
+
+	}
+    }
+    /* ensure we found all the rows */
+    ASSERT (debug_rows == 0) ;
+
+    /* === Return the new value of pfree ==================================== */
+
+    return ((Int) (pdest - &A [0])) ;
+}
+
+
+/* ========================================================================== */
+/* === clear_mark =========================================================== */
+/* ========================================================================== */
+
+/*
+    Clears the Row [].shared2.mark array, and returns the new tag_mark.
+    Return value is the new tag_mark.  Not user-callable.
+*/
+
+PRIVATE Int clear_mark	/* return the new value for tag_mark */
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,		/* number of rows in A */
+    Colamd_Row Row []	/* Row [0 ... n-1].shared2.mark is set to zero */
+)
+{
+    /* === Local variables ================================================== */
+
+    Int r ;
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    Row [r].shared2.mark = 0 ;
+	}
+    }
+
+    /* ------------------ */
+    return (1) ;
+    /* ------------------ */
+
+}
+
+
+/* ========================================================================== */
+/* === print_report removed for UMFPACK ===================================== */
+/* ========================================================================== */
+
+
+
+/* ========================================================================== */
+/* === colamd debugging routines ============================================ */
+/* ========================================================================== */
+
+/* When debugging is disabled, the remainder of this file is ignored. */
+
+#ifndef NDEBUG
+
+
+/* ========================================================================== */
+/* === debug_structures ===================================================== */
+/* ========================================================================== */
+
+/*
+    At this point, all empty rows and columns are dead.  All live columns
+    are "clean" (containing no dead rows) and simplicial (no supercolumns
+    yet).  Rows may contain dead columns, but all live rows contain at
+    least one live column.
+*/
+
+PRIVATE void debug_structures
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A [],
+    Int n_col2
+)
+{
+    /* === Local variables ================================================== */
+
+    Int i ;
+    Int c ;
+    Int *cp ;
+    Int *cp_end ;
+    Int len ;
+    Int score ;
+    Int r ;
+    Int *rp ;
+    Int *rp_end ;
+    Int deg ;
+
+    /* === Check A, Row, and Col ============================================ */
+
+    for (c = 0 ; c < n_col ; c++)
+    {
+	if (COL_IS_ALIVE (c))
+	{
+	    len = Col [c].length ;
+	    score = Col [c].shared2.score ;
+	    DEBUG4 (("initial live col "ID" "ID" "ID"\n", c, len, score)) ;
+	    ASSERT (len > 0) ;
+	    ASSERT (score >= 0) ;
+	    ASSERT (Col [c].shared1.thickness == 1) ;
+	    cp = &A [Col [c].start] ;
+	    cp_end = cp + len ;
+	    while (cp < cp_end)
+	    {
+		r = *cp++ ;
+		ASSERT (ROW_IS_ALIVE (r)) ;
+	    }
+	}
+	else
+	{
+	    i = Col [c].shared2.order ;
+	    ASSERT (i >= n_col2 && i < n_col) ;
+	}
+    }
+
+    for (r = 0 ; r < n_row ; r++)
+    {
+	if (ROW_IS_ALIVE (r))
+	{
+	    i = 0 ;
+	    len = Row [r].length ;
+	    deg = Row [r].shared1.degree ;
+	    ASSERT (len > 0) ;
+	    ASSERT (deg > 0) ;
+	    rp = &A [Row [r].start] ;
+	    rp_end = rp + len ;
+	    while (rp < rp_end)
+	    {
+		c = *rp++ ;
+		if (COL_IS_ALIVE (c))
+		{
+		    i++ ;
+		}
+	    }
+	    ASSERT (i > 0) ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_deg_lists ====================================================== */
+/* ========================================================================== */
+
+/*
+    Prints the contents of the degree lists.  Counts the number of columns
+    in the degree list and compares it to the total it should have.  Also
+    checks the row degrees.
+*/
+
+PRIVATE void debug_deg_lists
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int head [],
+    Int min_score,
+    Int should,
+    Int max_deg
+)
+{
+    /* === Local variables ================================================== */
+
+    Int deg ;
+    Int col ;
+    Int have ;
+    Int row ;
+
+    /* === Check the degree lists =========================================== */
+
+    if (n_col > 10000 && UMF_debug <= 0)
+    {
+	return ;
+    }
+    have = 0 ;
+    DEBUG4 (("Degree lists: "ID"\n", min_score)) ;
+    for (deg = 0 ; deg <= n_col ; deg++)
+    {
+	col = head [deg] ;
+	if (col == EMPTY)
+	{
+	    continue ;
+	}
+	DEBUG4 ((ID":", deg)) ;
+	while (col != EMPTY)
+	{
+	    DEBUG4 ((" "ID, col)) ;
+	    have += Col [col].shared1.thickness ;
+	    ASSERT (COL_IS_ALIVE (col)) ;
+	    col = Col [col].shared4.degree_next ;
+	}
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("should "ID" have "ID"\n", should, have)) ;
+    ASSERT (should == have) ;
+
+    /* === Check the row degrees ============================================ */
+
+    if (n_row > 10000 && UMF_debug <= 0)
+    {
+	return ;
+    }
+    for (row = 0 ; row < n_row ; row++)
+    {
+	if (ROW_IS_ALIVE (row))
+	{
+	    ASSERT (Row [row].shared1.degree <= max_deg) ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_mark =========================================================== */
+/* ========================================================================== */
+
+/*
+    Ensures that the tag_mark is less that the maximum and also ensures that
+    each entry in the mark array is less than the tag mark.
+*/
+
+PRIVATE void debug_mark
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,
+    Colamd_Row Row [],
+    Int tag_mark,
+    Int max_mark
+)
+{
+    /* === Local variables ================================================== */
+
+    Int r ;
+
+    /* === Check the Row marks ============================================== */
+
+    ASSERT (tag_mark > 0 && tag_mark <= max_mark) ;
+    if (n_row > 10000 && UMF_debug <= 0)
+    {
+	return ;
+    }
+    for (r = 0 ; r < n_row ; r++)
+    {
+	ASSERT (Row [r].shared2.mark < tag_mark) ;
+    }
+}
+
+
+/* ========================================================================== */
+/* === debug_matrix ========================================================= */
+/* ========================================================================== */
+
+/*
+    Prints out the contents of the columns and the rows.
+*/
+
+PRIVATE void debug_matrix
+(
+    /* === Parameters ======================================================= */
+
+    Int n_row,
+    Int n_col,
+    Colamd_Row Row [],
+    Colamd_Col Col [],
+    Int A []
+)
+{
+    /* === Local variables ================================================== */
+
+    Int r ;
+    Int c ;
+    Int *rp ;
+    Int *rp_end ;
+    Int *cp ;
+    Int *cp_end ;
+
+    /* === Dump the rows and columns of the matrix ========================== */
+
+    if (UMF_debug < 3)
+    {
+	return ;
+    }
+    DEBUG3 (("DUMP MATRIX:\n")) ;
+    for (r = 0 ; r < n_row ; r++)
+    {
+	DEBUG3 (("Row "ID" alive? %d\n", r, ROW_IS_ALIVE (r))) ;
+	if (ROW_IS_DEAD (r))
+	{
+	    continue ;
+	}
+
+	/* ------------------ */
+	/* changed for UMFPACK: */
+	DEBUG3 (("start "ID" length "ID" degree "ID" thickness "ID"\n",
+		Row [r].start, Row [r].length, Row [r].shared1.degree,
+		Row [r].thickness)) ;
+	/* ------------------ */
+
+	rp = &A [Row [r].start] ;
+	rp_end = rp + Row [r].length ;
+	while (rp < rp_end)
+	{
+	    c = *rp++ ;
+	    DEBUG4 (("	%d col "ID"\n", COL_IS_ALIVE (c), c)) ;
+	}
+    }
+
+    for (c = 0 ; c < n_col ; c++)
+    {
+	DEBUG3 (("Col "ID" alive? %d\n", c, COL_IS_ALIVE (c))) ;
+	if (COL_IS_DEAD (c))
+	{
+	    continue ;
+	}
+	/* ------------------ */
+	/* changed for UMFPACK: */
+	DEBUG3 (("start "ID" length "ID" shared1[thickness,parent] "ID
+		" shared2 [order,score] "ID"\n", Col [c].start, Col [c].length,
+		Col [c].shared1.thickness, Col [c].shared2.score));
+	/* ------------------ */
+	cp = &A [Col [c].start] ;
+	cp_end = cp + Col [c].length ;
+	while (cp < cp_end)
+	{
+	    r = *cp++ ;
+	    DEBUG4 (("	%d row "ID"\n", ROW_IS_ALIVE (r), r)) ;
+	}
+
+	/* ------------------ */
+	/* added for UMFPACK: */
+	DEBUG1 (("Col")) ;
+	dump_super (c, Col, n_col) ;
+	/* ------------------ */
+
+    }
+}
+
+/* ------------------ */
+/* dump_super added for UMFPACK: */
+PRIVATE void dump_super
+(
+    Int super_c,
+    Colamd_Col Col [],
+    Int n_col
+)
+{
+    Int col, ncols ;
+
+    DEBUG1 ((" =[ ")) ;
+    ncols = 0 ;
+    for (col = super_c ; col != EMPTY ; col = Col [col].nextcol)
+    {
+	DEBUG1 ((" "ID, col)) ;
+	ASSERT (col >= 0 && col < n_col) ;
+	if (col != super_c)
+	{
+	    ASSERT (COL_IS_DEAD (col)) ;
+	}
+	if (Col [col].nextcol == EMPTY)
+	{
+	    ASSERT (col == Col [super_c].lastcol) ;
+	}
+	ncols++ ;
+	ASSERT (ncols <= Col [super_c].shared1.thickness) ;
+    }
+    ASSERT (ncols == Col [super_c].shared1.thickness) ;
+    DEBUG1 (("]\n")) ;
+}
+/* ------------------ */
+
+
+#endif /* NDEBUG */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_colamd.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,255 @@
+/* ========================================================================== */
+/* === umf_colamd.h ========================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+
+Authors:
+
+    The authors of the COLAMD code itself are Stefan I. Larimore and Timothy A.
+    Davis, University of Florida.  The algorithm was developed in collaboration
+    with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory.
+
+Date:
+
+    UMFPACK Version: see above.
+    COLAMD Version 2.0 was released on January 31, 2000.
+
+Acknowledgements:
+
+    This work was supported by the National Science Foundation, under
+    grants DMS-9504974, DMS-9803599, and CCR-0203270.
+
+UMFPACK:  Copyright (c) 2003 by Timothy A. Davis.  All Rights Reserved.
+
+See the UMFPACK README file for the License for your use of this code.
+
+Availability:
+
+    Both UMFPACK and the original unmodified colamd/symamd library are
+    available at http://www.cise.ufl.edu/research/sparse.
+
+*/
+
+#ifndef COLAMD_H
+#define COLAMD_H
+
+/* ========================================================================== */
+/* === Include files ======================================================== */
+/* ========================================================================== */
+
+#include <stdlib.h>
+
+/* ========================================================================== */
+/* === Knob and statistics definitions ====================================== */
+/* ========================================================================== */
+
+/* size of the knobs [ ] array.  Only knobs [0..2] are currently used. */
+#define COLAMD_KNOBS 20
+
+/* number of output statistics.  Only stats [0..8] are currently used. */
+#define COLAMD_STATS 20
+
+/* knobs [0] and stats [0]: dense row knob and output statistic. */
+#define COLAMD_DENSE_ROW 0
+
+/* knobs [1] and stats [1]: dense column knob and output statistic. */
+#define COLAMD_DENSE_COL 1
+
+/* knobs [2]: aggressive absorption option */
+#define COLAMD_AGGRESSIVE 2
+
+/* stats [2]: memory defragmentation count output statistic */
+#define COLAMD_DEFRAG_COUNT 2
+
+/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */
+#define COLAMD_STATUS 3
+
+/* stats [4..6]: error info, or info on jumbled columns */
+#define COLAMD_INFO1 4
+#define COLAMD_INFO2 5
+#define COLAMD_INFO3 6
+
+/* ------------------ */
+/* added for UMFPACK: */
+/* stats [7]: number of originally empty rows */
+#define COLAMD_EMPTY_ROW 7
+/* stats [8]: number of originally empty cols */
+#define COLAMD_EMPTY_COL 8
+/* stats [9]: number of rows with entries only in dense cols */
+#define COLAMD_NEWLY_EMPTY_ROW 9
+/* stats [10]: number of cols with entries only in dense rows */
+#define COLAMD_NEWLY_EMPTY_COL 10
+/* ------------------ */
+
+/* error codes returned in stats [3]: */
+#define COLAMD_OK				(0)
+#define COLAMD_ERROR_jumbled_matrix		(-11)
+#define COLAMD_ERROR_A_not_present		(-1)
+#define COLAMD_ERROR_p_not_present		(-2)
+#define COLAMD_ERROR_nrow_negative		(-3)
+#define COLAMD_ERROR_ncol_negative		(-4)
+#define COLAMD_ERROR_nnz_negative		(-5)
+#define COLAMD_ERROR_p0_nonzero			(-6)
+#define COLAMD_ERROR_A_too_small		(-7)
+#define COLAMD_ERROR_col_length_negative	(-8)
+#define COLAMD_ERROR_row_index_out_of_bounds	(-9)
+#define COLAMD_ERROR_out_of_memory		(-10)
+#define COLAMD_ERROR_internal_error		(-999)
+
+/* ========================================================================== */
+/* === Row and Column structures ============================================ */
+/* ========================================================================== */
+
+/* User code that makes use of the colamd/symamd routines need not directly */
+/* reference these structures.  They are used only for the COLAMD_RECOMMENDED */
+/* macro. */
+
+typedef struct Colamd_Col_struct
+{
+    Int start ;		/* index for A of first row in this column, or DEAD */
+			/* if column is dead */
+    Int length ;	/* number of rows in this column */
+    union
+    {
+	Int thickness ;	/* number of original columns represented by this */
+			/* col, if the column is alive */
+	Int parent ;	/* parent in parent tree super-column structure, if */
+			/* the column is dead */
+    } shared1 ;
+    union
+    {
+	Int score ;	/* the score used to maintain heap, if col is alive */
+	Int order ;	/* pivot ordering of this column, if col is dead */
+    } shared2 ;
+    union
+    {
+	Int headhash ;	/* head of a hash bucket, if col is at the head of */
+			/* a degree list */
+	Int hash ;	/* hash value, if col is not in a degree list */
+	Int prev ;	/* previous column in degree list, if col is in a */
+			/* degree list (but not at the head of a degree list) */
+    } shared3 ;
+    union
+    {
+	Int degree_next ;	/* next column, if col is in a degree list */
+	Int hash_next ;		/* next column, if col is in a hash list */
+    } shared4 ;
+
+    /* ------------------ */
+    /* added for UMFPACK: */
+    Int nextcol ;	/* next column in this supercolumn */
+    Int lastcol ;	/* last column in this supercolumn */
+    /* ------------------ */
+
+} Colamd_Col ;
+
+typedef struct Colamd_Row_struct
+{
+    Int start ;		/* index for A of first col in this row */
+    Int length ;	/* number of principal columns in this row */
+    union
+    {
+	Int degree ;	/* number of principal & non-principal columns in row */
+	Int p ;		/* used as a row pointer in init_rows_cols () */
+    } shared1 ;
+    union
+    {
+	Int mark ;	/* for computing set differences and marking dead rows*/
+	Int first_column ;/* first column in row (used in garbage collection) */
+    } shared2 ;
+
+    /* ------------------ */
+    /* added for UMFPACK: */
+    Int thickness ;	/* number of original rows represented by this row */
+			/* that are not yet pivotal */
+    Int front ;		/* -1 if an original row */
+			/* k if this row represents the kth frontal matrix */
+			/* where k goes from 0 to at most n_col-1 */
+    /* ------------------ */
+
+} Colamd_Row ;
+
+
+
+/* ========================================================================== */
+/* === Colamd recommended memory size ======================================= */
+/* ========================================================================== */
+
+/*
+    The recommended length Alen of the array A passed to colamd is given by
+    the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any
+    argument is negative.  2*nnz space is required for the row and column
+    indices of the matrix. COLAMD_C (n_col) + COLAMD_R (n_row) space is
+    required for the Col and Row arrays, respectively, which are internal to
+    colamd.  An additional n_col space is the minimal amount of "elbow room",
+    and nnz/5 more space is recommended for run time efficiency.
+
+    This macro is not needed when using symamd.
+*/
+
+/* about 8*(n_col+1) integers: */
+#define UMF_COLAMD_C(n_col) ((n_col + 1) * sizeof (Colamd_Col) / sizeof (Int))
+
+/* about 6*(n_row+1) integers: */
+#define UMF_COLAMD_R(n_row) ((n_row + 1) * sizeof (Colamd_Row) / sizeof (Int))
+
+/* UMFPACK:  make sure Alen is >= 5*n_col + size of Col and Row structures.
+ * Alen is typically about 2.2*nz + 9*n_col + 6*n_row, or 2.2nz+15n for
+ * square matrices. */
+#define UMF_COLAMD_RECOMMENDED(nnz, n_row, n_col)	\
+(							\
+((nnz) < 0 || (n_row) < 0 || (n_col) < 0)		\
+?							\
+    (-1)						\
+:							\
+    (MAX (2 * (nnz), 4 * (n_col)) +			\
+    (Int) UMF_COLAMD_C (n_col) +			\
+    (Int) UMF_COLAMD_R (n_row) + (n_col) + ((nnz) / 5))	\
+)
+
+/* ========================================================================== */
+/* === Prototypes of user-callable routines ================================= */
+/* ========================================================================== */
+
+/* colamd_recommended removed for UMFPACK */
+
+void UMF_colamd_set_defaults	/* sets default parameters */
+(				/* knobs argument is modified on output */
+    double knobs [COLAMD_KNOBS]	/* parameter settings for colamd */
+) ;
+
+Int UMF_colamd			/* returns (1) if successful, (0) otherwise*/
+(				/* A and p arguments are modified on output */
+    Int n_row,			/* number of rows in A */
+    Int n_col,			/* number of columns in A */
+    Int Alen,			/* size of the array A */
+    Int A [],			/* row indices of A, of size Alen */
+    Int p [],			/* column pointers of A, of size n_col+1 */
+    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */
+    Int stats [COLAMD_STATS]	/* colamd output statistics and error codes */
+    /* ------------------ */
+    /* added for UMFPACK: */
+    , Int Front_npivcol [ ]
+    , Int Front_nrows [ ]
+    , Int Front_ncols [ ]
+    , Int Front_parent [ ]
+    , Int Front_cols [ ]
+    , Int *p_nfr
+    , Int InFront [ ]
+    /* ------------------ */
+) ;
+
+/* symamd deleted for UMFPACK */
+
+/* colamd_report deleted for UMFPACK */
+
+/* symamd_report deleted for UMFPACK */
+
+#endif /* COLAMD_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_config.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,919 @@
+/* ========================================================================== */
+/* === umf_config.h ========================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This file controls the compile-time configuration of UMFPACK.  Modify the
+    Makefile, the architecture-dependent Make.* file, and this file if
+    necessary, to control these options.  The following flags may be given
+    as options to your C compiler (as in "cc -DNBLAS", for example).  These
+    flags are normally placed in your CONFIG string, defined in your Make.*.
+
+    All of these options, except for the timer, are for accessing the BLAS.
+
+	-DNBLAS
+
+	    BLAS mode.  If -DNBLAS is set, then no BLAS will be used.  Vanilla
+	    C code will be used instead.  This is portable, and easier to
+	    install, but you won't get the best performance.
+
+	    If -DNBLAS is not set, then externally-available BLAS routines
+	    (dgemm, dger, and dgemv or the equivalent C-BLAS routines) will be
+	    used.  This will give you the best performance, but perhaps at the
+	    expense of portability.
+
+	    The default is to use the BLAS, for both the C-callable libumfpack.a
+	    library and the MATLAB mexFunction.  If you have trouble installing
+	    UMFPACK, set -DNBLAS (but then UMFPACK will be slow).
+
+	-DCBLAS
+
+	    If -DCBLAS is set, then the C-BLAS interface to the BLAS is
+	    used.  If your vendor-supplied BLAS library does not have a C-BLAS
+	    interface, you can obtain the ATLAS BLAS, available at
+	    http://www.netlib.org/atlas.
+
+	    This flag is ignored if -DNBLAS is set.
+
+	-DLP64
+
+	    This should be defined if you are compiling in the LP64 model
+	    (32 bit int's, 64 bit long's, and 64 bit pointers).  In Solaris,
+	    this is obtained with the flags -xtarget=ultra -xarch=v9 for
+	    the cc compiler (for example).
+
+	-DLONGBLAS
+
+	    If not defined, then the BLAS are not called in the long integer
+	    version of UMFPACK (the umfpack_*l_* routines).  The most common
+	    definitions of the BLAS, unfortunately, use int arguments, and
+	    are thus not suitable for use in the LP64 model.  Only the Sun
+	    Performance Library, as far as I can tell, has a version of the
+	    BLAS that allows long integer (64-bit) input arguments.  This
+	    flag is set automatically in Sun Solaris if you are using the
+	    Sun Performance BLAS.  You can set it yourself, too, if your BLAS
+	    routines can take long integer input arguments.
+
+	-DNSUNPERF
+
+	    Applies only to Sun Solaris.  If -DNSUNPERF is set, then the Sun
+	    Performance Library BLAS will not be used.
+
+	    The Sun Performance Library BLAS is used by default when compiling
+	    the C-callable libumfpack.a library on Sun Solaris.
+
+	    This flag is ignored if -DNBLAS is set.
+
+	-DNSCSL
+
+	    Applies only to SGI IRIX.  If -DSCSL is set, then the SGI SCSL
+	    Scientific Library BLAS will not be used.
+
+	    The SGI SCSL Scientific Library BLAS is used by default when
+	    compiling the C-callable libumfpack.a library on SGI IRIX.
+
+	    This flag is ignored if -DNBLAS is set.
+
+	-DNPOSIX
+
+	    If -DNPOSIX is set, then your Unix operating system is not POSIX-
+	    compliant, and the POSIX routines sysconf ( ) and times ( )
+	    routines are not used.  These routines provide CPU time and
+	    wallclock time information.  If -DNPOSIX is set, then the ANSI
+	    C clock ( ) routine is used.  If -DNPOSIX is not set, then
+	    sysconf ( ) and times ( ) are used in umfpack_tic and umfpack_toc.
+	    See umfpack_tictoc.c for more information.
+	    The default is to use the POSIX routines, except for Windows,
+	    which is not POSIX-compliant.
+
+	-DGETRUSAGE
+
+	    If -DGETRUSAGE is set, then your system's getrusage ( ) routine
+	    will be used for getting the process CPU time.  Otherwise the ANSI
+	    C clock ( ) routine will be used.  The default is to use getrusage
+	    ( ) on Unix systems, and to use clock on all other architectures.
+
+	-DNO_TIMER
+
+	    If -DNO_TIMER is set, then no timing routines are used at all.
+
+	-DNUTIL
+
+	    If -DNUTIL is set, then the internal MATLAB utMalloc, utFree, and
+	    utRealloc routines are not used in the UMFPACK mexFunction.  The
+	    regular mxMalloc, mxFree, and mxRealloc routines are used instead.
+	    These routines are not documented, but are available for use.  For
+	    Windows, -DNUTIL is defined below, because access to the ut*
+	    routines is not available by default.
+
+	-DNRECIPROCAL
+
+	    This option controls a tradeoff between speed and accuracy.  Using
+	    -DNRECIPROCAL can lead to more accurate results, but with perhaps
+	    some cost in performance, particularly if floating-point division
+	    is much more costly than floating-point multiplication.
+
+	    This option determines the method used to scale the pivot column.
+	    If set, or if the absolute value of the pivot is < 1e-12 (or is a
+	    NaN), then the pivot column is divided by the pivot value.
+	    Otherwise, the reciprocal of the pivot value is computed, and the
+	    pivot column is multiplied by (1/pivot).  Multiplying by the
+	    reciprocal can be slightly less accurate than dividing by the
+	    pivot, but it is often faster.  See umf_scale.c.
+
+	    This has a small effect on the performance of UMFPACK, at least on
+	    a Pentium 4M.  It may have a larger effect on other architectures
+	    where floating-point division is much more costly than floating-
+	    point multiplication.  The RS 6000 is one such example.
+
+	    By default, the method chosen is to multiply by the reciprocal
+	    (sacrificing accuracy for speed), except when compiling UMFPACK
+	    as a built-in routine in MATLAB, or when gcc is being used.
+
+	    When MATHWORKS is defined, -DNRECIPROCAL is forced on, and the pivot
+	    column is divided by the pivot value.  The only way of using the
+	    other method in this case is to edit this file.
+
+	    If -DNRECIPROCAL is enabled, then the row scaling factors are always
+	    applied by dividing each row by the scale factor, rather than
+	    multiplying by the reciprocal.  If -DNRECIPROCAL is not enabled
+	    (the default case), then the scale factors are normally applied by
+	    multiplying by the reciprocal.  If, however, the smallest scale
+	    factor is tiny, then the scale factors are applied via division.
+
+	-DNO_DIVIDE_BY_ZERO
+
+	    If the pivot is zero, and this flag is set, then no divide-by-zero
+	    occurs.
+
+    You should normally not set these flags yourself:
+
+	-DBLAS_BY_VALUE		if scalars are passed by value, not reference
+	-DBLAS_NO_UNDERSCORE	if no underscore should be appended
+	-DBLAS_CHAR_ARG		if BLAS options are single char's, not strings
+
+	    The BLAS options are normally set automatically.  If your
+	    architecture cannot be determined (see UMFPACK_ARCHITECTURE, below)
+	    then you may need to set these flags yourself.
+
+    The following options are controlled by amd_internal.h:
+
+	-DMATLAB_MEX_FILE
+
+	    This flag is turned on when compiling the umfpack mexFunction for
+	    use in MATLAB.  When compiling the MATLAB mexFunction, the MATLAB
+	    BLAS are used (unless -DNBLAS is set).  The -DCBLAS, -DNSCSL, and
+	    -DNSUNPERF flags are all ignored.   The -DNRECIPROCAL flag is
+	    forced on.  Otherwise, [L,U,P,Q,R] = umfpack (A) would return
+	    either L*U = P*(R\A)*Q or L*U = P*R*A*Q.  Rather than returning a
+	    flag stating how the scale factors R are to be applied, the umfpack
+	    mexFunction always takes the more accurate route and returns
+	    L*U = P*(R\A)*Q.
+
+	-DMATHWORKS
+
+	    This flag is turned on when compiling umfpack as a built-in routine
+	    in MATLAB.  The MATLAB BLAS are used for all architectures (-DNBLAS,
+	    -DCBLAS, -DNSCSL, and -DNSUNPERF flags are all ignored).  Internal
+	    routines utMalloc, utFree, utRealloc, utPrintf, utDivideComplex,
+	    and utFdlibm_hypot are used, and the "util.h" file is included.
+	    This avoids the problem discussed in the User Guide regarding memory
+	    allocation in MATLAB.  utMalloc returns NULL on failure, instead of
+	    terminating the mexFunction (which is what mxMalloc does).  However,
+	    the ut* routines are not documented by The MathWorks, Inc., so I
+	    cannot guarantee that you will always be able to use them.
+	    The -DNRECIPROCAL flag is turned on.
+
+	-DNDEBUG
+
+	    Debugging mode (if NDEBUG is not defined).  The default, of course,
+	    is no debugging.  Turning on debugging takes some work (see below).
+	    If you do not edit this file, then debugging is turned off anyway,
+	    regardless of whether or not -DNDEBUG is specified in your compiler
+	    options.
+*/
+
+/* ========================================================================== */
+/* === AMD configuration ==================================================== */
+/* ========================================================================== */
+
+/* NDEBUG, PRINTF defined in amd_internal.h */
+
+/* ========================================================================== */
+/* === reciprocal option ==================================================== */
+/* ========================================================================== */
+
+/* Force the definition NRECIPROCAL when MATHWORKS or MATLAB_MEX_FILE
+ * are defined.  Do not multiply by the reciprocal in those cases. */
+
+#ifndef NRECIPROCAL
+#if defined (MATHWORKS) || defined (MATLAB_MEX_FILE)
+#define NRECIPROCAL
+#endif
+#endif
+
+/* ========================================================================== */
+/* === Microsoft Windows configuration ====================================== */
+/* ========================================================================== */
+
+#ifdef UMF_WINDOWS
+/* Windows can't access the ut* routines, and it isn't Unix. */
+#define NUTIL
+#define NPOSIX
+#endif
+
+/* ========================================================================== */
+/* === 0-based or 1-based printing ========================================== */
+/* ========================================================================== */
+
+#if defined (MATLAB_MEX_FILE) && defined (NDEBUG)
+/* In MATLAB, matrices are 1-based to the user, but 0-based internally. */
+/* One is added to all row and column indices when printing matrices */
+/* for the MATLAB user.  The +1 shift is turned off when debugging. */
+#define INDEX(i) ((i)+1)
+#else
+/* In ANSI C, matrices are 0-based and indices are reported as such. */
+/* This mode is also used for debug mode, and if MATHWORKS is defined rather */
+/* than MATLAB_MEX_FILE. */
+#define INDEX(i) (i)
+#endif
+
+/* ========================================================================== */
+/* === Timer ================================================================ */
+/* ========================================================================== */
+
+/*
+    If you have the getrusage routine (all Unix systems I've test do), then use
+    that.  Otherwise, use the ANSI C clock function.   Note that on many
+    systems, the ANSI clock function wraps around after only 2147 seconds, or
+    about 36 minutes.  BE CAREFUL:  if you compare the run time of UMFPACK with
+    other sparse matrix packages, be sure to use the same timer.  See
+    umfpack_tictoc.c for the timer used internally by UMFPACK.  See also
+    umfpack_timer.c for the timer used in an earlier version of UMFPACK.
+    That timer is still available as a user-callable routine, but it is no
+    longer used internally by UMFPACK.
+*/
+
+/* Sun Solaris, SGI Irix, Linux, Compaq Alpha, and IBM RS 6000 all have */
+/* getrusage.  It's in BSD unix, so perhaps all unix systems have it. */
+#if defined (UMF_SOL2) || defined (UMF_SGI) || defined (UMF_LINUX) \
+|| defined (UMF_ALPHA) || defined (UMF_AIX)
+#define GETRUSAGE
+#endif
+
+
+/* ========================================================================== */
+/* === BLAS ================================================================= */
+/* ========================================================================== */
+
+/*
+    The adventure begins.  Figure out how to call the BLAS ...
+
+    This works, but it is incredibly ugly.  The C-BLAS was supposed to solve
+    this problem, and make it easier to interface a C program to the BLAS.
+    Unfortunately, the C-BLAS does not have a "long" integer (64 bit) version.
+    Various vendors have done their own 64-bit BLAS.  Sun has dgemm_64 routines
+    with "long" integers, SGI has a 64-bit dgemm in their scsl_blas_i8 library
+    with "long long" integers, and so on.
+
+    Different vendors also have different ways of defining a complex number,
+    some using struct's.  That's a bad idea.  See umf_version.h for the better
+    way to do it (the method that was also chosen for the complex C-BLAS,
+    which is compatible and guaranteed to be portable with ANSI C).
+
+    To make matters worse, SGI's SCSL BLAS has a C-BLAS interface which
+    differs from the ATLAS C-BLAS interface (see immediately below);
+    although a more recent version of SGI's C-BLAS interface is correct
+    if SCSL_VOID_ARGS is defined.
+*/
+
+
+/* -------------------------------------------------------------------------- */
+/* Determine which BLAS to use. */
+/* -------------------------------------------------------------------------- */
+
+#if defined (MATHWORKS)
+#define USE_MATLAB_BLAS
+
+#elif defined (NBLAS)
+#define USE_NO_BLAS
+
+#elif defined (MATLAB_MEX_FILE)
+#define USE_MATLAB_BLAS
+
+#elif defined (CBLAS)
+#define USE_C_BLAS
+
+#elif defined (UMF_SOL2) && !defined (NSUNPERF)
+#define USE_SUNPERF_BLAS
+
+#elif defined (UMF_SGI) && !defined (NSCSL)
+#define USE_SCSL_BLAS
+
+#else
+#define USE_FORTRAN_BLAS
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* int vs. long integer arguments */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Determine if the BLAS exists for the long integer version.  It exists if
+    LONGBLAS is defined in the Makefile, or if using the BLAS from the
+    Sun Performance Library, or SGI's SCSL Scientific Library.
+*/
+
+#if defined (USE_SUNPERF_BLAS) || defined (USE_SCSL_BLAS)
+#ifndef LONGBLAS
+#define LONGBLAS
+#endif
+#endif
+
+/* do not use the BLAS if Int's are long and LONGBLAS is not defined */
+#if defined (LONG_INTEGER) && !defined (LONGBLAS) && !defined (USE_NO_BLAS)
+#define USE_NO_BLAS
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* Use (void *) arguments for the SGI */
+/* -------------------------------------------------------------------------- */
+
+#if defined (UMF_SGI)
+/*
+    Use (void *) pointers for complex types in SCSL.
+    The ATLAS C-BLAS, and the SGI C-BLAS differ.  The former uses (void *)
+    arguments, the latter uses SCSL_ZOMPLEX_T, which are either scsl_zomplex
+    or (void *).  Using (void *) is simpler, and is selected by defining
+    SCSL_VOID_ARGS, below.  The cc compiler doesn't complain, but gcc is
+    more picky, and generates a warning without this next statement.
+    With gcc and the 07/09/98 version of SGI's cblas.h, spurious warnings
+    about complex BLAS arguments will be reported anyway.  This is because this
+    older version of SGI's cblas.h does not make use of the SCSL_VOID_ARGS
+    parameter, which is present in the 12/6/01 version of SGI's cblas.h.  You
+    can safely ignore these warnings.
+*/
+#define SCSL_VOID_ARGS
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* The BLAS exists, construct appropriate macros */
+/* -------------------------------------------------------------------------- */
+
+#if !defined (USE_NO_BLAS)		/* { */
+
+/*
+    If the compile-time flag -DNBLAS is defined, then the BLAS are not used,
+    portable vanilla C code is used instead, and the remainder of this file
+    is ignored.
+
+    Using the BLAS is much faster, but how C calls the Fortran BLAS is
+    machine-dependent and thus can cause portability problems.  Thus, use
+    -DNBLAS to ensure portability (at the expense of speed).
+
+    Preferences:
+
+	*** The best interface to use, regardless of the option you select
+	    below, is the standard C-BLAS interface.  Not all BLAS libraries
+	    use this interface.  The only problem with this interface is that
+	    it does not extend to the LP64 model.  The C-BLAS does not provide
+	    for a 64-bit integer.  In addition, SGI's older cblas.h can cause
+	    spurious warnings when using the C-BLAS interface.
+
+	1) often the most preferred (but see option (3)):  use the
+	    optimized vendor-supplied library (such as the Sun Performance
+	    Library, or IBM's ESSL).  This is often the fastest, but might not
+	    be portable and might not always be available.  When compiling a
+	    MATLAB mexFunction it might be difficult get the mex compiler
+	    script to recognize the vendor- supplied BLAS.  Note that the
+	    freely-available BLAS (option 3) can be faster than the vendor-
+	    specific BLAS.  You are encourage to try both option (1) and (3).
+
+	2) When compiling the UMFPACK mexFunction to use UMFPACK in MATLAB, use
+	    the BLAS provided by The Mathworks, Inc.  This assumes you are using
+	    MATLAB V6 or higher, since the BLAS are not incorporated in V5 or
+	    earlier versions.  On my Sun workstation, the MATLAB BLAS gave
+	    slightly worse performance than the Sun Perf. BLAS.  The advantage
+	    of using the MATLAB BLAS is that it's available on any computer that
+	    has MATLAB V6 or higher.  I have not tried using MATLAB BLAS outside
+	    of a mexFunction in a stand-alone C code, but MATLAB (V6) allows for
+	    this.  This is well worth trying if you have MATLAB and don't want
+	    to bother installing the ATLAS BLAS (option 3a, below).  The only
+	    glitch to this is that MATLAB does not provide a portable interface
+	    to the BLAS (an underscore is required for some but not all
+	    architectures).  For Windows and MATLAB 6.0 or 6.1, you also need
+	    to copy the libmwlapack.dll file into your MATLAB installation
+	    directory; see the User Guide for details.
+
+	    In the current distribution, the only BLAS that the UMFPACK
+	    mexFunction will use is the internal MATLAB BLAS.  It's possible to
+	    use other BLAS, but handling the porting of using the mex compiler
+	    with different BLAS libraries is not trivial.
+
+	    As of MATLAB 6.5, the BLAS used internally in MATLAB is the ATLAS
+	    BLAS.
+
+	3) Use a freely-available high-performance BLAS library:
+
+	    (a) The BLAS by Kazashige Goto and Robert van de Geijn, at
+		http://www.cs.utexas.edu/users/flame/goto.  This BLAS increased
+		the performance of UMFPACK by almost 50% as compared to the
+		ATLAS BLAS (v3.2).
+
+	    (b) The ATLAS BLAS, available at http://www.netlib.org/atlas,
+		by R. Clint Whaley, Antoine Petitet, and Jack Dongarra.
+		This has a standard C interface, and thus the interface to it is
+		fully portable.  Its performance rivals, and sometimes exceeds,
+		the vendor-supplied BLAS on many computers.
+
+	    (b) The Fortran RISC BLAS by Michel Dayde', Iain Duff, Antoine
+		Petitet, and Abderrahim Qrichi Aniba, available via anonymous
+		ftp to ftp.enseeiht.fr in the pub/numerique/BLAS/RISC directory,
+		See M. J. Dayde' and I. S. Duff, "The RISC BLAS:  A blocked
+		implementation of level 3 BLAS for RISC processors, ACM Trans.
+		Math. Software, vol. 25, no. 3., Sept. 1999.  This will give
+		you good performance, but with the same C-to-Fortran portability
+		problems as option (1).
+
+	4) Use UMFPACK's built-in vanilla C code by setting -DNBLAS at compile
+	    time.  The key advantage is portability, which is guaranteed if you
+	    have an ANSI C compliant compiler.  You also don't need to download
+	    any other package - UMFPACK is stand-alone.  No Fortran is used
+	    anywhere in UMFPACK.  UMFPACK will be much slower than when using
+	    options (1) through (3), however.
+
+	5) least preferred:  use the standard Fortran implementation of the
+	    BLAS, also available at Netlib (http://www.netlib.org/blas).  This
+	    will be no faster than option (4), and not portable because of
+	    C-to-Fortran calling conventions.  Don't bother trying option (5).
+
+    The mechanics of how C calls the BLAS on various computers are as follows:
+
+	* C-BLAS (from the ATLAS library, for example):
+	    The same interface is used on all computers.
+
+	* Defaults for calling the Fortran BLAS:
+	    add underscore, pass scalars by reference, use string arguments.
+
+	* The Fortran BLAS on Sun Solaris (when compiling the MATLAB mexFunction
+	    or when using the Fortran RISC BLAS), SGI IRIX, Linux, and Compaq
+	    Alpha: use defaults.
+
+	* Sun Solaris (when using the C-callable Sun Performance library):
+	    no underscore, pass scalars by value, use character arguments.
+
+	* The Fortran BLAS (ESSL Library) on the IBM RS 6000, and HP Unix:
+	    no underscore, pass scalars by reference, use string arguments.
+
+	* The Fortran BLAS on Windows:
+	    no underscore, pass scalars by reference, use string arguments.
+	    If you compile the umfpack mexFunction using umfpack_make, and are
+	    using the lcc compiler bundled with MATLAB, then you must first
+	    copy the umfpack\lcc_lib\libmwlapack.lib file into the
+	    <matlab>\extern\lib\win32\lcc\ directory, where <matlab> is the
+	    directory in which MATLAB is installed.  Next, type mex -setup
+	    at the MATLAB prompt, and ask MATLAB to select the lcc compiler.
+	    MATLAB has built-in BLAS, but it cannot be accessed by a program
+	    compiled by lcc without first copying this file.
+*/
+
+
+
+/* -------------------------------------------------------------------------- */
+#ifdef USE_C_BLAS	/* { */
+/* -------------------------------------------------------------------------- */
+
+
+/* -------------------------------------------------------------------------- */
+/* use the C-BLAS (any computer) */
+/* -------------------------------------------------------------------------- */
+
+/*
+    C-BLAS is the default interface, with the following exceptions.  Solaris
+    uses the Sun Performance BLAS for libumfpack.a (the C-callable library).
+    SGI IRIX uses the SCSL BLAS for libumfpack.a.  All architectures use
+    MATLAB's internal BLAS for the mexFunction on any architecture.  These
+    options are set in the Make.* files.  The Make.generic file uses no BLAS
+    at all.
+
+    If you use the ATLAS C-BLAS, then be sure to set the -I flag to
+    -I/path/ATLAS/include, where /path/ATLAS is the ATLAS installation
+    directory.  See Make.solaris for an example.  You do not need to do this
+    for the SGI, which has a /usr/include/cblas.h.
+*/
+
+#include "cblas.h"
+
+#ifdef COMPLEX
+#define BLAS_GEMM_ROUTINE cblas_zgemm
+#define BLAS_TRSM_ROUTINE cblas_ztrsm
+#define BLAS_TRSV_ROUTINE cblas_ztrsv
+#define BLAS_GEMV_ROUTINE cblas_zgemv
+#define BLAS_GER_ROUTINE  cblas_zgeru
+#define BLAS_SCAL_ROUTINE cblas_zscal
+#define BLAS_COPY_ROUTINE cblas_zcopy
+#define BLAS_DECLARE_SCALAR(x) double x [2]
+#define BLAS_ASSIGN(x,xr,xi) { x [0] = xr ; x [1] = xi ; }
+#else
+#define BLAS_GEMM_ROUTINE cblas_dgemm
+#define BLAS_TRSM_ROUTINE cblas_dtrsm
+#define BLAS_TRSV_ROUTINE cblas_dtrsv
+#define BLAS_GEMV_ROUTINE cblas_dgemv
+#define BLAS_GER_ROUTINE  cblas_dger
+#define BLAS_SCAL_ROUTINE cblas_dscal
+#define BLAS_COPY_ROUTINE cblas_dcopy
+#define BLAS_DECLARE_SCALAR(x) double x
+#define BLAS_ASSIGN(x,xr,xi) { x = xr ; }
+#endif
+
+#define BLAS_LOWER CblasLower
+#define BLAS_UNIT_DIAGONAL CblasUnit
+#define BLAS_RIGHT CblasRight
+#define BLAS_NO_TRANSPOSE CblasNoTrans
+#define BLAS_TRANSPOSE CblasTrans
+#define BLAS_COLUMN_MAJOR_ORDER CblasColMajor,
+#define BLAS_SCALAR(x) x
+#define BLAS_INT_SCALAR(n) n
+#define BLAS_ARRAY(a) a
+
+
+
+/* -------------------------------------------------------------------------- */
+#else	/* } USE_C_BLAS { */
+/* -------------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------------- */
+/* use Fortran (or other architecture-specific) BLAS */
+/* -------------------------------------------------------------------------- */
+
+/* No such argument when not using the C-BLAS */
+#define BLAS_COLUMN_MAJOR_ORDER
+
+/* Determine which architecture we're on and set options accordingly. */
+/* The default, if nothing is defined is to add an underscore, */
+/* pass scalars by reference, and use string arguments. */
+
+/* ---------------------------------- */
+/* Sun Performance BLAS */
+/* ---------------------------------- */
+
+#ifdef USE_SUNPERF_BLAS
+#ifdef _SUNPERF_H
+/* <sunperf.h> has been included somehow anyway, outside of umf_config.h */
+#error "sunperf.h must NOT be #include'd.  See umf_config.h for details."
+#endif
+#define BLAS_BY_VALUE
+#define BLAS_NO_UNDERSCORE
+#define BLAS_CHAR_ARG
+#endif	/* USE_SUNPERF_BLAS */
+
+/* ---------------------------------- */
+/* SGI SCSL BLAS */
+/* ---------------------------------- */
+
+#ifdef USE_SCSL_BLAS
+#if defined (LP64)
+#include <scsl_blas_i8.h>
+#else
+#include <scsl_blas.h>
+#endif
+#define BLAS_BY_VALUE
+#define BLAS_NO_UNDERSCORE
+#endif	/* USE_SCSL_BLAS */
+
+/* ---------------------------------- */
+/* IBM AIX, Windows, and HP Fortran BLAS */
+/* ---------------------------------- */
+
+#if defined (UMF_AIX) || defined (UMF_WINDOWS) || defined (UMF_HP)
+#define BLAS_NO_UNDERSCORE
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS names */
+/* -------------------------------------------------------------------------- */
+
+#if defined (LP64) && defined (USE_SUNPERF_BLAS) && defined (LONG_INTEGER)
+
+/* 64-bit sunperf BLAS, for Sun Solaris only */
+#ifdef COMPLEX
+#define BLAS_GEMM_ROUTINE zgemm_64
+#define BLAS_TRSM_ROUTINE ztrsm_64
+#define BLAS_TRSV_ROUTINE ztrsv_64
+#define BLAS_GEMV_ROUTINE zgemv_64
+#define BLAS_GER_ROUTINE  zgeru_64
+#define BLAS_SCAL_ROUTINE zscal_64
+#define BLAS_COPY_ROUTINE zcopy_64
+#else
+#define BLAS_GEMM_ROUTINE dgemm_64
+#define BLAS_TRSM_ROUTINE dtrsm_64
+#define BLAS_TRSV_ROUTINE dtrsv_64
+#define BLAS_GEMV_ROUTINE dgemv_64
+#define BLAS_GER_ROUTINE  dger_64
+#define BLAS_SCAL_ROUTINE dscal_64
+#define BLAS_COPY_ROUTINE dcopy_64
+#endif	/* COMPLEX */
+
+#else
+
+#ifdef COMPLEX
+
+/* naming convention (use underscore, or not) */
+#ifdef BLAS_NO_UNDERSCORE
+#define BLAS_GEMM_ROUTINE zgemm
+#define BLAS_TRSM_ROUTINE ztrsm
+#define BLAS_TRSV_ROUTINE ztrsv
+#define BLAS_GEMV_ROUTINE zgemv
+#define BLAS_GER_ROUTINE  zgeru
+#define BLAS_SCAL_ROUTINE zscal
+#define BLAS_COPY_ROUTINE zcopy
+#else
+/* default:  add underscore */
+#define BLAS_GEMM_ROUTINE zgemm_
+#define BLAS_TRSM_ROUTINE ztrsm_
+#define BLAS_TRSV_ROUTINE ztrsv_
+#define BLAS_GEMV_ROUTINE zgemv_
+#define BLAS_GER_ROUTINE  zgeru_
+#define BLAS_SCAL_ROUTINE zscal_
+#define BLAS_COPY_ROUTINE zcopy_
+#endif
+
+#else
+
+/* naming convention (use underscore, or not) */
+#ifdef BLAS_NO_UNDERSCORE
+#define BLAS_GEMM_ROUTINE dgemm
+#define BLAS_TRSM_ROUTINE dtrsm
+#define BLAS_TRSV_ROUTINE dtrsv
+#define BLAS_GEMV_ROUTINE dgemv
+#define BLAS_GER_ROUTINE  dger
+#define BLAS_SCAL_ROUTINE dscal
+#define BLAS_COPY_ROUTINE dcopy
+#else
+/* default:  add underscore */
+#define BLAS_GEMM_ROUTINE dgemm_
+#define BLAS_TRSM_ROUTINE dtrsm_
+#define BLAS_TRSV_ROUTINE dtrsv_
+#define BLAS_GEMV_ROUTINE dgemv_
+#define BLAS_GER_ROUTINE  dger_
+#define BLAS_SCAL_ROUTINE dscal_
+#define BLAS_COPY_ROUTINE dcopy_
+#endif
+
+#endif	/* COMPLEX */
+
+#endif /* LP64 && USE_SUNPERF_BLAS */
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS real or complex floating-point scalars */
+/* -------------------------------------------------------------------------- */
+
+#ifdef COMPLEX
+
+/*
+    The SunPerf BLAS expects to see a doublecomplex scalar, but it
+    also will accept an array of size 2.  See the manual, normally at
+    file:///opt/SUNWspro/WS6U1/lib/locale/C/html/manuals/perflib/user_guide
+    /plug_using_perflib.html .  This manual is inconsistent with the man pages
+    for zgemm, zgemv, and zgeru and also inconsistent with the <sunperf.h>
+    include file.  Use this instead, for SunPerf (only works if you do NOT
+    include sunperf.h).  Fortunately, this file (umf_config.h) is not included
+    in any user code that calls UMFPACK.  Thus, the caller may include
+    sunperf.h in his or her own code, and that is safely ignored here.
+    SGI's SCSL BLAS has yet a different kind of struct, but we can use a
+    double array of size 2 instead (since SCSL_VOID_ARGS is defined).
+    Most BLAS expect complex scalars as pointers to double arrays of size 2.
+*/
+
+#define BLAS_DECLARE_SCALAR(x) double x [2]
+#define BLAS_ASSIGN(x,xr,xi) { x [0] = xr ; x [1] = xi ; }
+#define BLAS_SCALAR(x) x
+
+#else
+
+#define BLAS_DECLARE_SCALAR(x) double x
+#define BLAS_ASSIGN(x,xr,xi) { x = xr ; }
+#ifdef BLAS_BY_VALUE
+#define BLAS_SCALAR(x) x
+#else
+#define BLAS_SCALAR(x) &(x)
+#endif
+
+#endif /* COMPLEX */
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS integer scalars */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Fortran requires integers to be passed by reference.
+    The SCSL BLAS requires long long arguments in LP64 mode.
+*/
+
+#if defined (USE_SCSL_BLAS) && defined (LP64)
+#define BLAS_INT_SCALAR(n) ((long long) n)
+#else
+#ifdef BLAS_BY_VALUE
+#define BLAS_INT_SCALAR(n) n
+#else
+#define BLAS_INT_SCALAR(n) &(n)
+#endif
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS strings */
+/* -------------------------------------------------------------------------- */
+
+/*
+    The Sun Performance BLAS wants a character instead of a string.
+*/
+
+#ifdef BLAS_CHAR_ARG
+#define BLAS_NO_TRANSPOSE 'N'
+#define BLAS_TRANSPOSE 'T'
+#define BLAS_LEFT 'L'
+#define BLAS_RIGHT 'R'
+#define BLAS_LOWER 'L'
+#define BLAS_UNIT_DIAGONAL 'U'
+#else
+#define BLAS_NO_TRANSPOSE "N"
+#define BLAS_TRANSPOSE "T"
+#define BLAS_LEFT "L"
+#define BLAS_RIGHT "R"
+#define BLAS_LOWER "L"
+#define BLAS_UNIT_DIAGONAL "U"
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS arrays */
+/* -------------------------------------------------------------------------- */
+
+/*
+    The complex SunPerf BLAS expects to see a doublecomplex array of size s.
+    This is broken (see above, regarding complex scalars in sunperf.h).
+    For SunPerf BLAS, just pass a pointer to the array, and ignore sunperf.h.
+    With sunperf.h, you would need:
+
+	#define BLAS_ARRAY(a) ((doublecomplex *)(a))
+
+    SGI's SCSL BLAS has yet a different kind of struct, but we can use a
+    double array of size 2 instead (since SCSL_VOID_ARGS is defined).
+
+    The real versions all use just a (double *) pointer.
+
+    In all cases, no typecast is required.  This will break if <sunperf.h> is
+    included.
+
+    If you have read this far, I hope you see now why (void *) a much better
+    choice for complex BLAS prototypes, and why double x [2] is better than
+    an architecture dependent struct { double real ; double imag ; }
+    type definition.
+
+*/
+
+#define BLAS_ARRAY(a) (a)
+
+
+/* -------------------------------------------------------------------------- */
+#endif /* USE_C_BLAS } */
+/* -------------------------------------------------------------------------- */
+
+
+
+
+
+/* -------------------------------------------------------------------------- */
+/* BLAS macros, for all interfaces */
+/* -------------------------------------------------------------------------- */
+
+/*
+   All architecture dependent issues have now been taken into consideration,
+   and folded into the macros BLAS_DECLARE_SCALAR, BLAS_ASSIGN, BLAS_*_ROUTINE,
+   BLAS_COLUMN_MAJOR_ORDER, BLAS_NO_TRANSPOSE, BLAS_TRANSPOSE, BLAS_SCALAR,
+   BLAS_INT_SCALAR, BLAS_ARRAY, and Int.
+
+   You will note that there is not a *** single *** name, declaration, or
+   argument to the BLAS which is not somehow different in one or more versions
+   of the BLAS!
+*/
+
+
+/* C = C - A*B', where:
+ * A is m-by-k with leading dimension ldac
+ * B is k-by-n with leading dimension ldb
+ * C is m-by-n with leading dimension ldac */
+#define BLAS_GEMM(m,n,k,A,B,ldb,C,ldac) \
+{ \
+    BLAS_DECLARE_SCALAR (alpha) ; \
+    BLAS_DECLARE_SCALAR (beta) ; \
+    BLAS_ASSIGN (alpha, -1.0, 0.0) ; \
+    BLAS_ASSIGN (beta, 1.0, 0.0) ; \
+    (void) BLAS_GEMM_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \
+	BLAS_NO_TRANSPOSE, BLAS_TRANSPOSE, \
+	BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), BLAS_INT_SCALAR (k), \
+	BLAS_SCALAR (alpha), \
+	BLAS_ARRAY (A), BLAS_INT_SCALAR (ldac), \
+	BLAS_ARRAY (B), BLAS_INT_SCALAR (ldb), BLAS_SCALAR (beta), \
+	BLAS_ARRAY (C), BLAS_INT_SCALAR (ldac)) ; \
+}
+
+/* A = A - x*y', where:
+ * A is m-by-n with leading dimension d
+   x is a column vector with stride 1
+   y is a column vector with stride 1 */
+#define BLAS_GER(m,n,x,y,A,d) \
+{ \
+    Int one = 1 ; \
+    BLAS_DECLARE_SCALAR (alpha) ; \
+    BLAS_ASSIGN (alpha, -1.0, 0.0) ; \
+    (void) BLAS_GER_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \
+	BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \
+	BLAS_SCALAR (alpha), \
+	BLAS_ARRAY (x), BLAS_INT_SCALAR (one), \
+	BLAS_ARRAY (y), BLAS_INT_SCALAR (one), \
+	BLAS_ARRAY (A), BLAS_INT_SCALAR (d)) ; \
+}
+
+/* y = y - A*x, where A is m-by-n with leading dimension d,
+   x is a column vector with stride 1
+   y is a column vector with stride 1 */
+#define BLAS_GEMV(m,n,A,x,y,d) \
+{ \
+    Int one = 1 ; \
+    BLAS_DECLARE_SCALAR (alpha) ; \
+    BLAS_DECLARE_SCALAR (beta) ; \
+    BLAS_ASSIGN (alpha, -1.0, 0.0) ; \
+    BLAS_ASSIGN (beta, 1.0, 0.0) ; \
+    (void) BLAS_GEMV_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \
+	BLAS_NO_TRANSPOSE, \
+	BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \
+	BLAS_SCALAR (alpha), \
+	BLAS_ARRAY (A), BLAS_INT_SCALAR (d), \
+	BLAS_ARRAY (x), BLAS_INT_SCALAR (one), BLAS_SCALAR (beta), \
+	BLAS_ARRAY (y), BLAS_INT_SCALAR (one)) ; \
+}
+
+
+/* solve Lx=b, where:
+ * B is a column vector (m-by-1) with leading dimension d
+ * A is m-by-m with leading dimension d */
+#define BLAS_TRSV(m,A,b,d) \
+{ \
+    Int one = 1 ; \
+    (void) BLAS_TRSV_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \
+	BLAS_LOWER, BLAS_NO_TRANSPOSE, BLAS_UNIT_DIAGONAL, \
+	BLAS_INT_SCALAR (m), \
+	BLAS_ARRAY (A), BLAS_INT_SCALAR (d), \
+	BLAS_ARRAY (b), BLAS_INT_SCALAR (one)) ; \
+}
+
+/* solve XL'=B where:
+ * B is m-by-n with leading dimension ldb
+ * A is n-by-n with leading dimension lda */
+#define BLAS_TRSM_RIGHT(m,n,A,lda,B,ldb) \
+{ \
+    BLAS_DECLARE_SCALAR (alpha) ; \
+    BLAS_ASSIGN (alpha, 1.0, 0.0) ; \
+    (void) BLAS_TRSM_ROUTINE (BLAS_COLUMN_MAJOR_ORDER \
+	BLAS_RIGHT, BLAS_LOWER, BLAS_TRANSPOSE, BLAS_UNIT_DIAGONAL, \
+	BLAS_INT_SCALAR (m), BLAS_INT_SCALAR (n), \
+	BLAS_SCALAR (alpha), \
+	BLAS_ARRAY (A), BLAS_INT_SCALAR (lda), \
+	BLAS_ARRAY (B), BLAS_INT_SCALAR (ldb)) ; \
+}
+
+/* x = s*x, where x is a stride-1 vector of length n */
+#define BLAS_SCAL(n,s,x) \
+{ \
+    Int one = 1 ; \
+    BLAS_DECLARE_SCALAR (alpha) ; \
+    BLAS_ASSIGN (alpha, REAL_COMPONENT (s), IMAG_COMPONENT (s)) ; \
+    (void) BLAS_SCAL_ROUTINE ( \
+	BLAS_INT_SCALAR (n), BLAS_SCALAR (alpha), \
+	BLAS_ARRAY (x), BLAS_INT_SCALAR (one)) ; \
+}
+
+/* x = y, where x and y are a stride-1 vectors of length n */
+#define BLAS_COPY(n,x,y) \
+{ \
+    Int one = 1 ; \
+    (void) BLAS_COPY_ROUTINE ( \
+	BLAS_INT_SCALAR (n), \
+	BLAS_ARRAY (x), BLAS_INT_SCALAR (one), \
+	BLAS_ARRAY (y), BLAS_INT_SCALAR (one)) ; \
+}
+
+#endif	/* !defined (USE_NO_BLAS) } */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_create_element.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,604 @@
+/* ========================================================================== */
+/* === UMF_create_element =================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Factorization of a frontal matrix is complete.  Create a new element for
+    later assembly into a subsequent frontal matrix.  Returns TRUE if
+    successful, FALSE if out of memory.
+*/
+
+#include "umf_internal.h"
+#include "umf_mem_alloc_element.h"
+#include "umf_mem_alloc_tail_block.h"
+#include "umf_mem_free_tail_block.h"
+#include "umf_get_memory.h"
+
+/* ========================================================================== */
+/* === copy_column ========================================================== */
+/* ========================================================================== */
+
+PRIVATE void copy_column (Int len, Entry *X, Entry *Y)
+{
+    Int i ;
+#pragma ivdep
+    for (i = 0 ; i < len ; i++)
+    {
+	Y [i] = X [i] ;
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_create_element =================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMF_create_element
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int j, col, row, *Fcols, *Frows, fnrows, fncols, *Cols, len, needunits, t1,
+	t2, size, e, i, *E, *Fcpos, *Frpos, *Rows, eloc, fnr_curr, f,
+	got_memory, *Row_tuples, *Row_degree, *Row_tlen, *Col_tuples, max_mark,
+	*Col_degree, *Col_tlen, nn, n_row, n_col, r2, c2, do_Fcpos ;
+    Entry *C, *Fcol ;
+    Element *ep ;
+    Unit *p, *Memory ;
+    Tuple *tp, *tp1, *tp2, tuple, *tpend ;
+#ifndef NDEBUG
+    DEBUG2 (("FRONTAL WRAPUP\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (Work->fnpiv == 0) ;
+    ASSERT (Work->fnzeros == 0) ;
+    Row_degree = Numeric->Rperm ;
+    Row_tuples = Numeric->Uip ;
+    Row_tlen   = Numeric->Uilen ;
+    Col_degree = Numeric->Cperm ;
+    Col_tuples = Numeric->Lip ;
+    Col_tlen   = Numeric->Lilen ;
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    nn = MAX (n_row, n_col) ;
+    Fcols = Work->Fcols ;
+    Frows = Work->Frows ;
+    Fcpos = Work->Fcpos ;
+    Frpos = Work->Frpos ;
+    Memory = Numeric->Memory ;
+    fncols = Work->fncols ;
+    fnrows = Work->fnrows ;
+
+    tp = (Tuple *) NULL ;
+    tp1 = (Tuple *) NULL ;
+    tp2 = (Tuple *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* add the current frontal matrix to the degrees of each column */
+    /* ---------------------------------------------------------------------- */
+
+    if (!Symbolic->fixQ)
+    {
+	/* but only if the column ordering is not fixed */
+#pragma ivdep
+	for (j = 0 ; j < fncols ; j++)
+	{
+	    /* add the current frontal matrix to the degree */
+	    ASSERT (Fcols [j] >= 0 && Fcols [j] < n_col) ;
+	    Col_degree [Fcols [j]] += fnrows ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* add the current frontal matrix to the degrees of each row */
+    /* ---------------------------------------------------------------------- */
+
+#pragma ivdep
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	/* add the current frontal matrix to the degree */
+	ASSERT (Frows [i] >= 0 && Frows [i] < n_row) ;
+	Row_degree [Frows [i]] += fncols ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* Reset the external degree counters */
+    /* ---------------------------------------------------------------------- */
+
+    E = Work->E ;
+    max_mark = MAX_MARK (nn) ;
+
+    if (!Work->pivcol_in_front)
+    {
+	/* clear the external column degrees. no more Usons of current front */
+	Work->cdeg0 += (nn + 1) ;
+	if (Work->cdeg0 >= max_mark)
+	{
+	    /* guard against integer overflow.  This is very rare */
+	    DEBUG1 (("Integer overflow, cdeg\n")) ;
+	    Work->cdeg0 = 1 ;
+#pragma ivdep
+	    for (e = 1 ; e <= Work->nel ; e++)
+	    {
+		if (E [e])
+		{
+		    ep = (Element *) (Memory + E [e]) ;
+		    ep->cdeg = 0 ;
+		}
+	    }
+	}
+    }
+
+    if (!Work->pivrow_in_front)
+    {
+	/* clear the external row degrees.  no more Lsons of current front */
+	Work->rdeg0 += (nn + 1) ;
+	if (Work->rdeg0 >= max_mark)
+	{
+	    /* guard against integer overflow.  This is very rare */
+	    DEBUG1 (("Integer overflow, rdeg\n")) ;
+	    Work->rdeg0 = 1 ;
+#pragma ivdep
+	    for (e = 1 ; e <= Work->nel ; e++)
+	    {
+		if (E [e])
+		{
+		    ep = (Element *) (Memory + E [e]) ;
+		    ep->rdeg = 0 ;
+		}
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* clear row/col offsets */
+    /* ---------------------------------------------------------------------- */
+
+    if (!Work->pivrow_in_front)
+    {
+#pragma ivdep
+	for (j = 0 ; j < fncols ; j++)
+	{
+	    Fcpos [Fcols [j]] = EMPTY ;
+	}
+    }
+
+    if (!Work->pivcol_in_front)
+    {
+#pragma ivdep
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    Frpos [Frows [i]] = EMPTY ;
+	}
+    }
+
+    if (fncols <= 0 || fnrows <= 0)
+    {
+	/* no element to create */
+	DEBUG2 (("Element evaporation\n")) ;
+	Work->prior_element = EMPTY ;
+	return (TRUE) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* create element for later assembly */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_allocfail = FALSE ;
+    if (UMF_gprob > 0)
+    {
+	double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ;
+	DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+	UMF_allocfail = rrr < UMF_gprob ;
+	if (UMF_allocfail) DEBUGm2 (("Random garbage collection (create)\n"));
+    }
+#endif
+
+    needunits = 0 ;
+    got_memory = FALSE ;
+    eloc = UMF_mem_alloc_element (Numeric, fnrows, fncols, &Rows, &Cols, &C,
+	&needunits, &ep) ;
+
+    /* if UMF_get_memory needs to be called */
+    if (Work->do_grow)
+    {
+	/* full compaction of current frontal matrix, since UMF_grow_front will
+	 * be called next anyway. */
+	r2 = fnrows ;
+	c2 = fncols ;
+	do_Fcpos = FALSE ;
+    }
+    else
+    {
+	/* partial compaction. */
+	r2 = MAX (fnrows, Work->fnrows_new + 1) ;
+	c2 = MAX (fncols, Work->fncols_new + 1) ;
+	/* recompute Fcpos if pivot row is in the front */
+	do_Fcpos = Work->pivrow_in_front ;
+    }
+
+    if (!eloc)
+    {
+	/* Do garbage collection, realloc, and try again. */
+	/* Compact the current front if it needs to grow anyway. */
+	/* Note that there are no pivot rows or columns in the current front */
+	DEBUGm3 (("get_memory from umf_create_element, 1\n")) ;
+	if (!UMF_get_memory (Numeric, Work, needunits, r2, c2, do_Fcpos))
+	{
+	    /* :: out of memory in umf_create_element (1) :: */
+	    DEBUGm4 (("out of memory: create element (1)\n")) ;
+	    return (FALSE) ;	/* out of memory */
+	}
+	got_memory = TRUE ;
+	Memory = Numeric->Memory ;
+	eloc = UMF_mem_alloc_element (Numeric, fnrows, fncols, &Rows, &Cols, &C,
+	    &needunits, &ep) ;
+	ASSERT (eloc >= 0) ;
+	if (!eloc)
+	{
+	    /* :: out of memory in umf_create_element (2) :: */
+	    DEBUGm4 (("out of memory: create element (2)\n")) ;
+	    return (FALSE) ;	/* out of memory */
+	}
+    }
+
+    e = ++(Work->nel) ;	/* get the name of this new frontal matrix */
+    Work->prior_element = e ;
+    DEBUG8 (("wrapup e "ID" nel "ID"\n", e, Work->nel)) ;
+
+    ASSERT (e > 0 && e < Work->elen) ;
+    ASSERT (E [e] == 0) ;
+    E [e] = eloc ;
+
+    if (Work->pivcol_in_front)
+    {
+	/* the new element is a Uson of the next frontal matrix */
+	ep->cdeg = Work->cdeg0 ;
+    }
+
+    if (Work->pivrow_in_front)
+    {
+	/* the new element is an Lson of the next frontal matrix */
+	ep->rdeg = Work->rdeg0 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* copy frontal matrix into the new element */
+    /* ---------------------------------------------------------------------- */
+
+#pragma ivdep
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	Rows [i] = Frows [i] ;
+    }
+#pragma ivdep
+    for (i = 0 ; i < fncols ; i++)
+    {
+	Cols [i] = Fcols [i] ;
+    }
+    Fcol = Work->Fcblock ;
+    DEBUG0 (("copy front "ID" by "ID"\n", fnrows, fncols)) ;
+    fnr_curr = Work->fnr_curr ;
+    ASSERT (fnr_curr >= 0 && fnr_curr % 2 == 1) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	copy_column (fnrows, Fcol, C) ;
+#if 0
+#ifdef USE_NO_BLAS
+	copy_column (fnrows, Fcol, C) ;
+#else
+	could also use BLAS-COPY (fnrows, Fcol, C) here, but it is typically
+	not as fast as the inlined copy_column subroutine, above.
+#endif
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    C [i] = Fcol [i] ;
+	}
+#endif
+	Fcol += fnr_curr ;
+	C += fnrows ;
+    }
+
+    DEBUG8 (("element copied\n")) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* add tuples for the new element */
+    /* ---------------------------------------------------------------------- */
+
+    tuple.e = e ;
+
+    if (got_memory)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* UMF_get_memory ensures enough space exists for each new tuple */
+	/* ------------------------------------------------------------------ */
+
+	/* place (e,f) in the element list of each column */
+	for (tuple.f = 0 ; tuple.f < fncols ; tuple.f++)
+	{
+	    col = Fcols [tuple.f] ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    ASSERT (NON_PIVOTAL_COL (col)) ;
+	    ASSERT (Col_tuples [col]) ;
+	    tp = ((Tuple *) (Memory + Col_tuples [col])) + Col_tlen [col]++ ;
+	    *tp = tuple ;
+	}
+
+	/* ------------------------------------------------------------------ */
+
+	/* place (e,f) in the element list of each row */
+	for (tuple.f = 0 ; tuple.f < fnrows ; tuple.f++)
+	{
+	    row = Frows [tuple.f] ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (NON_PIVOTAL_ROW (row)) ;
+	    ASSERT (Row_tuples [row]) ;
+	    tp = ((Tuple *) (Memory + Row_tuples [row])) + Row_tlen [row]++ ;
+	    *tp = tuple ;
+	}
+
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* place (e,f) in the element list of each column */
+	/* ------------------------------------------------------------------ */
+
+	/* might not have enough space for each tuple */
+
+	for (tuple.f = 0 ; tuple.f < fncols ; tuple.f++)
+	{
+	    col = Fcols [tuple.f] ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    ASSERT (NON_PIVOTAL_COL (col)) ;
+	    t1 = Col_tuples [col] ;
+	    DEBUG1 (("Placing on col:"ID" , tuples at "ID"\n",
+		col, Col_tuples [col])) ;
+
+	    size = 0 ;
+	    len = 0 ;
+
+	    if (t1)
+	    {
+		p = Memory + t1 ;
+		tp = (Tuple *) p ;
+		size = GET_BLOCK_SIZE (p) ;
+		len = Col_tlen [col] ;
+		tp2 = tp + len ;
+	    }
+
+	    needunits = UNITS (Tuple, len + 1) ;
+	    DEBUG1 (("len: "ID" size: "ID" needunits: "ID"\n",
+		len, size, needunits));
+
+	    if (needunits > size && t1)
+	    {
+		/* prune the tuples */
+		tp1 = tp ;
+		tp2 = tp ;
+		tpend = tp + len ;
+		for ( ; tp < tpend ; tp++)
+		{
+		    e = tp->e ;
+		    ASSERT (e > 0 && e <= Work->nel) ;
+		    if (!E [e]) continue ;   /* element already deallocated */
+		    f = tp->f ;
+		    p = Memory + E [e] ;
+		    ep = (Element *) p ;
+		    p += UNITS (Element, 1) ;
+		    Cols = (Int *) p ;
+		    ;
+		    if (Cols [f] == EMPTY) continue ;	/* already assembled */
+		    ASSERT (col == Cols [f]) ;
+		    *tp2++ = *tp ;	/* leave the tuple in the list */
+		}
+		len = tp2 - tp1 ;
+		Col_tlen [col] = len ;
+		needunits = UNITS (Tuple, len + 1) ;
+	    }
+
+	    if (needunits > size)
+	    {
+		/* no room exists - reallocate elsewhere */
+		DEBUG1 (("REALLOCATE Col: "ID", size "ID" to "ID"\n",
+		    col, size, 2*needunits)) ;
+
+#ifndef NDEBUG
+		UMF_allocfail = FALSE ;
+		if (UMF_gprob > 0)  /* a double relop, but ignore NaN case */
+		{
+		    double rrr = ((double) (rand ( ))) /
+			(((double) RAND_MAX) + 1) ;
+		    DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+		    UMF_allocfail = rrr < UMF_gprob ;
+		    if (UMF_allocfail) DEBUGm2 (("Random gar. (col tuple)\n")) ;
+		}
+#endif
+
+		needunits = MIN (2*needunits, (Int) UNITS (Tuple, nn)) ;
+		t2 = UMF_mem_alloc_tail_block (Numeric, needunits) ;
+		if (!t2)
+		{
+		    /* :: get memory in umf_create_element (1) :: */
+		    /* get memory, reconstruct all tuple lists, and return */
+		    /* Compact the current front if it needs to grow anyway. */
+		    /* Note: no pivot rows or columns in the current front */
+		    DEBUGm4 (("get_memory from umf_create_element, 1\n")) ;
+		    return (UMF_get_memory (Numeric, Work, 0, r2, c2,do_Fcpos));
+		}
+		Col_tuples [col] = t2 ;
+		tp2 = (Tuple *) (Memory + t2) ;
+		if (t1)
+		{
+		    for (i = 0 ; i < len ; i++)
+		    {
+			*tp2++ = *tp1++ ;
+		    }
+		    UMF_mem_free_tail_block (Numeric, t1) ;
+		}
+	    }
+
+	    /* place the new (e,f) tuple in the element list of the column */
+	    Col_tlen [col]++ ;
+	    *tp2 = tuple ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* place (e,f) in the element list of each row */
+	/* ------------------------------------------------------------------ */
+
+	for (tuple.f = 0 ; tuple.f < fnrows ; tuple.f++)
+	{
+	    row = Frows [tuple.f] ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (NON_PIVOTAL_ROW (row)) ;
+	    t1 = Row_tuples [row] ;
+	    DEBUG1 (("Placing on row:"ID" , tuples at "ID"\n",
+		row, Row_tuples [row])) ;
+
+	    size = 0 ;
+	    len = 0 ;
+	    if (t1)
+	    {
+		p = Memory + t1 ;
+		tp = (Tuple *) p ;
+		size = GET_BLOCK_SIZE (p) ;
+		len = Row_tlen [row] ;
+		tp2 = tp + len ;
+	    }
+
+	    needunits = UNITS (Tuple, len + 1) ;
+	    DEBUG1 (("len: "ID" size: "ID" needunits: "ID"\n",
+		len, size, needunits)) ;
+
+	    if (needunits > size && t1)
+	    {
+		/* prune the tuples */
+		tp1 = tp ;
+		tp2 = tp ;
+		tpend = tp + len ;
+		for ( ; tp < tpend ; tp++)
+		{
+		    e = tp->e ;
+		    ASSERT (e > 0 && e <= Work->nel) ;
+		    if (!E [e])
+		    {
+			continue ;	/* element already deallocated */
+		    }
+		    f = tp->f ;
+		    p = Memory + E [e] ;
+		    ep = (Element *) p ;
+		    p += UNITS (Element, 1) ;
+		    Cols = (Int *) p ;
+		    Rows = Cols + (ep->ncols) ;
+		    if (Rows [f] == EMPTY) continue ;	/* already assembled */
+		    ASSERT (row == Rows [f]) ;
+		    *tp2++ = *tp ;	/* leave the tuple in the list */
+		}
+		len = tp2 - tp1 ;
+		Row_tlen [row] = len ;
+		needunits = UNITS (Tuple, len + 1) ;
+	    }
+
+	    if (needunits > size)
+	    {
+		/* no room exists - reallocate elsewhere */
+		DEBUG1 (("REALLOCATE Row: "ID", size "ID" to "ID"\n",
+		    row, size, 2*needunits)) ;
+
+#ifndef NDEBUG
+		UMF_allocfail = FALSE ;
+		if (UMF_gprob > 0)  /* a double relop, but ignore NaN case */
+		{
+		    double rrr = ((double) (rand ( ))) /
+			(((double) RAND_MAX) + 1) ;
+		    DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+		    UMF_allocfail = rrr < UMF_gprob ;
+		    if (UMF_allocfail) DEBUGm2 (("Random gar. (row tuple)\n")) ;
+		}
+#endif
+
+		needunits = MIN (2*needunits, (Int) UNITS (Tuple, nn)) ;
+		t2 = UMF_mem_alloc_tail_block (Numeric, needunits) ;
+		if (!t2)
+		{
+		    /* :: get memory in umf_create_element (2) :: */
+		    /* get memory, reconstruct all tuple lists, and return */
+		    /* Compact the current front if it needs to grow anyway. */
+		    /* Note: no pivot rows or columns in the current front */
+		    DEBUGm4 (("get_memory from umf_create_element, 2\n")) ;
+		    return (UMF_get_memory (Numeric, Work, 0, r2, c2,do_Fcpos));
+		}
+		Row_tuples [row] = t2 ;
+		tp2 = (Tuple *) (Memory + t2) ;
+		if (t1)
+		{
+		    for (i = 0 ; i < len ; i++)
+		    {
+			*tp2++ = *tp1++ ;
+		    }
+		    UMF_mem_free_tail_block (Numeric, t1) ;
+		}
+	    }
+
+	    /* place the new (e,f) tuple in the element list of the row */
+	    Row_tlen [row]++ ;
+	    *tp2 = tuple ;
+	}
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG1 (("Done extending\nFINAL: element row pattern: len="ID"\n", fncols));
+    for (j = 0 ; j < fncols ; j++) DEBUG1 ((""ID"\n", Fcols [j])) ;
+    DEBUG1 (("FINAL: element col pattern:  len="ID"\n", fnrows)) ;
+    for (j = 0 ; j < fnrows ; j++) DEBUG1 ((""ID"\n", Frows [j])) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	col = Fcols [j] ;
+	ASSERT (col >= 0 && col < n_col) ;
+	UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ;
+    }
+    for (j = 0 ; j < fnrows ; j++)
+    {
+	row = Frows [j] ;
+	ASSERT (row >= 0 && row < n_row) ;
+	UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ;
+    }
+    if (n_row < 1000 && n_col < 1000)
+    {
+	UMF_dump_memory (Numeric) ;
+    }
+    DEBUG1 (("New element, after filling with stuff: "ID"\n", e)) ;
+    UMF_dump_element (Numeric, Work, e, TRUE) ;
+    if (nn < 1000)
+    {
+	DEBUG4 (("Matrix dump, after New element: "ID"\n", e)) ;
+	UMF_dump_matrix (Numeric, Work, TRUE) ;
+    }
+    DEBUG3 (("FRONTAL WRAPUP DONE\n")) ;
+#endif
+
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_create_element.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_create_element
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_dump.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1225 @@
+/* ========================================================================== */
+/* === UMF_dump ============================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* These routines, and external variables, are used only when debugging. */
+/* If debugging is disabled (for normal operation) then this entire file */
+/* becomes empty */
+
+#include "umf_internal.h"
+
+#ifndef NDEBUG
+
+/* These global debugging variables and arrays do not exist if debugging */
+/* is disabled at compile time (which is the default). */
+GLOBAL Int UMF_debug = -999 ;
+GLOBAL Int UMF_allocfail = FALSE ;
+GLOBAL double UMF_gprob = -1.0 ;
+
+/* static debugging arrays used only in UMF_dump_rowcol */
+PRIVATE Int UMF_DBflag = 0 ;
+PRIVATE Int UMF_DBpacked [UMF_DBMAX+1] ;
+PRIVATE Int UMF_DBscatter [UMF_DBMAX+1] ;
+
+/* ========================================================================== */
+/* === UMF_DBinit =========================================================== */
+/* ========================================================================== */
+
+/* clear the debugging arrays */
+
+PRIVATE void UMF_DBinit
+(
+    void
+)
+{
+    Int i ;
+
+    /* Int_MAX is defined in umfpack.h */
+    if (UMF_DBflag < 1 || UMF_DBflag == Int_MAX)
+    {
+	/* clear the debugging arrays */
+	UMF_DBflag = 0 ;
+	for (i = 0 ; i <= UMF_DBMAX ; i++)
+	{
+	    UMF_DBscatter [i] = 0 ;
+	    UMF_DBpacked  [i] = 0 ;
+	}
+    }
+
+    UMF_DBflag++ ;
+
+    /* UMF_DBflag > UMF_DBscatter [0...UMF_DBmax] is now true */
+}
+
+/* ========================================================================== */
+/* === UMF_dump_dense ======================================================= */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_dense
+(
+    Entry *C,
+    Int dim,
+    Int m,
+    Int n
+)
+{
+
+    /* dump C [1..m,1..n], with column dimenstion dim */
+    Int i, j;
+
+    if (UMF_debug < 7) return ;
+    if (C == (Entry *) NULL)
+    {
+	DEBUG7 (("No dense matrix allocated\n")) ;
+	return ;
+    }
+    DEBUG8 ((" dimension= "ID" rows= "ID" cols= "ID"\n", dim, m, n)) ;
+
+    for (i = 0 ; i < m ; i++)
+    {
+	DEBUG9 ((ID": ", i)) ;
+	for (j = 0 ; j < n ; j++)
+	{
+	    EDEBUG9 (C [i+j*dim]) ;
+	    if (j % 6 == 5) DEBUG9 (("\n     ")) ;
+	}
+	DEBUG9 (("\n")) ;
+    }
+
+    for (i = 0 ; i < m ; i++)
+    {
+	for (j = 0 ; j < n ; j++)
+	{
+	    if (IS_ZERO (C [i+j*dim]))
+	    {
+		DEBUG8 ((".")) ;
+	    }
+	    else
+	    {
+		DEBUG8 (("X")) ;
+	    }
+	}
+	DEBUG8 (("\n")) ;
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_dump_element ===================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_element
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int e,
+    Int clean
+)
+{
+
+    Int i, j, k, *Rows, *Cols, nrows, ncols, *E, row, col,
+	*Row_degree, *Col_degree ;
+    Entry *C ;
+    Element *ep ;
+    Unit *p ;
+
+    if (UMF_debug < 7) return ;
+
+    if (e == 0)
+    {
+	UMF_dump_current_front (Numeric, Work, FALSE) ;
+	return ;
+    }
+
+    DEBUG7 (("\n====================ELEMENT: "ID" ", e)) ;
+    if (!Numeric || !Work || !Numeric->Memory)
+    {
+	DEBUG7 ((" No Numeric, Work\n")) ;
+	return ;
+    }
+    DEBUG7 ((" nel: "ID" of "ID, e, Work->nel)) ;
+    E = Work->E ;
+    if (!E)
+    {
+	DEBUG7 ((" No elements\n")) ;
+	return ;
+    }
+    if (e < 0 || e > Work->nel)
+    {
+	DEBUG7 (("e out of range!\n")) ;
+	return ;
+    }
+    if (!E [e])
+    {
+	DEBUG7 ((" deallocated\n")) ;
+	return ;
+    }
+    DEBUG7 (("\n")) ;
+    Col_degree = Numeric->Cperm ;
+    Row_degree = Numeric->Rperm ;
+
+    p = Numeric->Memory + E [e] ;
+    DEBUG7 (("ep "ID"\n", (Int) (p-Numeric->Memory))) ;
+    GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, C) ;
+    DEBUG7 (("nrows "ID" nrowsleft "ID"\n", nrows, ep->nrowsleft)) ;
+    DEBUG7 (("ncols "ID" ncolsleft "ID"\n", ncols, ep->ncolsleft)) ;
+    DEBUG7 (("cdeg-cdeg0 "ID" rdeg-rdeg0 "ID" next "ID"\n",
+    ep->cdeg - Work->cdeg0, ep->rdeg - Work->rdeg0, ep->next)) ;
+
+    DEBUG8 (("rows: ")) ;
+    k = 0 ;
+    for (i = 0 ; i < ep->nrows ; i++)
+    {
+	row = Rows [i] ;
+	if (row >= 0)
+	{
+	    DEBUG8 ((" "ID, row)) ;
+	    ASSERT (row < Work->n_row) ;
+	    if ((k++ % 10) == 9) DEBUG8 (("\n")) ;
+	    ASSERT (IMPLIES (clean, NON_PIVOTAL_ROW (row))) ;
+	}
+    }
+
+    DEBUG8 (("\ncols: ")) ;
+    k = 0 ;
+    for (j = 0 ; j < ep->ncols ; j++)
+    {
+	col = Cols [j] ;
+	if (col >= 0)
+	{
+	    DEBUG8 ((" "ID, col)) ;
+	    ASSERT (col < Work->n_col) ;
+	    if ((k++ % 10) == 9) DEBUG8 (("\n")) ;
+	    ASSERT (IMPLIES (clean, NON_PIVOTAL_COL (col))) ;
+	}
+    }
+
+    DEBUG8 (("\nvalues:\n")) ;
+    if (UMF_debug >= 9)
+    {
+	for (i = 0 ; i < ep->nrows ; i++)
+	{
+	    row = Rows [i] ;
+	    if (row >= 0)
+	    {
+		DEBUG9 ((ID": ", row)) ;
+		k = 0 ;
+		for (j = 0 ; j < ep->ncols ; j++)
+		{
+		    col = Cols [j] ;
+		    if (col >= 0)
+		    {
+			EDEBUG9 (C [i+j*ep->nrows]) ;
+			if (k++ % 6 == 5) DEBUG9 (("\n     ")) ;
+		    }
+		}
+		DEBUG9 (("\n")) ;
+	    }
+	}
+    }
+
+    DEBUG7 (("====================\n")) ;
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_rowcol ====================================================== */
+/* ========================================================================== */
+
+/* dump a row or a column, from one or more memory spaces */
+/* return exact degree */
+
+GLOBAL void UMF_dump_rowcol
+(
+    Int dumpwhich,		/* 0 for row, 1 for column */
+    NumericType *Numeric,
+    WorkType *Work,
+    Int dumpindex,		/* row or column index to dump */
+    Int check_degree	/* true if degree is to be checked */
+)
+{
+    Entry value ;
+    Entry *C ;
+    Int f, nrows, j, jj, len, e, deg, index, n_row, n_col, *Cols, *Rows, nn,
+	dumpdeg, ncols, preve, *E, tpi, *Pattern, approx_deg, not_in_use ;
+    Tuple *tp, *tend ;
+    Element *ep ;
+    Int *Row_tuples, *Row_degree, *Row_tlen ;
+    Int *Col_tuples, *Col_degree, *Col_tlen ;
+    Unit *p ;
+    Int is_there ;
+
+    /* clear the debugging arrays */
+    UMF_DBinit () ;
+
+    if (dumpwhich == 0)
+    {
+	DEBUG7 (("\n====================ROW: "ID, dumpindex)) ;
+    }
+    else
+    {
+	DEBUG7 (("\n====================COL: "ID, dumpindex)) ;
+    }
+
+    if (dumpindex == EMPTY)
+    {
+	DEBUG7 ((" (EMPTY)\n")) ;
+	return ;
+    }
+
+    deg = 0 ;
+    approx_deg = 0 ;
+
+    if (!Numeric || !Work)
+    {
+	DEBUG7 ((" No Numeric, Work\n")) ;
+	return ;
+    }
+
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    nn = MAX (n_row, n_col) ;
+    E = Work->E ;
+
+    Col_degree = Numeric->Cperm ;
+    Row_degree = Numeric->Rperm ;
+
+    Row_tuples = Numeric->Uip ;
+    Row_tlen   = Numeric->Uilen ;
+    Col_tuples = Numeric->Lip ;
+    Col_tlen   = Numeric->Lilen ;
+
+	if (!E
+	|| !Row_tuples || !Row_degree || !Row_tlen
+	|| !Col_tuples || !Col_degree || !Col_tlen)
+	{
+	    DEBUG7 ((" No E, Rows, Cols\n")) ;
+	    return ;
+	}
+
+	if (dumpwhich == 0)
+	{
+	    /* dump a row */
+	    ASSERT (dumpindex >= 0 && dumpindex < n_row) ;
+	    if (!NON_PIVOTAL_ROW (dumpindex))
+	    {
+		DEBUG7 ((" Pivotal\n")) ;
+		return ;
+	    }
+	    len = Row_tlen [dumpindex] ;
+	    dumpdeg = Row_degree [dumpindex] ;
+	    tpi = Row_tuples [dumpindex] ;
+	}
+	else
+	{
+	    /* dump a column */
+	    ASSERT (dumpindex >= 0 && dumpindex < n_col) ;
+	    if (!NON_PIVOTAL_COL (dumpindex))
+	    {
+		DEBUG7 ((" Pivotal\n")) ;
+		return ;
+	    }
+	    len = Col_tlen [dumpindex] ;
+	    dumpdeg = Col_degree [dumpindex] ;
+	    tpi = Col_tuples [dumpindex] ;
+	}
+
+	p = Numeric->Memory + tpi ;
+	tp = (Tuple *) p ;
+	if (!tpi)
+	{
+	    DEBUG7 ((" Nonpivotal, No tuple list tuples "ID" tlen "ID"\n",
+		tpi, len)) ;
+	    return ;
+	}
+	ASSERT (p >= Numeric->Memory + Numeric->itail) ;
+	ASSERT (p <  Numeric->Memory + Numeric->size) ;
+
+	DEBUG7 ((" degree: "ID" len: "ID"\n", dumpdeg, len)) ;
+	not_in_use = (p-1)->header.size - UNITS (Tuple, len) ;
+	DEBUG7 ((" Tuple list: p+1: "ID" size: "ID" units, "ID" not in use\n",
+		(Int) (p-Numeric->Memory), (p-1)->header.size, not_in_use)) ;
+	ASSERT (not_in_use >= 0) ;
+	tend = tp + len ;
+	preve = 0 ;
+	for ( ; tp < tend ; tp++)
+	{
+	    /* row/col of element e, offset is f: */
+	    /* DEBUG8 (("    (tp="ID")\n", tp)) ; */
+	    e = tp->e ;
+	    f = tp->f ;
+	    DEBUG8 (("    (e="ID", f="ID")\n", e, f)) ;
+	    ASSERT (e > 0 && e <= Work->nel) ;
+	    /* dump the pattern and values */
+	    if (E [e])
+	    {
+		p = Numeric->Memory + E [e] ;
+		GET_ELEMENT (ep, p, Cols, Rows, ncols, nrows, C) ;
+		if (dumpwhich == 0)
+		{
+		    Pattern = Cols ;
+		    jj = ep->ncols ;
+		    is_there = Rows [f] >= 0 ;
+		    if (is_there) approx_deg += ep->ncolsleft ;
+		}
+		else
+		{
+		    Pattern = Rows ;
+		    jj = ep->nrows ;
+		    is_there = Cols [f] >= 0 ;
+		    if (is_there) approx_deg += ep->nrowsleft ;
+		}
+		if (!is_there)
+		{
+			DEBUG8 (("\t\tnot present\n")) ;
+		}
+		else
+		{
+		    for (j = 0 ; j < jj ; j++)
+		    {
+			index = Pattern [j] ;
+			value =
+			    C [ (dumpwhich == 0) ? (f+nrows*j) : (j+nrows*f) ] ;
+			if (index >= 0)
+			{
+			    DEBUG8 (("\t\t"ID":", index)) ;
+			    EDEBUG8 (value) ;
+			    DEBUG8 (("\n")) ;
+			    if (dumpwhich == 0)
+			    {
+				/* col must be in the range 0..n_col-1 */
+				ASSERT (index < n_col) ;
+			    }
+			    else
+			    {
+				/* row must be in the range 0..n_row-1 */
+				ASSERT (index < n_row) ;
+			    }
+
+			    if (nn <= UMF_DBMAX)
+			    {
+				if (UMF_DBscatter [index] != UMF_DBflag)
+				{
+				    UMF_DBpacked [deg++] = index ;
+				    UMF_DBscatter [index] = UMF_DBflag ;
+				}
+			    }
+			}
+		    }
+		}
+		/* the (e,f) tuples should be in order of their creation */
+		/* this means that garbage collection will not jumble them */
+		ASSERT (preve < e) ;
+		preve = e ;
+	    }
+	    else
+	    {
+		DEBUG8 (("\t\tdeallocated\n")) ;
+	    }
+	}
+
+    if (nn <= UMF_DBMAX)
+    {
+	if (deg > 0)
+	{
+	    DEBUG7 ((" Assembled, actual deg: "ID" : ", deg)) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		index = UMF_DBpacked [j] ;
+		DEBUG8 ((ID" ", index)) ;
+		if (j % 20 == 19) DEBUG8 (("\n ")) ;
+		ASSERT (UMF_DBscatter [index] == UMF_DBflag) ;
+	    }
+	    DEBUG7 (("\n")) ;
+	}
+    }
+
+    /* Col_degree is not maintained when fixQ is true */
+    if (check_degree)
+    {
+	DEBUG8 (("  approx_deg "ID"  dumpdeg "ID"\n", approx_deg, dumpdeg)) ;
+	ASSERT (approx_deg == dumpdeg) ;
+    }
+
+    DEBUG7 (("====================\n")) ;
+
+    /* deg is now the exact degree */
+    /* if nn <= UMF_DBMAX, then UMF_DBscatter [i] == UMF_DBflag for every i */
+    /* in the row or col, and != UMF_DBflag if not */
+
+    return ;
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_matrix ====================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_matrix
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int check_degree
+)
+{
+
+    Int e, row, col, intfrag, frag, n_row, n_col, *E, fullsize, actualsize ;
+    Element *ep ;
+    Unit *p ;
+
+    DEBUG6 (("=================================================== MATRIX:\n")) ;
+    if (!Numeric || !Work)
+    {
+	DEBUG6 (("No Numeric or Work allocated\n")) ;
+	return ;
+    }
+    if (!Numeric->Memory)
+    {
+	DEBUG6 (("No Numeric->Memory\n")) ;
+	return ;
+    }
+
+	n_row = Work->n_row ;
+	n_col = Work->n_col ;
+	DEBUG6 (("n_row "ID" n_col "ID" nz "ID"\n", n_row, n_col, Work->nz)) ;
+	DEBUG6 (("============================ ELEMENTS: "ID" \n", Work->nel)) ;
+	intfrag = 0 ;
+	E = Work->E ;
+	if (!E)
+	{
+	    DEBUG6 (("No elements allocated\n")) ;
+	}
+	else
+	{
+	    for (e = 0 ; e <= Work->nel ; e++)
+	    {
+		UMF_dump_element (Numeric, Work, e, FALSE) ;
+		if (e > 0 && E [e])
+		{
+		    p = Numeric->Memory + E [e] ;
+		    ep = (Element *) p ;
+		    ASSERT (ep->nrowsleft > 0 || ep->ncolsleft > 0) ;
+		    fullsize = GET_BLOCK_SIZE (p) ;
+		    actualsize = GET_ELEMENT_SIZE (ep->nrowsleft,ep->ncolsleft);
+		    frag =  fullsize - actualsize ;
+		    intfrag += frag ;
+		    DEBUG7 (("dump el: "ID", full "ID" actual "ID" frag: "ID
+			" intfrag: "ID"\n", e, fullsize, actualsize, frag,
+			intfrag)) ;
+		}
+	    }
+	}
+
+	DEBUG6 (("CURRENT INTERNAL FRAG in elements: "ID" \n", intfrag)) ;
+
+
+
+    DEBUG6 (("======================================== ROWS: "ID"\n", n_row)) ;
+    UMF_debug -= 2 ;
+    for (row = 0 ; row < n_row ; row++)
+    {
+	UMF_dump_rowcol (0, Numeric, Work, row, check_degree) ;
+    }
+    UMF_debug += 2 ;
+    DEBUG6 (("======================================== COLS: "ID"\n", n_col)) ;
+    UMF_debug -= 2 ;
+    for (col = 0 ; col < n_col ; col++)
+    {
+	UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+    }
+    UMF_debug += 2 ;
+    DEBUG6 (("============================================= END OF MATRIX:\n"));
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_current_front =============================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_current_front
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int check
+)
+{
+
+    Entry *Flublock, *Flblock, *Fublock, *Fcblock ;
+    Int fnrows_max, fncols_max, fnrows, fncols, fnpiv, *Frows, *Fcols,
+	i, j, *Fcpos, *Frpos, fnr_curr, fnc_curr, *E ;
+    if (!Work) return ;
+    DEBUG7 (("\n\n========CURRENT FRONTAL MATRIX:\n")) ;
+
+    Flublock = Work->Flublock ;
+    Flblock = Work->Flblock ;
+    Fublock = Work->Fublock ;
+    Fcblock = Work->Fcblock ;
+
+    Frows = Work->Frows ;
+    Fcols = Work->Fcols ;
+    Frpos = Work->Frpos ;
+    Fcpos = Work->Fcpos ;
+    fnrows_max = Work->fnrows_max ;
+    fncols_max = Work->fncols_max ;
+    fnr_curr = Work->fnr_curr ;
+    fnc_curr = Work->fnc_curr ;
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    fnpiv = Work->fnpiv ;
+    E = Work->E ;
+
+    DEBUG6 (("=== fnpiv= "ID"\n", fnpiv)) ;
+    DEBUG6 (("fnrows_max      fncols_max "ID" "ID"\n",fnrows_max, fncols_max)) ;
+    DEBUG6 (("fnr_curr        fnc_curr   "ID" "ID"\n",fnr_curr,   fnc_curr)) ;
+    DEBUG6 (("fnrows          fncols     "ID" "ID"\n",fnrows,     fncols)) ;
+    ASSERT ((fnr_curr % 2 == 1) || fnr_curr == 0) ;
+    DEBUG6 (("Pivot row pattern:\n")) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	DEBUG7 ((ID" "ID" "ID" %d\n", j, Fcols [j], Fcpos [Fcols [j]],
+	    j < fncols)) ;
+	if (check)
+	{
+	    ASSERT (Fcols [j] >= 0 && Fcols [j] < Work->n_col) ;
+	    ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ;
+	}
+    }
+    DEBUG6 (("Pivot col pattern:\n")) ;
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	DEBUG7 ((ID" "ID" "ID" %d\n", i, Frows [i], Frpos [Frows [i]],
+	    i < fnrows)) ;
+	if (check)
+	{
+	    ASSERT (Frows [i] >= 0 && Frows [i] < Work->n_row) ;
+	    ASSERT (Frpos [Frows [i]] == i) ;
+	}
+    }
+    if (UMF_debug < 7) return ;
+
+    if (!E [0])
+    {
+	DEBUG6 (("current front not allocated\n")) ;
+	ASSERT (!Work->Flublock) ;
+	return ;
+    }
+
+    ASSERT (Work->Flublock == (Entry *) (Numeric->Memory + E [0])) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Fcblock,  fnr_curr, fnrows, fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Flblock,  fnr_curr, fnrows, fnpiv) ;
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Fublock,  fnc_curr, fncols, fnpiv) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Flublock, Work->nb, fnpiv, fnpiv) ;
+    if (fnpiv > 0)
+    {
+	DEBUG7 (("Pivot entry: ")) ;
+	EDEBUG7 (Flublock [(fnpiv-1)+(fnpiv-1)*Work->nb]) ;
+	DEBUG7 (("\n")) ;
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_dump_lu ========================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_lu
+(
+    NumericType *Numeric
+)
+{
+    Int i, n_row, n_col, *Cperm, *Rperm ;
+
+    DEBUG6 (("=============================================== LU factors:\n")) ;
+    if (!Numeric)
+    {
+	DEBUG6 (("No LU factors allocated\n")) ;
+	return ;
+    }
+    n_row = Numeric->n_row ;
+    n_col = Numeric->n_col ;
+    DEBUG6 (("n_row: "ID" n_col: "ID"\n", n_row, n_col)) ;
+    DEBUG6 (("nLentries: "ID" nUentries: "ID"\n",
+	Numeric->nLentries, Numeric->nUentries)) ;
+
+    if (Numeric->Cperm)
+    {
+	Cperm = Numeric->Cperm ;
+	DEBUG7 (("Column permutations: (new: old)\n")) ;
+	for (i = 0 ; i < n_col ; i++)
+	{
+	    if (Cperm [i] != EMPTY)
+	    {
+		DEBUG7 ((ID": "ID"\n", i, Cperm [i])) ;
+	    }
+	}
+    }
+    else
+    {
+	DEBUG7 (("No Numeric->Cperm allocatated\n")) ;
+    }
+
+    if (Numeric->Rperm)
+    {
+	Rperm = Numeric->Rperm ;
+	DEBUG7 (("row permutations: (new: old)\n")) ;
+	for (i = 0 ; i < n_row ; i++)
+	{
+	    if (Rperm [i] != EMPTY)
+	    {
+		DEBUG7 ((ID": "ID"\n", i, Rperm [i])) ;
+	    }
+	}
+    }
+    else
+    {
+	DEBUG7 (("No Numeric->Rperm allocatated\n")) ;
+    }
+
+    DEBUG6 (("========================================= END OF LU factors:\n"));
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_memory ====================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_memory
+(
+    NumericType *Numeric
+)
+{
+
+    Unit *p ;
+    Int prevsize, s ;
+    Int found ;
+
+    if (!Numeric)
+    {
+	DEBUG6 (("No memory space S allocated\n")) ;
+	return ;
+    }
+
+    DEBUG6 (("\n ============================================== MEMORY:\n")) ;
+    if (!Numeric || !Numeric->Memory)
+    {
+	DEBUG6 (("No memory space Numeric allocated\n")) ;
+	return ;
+    }
+
+    DEBUG6 (("S: "ID"\n", (Int) Numeric)) ;
+    DEBUG6 (("S->ihead           : "ID"\n", Numeric->ihead)) ;
+    DEBUG6 (("S->itail           : "ID"\n", Numeric->itail)) ;
+    DEBUG6 (("S->size            : "ID"\n", Numeric->size)) ;
+    DEBUG6 (("S->ngarbage        : "ID"\n", Numeric->ngarbage)) ;
+    DEBUG6 (("S->nrealloc        : "ID"\n", Numeric->nrealloc)) ;
+    DEBUG6 (("   in use at head           : "ID"\n", Numeric->ihead)) ;
+    DEBUG6 (("   free space               : "ID"\n",
+	Numeric->itail - Numeric->ihead)) ;
+    DEBUG6 (("   blocks in use at tail    : "ID"\n",
+	Numeric->size - Numeric->itail)) ;
+    DEBUG6 (("   total in use             : "ID"\n",
+	Numeric->size - (Numeric->itail - Numeric->ihead))) ;
+
+    prevsize = 0 ;
+    found = FALSE ;
+
+    ASSERT (0 <= Numeric->ihead) ;
+    ASSERT (Numeric->ihead <= Numeric->itail) ;
+    ASSERT (Numeric->itail <= Numeric->size) ;
+
+    p = Numeric->Memory + Numeric->itail ;
+
+    while (p < Numeric->Memory + Numeric->size)
+    {
+	DEBUG8 (("p: "ID" p+1: "ID" prevsize: "ID" size: "ID,
+	    (Int) (p-Numeric->Memory), (Int) (p+1-Numeric->Memory),
+	    p->header.prevsize, p->header.size)) ;
+	if (p->header.size < 0)
+	{
+	    DEBUG8 ((" free")) ;
+	}
+
+	if (p == Numeric->Memory + Numeric->itail)
+	{
+	    ASSERT (p->header.prevsize == 0) ;
+	}
+	else
+	{
+	    ASSERT (p->header.prevsize > 0) ;
+	}
+
+	ASSERT (p->header.size != 0) ;
+	s = prevsize >= 0 ? prevsize : -prevsize ;
+	ASSERT (p->header.prevsize == s) ;
+	/* no adjacent free blocks */
+	ASSERT (p->header.size > 0 || prevsize > 0) ;
+	if (Numeric->ibig != EMPTY)
+	{
+	    if (p == Numeric->Memory + Numeric->ibig)
+	    {
+		ASSERT (p->header.size < 0) ;
+		DEBUG8 ((" <===== Numeric->ibig")) ;
+		found = TRUE ;
+	    }
+	}
+	s = p->header.size ;
+	prevsize = s ;
+	s = s >= 0 ? s : -s ;
+	p = p + 1 + s ;
+	DEBUG8 (("\n")) ;
+    }
+
+    ASSERT (p == Numeric->Memory + Numeric->size) ;
+    ASSERT (IMPLIES (Numeric->ibig != EMPTY, found)) ;
+    DEBUG6 (("============================================= END OF MEMORY:\n"));
+
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_packed_memory =============================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_packed_memory
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    Unit *p, *p3 ;
+    Int prevsize, col, row, *Rows, *Cols, ncols, nrows, k, esize,
+	*Row_tuples, *Row_degree, *Col_tuples, *Col_degree ;
+    Entry *C ;
+    Element *ep ;
+
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+    Row_tuples = Numeric->Uip ;
+    Col_tuples = Numeric->Lip ;
+
+    DEBUG6 (("============================================ PACKED MEMORY:\n")) ;
+    if (!Numeric || !Numeric->Memory)
+    {
+	DEBUG6 (("No memory space S allocated\n")) ;
+	return ;
+    }
+    DEBUG6 (("S: "ID"\n", (Int) Numeric)) ;
+    DEBUG6 (("S->ihead           : "ID"\n", Numeric->ihead)) ;
+    DEBUG6 (("S->itail           : "ID"\n", Numeric->itail)) ;
+    DEBUG6 (("S->size            : "ID"\n", Numeric->size)) ;
+    DEBUG6 (("S->ngarbage        : "ID"\n", Numeric->ngarbage)) ;
+    DEBUG6 (("S->nrealloc        : "ID"\n", Numeric->nrealloc)) ;
+    DEBUG6 (("   in use at head           : "ID"\n", Numeric->ihead)) ;
+    DEBUG6 (("   free space               : "ID"\n",
+	Numeric->itail - Numeric->ihead)) ;
+    DEBUG6 (("   blocks in use at tail    : "ID"\n",
+	Numeric->size - Numeric->itail)) ;
+    DEBUG6 (("   total in use             : "ID"\n",
+	Numeric->size - (Numeric->itail - Numeric->ihead))) ;
+
+    ASSERT (0 <= Numeric->ihead) ;
+    ASSERT (Numeric->ihead <= Numeric->itail) ;
+    ASSERT (Numeric->itail <= Numeric->size) ;
+
+    for (row = 0 ; row < Work->n_row ; row++)
+    {
+	ASSERT (IMPLIES (NON_PIVOTAL_ROW (row), !Row_tuples [row])) ;
+    }
+    for (col = 0 ; col < Work->n_col ; col++)
+    {
+	ASSERT (IMPLIES (NON_PIVOTAL_COL (col), !Col_tuples [col])) ;
+    }
+
+    prevsize = 0 ;
+    p = Numeric->Memory + Numeric->itail ;
+    while (p < Numeric->Memory + Numeric->size)
+    {
+	DEBUG9 (("====================\n")) ;
+	DEBUG7 (("p: "ID" p+1: "ID" prevsize: "ID" size: "ID"\n",
+	    (Int) (p-Numeric->Memory), (Int) (p+1-Numeric->Memory),
+	    p->header.prevsize, p->header.size)) ;
+	ASSERT (p->header.size > 0) ;
+
+	if (p == Numeric->Memory + Numeric->itail)
+	{
+	    ASSERT (p->header.prevsize == 0) ;
+	}
+	else
+	{
+	    ASSERT (p->header.prevsize > 0) ;
+	}
+
+	ASSERT (p->header.prevsize == prevsize) ;
+	prevsize = p->header.size ;
+
+	if (p != Numeric->Memory + Numeric->size - 2)
+	{
+
+	    p3 = p + 1 ;
+	    if (p3 == Numeric->Memory + Work->E [0])
+	    {
+		/* this is the current frontal matrix */
+		UMF_dump_current_front (Numeric, Work, FALSE) ;
+	    }
+	    else
+	    {
+
+		/* this is a packed element */
+		GET_ELEMENT (ep, p3, Cols, Rows, ncols, nrows, C) ;
+		DEBUG9 (("ep "ID"\n nrows "ID" ncols "ID"\n",
+		    (Int) ((p+1)-Numeric->Memory), ep->nrows, ep->ncols)) ;
+		DEBUG9 (("rows:")) ;
+		for (k = 0 ; k < ep->nrows; k++)
+		{
+		    row = Rows [k] ;
+		    DEBUG9 ((" "ID, row)) ;
+		    ASSERT (row >= 0 && row <= Work->n_row) ;
+		    if ((k % 10) == 9) DEBUG9 (("\n")) ;
+		}
+		DEBUG9 (("\ncols:")) ;
+		for (k = 0 ; k < ep->ncols; k++)
+		{
+		    col = Cols [k] ;
+		    DEBUG9 ((" "ID, col)) ;
+		    ASSERT (col >= 0 && col <= Work->n_col) ;
+		    if ((k % 10) == 9) DEBUG9 (("\n")) ;
+		}
+		DEBUG9 (("\nvalues: ")) ;
+		if (UMF_debug >= 9)
+		{
+		    UMF_dump_dense (C, ep->nrows, ep->nrows, ep->ncols) ;
+		}
+		esize = GET_ELEMENT_SIZE (ep->nrows, ep->ncols) ;
+		DEBUG9 (("esize: "ID"\n", esize)) ;
+		ASSERT (esize <= p->header.size) ;
+	    }
+
+	}
+	else
+	{
+	    /* this is the final marker block */
+	    ASSERT (p->header.size == 1) ;
+	}
+	p = p + 1 + p->header.size ;
+    }
+
+    ASSERT (Numeric->ibig == EMPTY) ;
+    ASSERT (p == Numeric->Memory + Numeric->size) ;
+    DEBUG6 (("======================================END OF PACKED MEMORY:\n")) ;
+
+}
+
+/* ========================================================================== */
+/* === UMF_dump_col_matrix ================================================== */
+/* ========================================================================== */
+
+/* This code is the same for real or complex matrices. */
+
+GLOBAL void UMF_dump_col_matrix
+(
+    const double Ax [ ],	/* Ax [0..nz-1]: real values, in column order */
+#ifdef COMPLEX
+    const double Az [ ],	/* Az [0..nz-1]: imag values, in column order */
+#endif
+    const Int Ai [ ],		/* Ai [0..nz-1]: row indices, in column order */
+    const Int Ap [ ],		/* Ap [0..n_col]: column pointers */
+    Int n_row,			/* number of rows of A */
+    Int n_col,			/* number of columns of A */
+    Int nz			/* number of entries */
+)
+{
+    Int col, p, p1, p2, row ;
+#ifdef COMPLEX
+    Int split = SPLIT (Az) ;
+#endif
+
+    if (!Ai || !Ap) return ;
+    DEBUG6 (("============================================ COLUMN FORM:\n")) ;
+
+    ASSERT (n_col >= 0) ;
+    nz = Ap [n_col] ;
+    DEBUG2 (("UMF_dump_col:  nz "ID"\n", nz)) ;
+    DEBUG2 (("n_row "ID"  \n", n_row)) ;
+    DEBUG2 (("n_col "ID"  \n", n_col)) ;
+
+    DEBUG6 ((" n_row = "ID", n_col ="ID" nz = "ID" Ap [0] "ID", Ap [n] "ID"\n",
+	n_row, n_col, nz, Ap [0], Ap [n_col])) ;
+    ASSERT (Ap [0] == 0) ;
+    ASSERT (Ap [n_col] == nz) ;
+    for (col = 0 ; col < n_col ; col++)
+    {
+	p1 = Ap [col] ;
+	p2 = Ap [col+1] ;
+	DEBUG6 (("col: "ID", length "ID"\n", col, p2 - p1)) ;
+	ASSERT (p2 >= p1) ;
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    row = Ai [p] ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    DEBUG6 (("\t"ID" ", row)) ;
+	    if (Ax != (double *) NULL)
+	    {
+#ifdef COMPLEX
+		if (split)
+		{
+		    DEBUG6 ((" (%e+%ei) ", Ax [p], Az [p])) ;
+		}
+		else
+		{
+		    DEBUG6 ((" (%e+%ei) ", Ax [2*p], Ax [2*p+1])) ;
+		}
+#else
+		DEBUG6 ((" %e", Ax [p])) ;
+#endif
+	    }
+	    DEBUG6 (("\n")) ;
+	}
+    }
+    DEBUG6 (("========================================== COLUMN FORM done\n")) ;
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_chain ======================================================= */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_chain
+(
+    Int frontid,
+    Int Front_parent [ ],
+    Int Front_npivcol [ ],
+    Int Front_nrows [ ],
+    Int Front_ncols [ ],
+    Int nfr
+)
+{
+    Int i, len = 0 ;
+
+    /* print a list of contiguous parents */
+    i = frontid ;
+    ASSERT (Front_parent [i] == EMPTY ||
+	(Front_parent [i] > i && Front_parent [i] < nfr)) ;
+
+    len++ ;
+    DEBUG3 (("Chain:\n	"ID" ["ID","ID"]("ID"-by-"ID")\n", i,
+		Front_npivcol [i],
+		MIN (Front_npivcol [i], Front_nrows [i]),
+		Front_nrows [i],
+		Front_ncols [i])) ;
+
+    for (i = frontid ; i < nfr ; i++)
+    {
+	ASSERT (Front_parent [i] == EMPTY ||
+	(Front_parent [i] > i && Front_parent [i] < nfr)) ;
+	if (Front_parent [i] == i+1)
+	{
+	    len++ ;
+	    DEBUG3 (("\t"ID" ["ID","ID"]("ID"-by-"ID")\n", i+1,
+		Front_npivcol [i+1],
+		MIN (Front_npivcol [i+1], Front_nrows [i+1]),
+		Front_nrows [i+1],
+		Front_ncols [i+1])) ;
+	}
+	else
+	{
+	    DEBUG2 (("Length of chain: "ID"\n", len)) ;
+	    return ;
+	}
+    }
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_start ======================================================= */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_start
+(
+    void
+)
+{
+    FILE *ff ;
+
+    AMD_debug_init ("from umfpack") ;
+
+    /* get the debug print level from the "debug.umf" file, if it exists */
+    UMF_debug = -999 ;
+    ff = fopen ("debug.umf", "r") ;
+    if (ff)
+    {
+	(void) fscanf (ff, ID, &UMF_debug) ;
+	(void) fclose (ff) ;
+    }
+
+    DEBUG0 (("umfpack: debug version (SLOW!) ")) ;
+
+    DEBUG0 ((" BLAS: ")) ;
+
+#if defined (USE_NO_BLAS)
+    DEBUG0 (("none.")) ;
+#elif defined (USE_C_BLAS)
+    DEBUG0 (("C-BLAS.")) ;
+#elif defined (USE_MATLAB_BLAS)
+    DEBUG0 (("built-in MATLAB BLAS.")) ;
+#elif defined (USE_SUNPERF_BLAS)
+    DEBUG0 (("Sun Performance Library BLAS.")) ;
+#elif defined (USE_SCSL_BLAS)
+    DEBUG0 (("SGI SCSL BLAS.")) ;
+#elif defined (USE_FORTRAN_BLAS)
+    DEBUG0 (("Fortran BLAS.")) ;
+#endif
+
+    DEBUG0 ((" MATLAB: ")) ;
+#ifdef MATLAB_MEX_FILE
+    DEBUG0 (("mexFunction.\n")) ;
+#else
+#ifdef MATHWORKS
+    DEBUG0 (("yes (uses MathWorks internal ut* routines).\n")) ;
+#else
+    DEBUG0 (("no.\n")) ;
+#endif
+#endif
+
+    UMF_gprob = -1.0 ;
+    ff = fopen ("gprob.umf", "r") ;
+    if (ff)
+    {
+	(void) fscanf (ff, "%lg", &UMF_gprob) ;
+	(void) fclose (ff) ;
+	srand (1) ;	/* restart the random number generator */
+    }
+
+    if (UMF_gprob > 1.0) UMF_gprob = 1.0 ;
+    DEBUG1 (("factor: UMF_gprob: %e UMF_debug "ID"\n", UMF_gprob, UMF_debug)) ;
+
+    DEBUG2 (("sizeof: (bytes / int / Units) \n")) ;
+    DEBUG2 (("sizeof (Int)           %u %u %u\n",
+    sizeof (Int), sizeof (Int) / sizeof (int), UNITS (Int, 1) )) ;
+    DEBUG2 (("sizeof (int)           %u %u %u\n",
+    sizeof (int), sizeof (int) / sizeof (int), UNITS (int, 1) )) ;
+    DEBUG2 (("sizeof (size_t)        %u %u %u\n",
+    sizeof (size_t), sizeof (size_t) / sizeof (size_t), UNITS (size_t, 1) )) ;
+    DEBUG2 (("sizeof (long)          %u %u %u\n",
+    sizeof (long), sizeof (long) / sizeof (long), UNITS (long, 1) )) ;
+    DEBUG2 (("sizeof (double)        %u %u %u\n",
+    sizeof (double), sizeof (double) / sizeof (int), UNITS (double, 1) )) ;
+    DEBUG2 (("sizeof (Unit)          %u %u %u\n",
+    sizeof (Unit), sizeof (Unit) / sizeof (int), UNITS (Unit, 1) )) ;
+    DEBUG2 (("sizeof (Entry)         %u %u %u\n",
+    sizeof (Entry), sizeof (Entry) / sizeof (int), UNITS (Entry, 1) )) ;
+    DEBUG2 (("sizeof (Tuple)         %u %u %u\n",
+    sizeof (Tuple), sizeof (Tuple) / sizeof (int), UNITS (Tuple, 1) )) ;
+    DEBUG2 (("sizeof (Tuple *)       %u %u %u\n",
+    sizeof (Tuple *), sizeof (Tuple *) / sizeof (int), UNITS (Tuple *, 1) )) ;
+    DEBUG2 (("sizeof (Element)       %u %u %u\n",
+    sizeof (Element), sizeof (Element) / sizeof (int), UNITS (Element, 1) )) ;
+    DEBUG2 (("sizeof (Element *)     %u %u %u\n",
+    sizeof (Element *), sizeof (Element *) / sizeof (int),
+    UNITS (Element *, 1) )) ;
+    DEBUG2 (("sizeof (WorkType)      %u %u %u\n",
+    sizeof (WorkType), sizeof (WorkType) / sizeof (int),
+    UNITS (WorkType, 1) )) ;
+    DEBUG2 (("sizeof (NumericType)   %u %u %u\n",
+    sizeof (NumericType), sizeof (NumericType) / sizeof (int),
+    UNITS (NumericType, 1) )) ;
+    DEBUG2 (("sizeof (SymbolicType)  %u %u %u\n",
+    sizeof (SymbolicType), sizeof (SymbolicType) / sizeof (int),
+    UNITS (SymbolicType, 1) )) ;
+
+}
+
+
+/* ========================================================================== */
+/* === UMF_dump_rowmerge ==================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_rowmerge
+(
+    NumericType *Numeric,
+    SymbolicType *Symbolic,
+    WorkType *Work
+)
+{
+    Int *Front_leftmostdesc, *Front_1strow, *Front_new1strow, row1, row2,
+	fleftmost, nfr, n_row, *Row_degree, i, frontid, row ;
+
+    nfr = Symbolic->nfr ;
+    DEBUG3 (("\n================== Row merge sets: nfr "ID"\n", nfr)) ;
+    Front_leftmostdesc = Symbolic->Front_leftmostdesc ;
+    Front_1strow = Symbolic->Front_1strow ;
+    Front_new1strow = Work->Front_new1strow ;
+    n_row = Symbolic->n_row ;
+    Row_degree = Numeric->Rperm ;
+    frontid = Work->frontid ;
+
+    for (i = frontid ; i <= nfr ; i++)
+    {
+	DEBUG3 (("----------------------\n")) ;
+	if (i == nfr) DEBUG3 (("Dummy: ")) ;
+	DEBUG3 (("Front "ID" 1strow "ID" new1strow "ID" leftmostdesc "ID,
+	    i, Front_1strow [i], Front_new1strow [i], Front_leftmostdesc [i])) ;
+	DEBUG3 ((" parent "ID" pivcol "ID"\n", Symbolic->Front_parent [i],
+	    Symbolic->Front_npivcol [i])) ;
+
+	if (i == nfr)
+	{
+	    fleftmost = -1 ;
+	    row1 = Front_new1strow [i] ;
+	    row2 = n_row-1 ;
+	}
+	else
+	{
+	    fleftmost = Front_leftmostdesc [i] ;
+	    row1 = Front_new1strow [fleftmost] ;
+	    row2 = Front_1strow [i+1] - 1 ;
+	}
+	DEBUG3 (("Leftmost: "ID"  Rows ["ID" to "ID"], search ["ID" to "ID"]\n",
+	    fleftmost, Front_1strow [i], row2, row1, row2)) ;
+
+	for (row = row1 ; row <= row2 ; row++)
+	{
+	    ASSERT (row >= 0 && row < n_row) ;
+	    DEBUG3 (("   Row "ID" live: %d\n", row, NON_PIVOTAL_ROW (row))) ;
+	}
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_dump_diagonal_map ================================================ */
+/* ========================================================================== */
+
+GLOBAL void UMF_dump_diagonal_map
+(
+    Int Diagonal_map [ ],
+    Int Diagonal_imap [ ],
+    Int n1,
+    Int nn,
+    Int nempty
+)
+{
+    Int row, col ;
+    if (Diagonal_map != (Int *) NULL)
+    {
+	DEBUG2 (("\nDump the Diagonal_map: n1 "ID" nn "ID" nempty "ID"\n",
+	    n1, nn, nempty)) ;
+	for (col = n1 ; col < nn - nempty ; col++)
+	{
+	    row = Diagonal_map [col] ;
+	    DEBUG2 (("     Diagonal_map [col = "ID"] gives "ID": ",
+		col, row)) ;
+	    row = UNFLIP (row) ;
+	    DEBUG2 ((" row "ID"\n", row)) ;
+	    ASSERT (Diagonal_imap [row] == col) ;
+	}
+    }
+}
+
+#endif /* NDEBUG */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_dump.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,186 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* umf_dump.h: debugging definitions. */
+
+#ifndef NDEBUG
+
+GLOBAL void UMF_dump_dense
+(
+    Entry *C,
+    Int dim,
+    Int m,
+    Int n
+) ;
+
+GLOBAL void UMF_dump_element
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int e,
+    Int clean
+) ;
+
+GLOBAL void UMF_dump_rowcol
+(
+    Int dump_which,
+    NumericType *Numeric,
+    WorkType *Work,
+    Int dump_index,
+    Int check_degree
+) ;
+
+GLOBAL void UMF_dump_matrix
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int check_degree
+) ;
+
+GLOBAL void UMF_dump_current_front
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int check
+) ;
+
+GLOBAL void UMF_dump_lu
+(
+    NumericType *Numeric
+) ;
+
+GLOBAL void UMF_dump_memory
+(
+    NumericType *Numeric
+) ;
+
+GLOBAL void UMF_dump_packed_memory
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
+
+GLOBAL void UMF_dump_col_matrix
+(
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    const Int Ai [ ],
+    const Int Ap [ ],
+    Int n_row,
+    Int n_col,
+    Int nz
+) ;
+
+GLOBAL void UMF_dump_chain
+(
+    Int frontid,
+    Int Front_parent [ ],
+    Int Front_npivcol [ ],
+    Int Front_nrows [ ],
+    Int Front_ncols [ ],
+    Int nfr
+) ;
+
+GLOBAL void UMF_dump_rowmerge
+(
+    NumericType *Numeric,
+    SymbolicType *Symbolic,
+    WorkType *Work
+) ;
+
+GLOBAL void UMF_dump_start
+(
+    void
+) ;
+
+
+GLOBAL void UMF_dump_diagonal_map
+(
+    Int Diagonal_map [ ],
+    Int Diagonal_imap [ ],
+    Int n1,
+    Int nn,
+    Int nempty
+) ;
+
+#define UMF_DBMAX 50000
+GLOBAL extern Int UMF_debug ;
+GLOBAL extern Int UMF_allocfail ;
+GLOBAL extern double UMF_gprob ;
+
+#define DEBUGk(k,params) { if (UMF_debug >= (k)) { PRINTF (params) ; } }
+
+#define DEBUGm4(params) DEBUGk (-4, params)
+#define DEBUGm3(params) DEBUGk (-3, params)
+#define DEBUGm2(params) DEBUGk (-2, params)
+#define DEBUGm1(params) DEBUGk (-1, params)
+#define DEBUG0(params) DEBUGk (0, params)
+#define DEBUG1(params) DEBUGk (1, params)
+#define DEBUG2(params) DEBUGk (2, params)
+#define DEBUG3(params) DEBUGk (3, params)
+#define DEBUG4(params) DEBUGk (4, params)
+#define DEBUG5(params) DEBUGk (5, params)
+#define DEBUG6(params) DEBUGk (6, params)
+#define DEBUG7(params) DEBUGk (7, params)
+#define DEBUG8(params) DEBUGk (8, params)
+#define DEBUG9(params) DEBUGk (9, params)
+
+#define EDEBUGk(k,a) { if (UMF_debug >= (k)) { PRINT_ENTRY (a) ; } }
+
+#define EDEBUG0(a) EDEBUGk (0, a)
+#define EDEBUG1(a) EDEBUGk (1, a)
+#define EDEBUG2(a) EDEBUGk (2, a)
+#define EDEBUG3(a) EDEBUGk (3, a)
+#define EDEBUG4(a) EDEBUGk (4, a)
+#define EDEBUG5(a) EDEBUGk (5, a)
+#define EDEBUG6(a) EDEBUGk (6, a)
+#define EDEBUG7(a) EDEBUGk (7, a)
+#define EDEBUG8(a) EDEBUGk (8, a)
+#define EDEBUG9(a) EDEBUGk (9, a)
+
+/* ASSERT defined in amd_dump.h */
+
+#else
+
+/* ========================================================================== */
+/* === No debugging ========================================================= */
+/* ========================================================================== */
+
+/* turn off all debugging macros */
+
+#define DEBUGk(k,params)
+
+#define DEBUGm4(params)
+#define DEBUGm3(params)
+#define DEBUGm2(params)
+#define DEBUGm1(params)
+#define DEBUG0(params)
+#define DEBUG1(params)
+#define DEBUG2(params)
+#define DEBUG3(params)
+#define DEBUG4(params)
+#define DEBUG5(params)
+#define DEBUG6(params)
+#define DEBUG7(params)
+#define DEBUG8(params)
+#define DEBUG9(params)
+
+#define EDEBUGk(k,a)
+
+#define EDEBUG0(a)
+#define EDEBUG1(a)
+#define EDEBUG2(a)
+#define EDEBUG3(a)
+#define EDEBUG4(a)
+#define EDEBUG5(a)
+#define EDEBUG6(a)
+#define EDEBUG7(a)
+#define EDEBUG8(a)
+#define EDEBUG9(a)
+
+#endif /* NDEBUG */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,392 @@
+/* ========================================================================== */
+/* === UMF_extend_front ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Called by kernel. */
+
+#include "umf_internal.h"
+#include "umf_grow_front.h"
+
+/* ========================================================================== */
+/* === zero_front =========================================================== */
+/* ========================================================================== */
+
+PRIVATE void zero_front (
+    Entry *Flblock, Entry *Fublock, Entry *Fcblock,
+    Int fnrows, Int fncols, Int fnr_curr, Int fnc_curr,
+    Int fnpiv, Int fnrows_extended, Int fncols_extended)
+{
+    Int j, i ;
+    Entry *F, *Fj, *Fi ;
+
+    Fj = Fcblock + fnrows ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	/* zero the new rows in the contribution block: */
+	F = Fj ;
+	Fj += fnr_curr ;
+#pragma ivdep
+	for (i = fnrows ; i < fnrows_extended ; i++)
+	{
+	    /* CLEAR (Fcblock [i + j*fnr_curr]) ; */
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+    }
+
+    Fj -= fnrows ;
+    for (j = fncols ; j < fncols_extended ; j++)
+    {
+	/* zero the new columns in the contribution block: */
+	F = Fj ;
+	Fj += fnr_curr ;
+#pragma ivdep
+	for (i = 0 ; i < fnrows_extended ; i++)
+	{
+	    /* CLEAR (Fcblock [i + j*fnr_curr]) ; */
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+    }
+
+    Fj = Flblock + fnrows ;
+    for (j = 0 ; j < fnpiv ; j++)
+    {
+	/* zero the new rows in L block: */
+	F = Fj ;
+	Fj += fnr_curr ;
+#pragma ivdep
+	for (i = fnrows ; i < fnrows_extended ; i++)
+	{
+	    /* CLEAR (Flblock [i + j*fnr_curr]) ; */
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+    }
+
+    Fi = Fublock + fncols ;
+    for (i = 0 ; i < fnpiv ; i++)
+    {
+	/* zero the new columns in U block: */
+	F = Fi ;
+	Fi += fnc_curr ;
+#pragma ivdep
+	for (j = fncols ; j < fncols_extended ; j++)
+	{
+	    /* CLEAR (Fublock [i*fnc_curr + j]) ; */
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+    }
+
+}
+
+/* ========================================================================== */
+/* === UMF_extend_front ===================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMF_extend_front
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int j, i, *Frows, row, col, *Wrow, fnr2, fnc2, *Frpos, *Fcpos, *Fcols,
+	fnrows_extended, rrdeg, ccdeg, fncols_extended, fnr_curr, fnc_curr,
+	fnrows, fncols, pos, fnpiv, *Wm ;
+    Entry *Wx, *Wy, *Fu, *Fl ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get current frontal matrix and check for frontal growth */
+    /* ---------------------------------------------------------------------- */
+
+    fnpiv = Work->fnpiv ;
+
+#ifndef NDEBUG
+    DEBUG2 (("EXTEND FRONT\n")) ;
+    DEBUG2 (("Work->fnpiv "ID"\n", fnpiv)) ;
+    ASSERT (Work->Flblock  == Work->Flublock + Work->nb*Work->nb) ;
+    ASSERT (Work->Fublock  == Work->Flblock  + Work->fnr_curr*Work->nb) ;
+    ASSERT (Work->Fcblock  == Work->Fublock  + Work->nb*Work->fnc_curr) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Work->Fcblock,  Work->fnr_curr, Work->fnrows, Work->fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Work->Flblock,  Work->fnr_curr, Work->fnrows, fnpiv);
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Work->Fublock,  Work->fnc_curr, Work->fncols, fnpiv) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Work->Flublock, Work->nb, fnpiv, fnpiv) ;
+#endif
+
+    if (Work->do_grow)
+    {
+	fnr2 = UMF_FRONTAL_GROWTH * Work->fnrows_new + 2 ;
+	fnc2 = UMF_FRONTAL_GROWTH * Work->fncols_new + 2 ;
+	if (!UMF_grow_front (Numeric, fnr2, fnc2, Work, 1))
+	{
+	    DEBUGm4 (("out of memory: extend front\n")) ;
+	    return (FALSE) ;
+	}
+    }
+
+    fnr_curr = Work->fnr_curr ;
+    fnc_curr = Work->fnc_curr ;
+    ASSERT (Work->fnrows_new + 1 <= fnr_curr) ;
+    ASSERT (Work->fncols_new + 1 <= fnc_curr) ;
+    ASSERT (fnr_curr >= 0 && fnr_curr % 2 == 1) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    Frows = Work->Frows ;
+    Frpos = Work->Frpos ;
+    Fcols = Work->Fcols ;
+    Fcpos = Work->Fcpos ;
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    rrdeg = Work->rrdeg ;
+    ccdeg = Work->ccdeg ;
+
+    /* scan starts at the first new column in Fcols */
+    /* also scan the pivot column if it was not in the front */
+    Work->fscan_col = fncols ;
+    Work->NewCols = Fcols ;
+
+    /* scan1 starts at the first new row in Frows */
+    /* also scan the pivot row if it was not in the front */
+    Work->fscan_row = fnrows ;
+    Work->NewRows = Frows ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extend row pattern of the front with the new pivot column */
+    /* ---------------------------------------------------------------------- */
+
+    fnrows_extended = fnrows ;
+    fncols_extended = fncols ;
+
+#ifndef NDEBUG
+    DEBUG2 (("Pivot col, before extension: "ID"\n", fnrows)) ;
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	DEBUG2 ((" "ID": row "ID"\n", i, Frows [i])) ;
+	ASSERT (Frpos [Frows [i]] == i) ;
+    }
+    DEBUG2 (("Extending pivot column: pivcol_in_front: "ID"\n",
+	Work->pivcol_in_front)) ;
+#endif
+
+    Fl = Work->Flblock + fnpiv * fnr_curr ;
+
+    if (Work->pivcol_in_front)
+    {
+	/* extended pattern and position already in Frows, Frpos.  Values above
+	 * the diagonal are already in LU block.  Values on and below the
+	 * diagonal are in Wy [0 .. fnrows_extended-1].  Copy into the L
+	 * block. */
+	fnrows_extended += ccdeg ;
+	Wy = Work->Wy ;
+
+	for (i = 0 ; i < fnrows_extended ; i++)
+	{
+	    Fl [i] = Wy [i] ;
+#ifndef NDEBUG
+	    row = Frows [i] ;
+	    DEBUG2 ((" "ID": row "ID" ", i, row)) ;
+	    EDEBUG2 (Fl [i]) ;
+	    if (row == Work->pivrow) DEBUG2 ((" <- pivrow")) ;
+	    DEBUG2 (("\n")) ;
+	    if (i == fnrows - 1) DEBUG2 ((" :::::::\n")) ;
+	    ASSERT (row >= 0 && row < Work->n_row) ;
+	    ASSERT (Frpos [row] == i) ;
+#endif
+	}
+
+    }
+    else
+    {
+	/* extended pattern,values is in (Wm,Wx), not yet in the front */
+	Entry *F ;
+	Fu = Work->Flublock + fnpiv * Work->nb ;
+	Wm = Work->Wm ;
+	Wx = Work->Wx ;
+	F = Fu ;
+	for (i = 0 ; i < fnpiv ; i++)
+	{
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+	F = Fl ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    CLEAR_AND_INCREMENT (F) ;
+	}
+	for (i = 0 ; i < ccdeg ; i++)
+	{
+	    row = Wm [i] ;
+#ifndef NDEBUG
+	    DEBUG2 ((" "ID": row "ID" (ext) ", fnrows_extended, row)) ;
+	    EDEBUG2 (Wx [i]) ;
+	    if (row == Work->pivrow) DEBUG2 ((" <- pivrow")) ;
+	    DEBUG2 (("\n")) ;
+	    ASSERT (row >= 0 && row < Work->n_row) ;
+#endif
+	    pos = Frpos [row] ;
+	    if (pos < 0)
+	    {
+		pos = fnrows_extended++ ;
+		Frows [pos] = row ;
+		Frpos [row] = pos ;
+	    }
+	    Fl [pos] = Wx [i] ;
+	}
+    }
+
+    ASSERT (fnrows_extended <= fnr_curr) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extend the column pattern of the front with the new pivot row */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG6 (("Pivot row, before extension: "ID"\n", fncols)) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	DEBUG7 ((" "ID": col "ID"\n", j, Fcols [j])) ;
+	ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ;
+    }
+    DEBUG6 (("Extending pivot row:\n")) ;
+#endif
+
+    if (Work->pivrow_in_front)
+    {
+	if (Work->pivcol_in_front)
+	{
+	    ASSERT (Fcols == Work->Wrow) ;
+	    for (j = fncols ; j < rrdeg ; j++)
+	    {
+#ifndef NDEBUG
+		col = Fcols [j] ;
+		DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ;
+		ASSERT (col != Work->pivcol) ;
+		ASSERT (col >= 0 && col < Work->n_col) ;
+		ASSERT (Fcpos [col] < 0) ;
+#endif
+		Fcpos [Fcols [j]] = j * fnr_curr ;
+	    }
+	}
+	else
+	{
+	    /* OUT-IN option: pivcol not in front, but pivrow is in front */
+	    Wrow = Work->Wrow ;
+	    ASSERT (IMPLIES (Work->pivcol_in_front, Wrow == Fcols)) ;
+	    if (Wrow == Fcols)
+	    {
+		/* Wrow and Fcols are equivalenced */
+		for (j = fncols ; j < rrdeg ; j++)
+		{
+		    col = Wrow [j] ;
+		    DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ;
+		    ASSERT (Fcpos [col] < 0) ;
+		    /* Fcols [j] = col ;  not needed */
+		    Fcpos [col] = j * fnr_curr ;
+		}
+	    }
+	    else
+	    {
+		for (j = fncols ; j < rrdeg ; j++)
+		{
+		    col = Wrow [j] ;
+		    DEBUG2 ((" "ID": col "ID" (ext)\n", j, col)) ;
+		    ASSERT (Fcpos [col] < 0) ;
+		    Fcols [j] = col ;
+		    Fcpos [col] = j * fnr_curr ;
+		}
+	    }
+	}
+	fncols_extended = rrdeg ;
+    }
+    else
+    {
+	ASSERT (Fcols != Work->Wrow) ;
+	Wrow = Work->Wrow ;
+	for (j = 0 ; j < rrdeg ; j++)
+	{
+	    col = Wrow [j] ;
+	    ASSERT (col >= 0 && col < Work->n_col) ;
+	    if (Fcpos [col] < 0)
+	    {
+		DEBUG2 ((" col:: "ID" (ext)\n", col)) ;
+		Fcols [fncols_extended] = col ;
+		Fcpos [col] = fncols_extended * fnr_curr ;
+		fncols_extended++ ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* pivot row and column have been extended */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    ASSERT (fncols_extended <= fnc_curr) ;
+    ASSERT (fnrows_extended <= fnr_curr) ;
+
+    DEBUG6 (("Pivot col, after ext: "ID" "ID"\n", fnrows,fnrows_extended)) ;
+    for (i = 0 ; i < fnrows_extended ; i++)
+    {
+	row = Frows [i] ;
+	DEBUG7 ((" "ID": row "ID" pos "ID" old: %d", i, row, Frpos [row],
+	    i < fnrows)) ;
+	if (row == Work->pivrow ) DEBUG7 (("  <-- pivrow")) ;
+	DEBUG7 (("\n")) ;
+	ASSERT (Frpos [Frows [i]] == i) ;
+    }
+
+    DEBUG6 (("Pivot row position: "ID"\n", Frpos [Work->pivrow])) ;
+    ASSERT (Frpos [Work->pivrow] >= 0) ;
+    ASSERT (Frpos [Work->pivrow] < fnrows_extended) ;
+
+    DEBUG6 (("Pivot row, after ext: "ID" "ID"\n", fncols,fncols_extended)) ;
+    for (j = 0 ; j < fncols_extended ; j++)
+    {
+	col = Fcols [j] ;
+	DEBUG7 ((" "ID": col "ID" pos "ID" old: %d", j, col, Fcpos [col],
+	    j < fncols)) ;
+	if (col == Work->pivcol ) DEBUG7 (("  <-- pivcol")) ;
+	DEBUG7 (("\n")) ;
+	ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ;
+    }
+
+    DEBUG6 (("Pivot col position: "ID"\n", Fcpos [Work->pivcol])) ;
+    ASSERT (Fcpos [Work->pivcol] >= 0) ;
+    ASSERT (Fcpos [Work->pivcol] < fncols_extended * fnr_curr) ;
+
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* Zero the newly extended frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    zero_front (Work->Flblock, Work->Fublock, Work->Fcblock,
+	fnrows, fncols, fnr_curr, fnc_curr,
+	fnpiv, fnrows_extended, fncols_extended) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* finalize extended row and column pattern of the frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    Work->fnrows = fnrows_extended ;
+    Work->fncols = fncols_extended ;
+
+    ASSERT (fnrows_extended == Work->fnrows_new + 1) ;
+    ASSERT (fncols_extended == Work->fncols_new + 1) ;
+
+    return (TRUE) ;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_extend_front.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_extend_front
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_free.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,45 @@
+/* ========================================================================== */
+/* === UMF_free ============================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Free a block previously allocated by UMF_malloc and return NULL.
+    Usage is p = UMF_free (p), to ensure that we don't free it twice.
+    Also maintains the UMFPACK malloc count.
+*/
+
+#include "umf_internal.h"
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+#include "umf_malloc.h"
+#endif
+
+GLOBAL void *UMF_free
+(
+    void *p
+)
+{
+    DEBUG0 (("UMF_free: "ID"\n", (Int) p)) ;
+    if (p)
+    {
+
+	/* see umf_config.h for the memory allocator selection */
+	FREE (p) ;
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+	/* One more object has been free'd.  Keep track of the count. */
+	/* (purely for sanity checks). */
+	UMF_malloc_count-- ;
+	DEBUG0 (("     new malloc count: "ID"\n", UMF_malloc_count)) ;
+#endif
+
+    }
+
+    return ((void *) NULL) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_free.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,10 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void *UMF_free
+(
+    void *p
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_fsize.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,69 @@
+/* ========================================================================== */
+/* === UMF_fsize ============================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Determine the largest frontal matrix size for each subtree.   Called by
+ * UMF_colamd and UMF_analyze.  Only required to sort the children of each
+ * node prior to AMD_postorder. */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_fsize
+(
+    Int nn,
+    Int Fsize [ ],
+    Int Fnrows [ ],
+    Int Fncols [ ],
+    Int Parent [ ],
+    Int Npiv [ ]
+)
+{
+    Int j, parent, frsize, r, c ;
+
+    for (j = 0 ; j < nn ; j++)
+    {
+	Fsize [j] = EMPTY ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* find max front size for tree rooted at node j, for each front j */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG1 (("\n\n========================================FRONTS:\n")) ;
+    for (j = 0 ; j < nn ; j++)
+    {
+	if (Npiv [j] > 0)
+	{
+	    /* this is a frontal matrix */
+	    parent = Parent [j] ;
+	    r = Fnrows [j] ;
+	    c = Fncols [j] ;
+	    frsize = r * c ;
+	    /* avoid integer overflow */
+	    if (INT_OVERFLOW (((double) r) * ((double) c)))
+	    {
+		/* :: frsize int overflow :: */
+		frsize = Int_MAX ;
+	    }
+	    DEBUG1 ((""ID" : npiv "ID" size "ID" parent "ID" ",
+		j, Npiv [j], frsize, parent)) ;
+	    Fsize [j] = MAX (Fsize [j], frsize) ;
+	    DEBUG1 (("Fsize [j = "ID"] = "ID"\n", j, Fsize [j])) ;
+	    if (parent != EMPTY)
+	    {
+		/* find the maximum frontsize of self and children */
+		ASSERT (Npiv [parent] > 0) ;
+		ASSERT (parent > j) ;
+		Fsize [parent] = MAX (Fsize [parent], Fsize [j]) ;
+		DEBUG1 (("Fsize [parent = "ID"] = "ID"\n",
+		    parent, Fsize [parent]));
+	    }
+	}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_fsize.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,15 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_fsize
+(
+    Int nn,
+    Int MaxFsize [ ],
+    Int Fnrows [ ],
+    Int Fncols [ ],
+    Int Parent [ ],
+    Int Npiv [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,695 @@
+/* ========================================================================== */
+/* === UMF_garbage_collection =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Compress the elements at the tail of Numeric->Memory, and delete the tuples.
+    Elements are renumbered.  The new numbering space is compressed, and
+    in the order of element creation (original elements of A first, followed
+    by the new elements in the order that they were formed).
+
+    Only called by UMF_get_memory.
+
+    There are 5 ways in which garbage collection can be performed:
+
+	Allocate a new working array for the current frontal matrix.  In this
+	case, there are never any pivot rows/columns in the current frontal
+	matrix (fnpiv = 0), and the old working array for the current frontal
+	matrix can always be fully compacted, to fnrows-by-fncols.
+
+	    UMF_kernel : UMF_extend : UMF_grow_front : UMF_get_memory
+	    UMF_kernel : UMF_init_front : UMF_grow_front : UMF_get_memory
+	    UMF_kernel : UMF_start_front : UMF_grow_front : UMF_get_memory
+
+	Allocate a new element.  In this case, UMF_grow_front may or may not
+	be subsequently called, depending on Work->do_grow.  There are never
+	any pivot rows/columns in the current frontal matrix (fnpiv=0), but one
+	may be added if UMF_init_front is to be called just after
+	UMF_create_element.  If do_grow is true, then the current front can be
+	fully compacted, to fnrows-by-fncols.  Otherwise, it can only be
+	partially compacted, to MAX (fnrows, fnrows_new + 1) -by-
+	MAX (fncols, fncols_new + 1).
+
+	    UMF_kernel : UMF_create_element : UMF_get_memory
+
+	Allocate rows of L and columns of U.  In this case, the current
+	frontal matrix is only partially compacted, to (fnrows_new + 1)-by-
+	(fncols_new + 1).  There are pivots in the frontal matrix (fnpiv > 0).
+
+	    UMF_kernel : UMF_store_lu : UMF_get_memory
+*/
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_garbage_collection
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int drnew,	    /* compact current front to drnew-by-dcnew */
+    Int dcnew,
+    Int do_Fcpos
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int size, e, n_row, n_col, nrows, ncols, nrowsleft, ncolsleft, prevsize,
+	csize, size2, i2, j2, i, j, cdeg, rdeg, *E, row, col,
+	*Rows, *Cols, *Rows2, *Cols2, nel, e2, *Row_tuples, *Col_tuples,
+	*Row_degree, *Col_degree ;
+    Entry *C, *C1, *C3, *C2 ;
+    Unit *psrc, *pdest, *p, *pnext ;
+    Element *epsrc, *epdest ;
+
+#ifndef NDEBUG
+    Int nmark ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+    Row_tuples = Numeric->Uip ;
+    Col_tuples = Numeric->Lip ;
+    E = Work->E ;
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+
+    /* note that the tuple lengths (Col_tlen and Row_tlen) are updated, but */
+    /* the tuple lists themselves are stale and are about to be destroyed */
+    /* and recreated.  Do not attempt to scan them until they are recreated. */
+
+#ifndef NDEBUG
+    DEBUGm1 (("::::GARBAGE COLLECTION::::\n")) ;
+    UMF_dump_memory (Numeric) ;
+#endif
+
+    Numeric->ngarbage++ ;
+
+    /* ---------------------------------------------------------------------- */
+    /* delete the tuple lists by marking the blocks as free */
+    /* ---------------------------------------------------------------------- */
+
+    /* do not modify Row_tlen and Col_tlen */
+    /* those are needed for UMF_build_tuples */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	if (NON_PIVOTAL_ROW (row) && Row_tuples [row])
+	{
+	    DEBUG2 (("row "ID" tuples "ID"\n", row, Row_tuples [row])) ;
+	    p = Numeric->Memory + Row_tuples [row] - 1 ;
+	    DEBUG2 (("Freeing tuple list row "ID", p-S "ID", size "ID"\n",
+		row, (Int) (p-Numeric->Memory), p->header.size)) ;
+	    ASSERT (p->header.size > 0) ;
+	    ASSERT (p >= Numeric->Memory + Numeric->itail) ;
+	    ASSERT (p < Numeric->Memory + Numeric->size) ;
+	    p->header.size = -p->header.size ;
+	    Row_tuples [row] = 0 ;
+	}
+    }
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	if (NON_PIVOTAL_COL (col) && Col_tuples [col])
+	{
+	    DEBUG2 (("col "ID" tuples "ID"\n", col, Col_tuples [col])) ;
+	    p = Numeric->Memory + Col_tuples [col] - 1 ;
+	    DEBUG2 (("Freeing tuple list col "ID", p-S "ID", size "ID"\n",
+		col, (Int) (p-Numeric->Memory), p->header.size)) ;
+	    ASSERT (p->header.size > 0) ;
+	    ASSERT (p >= Numeric->Memory + Numeric->itail) ;
+	    ASSERT (p < Numeric->Memory + Numeric->size) ;
+	    p->header.size = -p->header.size ;
+	    Col_tuples [col] = 0 ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* mark the elements, and compress the name space */
+    /* ---------------------------------------------------------------------- */
+
+    nel = Work->nel ;
+    ASSERT (nel < Work->elen) ;
+
+#ifndef NDEBUG
+    nmark = 0 ;
+    UMF_dump_current_front (Numeric, Work, FALSE) ;
+    DEBUGm1 (("E [0] "ID"  \n", E [0])) ;
+    ASSERT (IMPLIES (E [0],
+		Work->Flublock == (Entry *) (Numeric->Memory + E [0]))) ;
+    ASSERT (IMPLIES (Work->Flublock,
+		Work->Flublock == (Entry *) (Numeric->Memory + E [0]))) ;
+    ASSERT ((E [0] != 0) == (Work->Flublock != (Entry *) NULL)) ;
+#endif
+
+    e2 = 0 ;
+
+    for (e = 0 ; e <= nel ; e++) /* for all elements in order of creation */
+    {
+	if (E [e])
+	{
+	    psrc = Numeric->Memory + E [e] ;
+	    psrc-- ;		/* get the header of this block */
+	    if (e > 0)
+	    {
+		e2++ ;	/* do not renumber element zero */
+	    }
+	    ASSERT (psrc->header.size > 0) ;
+	    psrc->header.size = e2  ;	/* store the new name in the header */
+#ifndef NDEBUG
+	    nmark++ ;
+#endif
+	    DEBUG7 ((ID":: Mark e "ID" at psrc-S "ID", new e "ID"\n",
+		nmark, e, (Int) (psrc-Numeric->Memory), e2)) ;
+	    E [e] = 0 ;
+	    if (e == Work->prior_element)
+	    {
+		Work->prior_element = e2 ;
+	    }
+	}
+    }
+
+    /* all 1..e2 are now in use (element zero may or may not be in use) */
+    Work->nel = e2 ;
+    nel = Work->nel ;
+
+#ifndef NDEBUG
+    for (e = 0 ; e < Work->elen ; e++)
+    {
+	ASSERT (!E [e]) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* compress the elements */
+    /* ---------------------------------------------------------------------- */
+
+    /* point to tail marker block of size 1 + header */
+    psrc = Numeric->Memory + Numeric->size - 2 ;
+    pdest = psrc ;
+    prevsize = psrc->header.prevsize ;
+    DEBUG7 (("Starting the compression:\n")) ;
+
+    while (prevsize > 0)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* move up to the next element above the current header, and */
+	/* get the element name and size */
+	/* (if it is an element, the name will be positive) */
+	/* ------------------------------------------------------------------ */
+
+	size = prevsize ;
+	psrc -= (size + 1) ;
+	e = psrc->header.size ;
+	prevsize = psrc->header.prevsize ;
+	/* top block at tail has prevsize of 0 */
+
+	/* a free block will have a negative size, so skip it */
+	/* otherwise, if size >= 0, it holds the element name, not the size */
+
+	DEBUG8 (("psrc-S: "ID" prevsize: "ID" size: "ID,
+	    (Int) (psrc-Numeric->Memory), prevsize, size)) ;
+
+	if (e == 0)
+	{
+	    /* -------------------------------------------------------------- */
+	    /* this is the current frontal matrix */
+	    /* -------------------------------------------------------------- */
+
+	    Entry *F1, *F2, *Fsrc, *Fdst ;
+	    Int c, r, k, dr, dc, gap, gap1, gap2, nb ;
+
+	    /* shift the frontal matrix down */
+	    F1 = (Entry *) (psrc + 1) ;
+
+	    /* get the size of the current front.  r and c could be zero */
+	    k = Work->fnpiv ;
+	    dr = Work->fnr_curr ;
+	    dc = Work->fnc_curr ;
+	    r = Work->fnrows ;
+	    c = Work->fncols ;
+	    nb = Work->nb ;
+
+	    ASSERT ((dr >= 0 && (dr % 2) == 1) || dr == 0) ;
+	    ASSERT (drnew >= 0) ;
+	    if (drnew % 2 == 0)
+	    {
+		/* make sure leading frontal matrix dimension is always odd */
+		drnew++ ;
+	    }
+	    drnew = MIN (dr, drnew) ;
+	    ASSERT ((drnew >= 0 && (drnew % 2) == 1) || drnew == 0) ;
+
+	    pnext = pdest ;
+
+#ifndef NDEBUG
+	    DEBUGm2 (("move front: dr "ID" dc "ID" r "ID" drnew "ID" c "ID
+		" dcnew " ID" k "ID"\n", dr, dc, r, drnew, c, dcnew, k)) ;
+	    DEBUG7 (("\n")) ;
+	    DEBUG7 ((ID":: Move current frontal matrix from: psrc-S: "ID" \n",
+		nmark, (Int) (psrc-Numeric->Memory))) ;
+	    nmark-- ;
+	    ASSERT (E [e] == 0) ;
+	    ASSERT (Work->Flublock == F1) ;
+	    ASSERT (Work->Flblock  == Work->Flublock + nb*nb) ;
+	    ASSERT (Work->Fublock  == Work->Flblock  + dr*nb) ;
+	    ASSERT (Work->Fcblock  == Work->Fublock  + nb*dc) ;
+	    DEBUG7 (("C  block: ")) ;
+	    UMF_dump_dense (Work->Fcblock,  dr, r, c) ;
+	    DEBUG7 (("L  block: ")) ;
+	    UMF_dump_dense (Work->Flblock,  dr, r, k);
+	    DEBUG7 (("U' block: ")) ;
+	    UMF_dump_dense (Work->Fublock,  dc, c, k) ;
+	    DEBUG7 (("LU block: ")) ;
+	    UMF_dump_dense (Work->Flublock, nb, k, k) ;
+	    ASSERT (r <= drnew && c <= dcnew && drnew <= dr && dcnew <= dc) ;
+#endif
+
+	    /* compact frontal matrix to drnew-by-dcnew before moving it */
+
+	    /* do not compact the LU block (nb-by-nb) */
+
+	    /* compact the columns of L (from dr-by-nb to drnew-by-nb) */
+	    Fsrc = Work->Flblock ;
+	    Fdst = Work->Flblock ;
+	    ASSERT (Fdst == F1 + nb*nb) ;
+	    gap1 = dr - r ;
+	    gap2 = drnew - r ;
+	    ASSERT (gap1 >= 0) ;
+	    for (j = 0 ; j < k ; j++)
+	    {
+		for (i = 0 ; i < r ; i++)
+		{
+		    *Fdst++ = *Fsrc++ ;
+		}
+		Fsrc += gap1 ;
+		Fdst += gap2 ;
+	    }
+	    ASSERT (Fdst == F1 + nb*nb + drnew*k) ;
+	    Fdst += drnew * (nb - k) ;
+
+	    /* compact the rows of U (U' from dc-by-nb to dcnew-by-nb) */
+	    Fsrc = Work->Fublock ;
+	    ASSERT (Fdst == F1 + nb*nb + drnew*nb) ;
+	    gap1 = dc - c ;
+	    gap2 = dcnew - c ;
+	    for (i = 0 ; i < k ; i++)
+	    {
+		for (j = 0 ; j < c ; j++)
+		{
+		    *Fdst++ = *Fsrc++ ;
+		}
+		Fsrc += gap1 ;
+		Fdst += gap2 ;
+	    }
+	    ASSERT (Fdst == F1 + nb*nb + drnew*nb + dcnew*k) ;
+	    Fdst += dcnew * (nb - k) ;
+
+	    /* compact the columns of C (from dr-by-dc to drnew-by-dcnew) */
+	    Fsrc = Work->Fcblock ;
+	    ASSERT (Fdst == F1 + nb*nb + drnew*nb + nb*dcnew) ;
+	    gap1 = dr - r ;
+	    gap2 = drnew - r ;
+	    for (j = 0 ; j < c ; j++)
+	    {
+		for (i = 0 ; i < r ; i++)
+		{
+		    *Fdst++ = *Fsrc++ ;
+		}
+		Fsrc += gap1 ;
+		Fdst += gap2 ;
+	    }
+	    ASSERT (Fdst == F1 + nb*nb + drnew*nb + nb*dcnew + drnew*c) ;
+
+	    /* recompute Fcpos, if necessary */
+	    if (do_Fcpos)
+	    {
+		Int *Fcols, *Fcpos ;
+		Fcols = Work->Fcols ;
+		Fcpos = Work->Fcpos ;
+		for (j = 0 ; j < c ; j++)
+		{
+		    col = Fcols [j] ;
+		    ASSERT (col >= 0 && col < Work->n_col) ;
+		    ASSERT (Fcpos [col] == j * dr) ;
+		    Fcpos [col] = j * drnew ;
+		}
+#ifndef NDEBUG
+		{
+		    Int cnt = 0 ;
+		    for (j = 0 ; j < Work->n_col ; j++)
+		    {
+			if (Fcpos [j] != EMPTY) cnt++ ;
+		    }
+		    DEBUGm2 (("Recompute Fcpos cnt "ID" c "ID"\n", cnt, c)) ;
+		    ASSERT (cnt == c) ;
+		}
+#endif
+	    }
+
+#ifndef NDEBUG
+	    DEBUGm2 (("Compacted front, drnew "ID" dcnew "ID"\n", drnew, dcnew)) ;
+	    DEBUG7 (("C  block: ")) ;
+	    UMF_dump_dense (F1 + nb*nb + drnew*nb + nb*dcnew, drnew, r, c) ;
+	    DEBUG7 (("L  block: ")) ;
+	    UMF_dump_dense (F1 + nb*nb, drnew, r, k) ;
+	    DEBUG7 (("U  block: ")) ;
+	    UMF_dump_dense (F1 + nb*nb + drnew*nb, nb, k, c) ;
+	    DEBUG7 (("LU block: ")) ;
+	    UMF_dump_dense (F1, nb, k, k) ;
+#endif
+
+	    /* Compacted dimensions of the new frontal matrix. */
+	    Work->fnr_curr = drnew ;
+	    Work->fnc_curr = dcnew ;
+	    Work->fcurr_size = (drnew + nb) * (dcnew + nb) ;
+	    size = UNITS (Entry, Work->fcurr_size) ;
+
+	    /* make sure the object doesn't evaporate.  The front can have
+	     * zero size (Work->fcurr_size = 0), but the size of the memory
+	     * block containing it cannot have zero size. */
+	    size = MAX (1, size) ;
+
+	    /* get the destination of frontal matrix */
+	    pnext->header.prevsize = size ;
+	    pdest -= (size + 1) ;
+	    F2 = (Entry *) (pdest + 1) ;
+
+	    ASSERT ((unsigned Int) psrc + 1 + size <= (unsigned Int) pnext) ;
+	    ASSERT (psrc <= pdest) ;
+	    ASSERT (F1 <= F2) ;
+
+	    /* move the C block first */
+	    Fsrc = F1 + nb*nb + drnew*nb + nb*dcnew + drnew*c ;
+	    Fdst = F2 + nb*nb + drnew*nb + nb*dcnew + drnew*c ;
+	    gap = drnew - r ;
+	    for (j = c-1 ; j >= 0 ; j--)
+	    {
+		Fsrc -= gap ;
+		Fdst -= gap ;
+		/* move column j of C */
+		for (i = r-1 ; i >= 0 ; i--)
+		{
+		    *--Fdst = *--Fsrc ;
+		}
+	    }
+	    ASSERT (Fsrc == F1 + nb*nb + drnew*nb + nb*dcnew) ;
+	    ASSERT (Fdst == F2 + nb*nb + drnew*nb + nb*dcnew) ;
+
+	    /* move the U block */
+	    Fsrc -= dcnew * (nb - k) ;
+	    Fdst -= dcnew * (nb - k) ;
+	    ASSERT (Fsrc == F1 + nb*nb + drnew*nb + dcnew*k) ;
+	    ASSERT (Fdst == F2 + nb*nb + drnew*nb + dcnew*k) ;
+	    gap = dcnew - c ;
+	    for (i = k-1 ; i >= 0 ; i--)
+	    {
+		Fsrc -= gap ;
+		Fdst -= gap ;
+		for (j = c-1 ; j >= 0 ; j--)
+		{
+		    *--Fdst = *--Fsrc ;
+		}
+	    }
+	    ASSERT (Fsrc == F1 + nb*nb + drnew*nb) ;
+	    ASSERT (Fdst == F2 + nb*nb + drnew*nb) ;
+
+	    /* move the L block */
+	    Fsrc -= drnew * (nb - k) ;
+	    Fdst -= drnew * (nb - k) ;
+	    ASSERT (Fsrc == F1 + nb*nb + drnew*k) ;
+	    ASSERT (Fdst == F2 + nb*nb + drnew*k) ;
+	    gap = drnew - r ;
+	    for (j = k-1 ; j >= 0 ; j--)
+	    {
+		Fsrc -= gap ;
+		Fdst -= gap ;
+		for (i = r-1 ; i >= 0 ; i--)
+		{
+		    *--Fdst = *--Fsrc ;
+		}
+	    }
+	    ASSERT (Fsrc == F1 + nb*nb) ;
+	    ASSERT (Fdst == F2 + nb*nb) ;
+
+	    /* move the LU block */
+	    Fsrc -= nb * (nb - k) ;
+	    Fdst -= nb * (nb - k) ;
+	    ASSERT (Fsrc == F1 + nb*k) ;
+	    ASSERT (Fdst == F2 + nb*k) ;
+	    gap = nb - k ;
+	    for (j = k-1 ; j >= 0 ; j--)
+	    {
+		Fsrc -= gap ;
+		Fdst -= gap ;
+		for (i = k-1 ; i >= 0 ; i--)
+		{
+		    *--Fdst = *--Fsrc ;
+		}
+	    }
+	    ASSERT (Fsrc == F1) ;
+	    ASSERT (Fdst == F2) ;
+
+	    E [0] = (pdest + 1) - Numeric->Memory ;
+
+	    Work->Flublock = (Entry *) (Numeric->Memory + E [0]) ;
+	    ASSERT (Work->Flublock == F2) ;
+	    Work->Flblock  = Work->Flublock + nb * nb ;
+	    Work->Fublock  = Work->Flblock  + drnew * nb ;
+	    Work->Fcblock  = Work->Fublock  + nb * dcnew ;
+
+	    pdest->header.prevsize = 0 ;
+	    pdest->header.size = size ;
+
+#ifndef NDEBUG
+	    DEBUG7 (("After moving compressed current frontal matrix:\n")) ;
+	    DEBUG7 (("C  block: ")) ;
+	    UMF_dump_dense (Work->Fcblock,  drnew, r, c) ;
+	    DEBUG7 (("L  block: ")) ;
+	    UMF_dump_dense (Work->Flblock,  drnew, r, k);
+	    DEBUG7 (("U' block: ")) ;
+	    UMF_dump_dense (Work->Fublock,  dcnew, c, k) ;
+	    DEBUG7 (("LU block: ")) ;
+	    UMF_dump_dense (Work->Flublock, nb, k, k) ;
+#endif
+
+	}
+	else if (e > 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* this is an element, compress and move from psrc down to pdest */
+	    /* -------------------------------------------------------------- */
+
+#ifndef NDEBUG
+	    DEBUG7 (("\n")) ;
+	    DEBUG7 ((ID":: Move element "ID": from: "ID" \n",
+		nmark, e, (Int) (psrc-Numeric->Memory))) ;
+	    nmark-- ;
+	    ASSERT (e <= nel) ;
+	    ASSERT (E [e] == 0) ;
+#endif
+
+	    /* -------------------------------------------------------------- */
+	    /* get the element scalars, and pointers to C, Rows, and Cols: */
+	    /* -------------------------------------------------------------- */
+
+	    p = psrc + 1 ;
+	    GET_ELEMENT (epsrc, p, Cols, Rows, ncols, nrows, C) ;
+	    nrowsleft = epsrc->nrowsleft ;
+	    ncolsleft = epsrc->ncolsleft ;
+	    cdeg = epsrc->cdeg ;
+	    rdeg = epsrc->rdeg ;
+
+#ifndef NDEBUG
+	    DEBUG7 ((" nrows "ID" nrowsleft "ID"\n", nrows, nrowsleft)) ;
+	    DEBUG7 ((" ncols "ID" ncolsleft "ID"\n", ncols, ncolsleft)) ;
+	    DEBUG8 ((" Rows:")) ;
+	    for (i = 0 ; i < nrows ; i++) DEBUG8 ((" "ID, Rows [i])) ;
+	    DEBUG8 (("\n Cols:")) ;
+	    for (j = 0 ; j < ncols ; j++) DEBUG8 ((" "ID, Cols [j])) ;
+	    DEBUG8 (("\n")) ;
+#endif
+
+	    /* -------------------------------------------------------------- */
+	    /* determine the layout of the new element */
+	    /* -------------------------------------------------------------- */
+
+	    csize = nrowsleft * ncolsleft ;
+	    size2 = UNITS (Element, 1)
+		  + UNITS (Int, nrowsleft + ncolsleft)
+		  + UNITS (Entry, csize) ;
+
+	    DEBUG7 (("Old size "ID" New size "ID"\n", size, size2)) ;
+
+	    pnext = pdest ;
+	    pnext->header.prevsize = size2 ;
+	    pdest -= (size2 + 1) ;
+
+	    ASSERT (size2 <= size) ;
+	    ASSERT ((unsigned Int) psrc + 1 + size <= (unsigned Int) pnext) ;
+	    ASSERT (psrc <= pdest) ;
+
+	    p = pdest + 1 ;
+	    epdest = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Cols2 = (Int *) p ;
+	    Rows2 = Cols2 + ncolsleft ;
+	    p += UNITS (Int, nrowsleft + ncolsleft) ;
+	    C2 = (Entry *) p ;
+
+	    ASSERT (epdest >= epsrc) ;
+	    ASSERT (Rows2 >= Rows) ;
+	    ASSERT (Cols2 >= Cols) ;
+	    ASSERT (C2 >= C) ;
+	    ASSERT (p + UNITS (Entry, csize) == pnext) ;
+
+	    /* -------------------------------------------------------------- */
+	    /* move the contribution block */
+	    /* -------------------------------------------------------------- */
+
+	    /* overlap = psrc + size + 1 > pdest ; */
+
+	    if (nrowsleft < nrows || ncolsleft < ncols)
+	    {
+
+		/* ---------------------------------------------------------- */
+		/* compress contribution block in place prior to moving it */
+		/* ---------------------------------------------------------- */
+
+		DEBUG7 (("Compress C in place prior to move:\n"));
+#ifndef NDEBUG
+		UMF_dump_dense (C, nrows, nrows, ncols) ;
+#endif
+		C1 = C ;
+		C3 = C ;
+		for (j = 0 ; j < ncols ; j++)
+		{
+		    if (Cols [j] >= 0)
+		    {
+			for (i = 0 ; i < nrows ; i++)
+			{
+			    if (Rows [i] >= 0)
+			    {
+				*C3++ = C1 [i] ;
+			    }
+			}
+		    }
+		    C1 += nrows ;
+		}
+		ASSERT (C3-C == csize) ;
+		DEBUG8 (("Newly compressed contrib. block (all in use):\n")) ;
+#ifndef NDEBUG
+		UMF_dump_dense (C, nrowsleft, nrowsleft, ncolsleft) ;
+#endif
+	    }
+
+	    /* shift the contribution block down */
+	    C += csize ;
+	    C2 += csize ;
+	    for (i = 0 ; i < csize ; i++)
+	    {
+		*--C2 = *--C ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* move the row indices */
+	    /* -------------------------------------------------------------- */
+
+	    i2 = nrowsleft ;
+	    for (i = nrows - 1 ; i >= 0 ; i--)
+	    {
+		ASSERT (Rows2+i2 >= Rows+i) ;
+		if (Rows [i] >= 0)
+		{
+		    Rows2 [--i2] = Rows [i] ;
+		}
+	    }
+	    ASSERT (i2 == 0) ;
+
+	    j2 = ncolsleft ;
+	    for (j = ncols - 1 ; j >= 0 ; j--)
+	    {
+		ASSERT (Cols2+j2 >= Cols+j) ;
+		if (Cols [j] >= 0)
+		{
+		    Cols2 [--j2] = Cols [j] ;
+		}
+	    }
+	    ASSERT (j2 == 0) ;
+
+	    /* -------------------------------------------------------------- */
+	    /* construct the new header */
+	    /* -------------------------------------------------------------- */
+
+	    /* E [0...e] is now valid */
+	    E [e] = (pdest + 1) - Numeric->Memory ;
+	    epdest = (Element *) (pdest + 1) ;
+
+	    epdest->next = EMPTY ;	/* destroys the son list */
+	    epdest->ncols = ncolsleft ;
+	    epdest->nrows = nrowsleft ;
+	    epdest->ncolsleft = ncolsleft ;
+	    epdest->nrowsleft = nrowsleft ;
+	    epdest->rdeg = rdeg ;
+	    epdest->cdeg = cdeg ;
+
+	    ASSERT (size2 <= size) ;
+	    pdest->header.prevsize = 0 ;
+	    pdest->header.size = size2 ;
+
+	    DEBUG7 (("After moving it:\n")) ;
+#ifndef NDEBUG
+	    UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+	}
+
+#ifndef NDEBUG
+	else
+	{
+	    DEBUG8 ((" free\n")) ;
+	}
+#endif
+	DEBUG7 (("psrc "ID"  tail "ID"\n",
+	(Int) (psrc-Numeric->Memory), Numeric->itail)) ;
+    }
+
+    ASSERT (psrc == Numeric->Memory + Numeric->itail) ;
+    ASSERT (nmark == 0) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* final tail pointer */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (pdest >= Numeric->Memory + Numeric->itail) ;
+    Numeric->itail = pdest - Numeric->Memory ;
+    pdest->header.prevsize = 0 ;
+    Numeric->ibig = EMPTY ;
+    Numeric->tail_usage = Numeric->size - Numeric->itail ;
+
+    /* ---------------------------------------------------------------------- */
+    /* clear the unused E [nel+1 .. Work->elen - 1] */
+    /* ---------------------------------------------------------------------- */
+
+    for (e = nel+1 ; e < Work->elen ; e++)
+    {
+	E [e] = 0 ;
+    }
+
+#ifndef NDEBUG
+    UMF_dump_packed_memory (Numeric, Work) ;
+#endif
+
+    DEBUG8 (("::::GARBAGE COLLECTION DONE::::\n")) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_garbage_collection.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,14 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_garbage_collection
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int drnew,
+    Int dcnew,
+    Int do_Fcpos
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,222 @@
+/* ========================================================================== */
+/* === UMF_get_memory ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Reallocate the workspace (Numeric->Memory) and shift elements downwards.
+    needunits: increase in size so that the free space is at least this many
+    Units (to which the tuple lengths is added).
+
+    Return TRUE if successful, FALSE if out of memory.
+*/
+
+#include "umf_internal.h"
+#include "umf_garbage_collection.h"
+#include "umf_tuple_lengths.h"
+#include "umf_build_tuples.h"
+#include "umf_mem_free_tail_block.h"
+#include "umf_realloc.h"
+
+GLOBAL Int UMF_get_memory
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int needunits,
+    Int r2,		/* compact current front to r2-by-c2 */
+    Int c2,
+    Int do_Fcpos
+)
+{
+    double nsize, bsize, tsize ;
+    Int i, minsize, newsize, newmem, costly, row, col, *Row_tlen, *Col_tlen,
+	n_row, n_col, *Row_degree, *Col_degree ;
+    Unit *mnew, *p ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get and check parameters */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG1 (("::::GET MEMORY::::\n")) ;
+    UMF_dump_memory (Numeric) ;
+#endif
+
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_tlen   = Numeric->Uilen ;
+    Col_tlen   = Numeric->Lilen ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize the tuple list lengths */
+    /* ---------------------------------------------------------------------- */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	if (NON_PIVOTAL_ROW (row))
+	{
+	    Row_tlen [row] = 0 ;
+	}
+    }
+    for (col = 0 ; col < n_col ; col++)
+    {
+	if (NON_PIVOTAL_COL (col))
+	{
+	    Col_tlen [col] = 0 ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* determine how much memory is needed for the tuples */
+    /* ---------------------------------------------------------------------- */
+
+    nsize = (double) needunits + 2 ;
+    needunits += UMF_tuple_lengths (Numeric, Work, &tsize) ;
+    nsize += tsize ;
+    needunits += 2 ;	/* add 2, so that newmem >= 2 is true if realloc'd */
+
+    /* note: Col_tlen and Row_tlen are updated, but the tuple lists */
+    /* themselves are not.  Do not attempt to scan the tuple lists. */
+    /* They are now stale, and are about to be destroyed and recreated. */
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the desired new size of memory */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG0 (("UMF_get_memory: needunits: "ID"\n", needunits)) ;
+
+    minsize = Numeric->size + needunits ;
+    nsize += (double) Numeric->size ;
+
+    bsize = ((double) Int_MAX) / sizeof (Unit) - 1 ;
+
+    newsize = (Int) (UMF_REALLOC_INCREASE * ((double) minsize)) ;
+    nsize *= UMF_REALLOC_INCREASE ;
+    nsize += 1 ;
+
+    if (newsize < 0 || nsize > bsize)
+    {
+	/* :: realloc Numeric->Memory int overflow :: */
+	DEBUGm3 (("Realloc hit integer limit\n")) ;
+	newsize = (Int) bsize ;	/* we cannot increase the size beyond bsize */
+    }
+    else
+    {
+	ASSERT (newsize <= nsize) ;
+	newsize = MAX (newsize, minsize) ;
+    }
+    newsize = MAX (newsize, Numeric->size) ;
+
+    DEBUG0 ((
+    "REALLOC MEMORY: needunits "ID" old size: "ID" new size: "ID" Units \n",
+	needunits, Numeric->size, newsize)) ;
+
+    /* Forget where the biggest free block is (we no longer need it) */
+    /* since garbage collection will occur shortly. */
+    Numeric->ibig = EMPTY ;
+
+    DEBUG0 (("Before realloc E [0] "ID"\n", Work->E [0])) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* reallocate the memory, if possible, and make it bigger */
+    /* ---------------------------------------------------------------------- */
+
+    mnew = (Unit *) NULL ;
+    while (!mnew)
+    {
+	mnew = (Unit *) UMF_realloc (Numeric->Memory, newsize, sizeof (Unit)) ;
+	if (!mnew)
+	{
+	    if (newsize == minsize)	/* last realloc attempt failed */
+	    {
+		/* We failed to get the minimum.  Just stick with the */
+		/* current allocation and hope that garbage collection */
+		/* can recover enough space. */
+		mnew = Numeric->Memory ;	/* no new memory available */
+		newsize = Numeric->size ;
+	    }
+	    else
+	    {
+		/* otherwise, reduce the request and keep trying */
+		newsize = (Int) (UMF_REALLOC_REDUCTION * ((double) newsize)) ;
+		newsize = MAX (minsize, newsize) ;
+	    }
+	}
+    }
+    ASSERT (mnew != (Unit *) NULL) ;
+
+    /* see if realloc had to copy, rather than just extend memory */
+    costly = (mnew != Numeric->Memory) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* extend the tail portion of memory downwards */
+    /* ---------------------------------------------------------------------- */
+
+    Numeric->Memory = mnew ;
+    if (Work->E [0])
+    {
+	Int nb, dr, dc ;
+	nb = Work->nb ;
+	dr = Work->fnr_curr ;
+	dc = Work->fnc_curr ;
+	Work->Flublock = (Entry *) (Numeric->Memory + Work->E [0]) ;
+	Work->Flblock  = Work->Flublock + nb * nb ;
+	Work->Fublock  = Work->Flblock  + dr * nb ;
+	Work->Fcblock  = Work->Fublock  + nb * dc ;
+	DEBUG0 (("after realloc E [0] "ID"\n", Work->E [0])) ;
+    }
+    ASSERT (IMPLIES (!(Work->E [0]), Work->Flublock == (Entry *) NULL)) ;
+
+    newmem = newsize - Numeric->size ;
+    ASSERT (newmem == 0 || newmem >= 2) ;
+
+    if (newmem >= 2)
+    {
+	/* reallocation succeeded */
+
+	/* point to the old tail marker block of size 1 + header */
+	p = Numeric->Memory + Numeric->size - 2 ;
+
+	/* create a new block out of the newly extended memory */
+	p->header.size = newmem - 1 ;
+	i = Numeric->size - 1 ;
+	p += newmem ;
+
+	/* create a new tail marker block */
+	p->header.prevsize = newmem - 1 ;
+	p->header.size = 1 ;
+
+	Numeric->size = newsize ;
+
+	/* free the new block */
+	UMF_mem_free_tail_block (Numeric, i) ;
+
+	Numeric->nrealloc++ ;
+
+	if (costly)
+	{
+	    Numeric->ncostly++ ;
+	}
+
+    }
+    DEBUG1 (("Done with realloc memory\n")) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* garbage collection on the tail of Numeric->memory (destroys tuples) */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_garbage_collection (Numeric, Work, r2, c2, do_Fcpos) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* rebuild the tuples */
+    /* ---------------------------------------------------------------------- */
+
+    return (UMF_build_tuples (Numeric, Work)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_get_memory.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,15 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_get_memory
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    Int needunits,
+    Int r2,
+    Int c2,
+    Int do_Fcpos
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,293 @@
+/* ========================================================================== */
+/* === UMF_grow_front ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Current frontal matrix is too small.  Make it bigger. */
+
+#include "umf_internal.h"
+#include "umf_mem_free_tail_block.h"
+#include "umf_mem_alloc_tail_block.h"
+#include "umf_get_memory.h"
+
+GLOBAL Int UMF_grow_front
+(
+    NumericType *Numeric,
+    Int fnr2,		/* desired size is fnr2-by-fnc2 */
+    Int fnc2,
+    WorkType *Work,
+    Int do_what		/* -1: UMF_start_front
+			 * 0:  UMF_init_front, do not recompute Fcpos
+			 * 1:  UMF_extend_front
+			 * 2:  UMF_init_front, recompute Fcpos */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double s ;
+    Entry *Fcold, *Fcnew ;
+    Int j, i, col, *Fcpos, *Fcols, fnrows_max, fncols_max, fnr_curr, nb,
+	fnrows_new, fncols_new, fnr_min, fnc_min, minsize,
+	newsize, fnrows, fncols, *E, eloc ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    if (do_what != -1) UMF_debug++ ;
+    DEBUG0 (("\n\n====================GROW FRONT: do_what: "ID"\n", do_what)) ;
+    if (do_what != -1) UMF_debug-- ;
+    ASSERT (Work->do_grow) ;
+    ASSERT (Work->fnpiv == 0) ;
+#endif
+
+    Fcols = Work->Fcols ;
+    Fcpos = Work->Fcpos ;
+    E = Work->E ;
+
+    /* ---------------------------------------------------------------------- */
+    /* The current front is too small, find the new size */
+    /* ---------------------------------------------------------------------- */
+
+    /* maximum size of frontal matrix for this chain */
+    nb = Work->nb ;
+    fnrows_max = Work->fnrows_max + nb ;
+    fncols_max = Work->fncols_max + nb ;
+    ASSERT (fnrows_max >= 0 && (fnrows_max % 2) == 1) ;
+    DEBUG0 (("Max     size: "ID"-by-"ID" (incl. "ID" pivot block\n",
+	fnrows_max, fncols_max, nb)) ;
+
+    /* current dimensions of frontal matrix: fnr-by-fnc */
+    DEBUG0 (("Current : "ID"-by-"ID" (excl "ID" pivot blocks)\n",
+		Work->fnr_curr, Work->fnc_curr, nb)) ;
+    ASSERT (Work->fnr_curr >= 0) ;
+    ASSERT ((Work->fnr_curr % 2 == 1) || Work->fnr_curr == 0) ;
+
+    /* required dimensions of frontal matrix: fnr_min-by-fnc_min */
+    fnrows_new = Work->fnrows_new + 1 ;
+    fncols_new = Work->fncols_new + 1 ;
+    ASSERT (fnrows_new >= 0) ;
+    if (fnrows_new % 2 == 0) fnrows_new++ ;
+    fnrows_new += nb ;
+    fncols_new += nb ;
+    fnr_min = MIN (fnrows_new, fnrows_max) ;
+    fnc_min = MIN (fncols_new, fncols_max) ;
+    minsize = fnr_min * fnc_min ;
+    if (INT_OVERFLOW ((double) fnr_min * (double) fnc_min * sizeof (Entry)))
+    {
+	/* :: the minimum front size is bigger than the integer maximum :: */
+	return (FALSE) ;
+    }
+    ASSERT (fnr_min >= 0) ;
+    ASSERT (fnr_min % 2 == 1) ;
+
+    DEBUG0 (("Min     : "ID"-by-"ID"\n", fnr_min, fnc_min)) ;
+
+    /* grow the front to fnr2-by-fnc2, but no bigger than the maximum,
+     * and no smaller than the minumum. */
+    DEBUG0 (("Desired : ("ID"+"ID")-by-("ID"+"ID")\n", fnr2, nb, fnc2, nb)) ;
+    fnr2 += nb ;
+    fnc2 += nb ;
+    ASSERT (fnr2 >= 0) ;
+    if (fnr2 % 2 == 0) fnr2++ ;
+    fnr2 = MAX (fnr2, fnr_min) ;
+    fnc2 = MAX (fnc2, fnc_min) ;
+    fnr2 = MIN (fnr2, fnrows_max) ;
+    fnc2 = MIN (fnc2, fncols_max) ;
+    DEBUG0 (("Try     : "ID"-by-"ID"\n", fnr2, fnc2)) ;
+    ASSERT (fnr2 >= 0) ;
+    ASSERT (fnr2 % 2 == 1) ;
+
+    s = ((double) fnr2) * ((double) fnc2) ;
+    if (INT_OVERFLOW (s * sizeof (Entry)))
+    {
+	/* :: frontal matrix size int overflow :: */
+	/* the desired front size is bigger than the integer maximum */
+	/* compute a such that a*a*s < Int_MAX / sizeof (Entry) */
+	double a = 0.9 * sqrt ((Int_MAX / sizeof (Entry)) / s) ;
+	fnr2 = MAX (fnr_min, a * fnr2) ;
+	fnc2 = MAX (fnc_min, a * fnc2) ;
+	/* the new frontal size is a*r*a*c = a*a*s */
+	newsize = fnr2 * fnc2 ;
+	ASSERT (fnr2 >= 0) ;
+	if (fnr2 % 2 == 0) fnr2++ ;
+	fnc2 = newsize / fnr2 ;
+    }
+
+    fnr2 = MAX (fnr2, fnr_min) ;
+    fnc2 = MAX (fnc2, fnc_min) ;
+    newsize = fnr2 * fnc2 ;
+
+    ASSERT (fnr2 >= 0) ;
+    ASSERT (fnr2 % 2 == 1) ;
+    ASSERT (fnr2 >= fnr_min) ;
+    ASSERT (fnc2 >= fnc_min) ;
+    ASSERT (newsize >= minsize) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the current front if it is empty of any numerical values */
+    /* ---------------------------------------------------------------------- */
+
+    if (E [0] && do_what != 1)
+    {
+	/* free the current front, if it exists and has nothing in it */
+	DEBUG0 (("Freeing empty front\n")) ;
+	UMF_mem_free_tail_block (Numeric, E [0]) ;
+	E [0] = 0 ;
+	Work->Flublock = (Entry *) NULL ;
+	Work->Flblock  = (Entry *) NULL ;
+	Work->Fublock  = (Entry *) NULL ;
+	Work->Fcblock  = (Entry *) NULL ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the new front, doing garbage collection if necessary */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_allocfail = FALSE ;
+    if (UMF_gprob > 0)  /* a double relop, but ignore NaN case */
+    {
+	double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ;
+	DEBUG1 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+	UMF_allocfail = rrr < UMF_gprob ;
+	if (UMF_allocfail) DEBUGm2 (("Random garbage collection (grow)\n")) ;
+    }
+#endif
+
+    DEBUG0 (("Attempt size: "ID"-by-"ID"\n", fnr2, fnc2)) ;
+    eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ;
+
+    if (!eloc)
+    {
+	/* Do garbage collection, realloc, and try again. Compact the current
+	 * contribution block in the front to fnrows-by-fncols.  Note that
+	 * there are no pivot rows/columns in current front.  Do not recompute
+	 * Fcpos in UMF_garbage_collection. */
+	DEBUGm3 (("get_memory from umf_grow_front\n")) ;
+	if (!UMF_get_memory (Numeric, Work, 1 + UNITS (Entry, newsize),
+	    Work->fnrows, Work->fncols, FALSE))
+	{
+	    /* :: out of memory in umf_grow_front :: */
+	    return (FALSE) ;	/* out of memory */
+	}
+	DEBUG0 (("Attempt size: "ID"-by-"ID" again\n", fnr2, fnc2)) ;
+	eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ;
+    }
+
+    /* try again with something smaller */
+    while ((fnr2 != fnr_min || fnc2 != fnc_min) && !eloc)
+    {
+	fnr2 = MIN (fnr2 - 2, fnr2 * UMF_REALLOC_REDUCTION) ;
+	fnc2 = MIN (fnc2 - 2, fnc2 * UMF_REALLOC_REDUCTION) ;
+	ASSERT (fnr_min >= 0) ;
+	ASSERT (fnr_min % 2 == 1) ;
+	fnr2 = MAX (fnr_min, fnr2) ;
+	fnc2 = MAX (fnc_min, fnc2) ;
+	ASSERT (fnr2 >= 0) ;
+	if (fnr2 % 2 == 0) fnr2++ ;
+	newsize = fnr2 * fnc2 ;
+	DEBUGm3 (("Attempt smaller size: "ID"-by-"ID" minsize "ID"-by-"ID"\n",
+	    fnr2, fnc2, fnr_min, fnc_min)) ;
+	eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ;
+    }
+
+    /* try again with the smallest possible size */
+    if (!eloc)
+    {
+	fnr2 = fnr_min ;
+	fnc2 = fnc_min ;
+	newsize = minsize ;
+	DEBUG0 (("Attempt minsize: "ID"-by-"ID"\n", fnr2, fnc2)) ;
+	eloc = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry, newsize)) ;
+    }
+
+    if (!eloc)
+    {
+	/* out of memory */
+	return (FALSE) ;
+    }
+
+    ASSERT (fnr2 >= 0) ;
+    ASSERT (fnr2 % 2 == 1) ;
+    ASSERT (fnr2 >= fnr_min && fnc2 >= fnc_min) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* copy the old frontal matrix into the new one */
+    /* ---------------------------------------------------------------------- */
+
+    /* old contribution block (if any) */
+    fnr_curr = Work->fnr_curr ;	    /* garbage collection can change fn*_curr */
+    ASSERT (fnr_curr >= 0) ;
+    ASSERT ((fnr_curr % 2 == 1) || fnr_curr == 0) ;
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    Fcold = Work->Fcblock ;
+
+    /* remove nb from the sizes */
+    fnr2 -= nb ;
+    fnc2 -= nb ;
+
+    /* new frontal matrix */
+    Work->Flublock = (Entry *) (Numeric->Memory + eloc) ;
+    Work->Flblock  = Work->Flublock + nb * nb ;
+    Work->Fublock  = Work->Flblock  + nb * fnr2 ;
+    Work->Fcblock  = Work->Fublock  + nb * fnc2 ;
+    Fcnew = Work->Fcblock ;
+
+    if (E [0])
+    {
+	/* copy the old contribution block into the new one */
+	for (j = 0 ; j < fncols ; j++)
+	{
+	    col = Fcols [j] ;
+	    DEBUG1 (("copy col "ID" \n",col)) ;
+	    ASSERT (col >= 0 && col < Work->n_col) ;
+	    for (i = 0 ; i < fnrows ; i++)
+	    {
+		Fcnew [i] = Fcold [i] ;
+	    }
+	    Fcnew += fnr2 ;
+	    Fcold += fnr_curr ;
+	    DEBUG1 (("new offset col "ID" "ID"\n",col, j * fnr2)) ;
+	    Fcpos [col] = j * fnr2 ;
+	}
+    }
+    else if (do_what == 2)
+    {
+	/* just find the new column offsets */
+	for (j = 0 ; j < fncols ; j++)
+	{
+	    col = Fcols [j] ;
+	    DEBUG1 (("new offset col "ID" "ID"\n",col, j * fnr2)) ;
+	    Fcpos [col] = j * fnr2 ;
+	}
+    }
+
+    /* free the old frontal matrix */
+    UMF_mem_free_tail_block (Numeric, E [0]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* new frontal matrix size */
+    /* ---------------------------------------------------------------------- */
+
+    E [0] = eloc ;
+    Work->fnr_curr = fnr2 ;	    /* C block is fnr2-by-fnc2 */
+    Work->fnc_curr = fnc2 ;
+    Work->fcurr_size = newsize ;    /* including LU, L, U, and C blocks */
+    Work->do_grow = FALSE ;	    /* the front has just been grown */
+
+    ASSERT (Work->fnr_curr >= 0) ;
+    ASSERT (Work->fnr_curr % 2 == 1) ;
+    DEBUG0 (("Newly grown front: "ID"+"ID" by "ID"+"ID"\n", Work->fnr_curr,
+	nb, Work->fnc_curr, nb)) ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_grow_front.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,14 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_grow_front
+(
+    NumericType *Numeric,
+    Int fnr2,
+    Int fnc2,
+    WorkType *Work,
+    Int do_what
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_init_front.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,267 @@
+/* ========================================================================== */
+/* === UMF_init_front ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_internal.h"
+#include "umf_grow_front.h"
+
+/* ========================================================================== */
+/* === zero_init_front ====================================================== */
+/* ========================================================================== */
+
+/* Set the initial frontal matrix to zero. */
+
+PRIVATE void zero_init_front (Int m, Int n, Entry *Fcblock, Int d)
+{
+    Int i, j ;
+    Entry *F, *Fj = Fcblock ;
+    for (j = 0 ; j < m ; j++)
+    {
+	F = Fj ;
+	Fj += d ;
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* CLEAR (Fcblock [i + j*d]) ; */
+	    CLEAR (*F) ;
+	    F++ ;
+	}
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_init_front ======================================================= */
+/* ========================================================================== */
+
+GLOBAL Int UMF_init_front
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int i, j, fnr_curr, row, col, *Frows, *Fcols,
+	*Fcpos, *Frpos, fncols, fnrows, *Wrow, fnr2, fnc2, rrdeg, ccdeg, *Wm,
+	fnrows_extended ;
+    Entry *Fcblock, *Fl, *Wy, *Wx ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get current frontal matrix and check for frontal growth */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG0 (("INIT FRONT\n")) ;
+    DEBUG1 (("CURR before init:\n")) ;
+    UMF_dump_current_front (Numeric, Work, FALSE) ;
+#endif
+    if (Work->do_grow)
+    {
+	fnr2 = UMF_FRONTAL_GROWTH * Work->fnrows_new + 2 ;
+	fnc2 = UMF_FRONTAL_GROWTH * Work->fncols_new + 2 ;
+	if (!UMF_grow_front (Numeric, fnr2, fnc2, Work,
+	    Work->pivrow_in_front ? 2 : 0))
+	{
+	    /* :: out of memory in umf_init_front :: */
+	    DEBUGm4 (("out of memory: init front\n")) ;
+	    return (FALSE) ;
+	}
+    }
+#ifndef NDEBUG
+    DEBUG1 (("CURR after grow:\n")) ;
+    UMF_dump_current_front (Numeric, Work, FALSE) ;
+    DEBUG1 (("fnrows new "ID" fncols new "ID"\n",
+	Work->fnrows_new, Work->fncols_new)) ;
+#endif
+    ASSERT (Work->fnpiv == 0) ;
+    fnr_curr = Work->fnr_curr ;
+    ASSERT (Work->fnrows_new + 1 <= fnr_curr) ;
+    ASSERT (Work->fncols_new + 1 <= Work->fnc_curr) ;
+    ASSERT (fnr_curr >= 0) ;
+    ASSERT (fnr_curr % 2 == 1) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    /* current front is defined by pivot row and column */
+
+    Frows = Work->Frows ;
+    Fcols = Work->Fcols ;
+    Frpos = Work->Frpos ;
+    Fcpos = Work->Fcpos ;
+
+    Work->fnzeros = 0 ;
+
+    ccdeg = Work->ccdeg ;
+    rrdeg = Work->rrdeg ;
+
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+
+    /* if both pivrow and pivcol are in front, then we extend the old one */
+    /* in UMF_extend_front, rather than starting a new one here. */
+    ASSERT (! (Work->pivrow_in_front && Work->pivcol_in_front)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* place pivot column pattern in frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    Fl = Work->Flblock ;
+
+    if (Work->pivcol_in_front)
+    {
+	/* Append the pivot column extension.
+	 * Note that all we need to do is increment the size, since the
+	 * candidate pivot column pattern is already in place in
+	 * Frows [0 ... fnrows-1] (the old pattern), and
+	 * Frows [fnrows ... fnrows + Work->ccdeg - 1] (the new
+	 * pattern).  Frpos is also properly defined. */
+	/* make a list of the new rows to scan */
+	Work->fscan_row = fnrows ;	/* only scan the new rows */
+	Work->NewRows = Work->Wrp ;
+	Wy = Work->Wy ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    Fl [i] = Wy [i] ;
+	}
+	fnrows_extended = fnrows + ccdeg ;
+	for (i = fnrows ; i < fnrows_extended ; i++)
+	{
+	    Fl [i] = Wy [i] ;
+	    /* flip the row index, since Wrp must be < 0 */
+	    row = Frows [i] ;
+	    Work->NewRows [i] = FLIP (row) ;
+	}
+	fnrows = fnrows_extended ;
+    }
+    else
+    {
+	/* this is a completely new column */
+	Work->fscan_row = 0 ;			/* scan all the rows */
+	Work->NewRows = Frows ;
+	Wm = Work->Wm ;
+	Wx = Work->Wx ;
+	for (i = 0 ; i < ccdeg ; i++)
+	{
+	    Fl [i] = Wx [i] ;
+	    row = Wm [i] ;
+	    Frows [i] = row ;
+	    Frpos [row] = i ;
+	}
+	fnrows = ccdeg ;
+    }
+
+    Work->fnrows = fnrows ;
+
+#ifndef NDEBUG
+    DEBUG3 (("New Pivot col "ID" now in front, length "ID"\n",
+	Work->pivcol, fnrows)) ;
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	DEBUG4 ((" "ID": row "ID"\n", i, Frows [i])) ;
+	ASSERT (Frpos [Frows [i]] == i) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* place pivot row pattern in frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    Wrow = Work->Wrow ;
+    if (Work->pivrow_in_front)
+    {
+	/* append the pivot row extension */
+	Work->fscan_col = fncols ;	/* only scan the new columns */
+	Work->NewCols = Work->Wp ;
+#ifndef NDEBUG
+	for (j = 0 ; j < fncols ; j++)
+	{
+	    col = Fcols [j] ;
+	    ASSERT (col >= 0 && col < Work->n_col) ;
+	    ASSERT (Fcpos [col] == j * fnr_curr) ;
+	}
+#endif
+	/* Wrow == Fcol for the IN_IN case, and for the OUT_IN case when
+	 * the pivrow [IN][IN] happens to be the same as pivrow [OUT][IN].
+	 * See UMF_local_search for more details. */
+	ASSERT (IMPLIES (Work->pivcol_in_front, Wrow == Fcols)) ;
+	if (Wrow == Fcols)
+	{
+	    for (j = fncols ; j < rrdeg ; j++)
+	    {
+		col = Wrow [j] ;
+		/* Fcols [j] = col ; not needed */
+		/* flip the col index, since Wp must be < 0 */
+		Work->NewCols [j] = FLIP (col) ;
+		Fcpos [col] = j * fnr_curr ;
+	    }
+	}
+	else
+	{
+	    for (j = fncols ; j < rrdeg ; j++)
+	    {
+		col = Wrow [j] ;
+		Fcols [j] = col ;
+		/* flip the col index, since Wp must be < 0 */
+		Work->NewCols [j] = FLIP (col) ;
+		Fcpos [col] = j * fnr_curr ;
+	    }
+	}
+    }
+    else
+    {
+	/* this is a completely new row */
+	Work->fscan_col = 0 ;			/* scan all the columns */
+	Work->NewCols = Fcols ;
+	for (j = 0 ; j < rrdeg ; j++)
+	{
+	    col = Wrow [j] ;
+	    Fcols [j] = col ;
+	    Fcpos [col] = j * fnr_curr ;
+	}
+    }
+
+    DEBUGm1 (("rrdeg "ID" fncols "ID"\n", rrdeg, fncols)) ;
+    fncols = rrdeg ;
+    Work->fncols = fncols ;
+
+    /* ---------------------------------------------------------------------- */
+    /* clear the frontal matrix */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (fnrows == Work->fnrows_new + 1) ;
+    ASSERT (fncols == Work->fncols_new + 1) ;
+
+    Fcblock = Work->Fcblock ;
+    ASSERT (Fcblock != (Entry *) NULL) ;
+
+    zero_init_front (fncols, fnrows, Fcblock, fnr_curr) ;
+
+#ifndef NDEBUG
+    DEBUG3 (("New Pivot row "ID" now in front, length "ID" fnr_curr "ID"\n",
+		Work->pivrow, fncols, fnr_curr)) ;
+    for (j = 0 ; j < fncols ; j++)
+    {
+	DEBUG4 (("col "ID" position "ID"\n", j, Fcols [j])) ;
+	ASSERT (Fcpos [Fcols [j]] == j * fnr_curr) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* current workspace usage: */
+    /* ---------------------------------------------------------------------- */
+
+    /* Fcblock [0..fnr_curr-1, 0..fnc_curr-1]: space for the new frontal
+     * matrix.  Fcblock (i,j) is located at Fcblock [i+j*fnr_curr] */
+
+    return (TRUE) ;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_init_front.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_init_front
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_internal.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,760 @@
+/* ========================================================================== */
+/* === umf_internal.h ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This file is for internal use in UMFPACK itself, and should not be included
+    in user code.  Use umfpack.h instead.  User-accessible file names and
+    routine names all start with the letters "umfpack_".  Non-user-accessible
+    file names and routine names all start with "umf_".
+*/
+
+#ifndef _UMF_INTERNAL
+#define _UMF_INTERNAL
+
+/* -------------------------------------------------------------------------- */
+/* ANSI standard include files */
+/* -------------------------------------------------------------------------- */
+
+/* from float.h:  DBL_EPSILON */
+#include <float.h>
+
+/* from string.h: strcmp */
+#include <string.h>
+
+/* when debugging, assert.h and the assert macro are used (see umf_dump.h) */
+
+/* -------------------------------------------------------------------------- */
+/* Architecture */
+/* -------------------------------------------------------------------------- */
+
+#if defined (__sun) || defined (MSOL2) || defined (ARCH_SOL2)
+#define UMF_SOL2
+#define UMFPACK_ARCHITECTURE "Sun Solaris"
+
+#elif defined (__sgi) || defined (MSGI) || defined (ARCH_SGI)
+#define UMF_SGI
+#define UMFPACK_ARCHITECTURE "SGI Irix"
+
+#elif defined (__linux) || defined (MGLNX86) || defined (ARCH_GLNX86)
+#define UMF_LINUX
+#define UMFPACK_ARCHITECTURE "Linux"
+
+#elif defined (_AIX) || defined (MIBM_RS) || defined (ARCH_IBM_RS)
+#define UMF_AIX
+#define UMFPACK_ARCHITECTURE "IBM AIX"
+
+#elif defined (__alpha) || defined (MALPHA) || defined (ARCH_ALPHA)
+#define UMF_ALPHA
+#define UMFPACK_ARCHITECTURE "Compaq Alpha"
+
+#elif defined (__WIN32) || defined (_WIN32) || defined (_win32) || defined (__win32) || defined (WIN32)
+#define UMF_WINDOWS
+#define UMFPACK_ARCHITECTURE "Microsoft Windows"
+
+#elif defined (__hppa) || defined (__hpux) || defined (MHPUX) || defined (ARCH_HPUX)
+#define UMF_HP
+#define UMFPACK_ARCHITECTURE "HP Unix"
+
+#elif defined (__hp700) || defined (MHP700) || defined (ARCH_HP700)
+#define UMF_HP
+#define UMFPACK_ARCHITECTURE "HP 700 Unix"
+
+#else
+/* If the architecture is unknown, and you call the BLAS, you may need to */
+/* define BLAS_BY_VALUE, BLAS_NO_UNDERSCORE, and/or BLAS_CHAR_ARG yourself. */
+#define UMFPACK_ARCHITECTURE "unknown"
+#endif
+
+
+/* -------------------------------------------------------------------------- */
+/* basic definitions (see also amd_internal.h) */
+/* -------------------------------------------------------------------------- */
+
+#define ONES_COMPLEMENT(r) (-(r)-1)
+
+/* -------------------------------------------------------------------------- */
+/* AMD include file */
+/* -------------------------------------------------------------------------- */
+
+/* stdio.h, stdlib.h, limits.h, and math.h, NDEBUG definition,
+ * assert.h, and MATLAB include files */
+#include "amd_internal.h"
+
+/* -------------------------------------------------------------------------- */
+/* Real/complex and int/long definitions, double relops */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_version.h"
+
+/* -------------------------------------------------------------------------- */
+/* Compile-time configurations */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_config.h"
+
+/* -------------------------------------------------------------------------- */
+/* umfpack include file */
+/* -------------------------------------------------------------------------- */
+
+#include "umfpack.h"
+
+/* -------------------------------------------------------------------------- */
+/* for contents of Info.  This must correlate with umfpack.h */
+/* -------------------------------------------------------------------------- */
+
+#define ESTIMATE (UMFPACK_NUMERIC_SIZE_ESTIMATE - UMFPACK_NUMERIC_SIZE)
+#define ACTUAL 0
+
+/* -------------------------------------------------------------------------- */
+/* get a parameter from the Control array */
+/* -------------------------------------------------------------------------- */
+
+#define GET_CONTROL(i,default) \
+    ((Control != (double *) NULL) ? \
+	(SCALAR_IS_NAN (Control [i]) ? default : Control [i]) \
+	: default)
+
+/* -------------------------------------------------------------------------- */
+/* for clearing the external degree counters */
+/* -------------------------------------------------------------------------- */
+
+#define MAX_MARK(n) Int_MAX - (2*(n)+1)
+
+/* -------------------------------------------------------------------------- */
+/* convert number of Units to MBytes */
+/* -------------------------------------------------------------------------- */
+
+#define MBYTES(units) (((units) * sizeof (Unit)) / 1048576.0)
+
+/* -------------------------------------------------------------------------- */
+/* dense row/column macro */
+/* -------------------------------------------------------------------------- */
+
+/* In order for a row or column to be treated as "dense", it must have more */
+/* entries than the value returned by this macro.  n is the dimension of the */
+/* matrix, and alpha is the dense row/column control parameter. */
+
+/* Note: this is not defined if alpha is NaN or Inf: */
+#define UMFPACK_DENSE_DEGREE_THRESHOLD(alpha,n) \
+    ((Int) MAX (16.0, (alpha) * 16.0 * sqrt ((double) (n))))
+
+/* -------------------------------------------------------------------------- */
+/* PRINTF */
+/* -------------------------------------------------------------------------- */
+
+#define PRINTFk(k,params) { if (prl >= (k)) { PRINTF (params) ; } }
+#define PRINTF1(params) PRINTFk (1, params)
+#define PRINTF2(params) PRINTFk (2, params)
+#define PRINTF3(params) PRINTFk (3, params)
+#define PRINTF4(params) PRINTFk (4, params)
+#define PRINTF5(params) PRINTFk (5, params)
+#define PRINTF6(params) PRINTFk (6, params)
+
+/* -------------------------------------------------------------------------- */
+/* Fixed control parameters */
+/* -------------------------------------------------------------------------- */
+
+/* maximum number of columns to consider at one time, in a single front */
+#define MAX_CANDIDATES 128
+
+/* reduce Numeric->Memory request by this ratio, if allocation fails */
+#define UMF_REALLOC_REDUCTION (0.95)
+
+/* increase Numeric->Memory request by this ratio, if we need more */
+#define UMF_REALLOC_INCREASE (1.2)
+
+/* increase the dimensions of the current frontal matrix by this factor
+ * when it needs to grow. */
+#define UMF_FRONTAL_GROWTH (1.2)
+
+/* largest BLAS block size permitted */
+#define MAXNB 64
+
+/* if abs (y) < RECIPROCAL_TOLERANCE, then compute x/y.  Otherwise x*(1/y).
+ * Ignored if NRECIPROCAL is defined */
+#define RECIPROCAL_TOLERANCE 1e-12
+
+/* -------------------------------------------------------------------------- */
+/* Memory allocator */
+/* -------------------------------------------------------------------------- */
+
+/* The MATLAB mexFunction uses MATLAB's memory manager, while the C-callable
+ * AMD library uses the ANSI C malloc, free, and realloc routines.  To use
+ * the mx* memory allocation routines, use -DNUTIL when compiling.
+ */
+
+#undef ALLOCATE
+#undef FREE
+#undef REALLOC
+
+#ifdef MATLAB_MEX_FILE
+
+#ifdef NUTIL
+
+/* These functions simply terminate the mexFunction if they fail to allocate
+ * memory.  That's too restrictive for UMFPACK. */
+#define ALLOCATE mxMalloc
+#define FREE mxFree
+#define REALLOCATE mxRealloc
+
+#else
+
+/* Use internal MATLAB memory allocation routines, used by built-in MATLAB
+ * functions.  These are not documented, but are available for use.  Their
+ * prototypes are in util.h, but that file is not provided to the MATLAB user.
+ * The advantage of using these routines is that they return NULL if out of
+ * memory, instead of terminating the mexFunction.  UMFPACK attempts to allocate
+ * extra space for "elbow room", and then reduces its request if the memory is
+ * not available.  That strategy doesn't work with the mx* routines.
+ */
+void *utMalloc (size_t size) ;
+void utFree (void *p) ;
+void *utRealloc (void *p, size_t size) ;
+#define ALLOCATE utMalloc
+#define FREE utFree
+#define REALLOCATE utRealloc
+
+#endif
+#else
+#ifdef MATHWORKS
+
+/* Compiling as a built-in routine.  Since out-of-memory conditions are checked
+ * after every allocation, we can use ut* routines here. */
+#define ALLOCATE utMalloc
+#define FREE utFree
+#define REALLOCATE utRealloc
+
+#else
+
+/* use the ANSI C memory allocation routines */
+#define ALLOCATE malloc
+#define FREE free
+#define REALLOCATE realloc
+
+#endif
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* Memory space definitions */
+/* -------------------------------------------------------------------------- */
+
+/* for memory alignment - assume double has worst case alignment */
+typedef double Align ;
+
+/* get number of bytes required to hold n items of a type: */
+/* note that this will not overflow, because sizeof (type) is always */
+/* greater than or equal to sizeof (Int) >= 2 */
+#define BYTES(type,n) (sizeof (type) * (n))
+
+/* ceiling of (b/u).  Assumes b >= 0 and u > 0 */
+#define CEILING(b,u) (((b) + (u) - 1) / (u))
+
+/* get number of Units required to hold n items of a type: */
+#define UNITS(type,n) (CEILING (BYTES (type, n), sizeof (Unit)))
+
+/* same as DUNITS, but use double instead of int to avoid overflow */
+#define DUNITS(type,n) (ceil (BYTES (type, (double) n) / sizeof (Unit)))
+
+union Unit_union
+{	/* memory is allocated in multiples of Unit */
+    struct
+    {
+	Int
+	    size,	/* size, in Units, of the block, excl. header block */
+			/* size >= 0: block is in use */
+			/* size < 0: block is free, of |size| Units */
+	    prevsize ;	/* size, in Units, of preceding block in S->Memory */
+			/* during garbage_collection, prevsize is set to -e-1 */
+			/* for element e, or positive (and thus a free block) */
+			/* otherwise */
+    } header ;		/* block header */
+    Align  xxxxxx ;	/* force alignment of blocks (xxxxxx is never used) */
+} ;
+
+typedef union Unit_union Unit ;
+
+/* get the size of an allocated block */
+#define GET_BLOCK_SIZE(p) (((p)-1)->header.size)
+
+/* -------------------------------------------------------------------------- */
+/* Numeric */
+/* -------------------------------------------------------------------------- */
+
+/*
+    NUMERIC_VALID and SYMBOLIC_VALID:
+    The different values of SYBOLIC_VALID and NUMERIC_VALID are chosen as a
+    first defense against corrupted *Symbolic or *Numeric pointers passed to an
+    UMFPACK routine.  They also ensure that the objects are used only by the
+    same version that created them (umfpack_di_*, umfpack_dl_*, umfpack_zi_*,
+    or umfpack_zl_*).  The values have also been changed since prior releases of
+    the code to ensure that all routines that operate on the objects are of the
+    same release.  The values themselves are purely arbitrary.  The are less
+    than the ANSI C required minimums of INT_MAX and LONG_MAX, respectively.
+*/
+
+#ifdef DINT
+#define NUMERIC_VALID  15977
+#define SYMBOLIC_VALID 41937
+#endif
+#ifdef DLONG
+#define NUMERIC_VALID  399789720
+#define SYMBOLIC_VALID 399192713
+#endif
+#ifdef ZINT
+#define NUMERIC_VALID  17957
+#define SYMBOLIC_VALID 40927
+#endif
+#ifdef ZLONG
+#define NUMERIC_VALID  129987754
+#define SYMBOLIC_VALID 110291734
+#endif
+
+typedef struct	/* NumericType */
+{
+    double
+	flops,		/* "true" flop count */
+	relpt,		/* relative pivot tolerance used */
+	relpt2,		/* relative pivot tolerance used for sym. */
+	droptol,
+	alloc_init,	/* initial allocation of Numeric->memory */
+	front_alloc_init, /* frontal matrix allocation parameter */
+	rsmin,		/* smallest row sum */
+	rsmax,		/* largest row sum  */
+	min_udiag,	/* smallest abs value on diagonal of D */
+	max_udiag,	/* smallest abs value on diagonal of D */
+	rcond ;		/* min (D) / max (D) */
+
+    Int
+	scale ;
+
+    Int valid ;		/* set to NUMERIC_VALID, for validity check */
+
+    /* Memory space for A and LU factors */
+    Unit
+	*Memory ;	/* working memory for A and LU factors */
+    Int
+	ihead,		/* pointer to tail of LU factors, in Numeric->Memory */
+	itail,		/* pointer to top of elements & tuples,  */
+			/* in Numeric->Memory */
+	ibig,		/* pointer to largest free block seen in tail */
+	size ;		/* size of Memory, in Units */
+
+    Int
+	*Rperm,		/* pointer to row perm array, size: n+1 */
+			/* after UMF_kernel:  Rperm [new] = old */
+			/* during UMF_kernel: Rperm [old] = new */
+	*Cperm,		/* pointer to col perm array, size: n+1 */
+			/* after UMF_kernel:  Cperm [new] = old */
+			/* during UMF_kernel: Cperm [old] = new */
+
+	*Upos,		/* see UMFPACK_get_numeric for a description */
+	*Lpos,
+	*Lip,
+	*Lilen,
+	*Uip,
+	*Uilen,
+	*Upattern ;	/* pattern of last row of U (if singular) */
+
+    Int
+	ulen,		/* length of Upattern */
+	npiv,		/* number of structural pivots found (sprank approx) */
+	nnzpiv ;	/* number of numerical (nonzero) pivots found */
+
+    Entry
+	*D ;		/* D [i] is the diagonal entry of U */
+
+    Int do_recip ;
+    double *Rs ;	/* scale factors for the rows of A and b */
+			/* do_recip FALSE: Divide row i by Rs [i] */
+			/* do_recip TRUE:  Multiply row i by Rs [i] */
+
+    Int
+	n_row, n_col,	/* A is n_row-by-n_row */
+	n1 ;		/* number of singletons */
+
+    /* for information only: */
+    Int
+	tail_usage,	/* amount of memory allocated in tail */
+			/* head_usage is Numeric->ihead */
+	init_usage,	/* memory usage just after UMF_kernel_init */
+	max_usage,	/* peak memory usage (excludes internal and external */
+			/* fragmentation in the tail) */
+	ngarbage,	/* number of garbage collections performed */
+	nrealloc,	/* number of reallocations performed */
+	ncostly,	/* number of costly reallocations performed */
+	isize,		/* size of integer pattern of L and U */
+	nLentries,	/* number of entries in L, excluding diagonal */
+	nUentries,	/* number of entries in U, including diagonal */
+			/* Some entries may be numerically zero. */
+	lnz,		/* number of nonzero entries in L, excl. diagonal */
+	all_lnz,	/* lnz plus entries dropped from L */
+	unz,		/* number of nonzero entries in U, excl. diagonal */
+	all_unz,	/* unz plus entries dropped form U */
+	maxfrsize ;	/* largest actual front size */
+
+    Int maxnrows, maxncols ;	/* not the same as Symbolic->maxnrows/cols* */
+
+} NumericType ;
+
+
+
+/* -------------------------------------------------------------------------- */
+/* Element tuples for connecting elements together in a matrix */
+/* -------------------------------------------------------------------------- */
+
+typedef struct	/* Tuple */
+{
+    /* The (e,f) tuples for the element lists */
+    Int
+	e,		/* element */
+	f ;		/* contribution to the row/col appears at this offset */
+
+} Tuple ;
+
+#define TUPLES(t) MAX (4, (t) + 1)
+
+/* Col_degree is aliased with Cperm, and Row_degree with Rperm */
+#define NON_PIVOTAL_COL(col) (Col_degree [col] >= 0)
+#define NON_PIVOTAL_ROW(row) (Row_degree [row] >= 0)
+
+/* -------------------------------------------------------------------------- */
+/* An element */
+/* -------------------------------------------------------------------------- */
+
+typedef struct	/* Element */
+{
+    Int
+
+	cdeg,		/* external column degree + cdeg0 offset */
+	rdeg,		/* external row degree    + rdeg0 offset */
+	nrowsleft,	/* number of rows remaining */
+	ncolsleft,	/* number of columns remaining */
+	nrows,		/* number of rows */
+	ncols,		/* number of columns */
+	next ;		/* for list link of sons, used during assembly only */
+
+    /* followed in memory by:
+    Int
+	col [0..ncols-1],	column indices of this element
+	row [0..nrows-1] ;	row indices of this element
+    Entry			(suitably aligned, see macro below)
+	C [0...nrows-1, 0...ncols-1] ;
+	size of C is nrows*ncols Entry's
+    */
+
+} Element ;
+
+/* macros for computing pointers to row/col indices, and contribution block: */
+
+#define GET_ELEMENT_SIZE(nr,nc) \
+(UNITS (Element, 1) + UNITS (Int, (nc) + (nr)) + UNITS (Entry, (nc) * (nr)))
+
+#define DGET_ELEMENT_SIZE(nr,nc) \
+(DUNITS (Element, 1) + DUNITS (Int, (nc) + (nr)) + DUNITS (Entry, (nc) * (nr)))
+
+#define GET_ELEMENT_COLS(ep,p,Cols) { \
+    ASSERT (p != (Unit *) NULL) ; \
+    ASSERT (p >= Numeric->Memory + Numeric->itail) ; \
+    ASSERT (p <= Numeric->Memory + Numeric->size) ; \
+    ep = (Element *) p ; \
+    p += UNITS (Element, 1) ; \
+    Cols = (Int *) p ; \
+}
+
+#define GET_ELEMENT_PATTERN(ep,p,Cols,Rows,ncm) { \
+    GET_ELEMENT_COLS (ep, p, Cols) ; \
+    ncm = ep->ncols ; \
+    Rows = Cols + ncm ; \
+}
+
+#define GET_ELEMENT(ep,p,Cols,Rows,ncm,nrm,C) { \
+    GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncm) ; \
+    nrm = ep->nrows ; \
+    p += UNITS (Int, ncm + nrm) ; \
+    C = (Entry *) p ; \
+}
+
+/* -------------------------------------------------------------------------- */
+/* Work data structure */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This data structure holds items needed only during factorization.
+    All of this is freed when UMFPACK_numeric completes.  Note that some of
+    it is stored in the tail end of Numeric->S (namely, the Tuples and the
+    Elements).
+*/
+
+typedef struct	/* WorkType */
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* information about each row and col of A */
+    /* ---------------------------------------------------------------------- */
+
+    /*
+	Row_tuples:	pointer to tuple list (alias with Numeric->Uip)
+	Row_tlen:	number of tuples (alias with Numeric->Uilen)
+	Col_tuples:	pointer to tuple list (alias with Numeric->Lip)
+	Col_tlen:	number of tuples (alias with Numeric->Lilen)
+	Row_degree:	degree of the row or column (alias Numeric->Rperm)
+	Col_degree:	degree of the row or column (alias Numeric->Cperm)
+
+	The Row_degree and Col_degree are MATLAB-style colmmd approximations,
+	are equal to the sum of the sizes of the elements (contribution blocks)
+	in each row and column.  They are maintained when elements are created
+	and assembled.  They are used only during the pivot row and column
+	search.  They are not needed to represent the pattern of the remaining
+	matrix.
+    */
+
+    /* ---------------------------------------------------------------------- */
+    /* information about each element */
+    /* ---------------------------------------------------------------------- */
+
+    Int	*E ;		/* E [0 .. Work->elen-1] element "pointers" */
+			/* (offsets in Numeric->Memory) */
+
+    /* ---------------------------------------------------------------------- */
+    /* generic workspace */
+    /* ---------------------------------------------------------------------- */
+
+    Entry *Wx, *Wy ;	/* each of size maxnrows+1 */
+
+    Int			/* Sizes:  nn = MAX (n_row, n_col) */
+	*Wp,		/* nn+1 */
+	*Wrp,		/* n_col+1 */
+	*Wm,		/* maxnrows+1 */
+	*Wio,		/* maxncols+1 */
+	*Woi,		/* maxncols+1 */
+	*Woo,		/* MAX (maxnrows,maxncols)+1 */
+	*Wrow,		/* pointer to Fcols, Wio, or Woi */
+	*NewRows,	/* list of rows to scan */
+	*NewCols ;	/* list of cols to scan */
+
+    /* ---------------------------------------------------------------------- */
+
+    Int
+	*Lpattern,	/* pattern of column of L, for one Lchain */
+	*Upattern,	/* pattern of row of U, for one Uchain */
+	ulen, llen ;	/* length of Upattern and Lpattern */
+
+    Int
+	*Diagonal_map,	/* used for symmetric pivoting, of size nn+1 */
+	*Diagonal_imap ;/* used for symmetric pivoting, of size nn+1 */
+
+    /* ---------------------------------------------------------------------- */
+
+    Int
+	n_row, n_col,	/* matrix is n_row-by-n_col */
+	nz,		/* nonzeros in the elements for this matrix */
+	n1,		/* number of row and col singletons */
+	elen,		/* max possible number of elements */
+	npiv,		/* number of pivot rows and columns so far */
+	ndiscard,	/* number of discarded pivot columns */
+	Wrpflag,
+	nel,		/* elements in use are in the range 1..nel */
+	noff_diagonal,
+	prior_element,
+	rdeg0, cdeg0,
+	rrdeg, ccdeg,
+	Candidates [MAX_CANDIDATES],	 /* current candidate pivot columns */
+	nCandidates,	/* number of candidates in Candidate set */
+	ksuper,
+	firstsuper,
+	jsuper,
+	ncand,		/* number of candidates (some not in Candidates[ ]) */
+	nextcand,	/* next candidate to place in Candidate search set */
+	lo,
+	hi,
+	pivrow,		/* current pivot row */
+	pivcol,		/* current pivot column */
+	do_extend,	/* true if the next pivot extends the current front */
+	do_update,	/* true if update should be applied */
+	nforced,	/* number of forced updates because of frontal growth */
+	any_skip,
+	do_scan2row,
+	do_scan2col,
+	do_grow,
+	pivot_case,
+	frontid,	/* id of current frontal matrix */
+	nfr ;		/* number of frontal matrices */
+
+    /* ---------------------------------------------------------------------- */
+    /* For row-merge tree */
+    /* ---------------------------------------------------------------------- */
+
+    Int
+	*Front_new1strow ;
+
+    /* ---------------------------------------------------------------------- */
+    /* current frontal matrix, F */
+    /* ---------------------------------------------------------------------- */
+
+    Int Pivrow [MAXNB],
+	Pivcol [MAXNB] ;
+
+    Entry
+	*Flublock,	/* LU block, nb-by-nb */
+	*Flblock,	/* L block,  fnr_curr-by-nb */
+	*Fublock,	/* U block,  nb-by-fnc_curr, or U' fnc_curr-by-nb */
+	*Fcblock ;	/* C block,  fnr_curr-by-fnc_curr */
+
+    Int
+	*Frows,		/* Frows [0.. ]: row indices of F */
+
+	*Fcols,		/* Fcols [0.. ]: column indices of F */
+
+	*Frpos,		/* position of row indices in F, or -1 if not present */
+			/* if Frows[i] == row, then Frpos[row] == i */
+
+	*Fcpos,		/* position of col indices in F, or -1 if not present */
+			/* if Fcols[j] == col, then */
+			/* Fcpos[col] == j*Work->fnr_curr */
+
+	fnrows,		/* number of rows in contribution block in F */
+	fncols,		/* number of columns in contribution block in F */
+	fnr_curr,	/* maximum # of rows in F (leading dimension) */
+	fnc_curr,	/* maximum # of columns in F */
+	fcurr_size,	/* current size of F */
+	fnrows_max,	/* max possible column-dimension (max # of rows) of F */
+	fncols_max,	/* max possible row-dimension (max # of columns) of F */
+	nb,
+	fnpiv,		/* number of pivots in F */
+	fnzeros,	/* number of explicit zero entries in LU block */
+	fscan_row,	/* where to start scanning rows of F in UMF_assemble */
+	fscan_col,	/* where to start scanning cols of F in UMF_assemble */
+	fnrows_new,	/* number of new row indices in F after pivot added */
+	fncols_new,	/* number of new col indices in F after pivot added */
+	pivrow_in_front,	/* true if current pivot row in Frows */
+	pivcol_in_front ;	/* true if current pivot column in Fcols */
+
+    /* ----------------------------------------------------------------------
+     * Current frontal matrix
+     * ----------------------------------------------------------------------
+     * The current frontal matrix is held as a single block of memory allocated
+     * from the "tail" end of Numeric->Memory.  It is subdivided into four
+     * parts: an LU block, an L block, a U block, and a C block.
+     *
+     * Let k = fnpiv, r = fnrows, and c = fncols for the following discussion.
+     * Let dr = fnr_curr and dc = fnc_curr.  Note that r <= dr and c <= dc.
+     *
+     * The LU block is of dimension nb-by-nb.  The first k-by-k part holds the
+     * "diagonal" part of the LU factors for these k pivot rows and columns.
+     * The k pivot row and column indices in this part are Pivrow [0..k-1] and
+     * Pivcol [0..k-1], respectively.
+     *
+     * The L block is of dimension dr-by-nb.  It holds the k pivot columns,
+     * except for the leading k-by-k part in the LU block.  Only the leading
+     * r-by-k part is in use.
+     *
+     * The U block is of dimension dc-by-nb.  It holds the k pivot rows,
+     * except for the leading k-by-k part in the LU block.  It is stored in
+     * row-oriented form.  Only the leading c-by-k part is in use.
+     *
+     * The C block is of dimension dr-by-dc.  It holds the current contribution
+     * block.  Only the leading r-by-c part is in use.  The column indices in
+     * the C block are Fcols [0..c-1], and the row indices are Frows [0..r-1].
+     *
+     * dr is always odd, to avoid bad cache behavior.
+     */
+
+} WorkType ;
+
+
+/* -------------------------------------------------------------------------- */
+/* Symbolic */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This is is constructed by UMFPACK_symbolic, and is needed by UMFPACK_numeric
+    to factor the matrix.
+*/
+
+typedef struct	/* SymbolicType */
+{
+
+    double
+	num_mem_usage_est,	/* estimated max Numeric->Memory size */
+	num_mem_size_est,	/* estimated final Numeric->Memory size */
+	peak_sym_usage,		/* peak Symbolic and SymbolicWork usage */
+	sym,			/* symmetry of pattern */
+	dnum_mem_init_usage,	/* min Numeric->Memory for UMF_kernel_init */
+	amd_lunz,	/* nz in LU for AMD, with symmetric pivoting */
+	lunz_bound ;	/* max nx in LU, for arbitrary row pivoting */
+
+    Int valid,		/* set to SYMBOLIC_VALID, for validity check */
+	max_nchains,
+	nchains,
+	*Chain_start,
+	*Chain_maxrows,
+	*Chain_maxcols,
+	maxnrows,		/* largest number of rows in any front */
+	maxncols,		/* largest number of columns in any front */
+	*Front_npivcol,		/* Front_npivcol [j] = size of jth supercolumn*/
+	*Front_1strow,		/* first row index in front j */
+	*Front_leftmostdesc,	/* leftmost desc of front j */
+	*Front_parent,		/* super-column elimination tree */
+	*Cperm_init,		/* initial column ordering */
+	*Rperm_init,		/* initial row ordering */
+	*Cdeg, *Rdeg,
+	*Esize,
+	dense_row_threshold,
+	n1,			/* number of singletons */
+	nempty,			/* MIN (nempty_row, nempty_col) */
+	*Diagonal_map,		/* initial "diagonal" (after 2by2) */
+	esize,			/* size of Esize array */
+	nfr,
+	n_row, n_col,		/* matrix A is n_row-by-n_col */
+	nz,			/* nz of original matrix */
+	nb,			/* block size for BLAS 3 */
+	num_mem_init_usage,	/* min Numeric->Memory for UMF_kernel_init */
+	nempty_row, nempty_col,
+
+	strategy,
+	ordering,
+	fixQ,
+	prefer_diagonal,
+	nzaat,
+	nzdiag,
+	amd_dmax ;
+
+} SymbolicType ;
+
+
+/* -------------------------------------------------------------------------- */
+/* for debugging only: */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_dump.h"
+
+/* -------------------------------------------------------------------------- */
+/* for statement coverage testing only: */
+/* -------------------------------------------------------------------------- */
+
+#ifdef TESTING
+
+/* for testing integer overflow: */
+#ifdef TEST_FOR_INTEGER_OVERFLOW
+#undef MAX_MARK
+#define MAX_MARK(n) (3*(n))
+#endif
+
+/* for testing out-of-memory conditions: */
+#define UMF_TCOV_TEST
+GLOBAL extern int umf_fail, umf_fail_lo, umf_fail_hi ;
+GLOBAL extern int umf_realloc_fail, umf_realloc_lo, umf_realloc_hi ;
+
+/* for testing malloc count: */
+#define UMF_MALLOC_COUNT
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,55 @@
+/* ========================================================================== */
+/* === UMF_is_permutation =================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Return TRUE if P is a r-permutation vector, FALSE otherwise */
+/* P [0..r-1] must be an r-permutation of 0..n-1 */
+
+#include "umf_internal.h"
+
+GLOBAL Int UMF_is_permutation
+(
+    const Int P [ ],	/* permutation of size r */
+    Int W [ ],		/* workspace of size n */
+    Int n,
+    Int r
+)
+{
+    Int i, k ;
+
+    if (!P)
+    {
+	/* if P is (Int *) NULL, this is the identity permutation */
+	return (TRUE) ;
+    }
+
+    ASSERT (W != (Int *) NULL) ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	W [i] = FALSE ;
+    }
+    for (k = 0 ; k < r ; k++)
+    {
+	i = P [k] ;
+	DEBUG5 (("k "ID" i "ID"\n", k, i)) ;
+	if (i < 0 || i >= n)
+	{
+	    DEBUG0 (("i out of range "ID" "ID"\n", i, n)) ;
+	    return (FALSE) ;
+	}
+	if (W [i])
+	{
+	    DEBUG0 (("i duplicate "ID"\n", i)) ;
+	    return (FALSE) ;
+	}
+	W [i] = TRUE ;
+    }
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_is_permutation.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,13 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_is_permutation
+(
+    const Int P [ ],
+    Int W [ ],
+    Int n,
+    Int r
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,299 @@
+/* ========================================================================== */
+/* === UMF_kernel =========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Primary factorization routine.   Called by UMFPACK_numeric.
+    Returns:
+	UMFPACK_OK if successful,
+	UMFPACK_ERROR_out_of_memory if out of memory, or
+	UMFPACK_ERROR_different_pattern if pattern of matrix (Ap and/or Ai)
+	   has changed since the call to UMFPACK_*symbolic.
+*/
+
+#include "umf_internal.h"
+#include "umf_kernel_init.h"
+#include "umf_init_front.h"
+#include "umf_start_front.h"
+#include "umf_assemble.h"
+#include "umf_scale_column.h"
+#include "umf_local_search.h"
+#include "umf_create_element.h"
+#include "umf_extend_front.h"
+#include "umf_blas3_update.h"
+#include "umf_store_lu.h"
+#include "umf_kernel_wrapup.h"
+
+/* perform an action, and return if out of memory */
+#define DO(action) { if (! (action)) { return (UMFPACK_ERROR_out_of_memory) ; }}
+
+GLOBAL Int UMF_kernel
+(
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int j, f1, f2, chain, nchains, *Chain_start, status, fixQ, evaporate,
+	*Front_npivcol, jmax, nb, drop ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize memory space and load the matrix. Optionally scale. */
+    /* ---------------------------------------------------------------------- */
+
+    if (!UMF_kernel_init (Ap, Ai, Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+	Numeric, Work, Symbolic))
+    {
+	/* UMF_kernel_init is guaranteed to succeed, since UMFPACK_numeric */
+	/* either allocates enough space or if not, UMF_kernel does not get */
+	/* called.  So running out of memory here is a fatal error, and means */
+	/* that the user changed Ap and/or Ai since the call to */
+	/* UMFPACK_*symbolic. */
+	DEBUGm4 (("kernel init failed\n")) ;
+	return (UMFPACK_ERROR_different_pattern) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* get the symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    nchains = Symbolic->nchains ;
+    Chain_start = Symbolic->Chain_start ;
+    Front_npivcol = Symbolic->Front_npivcol ;
+    nb = Symbolic->nb ;
+    fixQ = Symbolic->fixQ ;
+    drop = Numeric->droptol > 0.0 ;
+
+#ifndef NDEBUG
+    for (chain = 0 ; chain < nchains ; chain++)
+    {
+	Int i ;
+	f1 = Chain_start [chain] ;
+	f2 = Chain_start [chain+1] - 1 ;
+	DEBUG1 (("\nCHain: "ID" start "ID" end "ID"\n", chain, f1, f2)) ;
+	for (i = f1 ; i <= f2 ; i++)
+	{
+	    DEBUG1 (("Front "ID", npivcol "ID"\n", i, Front_npivcol [i])) ;
+	}
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* factorize each chain of frontal matrices */
+    /* ---------------------------------------------------------------------- */
+
+    for (chain = 0 ; chain < nchains ; chain++)
+    {
+	f1 = Chain_start [chain] ;
+	f2 = Chain_start [chain+1] - 1 ;
+
+	/* ------------------------------------------------------------------ */
+	/* get the initial frontal matrix size for this chain */
+	/* ------------------------------------------------------------------ */
+
+	DO (UMF_start_front (chain, Numeric, Work, Symbolic)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* factorize each front in the chain */
+	/* ------------------------------------------------------------------ */
+
+	for (Work->frontid = f1 ; Work->frontid <= f2 ; Work->frontid++)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* Initialize the pivot column candidate set  */
+	    /* -------------------------------------------------------------- */
+
+	    Work->ncand = Front_npivcol [Work->frontid] ;
+	    Work->lo = Work->nextcand ;
+	    Work->hi = Work->nextcand + Work->ncand - 1 ;
+	    jmax = MIN (MAX_CANDIDATES, Work->ncand) ;
+	    DEBUGm1 ((">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Starting front "
+		ID", npivcol: "ID"\n", Work->frontid, Work->ncand)) ;
+	    if (fixQ)
+	    {
+		/* do not modify the column order */
+		jmax = 1 ;
+	    }
+	    DEBUGm1 (("Initial candidates: ")) ;
+	    for (j = 0 ; j < jmax ; j++)
+	    {
+		DEBUGm1 ((" "ID, Work->nextcand)) ;
+		ASSERT (Work->nextcand <= Work->hi) ;
+		Work->Candidates [j] = Work->nextcand++ ;
+	    }
+	    Work->nCandidates = jmax ;
+	    DEBUGm1 (("\n")) ;
+
+	    /* -------------------------------------------------------------- */
+	    /* Assemble and factorize the current frontal matrix */
+	    /* -------------------------------------------------------------- */
+
+	    while (Work->ncand > 0)
+	    {
+
+		/* ---------------------------------------------------------- */
+		/* get the pivot row and column */
+		/* ---------------------------------------------------------- */
+
+		status = UMF_local_search (Numeric, Work, Symbolic) ;
+		if (status == UMFPACK_ERROR_different_pattern)
+		{
+		    /* :: pattern change detected in umf_local_search :: */
+		    /* input matrix has changed since umfpack_*symbolic */
+		    DEBUGm4 (("local search failed\n")) ;
+		    return (UMFPACK_ERROR_different_pattern) ;
+		}
+		if (status == UMFPACK_WARNING_singular_matrix)
+		{
+		    /* no pivot found, discard and try again */
+		    continue ;
+		}
+
+		/* ---------------------------------------------------------- */
+		/* update if front not extended or too many zeros in L,U */
+		/* ---------------------------------------------------------- */
+
+		if (Work->do_update)
+		{
+		    UMF_blas3_update (Work) ;
+		    if (drop)
+		    {
+			DO (UMF_store_lu_drop (Numeric, Work)) ;
+		    }
+		    else
+		    {
+			DO (UMF_store_lu (Numeric, Work)) ;
+		    }
+		}
+
+		/* ---------------------------------------------------------- */
+		/* extend the frontal matrix, or start a new one */
+		/* ---------------------------------------------------------- */
+
+		if (Work->do_extend)
+		{
+		    /* extend the current front */
+		    DO (UMF_extend_front (Numeric, Work)) ;
+		}
+		else
+		{
+		    /* finish the current front (if any) and start a new one */
+		    DO (UMF_create_element (Numeric, Work, Symbolic)) ;
+		    DO (UMF_init_front (Numeric, Work)) ;
+		}
+
+		/* ---------------------------------------------------------- */
+		/* Numerical & symbolic assembly into current frontal matrix */
+		/* ---------------------------------------------------------- */
+
+		if (fixQ)
+		{
+		    UMF_assemble_fixq (Numeric, Work) ;
+		}
+		else
+		{
+		    UMF_assemble (Numeric, Work) ;
+		}
+
+		/* ---------------------------------------------------------- */
+		/* scale the pivot column */
+		/* ---------------------------------------------------------- */
+
+		UMF_scale_column (Numeric, Work) ;
+
+		/* ---------------------------------------------------------- */
+		/* Numerical update if enough pivots accumulated */
+		/* ---------------------------------------------------------- */
+
+		evaporate = Work->fnrows == 0 || Work->fncols == 0 ;
+		if (Work->fnpiv >= nb || evaporate)
+		{
+		    UMF_blas3_update (Work) ;
+		    if (drop)
+		    {
+			DO (UMF_store_lu_drop (Numeric, Work)) ;
+		    }
+		    else
+		    {
+			DO (UMF_store_lu (Numeric, Work)) ;
+		    }
+
+		}
+
+		Work->pivrow_in_front = FALSE ;
+		Work->pivcol_in_front = FALSE ;
+
+		/* ---------------------------------------------------------- */
+		/* If front is empty, evaporate it */
+		/* ---------------------------------------------------------- */
+
+		if (evaporate)
+		{
+		    /* This does not create an element, just evaporates it.
+		     * It ensures that a front is not 0-by-c or r-by-0.  No
+		     * memory is allocated, so it is guaranteed to succeed. */
+		    (void) UMF_create_element (Numeric, Work, Symbolic) ;
+		    Work->fnrows = 0 ;
+		    Work->fncols = 0 ;
+		}
+	    }
+	}
+
+	/* ------------------------------------------------------------------
+	 * Wrapup the current frontal matrix.  This is the last in a chain
+	 * in the column elimination tree.  The next frontal matrix
+	 * cannot overlap with the current one, which will be its sibling
+	 * in the column etree.
+	 * ------------------------------------------------------------------ */
+
+	UMF_blas3_update (Work) ;
+	if (drop)
+	{
+	    DO (UMF_store_lu_drop (Numeric, Work)) ;
+	}
+	else
+	{
+	    DO (UMF_store_lu (Numeric, Work)) ;
+	}
+	Work->fnrows_new = Work->fnrows ;
+	Work->fncols_new = Work->fncols ;
+	DO (UMF_create_element (Numeric, Work, Symbolic)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* current front is now empty */
+	/* ------------------------------------------------------------------ */
+
+	Work->fnrows = 0 ;
+	Work->fncols = 0 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* end the last Lchain and Uchain and finalize the LU factors */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_kernel_wrapup (Numeric, Symbolic, Work) ;
+
+    /* note that the matrix may be singular (this is OK) */
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,18 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_kernel
+(
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1056 @@
+/* ========================================================================== */
+/* === UMF_kernel_init ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Initialize the kernel: scale the matrix, load the initial elements, and
+    build the tuple lists.
+
+    Returns TRUE if successful, FALSE if out of memory or if the pattern has
+    changed since UMFPACK_*symbolic.  UMFPACK_numeric allocates at least enough
+    space for UMF_kernel_init to succeed; otherwise it does not call
+    UMF_kernel_init.  So an out-of-memory condition means that the pattern must
+    have gotten larger.
+*/
+
+#include "umf_internal.h"
+#include "umf_tuple_lengths.h"
+#include "umf_build_tuples.h"
+#include "umf_mem_init_memoryspace.h"
+#include "umf_mem_alloc_element.h"
+#include "umf_mem_alloc_head_block.h"
+#include "umf_mem_alloc_tail_block.h"
+#include "umf_mem_free_tail_block.h"
+#include "umf_scale.h"
+
+/* ========================================================================== */
+/* === packsp =============================================================== */
+/* ========================================================================== */
+
+/* remove zero or small entries from a column of L or a row of U */
+
+PRIVATE Int packsp	/* returns new value of pnew */
+(
+    Int pnew,		/* index into Memory of next free space */
+    Int *p_p,		/* ptr to index of old pattern in Memory on input,
+			   new pattern on output */
+    Int *p_len,		/* ptr to length of old pattern on input,
+			   new pattern on output */
+    Int drop,		/* TRUE if small nonzero entries are to be dropped */
+    double droptol,	/* the drop tolerance */
+    Unit *Memory	/* contains the sparse vector on input and output */
+)
+{
+    Entry x ;
+    double s ;
+    Entry *Bx, *Bx2 ;
+    Int p, i, len, len_new, *Bi, *Bi2 ;
+
+    /* get the pointers to the sparse vector, and its length */
+    p = *p_p ;
+    len = *p_len ;
+    Bi = (Int   *) (Memory + p) ; p += UNITS (Int,   len) ;
+    Bx = (Entry *) (Memory + p) ; p += UNITS (Entry, len) ;
+    DEBUGm4 (("  p "ID" len "ID" pnew "ID"\n", p, len, pnew)) ;
+
+    /* the vector resides in Bi [0..len-1] and Bx [0..len-1] */
+
+    /* first, compact the vector in place */
+    len_new = 0 ;
+    for (p = 0 ; p < len ; p++)
+    {
+	i = Bi [p] ;
+	x = Bx [p] ;
+	DEBUGm4 (("    old vector: i "ID" value: ", i)) ;
+	EDEBUGk (-4, x) ;
+	DEBUGm4 (("\n")) ;
+	ASSERT (i >= 0) ;
+	/* skip if zero or below drop tolerance */
+	if (IS_ZERO (x)) continue ;
+	if (drop)
+	{
+	    APPROX_ABS (s, x) ;
+	    if (s <= droptol) continue ;
+	}
+	/* store the value back into the vector */
+	if (len_new != p)
+	{
+	    Bi [len_new] = i ;
+	    Bx [len_new] = x ;
+	}
+	len_new++ ;
+    }
+    ASSERT (len_new <= len) ;
+
+    /* the vector is now in Bi [0..len_new-1] and Bx [0..len_new-1] */
+
+#ifndef NDEBUG
+    for (p = 0 ; p < len_new ; p++)
+    {
+	DEBUGm4 (("    new vector: i "ID" value: ", Bi [p])) ;
+	EDEBUGk (-4, Bx [p]) ;
+	DEBUGm4 (("\n")) ;
+	ASSERT (Bi [p] >= 0) ;
+    }
+#endif
+
+    /* allocate new space for the compacted vector */
+    *p_p = pnew ;
+    *p_len = len_new ;
+    Bi2 = (Int   *) (Memory + pnew) ; pnew += UNITS (Int,   len_new) ;
+    Bx2 = (Entry *) (Memory + pnew) ; pnew += UNITS (Entry, len_new) ;
+    DEBUGm4 (("  pnew "ID" len_new "ID"\n", pnew, len_new)) ;
+
+    /* shift the vector upwards, into its new space */
+    for (p = 0 ; p < len_new ; p++)
+    {
+	Bi2 [p] = Bi [p] ;
+    }
+    for (p = 0 ; p < len_new ; p++)
+    {
+	Bx2 [p] = Bx [p] ;
+    }
+
+#ifndef NDEBUG
+    for (p = 0 ; p < len_new ; p++)
+    {
+	DEBUGm4 (("    packed vec: i "ID" value: ", Bi2 [p])) ;
+	EDEBUGk (-4, Bx2 [p]) ;
+	DEBUGm4 (("\n")) ;
+	ASSERT (Bi2 [p] >= 0) ;
+    }
+#endif
+
+    /* return the pointer to the space just after the new vector */
+    return (pnew) ;
+}
+
+
+/* ========================================================================== */
+/* === UMF_kernel_init ====================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMF_kernel_init
+(
+    const Int Ap [ ],		/* user's input matrix (not modified) */
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry x, pivot_value ;
+    double unused = 0, rsmin, rsmax, rs, droptol ;
+    Entry *D, *C, *Lval, **Rpx ;
+    double *Rs ;
+    Int row, k, oldcol, size, e, p1, p2, p, nz, *Rows, *Cols, *E, i, *Upos,
+	*Lpos, n_row, n_col, *Wp, *Cperm_init, *Frpos, *Fcpos, *Row_degree, nn,
+	*Row_tlen, *Col_degree, *Col_tlen, oldrow, newrow, ilast, *Wrp,
+	*Rperm_init, col, n_inner, prefer_diagonal, *Diagonal_map, nempty,
+	*Diagonal_imap, fixQ, rdeg, cdeg, nempty_col, *Esize, esize, pnew,
+	*Lip, *Uip, *Lilen, *Uilen, llen, pa, *Cdeg, *Rdeg, n1, clen, do_scale,
+	lnz, unz, lip, uip, k1, *Rperm, *Cperm, pivcol, *Li, lilen, drop,
+	**Rpi, nempty_row, dense_row_threshold, empty_elements, rpi, rpx ;
+    Element *ep ;
+    Unit *Memory ;
+#ifdef COMPLEX
+    Int split = SPLIT (Az) ;
+#endif
+#ifndef NRECIPROCAL
+    Int do_recip = FALSE ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG0 (("KERNEL INIT\n")) ;
+
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+    nempty_col = Symbolic->nempty_col ;
+    nempty_row = Symbolic->nempty_row ;
+    nempty = MIN (nempty_row, nempty_col) ;
+    ASSERT (n_row > 0 && n_col > 0) ;
+    Cperm_init = Symbolic->Cperm_init ;
+    Rperm_init = Symbolic->Rperm_init ;
+    Cdeg = Symbolic->Cdeg ;
+    Rdeg = Symbolic->Rdeg ;
+    n1 = Symbolic->n1 ;
+    dense_row_threshold = Symbolic->dense_row_threshold ;
+    DEBUG0 (("Singletons: "ID"\n", n1)) ;
+    Work->nforced = 0 ;
+    Work->ndiscard = 0 ;
+    Work->noff_diagonal = 0 ;
+
+    nz = Ap [n_col] ;
+    if (nz < 0 || Ap [0] != 0 || nz != Symbolic->nz)
+    {
+	DEBUGm4 (("nz or Ap [0] bad\n")) ;
+	return (FALSE) ;	/* pattern changed */
+    }
+
+    prefer_diagonal = Symbolic->prefer_diagonal ;
+    Diagonal_map = Work->Diagonal_map ;
+    Diagonal_imap = Work->Diagonal_imap ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize the Numeric->Memory space for LU, elements, and tuples */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_mem_init_memoryspace (Numeric) ;
+    DEBUG1 (("Kernel init head usage, before allocs: "ID"\n", Numeric->ihead)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize the Work and Numeric objects */
+    /* ---------------------------------------------------------------------- */
+
+    /* current front is empty */
+    Work->fnpiv = 0 ;
+    Work->fncols = 0 ;
+    Work->fnrows = 0 ;
+    Work->fncols_max = 0 ;
+    Work->fnrows_max = 0 ;
+    Work->fnzeros = 0 ;
+    Work->fcurr_size = 0 ;
+    Work->fnr_curr = 0 ;
+    Work->fnc_curr = 0 ;
+
+    Work->nz = nz ;
+    Work->prior_element = EMPTY ;
+    Work->ulen = 0 ;
+    Work->llen = 0 ;
+    Work->npiv = n1 ;
+    Work->frontid = 0 ;
+    Work->nextcand = n1 ;
+
+    Memory = Numeric->Memory ;
+    Rperm = Numeric->Rperm ;
+    Cperm = Numeric->Cperm ;
+    Row_degree = Numeric->Rperm ;
+    Col_degree = Numeric->Cperm ;
+    /* Row_tuples = Numeric->Uip ; not needed */
+    Row_tlen   = Numeric->Uilen ;
+    /* Col_tuples = Numeric->Lip ; not needed */
+    Col_tlen   = Numeric->Lilen ;
+
+    Lip = Numeric->Lip ;
+    Uip = Numeric->Uip ;
+    Lilen = Numeric->Lilen ;
+    Uilen = Numeric->Uilen ;
+
+    Frpos = Work->Frpos ;
+    Fcpos = Work->Fcpos ;
+    Wp = Work->Wp ;
+    Wrp = Work->Wrp ;
+
+    D = Numeric->D ;
+    Upos = Numeric->Upos ;
+    Lpos = Numeric->Lpos ;
+    for (k = 0 ; k < n_inner ; k++)
+    {
+	CLEAR (D [k]) ;
+    }
+
+    Rs = Numeric->Rs ;
+
+    for (row = 0 ; row <= n_row ; row++)
+    {
+	Lpos [row] = EMPTY ;
+	/* Row_tuples [row] = 0 ; set in UMF_build_tuples */
+	/* Row_degree [row] = 0 ; initialized below */
+	Row_tlen [row] = 0 ;
+	/* Frpos [row] = EMPTY ;  do this later */
+    }
+
+    for (col = 0 ; col <= n_col ; col++)
+    {
+	Upos [col] = EMPTY ;
+	/* Col_tuples [col] = 0 ; set in UMF_build_tuples */
+	/* Col_degree [col] = 0 ; initialized below */
+	Col_tlen [col] = 0 ;
+	Fcpos [col] = EMPTY ;
+	Wrp [col] = 0 ;
+    }
+    Work->Wrpflag = 1 ;
+
+    /* When cleared, Wp [0..nn] is < 0 */
+    for (i = 0 ; i <= nn ; i++)
+    {
+	Wp [i] = EMPTY ;
+    }
+    /* In col search, Wp [row] is set to a position, which is >= 0. */
+
+    /* When cleared, Wrp [0..n_col] is < Wrpflag */
+    /* In row search, Wrp [col] is set to Wrpflag. */
+
+    /* no need to initialize Wm, Wio, Woi, and Woo */
+
+    /* clear the external degree counters */
+    Work->cdeg0 = 1 ;
+    Work->rdeg0 = 1 ;
+
+    fixQ = Symbolic->fixQ ;
+
+    E = Work->E ;
+
+    Numeric->n_row = n_row ;
+    Numeric->n_col = n_col ;
+    Numeric->npiv = 0 ;
+    Numeric->nnzpiv = 0 ;
+    Numeric->min_udiag = 0.0 ;
+    Numeric->max_udiag = 0.0 ;
+    Numeric->rcond = 0.0 ;
+    Numeric->isize = 0 ;
+    Numeric->nLentries = 0 ;
+    Numeric->nUentries = 0 ;
+    Numeric->lnz = 0 ;
+    Numeric->unz = 0 ;
+    Numeric->all_lnz = 0 ;
+    Numeric->all_unz = 0 ;
+    Numeric->maxfrsize = 0 ;
+    Numeric->maxnrows = 0 ;
+    Numeric->maxncols = 0 ;
+    Numeric->flops = 0. ;
+    Numeric->n1 = n1 ;
+    droptol = Numeric->droptol ;
+    drop = (droptol > 0) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the scale factors, if requested, and check the input matrix */
+    /* ---------------------------------------------------------------------- */
+
+    /* UMFPACK_SCALE_SUM: Rs [i] = sum of the absolute values in row i.
+     * UMFPACK_SCALE_MAX: Rs [i] = max of the absolute values in row i.
+     *
+     * If A is complex, an approximate abs is used (|xreal| + |ximag|).
+     *
+     * If min (Rs [0..n_row]) >= RECIPROCAL_TOLERANCE, then the scale
+     * factors are inverted, and the rows of A are multiplied by the scale
+     * factors.  Otherwise, the rows are divided by the scale factors.  If
+     * NRECIPROCAL is defined, then the rows are always divided by the scale
+     * factors.
+     *
+     * For MATLAB (either built-in routine or mexFunction), or for gcc,
+     * the rows are always divided by the scale factors.
+     */
+
+    do_scale = (Numeric->scale != UMFPACK_SCALE_NONE) ;
+
+    if (do_scale)
+    {
+	int do_max = Numeric->scale == UMFPACK_SCALE_MAX ;
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    Rs [row] = 0.0 ;
+	}
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    ilast = EMPTY ;
+	    p1 = Ap [col] ;
+	    p2 = Ap [col+1] ;
+	    if (p1 > p2)
+	    {
+		/* invalid matrix */
+		DEBUGm4 (("invalid matrix (Ap)\n")) ;
+		return (FALSE) ;
+	    }
+	    for (p = p1 ; p < p2 ; p++)
+	    {
+		Entry aij ;
+		double value ;
+		row = Ai [p] ;
+		if (row <= ilast || row >= n_row)
+		{
+		    /* invalid matrix, columns must be sorted, no duplicates */
+		    DEBUGm4 (("invalid matrix (Ai)\n")) ;
+		    return (FALSE) ;
+		}
+		ASSIGN (aij, Ax, Az, p, split) ;
+		APPROX_ABS (value, aij) ;
+		rs = Rs [row] ;
+		if (!SCALAR_IS_NAN (rs))
+		{
+		    if (SCALAR_IS_NAN (value))
+		    {
+			/* if any entry in the row is NaN, then the scale factor
+			 * is NaN too (for now) and then set to 1.0 below */
+			Rs [row] = value ;
+		    }
+		    else if (do_max)
+		    {
+			Rs [row] = MAX (rs, value) ;
+		    }
+		    else
+		    {
+			Rs [row] += value ;
+		    }
+		}
+		DEBUG4 (("i "ID" j "ID" value %g,  Rs[i]: %g\n",
+		    row, col, value, Rs[row])) ;
+		ilast = row ;
+	    }
+	}
+	DEBUG2 (("Rs[0] = %30.20e\n", Rs [0])) ;
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    rs = Rs [row] ;
+	    if (SCALAR_IS_ZERO (rs) || SCALAR_IS_NAN (rs))
+	    {
+		/* don't scale a completely zero row, or one with NaN's */
+		Rs [row] = 1.0 ;
+	    }
+	}
+	rsmin = Rs [0] ;
+	rsmax = Rs [0] ;
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    DEBUG2 (("sum %30.20e ", Rs [row])) ;
+	    rsmin = MIN (rsmin, Rs [row]) ;
+	    rsmax = MAX (rsmax, Rs [row]) ;
+	    DEBUG2 (("Rs["ID"] = %30.20e\n", row, Rs [row])) ;
+	}
+#ifndef NRECIPROCAL
+	/* multiply by the reciprocal if Rs is not too small */
+	do_recip = (rsmin >= RECIPROCAL_TOLERANCE) ;
+	if (do_recip)
+	{
+	    /* invert the scale factors */
+	    for (row = 0 ; row < n_row ; row++)
+	    {
+		Rs [row] = 1.0 / Rs [row] ;
+	    }
+	}
+#endif
+    }
+    else
+    {
+	/* no scaling, rsmin and rsmax not computed */
+	rsmin = -1 ;
+	rsmax = -1 ;
+#ifndef NRECIPROCAL
+	do_recip = FALSE ;
+#endif
+	/* check the input matrix */
+	if (!AMD_valid (n_row, n_col, Ap, Ai))
+	{
+	    /* matrix is invalid */
+	    return (FALSE) ;
+	}
+    }
+
+    Numeric->rsmin = rsmin ;
+    Numeric->rsmax = rsmax ;
+#ifndef NRECIPROCAL
+    Numeric->do_recip = do_recip ;
+#else
+    Numeric->do_recip = FALSE ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the inverse row Rperm_init permutation (use Frpos as temp) */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG3 (("\n\n===================LOAD_MATRIX:\n")) ;
+
+    for (newrow = 0 ; newrow < n_row ; newrow++)
+    {
+	oldrow = Rperm_init [newrow] ;
+	ASSERT (oldrow >= 0 && oldrow < n_row) ;
+	Frpos [oldrow] = newrow ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the diagonal imap if doing symmetric pivoting */
+    /* ---------------------------------------------------------------------- */
+
+    if (prefer_diagonal)
+    {
+	ASSERT (n_row == n_col) ;
+	ASSERT (nempty_col == Symbolic->nempty_row) ;
+	ASSERT (nempty_col == nempty) ;
+	for (i = 0 ; i < nn ; i++)
+	{
+	    Diagonal_map [i] = EMPTY ;
+	    Diagonal_imap [i] = EMPTY ;
+	}
+	for (k = n1 ; k < nn - nempty ; k++)
+	{
+	    newrow = Symbolic->Diagonal_map [k] ;
+	    Diagonal_map [k] = newrow ;
+	    Diagonal_imap [newrow] = k ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate O (n_row) workspace at the tail end of Memory */
+    /* ---------------------------------------------------------------------- */
+
+    rpi = UMF_mem_alloc_tail_block (Numeric, UNITS (Int *, n_row+1)) ;
+    rpx = UMF_mem_alloc_tail_block (Numeric, UNITS (Entry *, n_row+1)) ;
+    if (!rpi || !rpx)
+    {
+	/* :: pattern change (out of memory for Rpx, Rpx) :: */
+	/* out of memory, which can only mean that the pattern has changed */
+	return (FALSE) ;	/* pattern changed */
+    }
+    Rpi = (Int   **) (Memory + rpx) ;
+    Rpx = (Entry **) (Memory + rpi) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the LU factors for the columns of the singletons */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG1 (("Allocating singletons:\n")) ;
+    for (k = 0 ; k < n1 ; k++)
+    {
+	lnz = Cdeg [k] - 1 ;
+	unz = Rdeg [k] - 1 ;
+
+	DEBUG1 (("Singleton k "ID" pivrow "ID" pivcol "ID" cdeg "ID" rdeg "
+	    ID"\n", k, Rperm_init [k], Cperm_init [k], Cdeg [k], Rdeg [k])) ;
+	ASSERT (unz >= 0 && lnz >= 0 && (lnz == 0 || unz == 0)) ;
+	DEBUG1 (("   lnz "ID" unz "ID"\n", lnz, unz)) ;
+
+	size = UNITS (Int, lnz) + UNITS (Entry, lnz)
+	     + UNITS (Int, unz) + UNITS (Entry, unz) ;
+	p = UMF_mem_alloc_head_block (Numeric, size) ;
+	DEBUG1 (("Kernel init head usage: "ID"\n", Numeric->ihead)) ;
+	if (!p)
+	{
+	    /* :: pattern change (out of memory for singletons) :: */
+	    DEBUG0 (("Pattern has gotten larger - kernel init failed\n")) ;
+	    return (FALSE) ;	/* pattern changed */
+	}
+
+	Numeric->all_lnz += lnz ;
+	Numeric->all_unz += unz ;
+
+	/* allocate the column of L */
+	lip = p ;
+	p += UNITS (Int, lnz) ;
+	p += UNITS (Entry, lnz) ;
+
+	/* allocate the row of U */
+	uip = p ;
+	Rpi [k] = (Int *) (Memory + p) ;
+	p += UNITS (Int, unz) ;
+	Rpx [k] = (Entry *) (Memory + p) ;
+	/* p += UNITS (Entry, unz) ; (not needed) */
+
+	/* a single column of L (no Lchains) */
+	Lip [k] = lip ;
+	Lilen [k] = lnz ;
+
+	/* a single row of L (no Uchains) */
+	Uip [k] = uip ;
+	Uilen [k] = unz ;
+
+	Wp [k] = unz ;
+
+	/* save row and column inverse permutation */
+	k1 = ONES_COMPLEMENT (k) ;
+	Rperm [k] = k1 ;			/* aliased with Row_degree */
+	Cperm [k] = k1 ;			/* aliased with Col_degree */
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* current frontal matrix is empty */
+    /* ---------------------------------------------------------------------- */
+
+    e = 0 ;
+    E [e] = 0 ;
+    Work->Flublock = (Entry *) NULL ;
+    Work->Flblock  = (Entry *) NULL ;
+    Work->Fublock  = (Entry *) NULL ;
+    Work->Fcblock  = (Entry *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the column elements */
+    /* ---------------------------------------------------------------------- */
+
+    Esize = Symbolic->Esize ;
+    empty_elements = FALSE  ;
+    for (k = n1 ; k < n_col - nempty_col ; k++)
+    {
+	e = k - n1 + 1 ;
+	ASSERT (e < Work->elen) ;
+	esize = Esize ? Esize [k-n1] : Cdeg [k] ;
+	if (esize > 0)
+	{
+	    /* allocate an element for this column */
+	    E [e] = UMF_mem_alloc_element (Numeric, esize, 1, &Rows, &Cols, &C,
+		&size, &ep) ;
+	    if (E [e] <= 0)
+	    {
+		/* :: pattern change (out of memory for column elements) :: */
+		return (FALSE) ;	/* pattern has changed */
+	    }
+	    Cols [0] = k ;
+	    DEBUG0 (("Got column element e "ID" esize "ID"\n", e, esize)) ;
+	}
+	else
+	{
+	    /* all rows in this column are dense, or empty */
+	    E [e] = 0 ;
+	    empty_elements = TRUE  ;
+	    DEBUG0 (("column element e is empty "ID"\n", e)) ;
+	}
+    }
+    DEBUG0 (("e "ID" n_col "ID" nempty_col "ID" n1 "ID"\n", e, n_col,
+		nempty_col, n1)) ;
+    ASSERT (e == n_col - nempty_col - n1) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the row elements for dense rows of A (if any) */
+    /* ---------------------------------------------------------------------- */
+
+    if (Esize)
+    {
+	for (k = n1 ; k < n_row - nempty_row ; k++)
+	{
+	    rdeg = Rdeg [k] ;
+	    if (rdeg > dense_row_threshold)
+	    {
+		/* allocate an element for this dense row */
+		e++ ;
+		ASSERT (e < Work->elen) ;
+		E [e] = UMF_mem_alloc_element (Numeric, 1, rdeg, &Rows, &Cols,
+		    &C, &size, &ep) ;
+		if (E [e] <= 0)
+		{
+		    /* :: pattern change (out of memory for row elements) :: */
+		    return (FALSE) ;	/* pattern has changed */
+		}
+		Rows [0] = k ;
+		Rpi [k] = Cols ;
+		Rpx [k] = C ;
+		Wp [k] = rdeg ;
+		DEBUG0 (("Got row element e "ID" rdeg "ID"\n", e, rdeg)) ;
+	    }
+	}
+    }
+
+    /* elements are currently in the range 0 to e */
+    Work->nel = e ;
+
+    /* ---------------------------------------------------------------------- */
+    /* create the first n1 columns of L and U */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	pivcol = Cperm_init [k] ;
+	p2 = Ap [pivcol+1] ;
+
+	/* get the kth column of L */
+	p = Lip [k] ;
+	Li = (Int *) (Memory + p) ;
+	lilen = Lilen [k] ;
+	p += UNITS (Int, lilen) ;
+	Lval = (Entry *) (Memory + p) ;
+
+	llen = 0 ;
+
+	for (pa = Ap [pivcol] ; pa < p2 ; pa++)
+	{
+	    oldrow = Ai [pa] ;
+	    newrow = Frpos [oldrow] ;
+	    ASSIGN (x, Ax, Az, pa, split) ;
+
+	    /* scale the value using the scale factors, Rs */
+	    if (do_scale)
+	    {
+#ifndef NRECIPROCAL
+		if (do_recip)
+		{
+		    SCALE (x, Rs [oldrow]) ;
+		}
+		else
+#endif
+		{
+		    SCALE_DIV (x, Rs [oldrow]) ;
+		}
+	    }
+
+	    if (newrow == k)
+	    {
+		/* this is the pivot entry itself */
+		ASSERT (oldrow == Rperm_init [k]) ;
+		D [k] = x ;
+	    }
+	    else if (newrow < k)
+	    {
+		/* this entry goes in a row of U */
+		DEBUG1 (("Singleton row of U: k "ID" newrow "ID"\n",
+		    k, newrow)) ;
+		if (--(Wp [newrow]) < 0)
+		{
+		    /* :: pattern change (singleton row too long) :: */
+		    DEBUGm4 (("bad U singleton row (too long)\n")) ;
+		    return (FALSE) ;	/* pattern changed */
+		}
+		*(Rpi [newrow]++) = k ;
+		*(Rpx [newrow]++) = x ;
+	    }
+	    else
+	    {
+		/* this entry goes in a column of L */
+		DEBUG1 (("Singleton col of L: k "ID" newrow "ID"\n",
+		    k, newrow)) ;
+		if (llen >= lilen)
+		{
+		    DEBUGm4 (("bad L singleton col (too long)\n")) ;
+		    return (FALSE) ;	/* pattern changed */
+		}
+		Li   [llen] = newrow ;
+		Lval [llen] = x ;
+		llen++ ;
+	    }
+	}
+
+	if (llen != lilen)
+	{
+	    /* :: pattern change (singleton column too long) :: */
+	    DEBUGm4 (("bad L singleton col (too short)\n")) ;
+	    return (FALSE) ;	/* pattern changed */
+	}
+
+	/* scale the column of L */
+	if (llen > 0)
+	{
+	    pivot_value = D [k] ;
+	    UMF_scale (llen, pivot_value, Lval) ;
+	}
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the elements and copy the columns of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* also apply the row and column pre-ordering.  */
+    for (k = n1 ; k < n_col ; k++)
+    {
+	/* The newcol is k, which is what the name of the column is in the
+	 * UMFPACK kernel.  The user's name for the column is oldcol. */
+	oldcol = Cperm_init [k] ;
+
+	ASSERT (oldcol >= 0 && oldcol < n_col) ;
+
+	p2 = Ap [oldcol+1] ;
+
+	cdeg = Cdeg [k] ;
+	ASSERT (cdeg >= 0) ;
+	ASSERT (IMPLIES (
+	    (Symbolic->ordering != UMFPACK_ORDERING_GIVEN) && n1 > 0,
+	    cdeg > 1 || cdeg == 0)) ;
+
+	/* if fixQ: set Col_degree to 0 for the NON_PIVOTAL_COL macro */
+	Col_degree [k] = fixQ ? 0 : cdeg ;
+
+	/* get the element for this column (if any) */
+	e = k - n1 + 1 ;
+	if (k < n_col - nempty_col)
+	{
+	    esize = Esize ? Esize [k-n1] : cdeg ;
+	    if (E [e])
+	    {
+		Int ncols, nrows ;
+		Unit *pp ;
+		pp = Memory + E [e] ;
+		GET_ELEMENT (ep, pp, Cols, Rows, ncols, nrows, C) ;
+		ASSERT (ncols == 1) ;
+		ASSERT (nrows == esize) ;
+		ASSERT (Cols [0] == k) ;
+	    }
+	}
+	else
+	{
+	    ASSERT (cdeg == 0) ;
+	    esize = 0 ;
+	}
+
+	clen = 0 ;
+
+	for (pa = Ap [oldcol] ; pa < p2 ; pa++)
+	{
+	    oldrow = Ai [pa] ;
+	    newrow = Frpos [oldrow] ;
+	    ASSIGN (x, Ax, Az, pa, split) ;
+
+	    /* scale the value using the scale factors, Rs */
+	    if (do_scale)
+	    {
+#ifndef NRECIPROCAL
+		if (do_recip)
+		{
+		    /* multiply by the reciprocal */
+		    SCALE (x, Rs [oldrow]) ;
+		}
+		else
+#endif
+		{
+		    /* divide instead */
+		    SCALE_DIV (x, Rs [oldrow]) ;
+		}
+	    }
+
+	    rdeg = Rdeg [newrow] ;
+	    if (newrow < n1 || rdeg > dense_row_threshold)
+	    {
+		/* this entry goes in a row of U or into a dense row */
+		DEBUG1 (("Singleton/dense row of U: k "ID" newrow "ID"\n",
+		    k, newrow)) ;
+		if (--(Wp [newrow]) < 0)
+		{
+		    DEBUGm4 (("bad row of U or A (too long)\n")) ;
+		    return (FALSE) ;	/* pattern changed */
+		}
+		*(Rpi [newrow]++) = k ;
+		*(Rpx [newrow]++) = x ;
+	    }
+	    else
+	    {
+		/* this entry goes in an initial element */
+		DEBUG1 (("In element k "ID" e "ID" newrow "ID"\n",
+		    k, e, newrow)) ;
+		if (clen >= esize)
+		{
+		    DEBUGm4 (("bad A column (too long)\n")) ;
+		    return (FALSE) ;	/* pattern changed */
+		}
+		ASSERT (E [e]) ;
+		ASSERT (k < n_col - nempty_col) ;
+		Rows [clen] = newrow ;
+		C    [clen] = x ;
+		clen++ ;
+#ifndef NDEBUG
+		if (Diagonal_map && (newrow == Diagonal_map [k]))
+		{
+		    DEBUG0 (("Diagonal: old: row "ID" col "ID" : "
+			"new: row "ID" col "ID" : ",
+			oldrow, oldcol, newrow, k)) ;
+		    EDEBUGk (0, x) ;
+		}
+#endif
+	    }
+	}
+
+	if (clen != esize)
+	{
+	    /* :: pattern change (singleton column too short) :: */
+	    DEBUGm4 (("bad A column (too short)\n")) ;
+	    return (FALSE) ;	/* pattern changed */
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the Rpi and Rpx workspace at the tail end of memory */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_mem_free_tail_block (Numeric, rpi) ;
+    UMF_mem_free_tail_block (Numeric, rpx) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* prune zeros and small entries from the singleton rows and columns */
+    /* ---------------------------------------------------------------------- */
+
+    if (n1 > 0)
+    {
+	pnew = Lip [0] ;
+	ASSERT (pnew == 1) ;
+	for (k = 0 ; k < n1 ; k++)
+	{
+	    DEBUGm4 (("\nPrune singleton L col "ID"\n", k)) ;
+	    pnew = packsp (pnew, &Lip [k], &Lilen [k], drop, droptol, Memory) ;
+	    Numeric->lnz += Lilen [k] ;
+	    DEBUGm4 (("\nPrune singleton U row "ID"\n", k)) ;
+	    pnew = packsp (pnew, &Uip [k], &Uilen [k], drop, droptol, Memory) ;
+	    Numeric->unz += Uilen [k] ;
+	}
+	/* free the unused space at the head of memory */
+	Numeric->ihead = pnew ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize row degrees */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	if (Wp [k] != 0)
+	{
+	    /* :: pattern change (singleton row too short) :: */
+	    DEBUGm4 (("bad U singleton row (too short)\n")) ;
+	    return (FALSE) ;	/* pattern changed */
+	}
+    }
+
+    for (k = n1 ; k < n_row ; k++)
+    {
+	DEBUG1 (("Initial row degree k "ID" oldrow "ID" Rdeg "ID"\n",
+	    k, Rperm_init [k], Rdeg [k])) ;
+	rdeg = Rdeg [k] ;
+	Row_degree [k] = rdeg ;
+	if (rdeg > dense_row_threshold && Wp [k] != 0)
+	{
+	    /* :: pattern change (dense row too short) :: */
+	    DEBUGm4 (("bad dense row (too short)\n")) ;
+	    return (FALSE) ;	/* pattern changed */
+	}
+    }
+
+#ifndef NDEBUG
+    if (prefer_diagonal)
+    {
+	Entry aij ;
+	Int *InvCperm, newcol ;
+	UMF_dump_diagonal_map (Diagonal_map, Diagonal_imap, n1, nn, nempty) ;
+	InvCperm = (Int *) malloc (n_col * sizeof (Int)) ;
+	ASSERT (InvCperm != (Int *) NULL) ;
+	for (newcol = 0 ; newcol < n_col ; newcol++)
+	{
+	    oldcol = Cperm_init [newcol] ;
+	    InvCperm [oldcol] = newcol ;
+	}
+	DEBUGm3 (("Diagonal of P2*A:\n")) ;
+	for (oldcol = 0 ; oldcol < n_col ; oldcol++)
+	{
+	    newcol = InvCperm [oldcol] ;
+	    for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++)
+	    {
+		oldrow = Ai [p] ;
+		newrow = Frpos [oldrow] ;
+		ASSIGN (aij, Ax, Az, p, split) ;
+		if (newrow == Diagonal_map [newcol])
+		{
+		    DEBUG0 (("old row "ID" col "ID" new row "ID" col "ID,
+			oldrow, oldcol, newrow, newcol)) ;
+		    EDEBUGk (0, aij) ;
+		    DEBUG0 ((" scaled ")) ;
+		    if (do_scale)
+		    {
+#ifndef NRECIPROCAL
+			if (do_recip)
+			{
+			    SCALE (aij, Rs [oldrow]) ;
+			}
+			else
+#endif
+			{
+			    SCALE_DIV (aij, Rs [oldrow]) ;
+			}
+		    }
+		    EDEBUGk (0, aij) ;
+		    DEBUG0 (("\n")) ;
+		}
+	    }
+	}
+	free (InvCperm) ;
+    }
+#endif
+
+    Col_degree [n_col] = 0 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* pack the element name space */
+    /* ---------------------------------------------------------------------- */
+
+    if (empty_elements)
+    {
+	Int e2 = 0 ;
+	DEBUG0 (("\n\n============= Packing element space\n")) ;
+	for (e = 1 ; e <= Work->nel ; e++)
+	{
+	    if (E [e])
+	    {
+		e2++ ;
+		E [e2] = E [e] ;
+	    }
+	}
+	Work->nel = e2 ;
+    }
+
+#ifndef NDEBUG
+    DEBUG0 (("Number of initial elements: "ID"\n", Work->nel)) ;
+    for (e = 0 ; e <= Work->nel ; e++) UMF_dump_element (Numeric, Work,e,TRUE) ;
+#endif
+
+    for (e = Work->nel + 1 ; e < Work->elen ; e++)
+    {
+	E [e] = 0 ;
+    }
+
+    /* Frpos no longer needed */
+    for (row = 0 ; row <= n_row ; row++)
+    {
+	Frpos [row] = EMPTY ;
+    }
+
+    /* clear Wp */
+    for (i = 0 ; i <= nn ; i++)
+    {
+	Wp [i] = EMPTY ;
+    }
+
+    DEBUG1 (("Kernel init head usage: "ID"\n", Numeric->ihead)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* build the tuple lists */
+    /* ---------------------------------------------------------------------- */
+
+    /* if the memory usage changes, then the pattern has changed */
+
+    (void) UMF_tuple_lengths (Numeric, Work, &unused) ;
+    if (!UMF_build_tuples (Numeric, Work))
+    {
+	/* :: pattern change (out of memory in umf_build_tuples) :: */
+	/* We ran out of memory, which can only mean that */
+	/* the pattern (Ap and or Ai) has changed (gotten larger). */
+	DEBUG0 (("Pattern has gotten larger - build tuples failed\n")) ;
+	return (FALSE) ;	/* pattern changed */
+    }
+
+    Numeric->init_usage = Numeric->max_usage ;
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the row merge sets */
+    /* ---------------------------------------------------------------------- */
+
+    for (i = 0 ; i <= Symbolic->nfr ; i++)
+    {
+	Work->Front_new1strow [i] = Symbolic->Front_1strow [i] ;
+    }
+
+#ifndef NDEBUG
+    UMF_dump_rowmerge (Numeric, Symbolic, Work) ;
+    DEBUG6 (("Column form of original matrix:\n")) ;
+    UMF_dump_col_matrix (Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+	Ai, Ap, n_row, n_col, nz) ;
+    UMF_dump_memory (Numeric) ;
+    UMF_dump_matrix (Numeric, Work, FALSE) ;
+    DEBUG0 (("kernel init done...\n")) ;
+#endif
+
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_init.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,18 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_kernel_init
+(
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,466 @@
+/* ========================================================================== */
+/* === UMF_kernel_wrapup ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The matrix is factorized.  Finish the LU data structure. */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_kernel_wrapup
+(
+    NumericType *Numeric,
+    SymbolicType *Symbolic,
+    WorkType *Work
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry pivot_value ;
+    double d ;
+    Entry *D ;
+    Int i, k, col, row, llen, ulen, *ip, *Rperm, *Cperm, *Lilen, npiv, lp,
+	*Uilen, *Lip, *Uip, *Cperm_init, up, pivrow, pivcol, *Lpos, *Upos, *Wr,
+	*Wc, *Wp, *Frpos, *Fcpos, *Row_degree, *Col_degree, *Rperm_init,
+	n_row, n_col, n_inner, zero_pivot, nan_pivot, n1 ;
+
+#ifndef NDEBUG
+    UMF_dump_matrix (Numeric, Work, FALSE) ;
+#endif
+
+    DEBUG0 (("Kernel complete, Starting Kernel wrapup\n")) ;
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+    n_inner = MIN (n_row, n_col) ;
+    Rperm = Numeric->Rperm ;
+    Cperm = Numeric->Cperm ;
+    Lilen = Numeric->Lilen ;
+    Uilen = Numeric->Uilen ;
+    Upos = Numeric->Upos ;
+    Lpos = Numeric->Lpos ;
+    Lip = Numeric->Lip ;
+    Uip = Numeric->Uip ;
+    D = Numeric->D ;
+
+    npiv = Work->npiv ;
+    Numeric->npiv = npiv ;
+    Numeric->ulen = Work->ulen ;
+
+    ASSERT (n_row == Numeric->n_row) ;
+    ASSERT (n_col == Symbolic->n_col) ;
+    DEBUG0 (("Wrap-up: npiv "ID" ulen "ID"\n", npiv, Numeric->ulen)) ;
+    ASSERT (npiv <= n_inner) ;
+
+    /* this will be nonzero only if matrix is singular or rectangular */
+    ASSERT (IMPLIES (npiv == n_col, Work->ulen == 0)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* find the smallest and largest entries in D */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	pivot_value = D [k] ;
+	ABS (d, pivot_value) ;
+	zero_pivot = SCALAR_IS_ZERO (d) ;
+	nan_pivot = SCALAR_IS_NAN (d) ;
+
+	if (!zero_pivot)
+	{
+	    /* the pivot is nonzero, but might be Inf or NaN */
+	    Numeric->nnzpiv++ ;
+	}
+
+	if (k == 0)
+	{
+	    Numeric->min_udiag = d ;
+	    Numeric->max_udiag = d ;
+	}
+	else
+	{
+	    /* min (abs (diag (U))) behaves as follows:  If any entry is zero,
+	       then the result is zero (regardless of the presence of NaN's).
+	       Otherwise, if any entry is NaN, then the result is NaN.
+	       Otherwise, the result is the smallest absolute value on the
+	       diagonal of U.
+	    */
+
+	    if (SCALAR_IS_NONZERO (Numeric->min_udiag))
+	    {
+		if (zero_pivot || nan_pivot)
+		{
+		    Numeric->min_udiag = d ;
+		}
+		else if (!SCALAR_IS_NAN (Numeric->min_udiag))
+		{
+		    /* d and min_udiag are both non-NaN */
+		    Numeric->min_udiag = MIN (Numeric->min_udiag, d) ;
+		}
+	    }
+
+	    /*
+	       max (abs (diag (U))) behaves as follows:  If any entry is NaN
+	       then the result is NaN.  Otherise, the result is the largest
+	       absolute value on the diagonal of U.
+	    */
+
+	    if (nan_pivot)
+	    {
+		Numeric->max_udiag = d ;
+	    }
+	    else if (!SCALAR_IS_NAN (Numeric->max_udiag))
+	    {
+		/* d and max_udiag are both non-NaN */
+		Numeric->max_udiag = MAX (Numeric->max_udiag, d) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* check if matrix is singular or rectangular */
+    /* ---------------------------------------------------------------------- */
+
+    Col_degree = Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Rperm ;	/* for NON_PIVOTAL_ROW macro */
+
+    if (npiv < n_row)
+    {
+	/* finalize the row permutation */
+	k = npiv ;
+	DEBUGm3 (("Singular pivot rows "ID" to "ID"\n", k, n_row-1)) ;
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    if (NON_PIVOTAL_ROW (row))
+	    {
+		Rperm [row] = ONES_COMPLEMENT (k) ;
+		DEBUGm3 (("Singular row "ID" is k: "ID" pivot row\n", row, k)) ;
+		ASSERT (!NON_PIVOTAL_ROW (row)) ;
+		Lpos [row] = EMPTY ;
+		Uip [row] = EMPTY ;
+		Uilen [row] = 0 ;
+		k++ ;
+	    }
+	}
+	ASSERT (k == n_row) ;
+    }
+
+    if (npiv < n_col)
+    {
+	/* finalize the col permutation */
+	k = npiv ;
+	DEBUGm3 (("Singular pivot cols "ID" to "ID"\n", k, n_col-1)) ;
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    if (NON_PIVOTAL_COL (col))
+	    {
+		Cperm [col] = ONES_COMPLEMENT (k) ;
+		DEBUGm3 (("Singular col "ID" is k: "ID" pivot row\n", col, k)) ;
+		ASSERT (!NON_PIVOTAL_COL (col)) ;
+		Upos [col] = EMPTY ;
+		Lip [col] = EMPTY ;
+		Lilen [col] = 0 ;
+		k++ ;
+	    }
+	}
+	ASSERT (k == n_col) ;
+    }
+
+    if (npiv < n_inner)
+    {
+	/* finalize the diagonal of U */
+	DEBUGm3 (("Diag of U is zero, "ID" to "ID"\n", npiv, n_inner-1)) ;
+	for (k = npiv ; k < n_inner ; k++)
+	{
+	    CLEAR (D [k]) ;
+	}
+    }
+
+    /* save the pattern of the last row of U */
+    if (Numeric->ulen > 0)
+    {
+	DEBUGm3 (("Last row of U is not empty\n")) ;
+	Numeric->Upattern = Work->Upattern ;
+	Work->Upattern = (Int *) NULL ;
+    }
+
+    DEBUG2 (("Nnzpiv: "ID"  npiv "ID"\n", Numeric->nnzpiv, npiv)) ;
+    ASSERT (Numeric->nnzpiv <= npiv) ;
+    if (Numeric->nnzpiv < n_inner && !SCALAR_IS_NAN (Numeric->min_udiag))
+    {
+	/* the rest of the diagonal is zero, so min_udiag becomes 0,
+	 * unless it is already NaN. */
+	Numeric->min_udiag = 0.0 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* size n_row, n_col workspaces that can be used here: */
+    /* ---------------------------------------------------------------------- */
+
+    Frpos = Work->Frpos ;	/* of size n_row+1 */
+    Fcpos = Work->Fcpos ;	/* of size n_col+1 */
+    Wp = Work->Wp ;		/* of size MAX(n_row,n_col)+1 */
+    /* Work->Upattern ;		cannot be used (in Numeric) */
+    Wr = Work->Lpattern ;	/* of size n_row+1 */
+    Wc = Work->Wrp ;		/* of size n_col+1 or bigger */
+
+    /* ---------------------------------------------------------------------- */
+    /* construct Rperm from inverse permutations */
+    /* ---------------------------------------------------------------------- */
+
+    /* use Frpos for temporary copy of inverse row permutation [ */
+
+    for (pivrow = 0 ; pivrow < n_row ; pivrow++)
+    {
+	k = Rperm [pivrow] ;
+	ASSERT (k < 0) ;
+	k = ONES_COMPLEMENT (k) ;
+	ASSERT (k >= 0 && k < n_row) ;
+	Wp [k] = pivrow ;
+	Frpos [pivrow] = k ;
+    }
+    for (k = 0 ; k < n_row ; k++)
+    {
+	Rperm [k] = Wp [k] ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct Cperm from inverse permutation */
+    /* ---------------------------------------------------------------------- */
+
+    /* use Fcpos for temporary copy of inverse column permutation [ */
+
+    for (pivcol = 0 ; pivcol < n_col ; pivcol++)
+    {
+	k = Cperm [pivcol] ;
+	ASSERT (k < 0) ;
+	k = ONES_COMPLEMENT (k) ;
+	ASSERT (k >= 0 && k < n_col) ;
+	Wp [k] = pivcol ;
+	/* save a copy of the inverse column permutation in Fcpos */
+	Fcpos [pivcol] = k ;
+    }
+    for (k = 0 ; k < n_col ; k++)
+    {
+	Cperm [k] = Wp [k] ;
+    }
+
+#ifndef NDEBUG
+    for (k = 0 ; k < n_col ; k++)
+    {
+	col = Cperm [k] ;
+	ASSERT (col >= 0 && col < n_col) ;
+	ASSERT (Fcpos [col] == k) ;		/* col is the kth pivot */
+    }
+    for (k = 0 ; k < n_row ; k++)
+    {
+	row = Rperm [k] ;
+	ASSERT (row >= 0 && row < n_row) ;
+	ASSERT (Frpos [row] == k) ;		/* row is the kth pivot */
+    }
+#endif
+
+#ifndef NDEBUG
+    UMF_dump_lu (Numeric) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* permute Lpos, Upos, Lilen, Lip, Uilen, and Uip */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	pivrow = Rperm [k] ;
+	Wr [k] = Uilen [pivrow] ;
+	Wp [k] = Uip [pivrow] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	Uilen [k] = Wr [k] ;
+	Uip [k] = Wp [k] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	pivrow = Rperm [k] ;
+	Wp [k] = Lpos [pivrow] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	Lpos [k] = Wp [k] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	pivcol = Cperm [k] ;
+	Wc [k] = Lilen [pivcol] ;
+	Wp [k] = Lip [pivcol] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	Lilen [k] = Wc [k] ;
+	Lip [k] = Wp [k] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	pivcol = Cperm [k] ;
+	Wp [k] = Upos [pivcol] ;
+    }
+
+    for (k = 0 ; k < npiv ; k++)
+    {
+	Upos [k] = Wp [k] ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* terminate the last Uchain and last Lchain */
+    /* ---------------------------------------------------------------------- */
+
+    Upos [npiv] = EMPTY ;
+    Lpos [npiv] = EMPTY ;
+    Uip [npiv] = EMPTY ;
+    Lip [npiv] = EMPTY ;
+    Uilen [npiv] = 0 ;
+    Lilen [npiv] = 0 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert U to the new pivot order */
+    /* ---------------------------------------------------------------------- */
+
+    n1 = Symbolic->n1 ;
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	/* this is a singleton row of U */
+	ulen = Uilen [k] ;
+	DEBUG4 (("K "ID" New U.  ulen "ID" Singleton 1\n", k, ulen)) ;
+	if (ulen > 0)
+	{
+	    up = Uip [k] ;
+	    ip = (Int *) (Numeric->Memory + up) ;
+	    for (i = 0 ; i < ulen ; i++)
+	    {
+		col = *ip ;
+		DEBUG4 ((" old col "ID" new col "ID"\n", col, Fcpos [col]));
+		ASSERT (col >= 0 && col < n_col) ;
+		*ip++ = Fcpos [col] ;
+	    }
+	}
+    }
+
+    for (k = n1 ; k < npiv ; k++)
+    {
+	up = Uip [k] ;
+	if (up < 0)
+	{
+	    /* this is the start of a new Uchain (with a pattern) */
+	    ulen = Uilen [k] ;
+	    DEBUG4 (("K "ID" New U.  ulen "ID" End_Uchain 1\n", k, ulen)) ;
+	    if (ulen > 0)
+	    {
+		up = -up ;
+		ip = (Int *) (Numeric->Memory + up) ;
+		for (i = 0 ; i < ulen ; i++)
+		{
+		    col = *ip ;
+		    DEBUG4 ((" old col "ID" new col "ID"\n", col, Fcpos [col]));
+		    ASSERT (col >= 0 && col < n_col) ;
+		    *ip++ = Fcpos [col] ;
+		}
+	    }
+	}
+    }
+
+    ulen = Numeric->ulen ;
+    if (ulen > 0)
+    {
+	/* convert last pivot row of U to the new pivot order */
+	DEBUG4 (("K "ID" (last)\n", k)) ;
+	for (i = 0 ; i < ulen ; i++)
+	{
+	    col = Numeric->Upattern [i] ;
+	    DEBUG4 (("    old col "ID" new col "ID"\n", col, Fcpos [col])) ;
+	    Numeric->Upattern [i] = Fcpos [col] ;
+	}
+    }
+
+    /* Fcpos no longer needed ] */
+
+    /* ---------------------------------------------------------------------- */
+    /* convert L to the new pivot order */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	llen = Lilen [k] ;
+	DEBUG4 (("K "ID" New L.  llen "ID" Singleton col\n", k, llen)) ;
+	if (llen > 0)
+	{
+	    lp = Lip [k] ;
+	    ip = (Int *) (Numeric->Memory + lp) ;
+	    for (i = 0 ; i < llen ; i++)
+	    {
+		row = *ip ;
+		DEBUG4 (("    old row "ID" new row "ID"\n", row, Frpos [row])) ;
+		ASSERT (row >= 0 && row < n_row) ;
+		*ip++ = Frpos [row] ;
+	    }
+	}
+    }
+
+    for (k = n1 ; k < npiv ; k++)
+    {
+	llen = Lilen [k] ;
+	DEBUG4 (("K "ID" New L.  llen "ID" \n", k, llen)) ;
+	if (llen > 0)
+	{
+	    lp = Lip [k] ;
+	    if (lp < 0)
+	    {
+		/* this starts a new Lchain */
+		lp = -lp ;
+	    }
+	    ip = (Int *) (Numeric->Memory + lp) ;
+	    for (i = 0 ; i < llen ; i++)
+	    {
+		row = *ip ;
+		DEBUG4 (("    old row "ID" new row "ID"\n", row, Frpos [row])) ;
+		ASSERT (row >= 0 && row < n_row) ;
+		*ip++ = Frpos [row] ;
+	    }
+	}
+    }
+
+    /* Frpos no longer needed ] */
+
+    /* ---------------------------------------------------------------------- */
+    /* combine symbolic and numeric permutations */
+    /* ---------------------------------------------------------------------- */
+
+    Cperm_init = Symbolic->Cperm_init ;
+    Rperm_init = Symbolic->Rperm_init ;
+
+    for (k = 0 ; k < n_row ; k++)
+    {
+	Rperm [k] = Rperm_init [Rperm [k]] ;
+    }
+
+    for (k = 0 ; k < n_col ; k++)
+    {
+	Cperm [k] = Cperm_init [Cperm [k]] ;
+    }
+
+    /* Work object will be freed immediately upon return (to UMF_kernel */
+    /* and then to UMFPACK_numeric). */
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_kernel_wrapup.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_kernel_wrapup
+(
+    NumericType *Numeric,
+    SymbolicType *Symbolic,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_local_search.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1947 @@
+/* ========================================================================== */
+/* === UMF_local_search ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Perform pivot search to find pivot row and pivot column.
+    The pivot column is selected from the candidate set.  The candidate set
+    corresponds to a supercolumn from colamd or UMF_analyze.  The pivot column
+    is then removed from that set.  Constructs the pivot column pattern and
+    values.  Called by umf_kernel.  Returns UMFPACK_OK if successful, or
+    UMFPACK_WARNING_singular_matrix or UMFPACK_ERROR_different_pattern if not.
+*/
+
+#include "umf_internal.h"
+#include "umf_row_search.h"
+#include "umf_mem_free_tail_block.h"
+
+/* relaxed amalgamation control parameters are fixed at compile time */
+#define RELAX1 0.25
+#define SYM_RELAX1 0.0
+#define RELAX2 0.1
+#define RELAX3 0.125
+
+/* ========================================================================== */
+/* === remove_candidate ===================================================== */
+/* ========================================================================== */
+
+/* Remove a column from the set of candidate pivot columns. */
+
+PRIVATE void remove_candidate (Int jj, WorkType *Work, SymbolicType *Symbolic)
+{
+
+#ifndef NDEBUG
+    Int j ;
+    DEBUGm2 (("pivot column Candidates before remove: nCand "ID" ncand "ID
+	" lo "ID" hi "ID" jj "ID"\n", Work->nCandidates, Work->ncand,
+	Work->lo, Work->hi, jj)) ;
+    for (j = 0 ; j < Work->nCandidates ; j++)
+    {
+	Int col = Work->Candidates [j] ;
+	DEBUGm2 ((ID" ", col));
+	ASSERT (col >= 0 && col < Work->n_col) ;
+	/* ASSERT (NON_PIVOTAL_COL (col)) ; */
+	ASSERT (col >= Work->lo && col <= Work->hi) ;
+    }
+    DEBUGm2 (("\n")) ;
+#endif
+
+    if (Symbolic->fixQ)
+    {
+	DEBUGm2 (("FixQ\n")) ;
+	/* do not modify the column ordering */
+	ASSERT (Work->nCandidates == 1) ;
+	ASSERT (jj == 0) ;
+	if (Work->ncand > 1)
+	{
+	    Work->Candidates [0] = Work->nextcand++ ;
+	}
+	else
+	{
+	    Work->nCandidates = 0 ;
+	}
+    }
+    else
+    {
+	/* place the next candidate in the set */
+	if (Work->ncand > MAX_CANDIDATES)
+	{
+	    Work->Candidates [jj] = Work->nextcand++ ;
+	}
+	else
+	{
+	    ASSERT (Work->nCandidates == Work->ncand) ;
+	    Work->Candidates [jj] = Work->Candidates [Work->ncand - 1] ;
+	    Work->Candidates [Work->ncand - 1] = EMPTY ;
+	    Work->nCandidates-- ;
+	}
+    }
+    Work->ncand-- ;
+
+#ifndef NDEBUG
+    DEBUGm2 (("pivot column Candidates after remove: nCand "ID" ncand "ID
+	" lo "ID" hi "ID" jj "ID"\n", Work->nCandidates, Work->ncand, Work->lo,
+	Work->hi, jj)) ;
+    for (j = 0 ; j < Work->nCandidates ; j++)
+    {
+	Int col = Work->Candidates [j] ;
+	DEBUGm2 ((ID" ", col));
+	ASSERT (col >= 0 && col < Work->n_col) ;
+	/* ASSERT (NON_PIVOTAL_COL (col)) ; */
+	ASSERT (col >= Work->lo && col <= Work->hi) ;
+    }
+    DEBUGm2 (("\n")) ;
+    ASSERT (Work->ncand >= 0) ;
+    ASSERT (Work->nCandidates <= Work->ncand) ;
+#endif
+}
+
+/* ========================================================================== */
+/* === UMF_local_search ===================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMF_local_search
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double relax1 ;
+    Entry *Flblock, *Fublock, *Fs, *Fcblock, *C, *Wx, *Wy, *Fu, *Flublock,
+	*Flu ;
+    Int pos, nrows, *Cols, *Rows, e, f, status, max_cdeg, fnzeros, nb, j, col,
+	i, row, cdeg_in, rdeg [2][2], fnpiv, nothing [2], new_LUsize,
+	pivrow [2][2], pivcol [2], *Wp, *Fcpos, *Frpos, new_fnzeros, cdeg_out,
+	*Wm, *Wio, *Woi, *Woo, *Frows, *Fcols, fnrows, fncols, *E, deg, nr_in,
+	nc, thiscost, bestcost, nr_out, do_update, extra_cols, extra_rows,
+	extra_zeros, relaxed_front, do_extend, fnr_curr, fnc_curr, tpi,
+	*Col_tuples, *Col_degree, *Col_tlen, jj, jcand [2], freebie [2],
+	did_rowmerge, fnrows_new [2][2], fncols_new [2][2], search_pivcol_out,
+	*Diagonal_map, *Diagonal_imap, row2, col2 ;
+    Unit *Memory, *p ;
+    Tuple *tp, *tpend, *tp1, *tp2 ;
+    Element *ep ;
+
+#ifndef NDEBUG
+    Int debug_ok, n_row, n_col, *Row_degree ;
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro only */
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    Memory = Numeric->Memory ;
+    E = Work->E ;
+    Col_degree = Numeric->Cperm ;
+
+    Col_tuples = Numeric->Lip ;
+    Col_tlen   = Numeric->Lilen ;
+
+    Wx = Work->Wx ;
+    Wy = Work->Wy ;
+    Wp = Work->Wp ;
+    Wm = Work->Wm ;
+    Woi = Work->Woi ;
+    Wio = Work->Wio ;
+    Woo = Work->Woo ;
+    Fcpos = Work->Fcpos ;
+    Frpos = Work->Frpos ;
+    Frows = Work->Frows ;
+    Fcols = Work->Fcols ;
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    nb = Work->nb ;
+    fnr_curr = Work->fnr_curr ;
+    fnc_curr = Work->fnc_curr ;
+    fnpiv = Work->fnpiv ;
+    nothing [0] = EMPTY ;
+    nothing [1] = EMPTY ;
+    relax1 = (Symbolic->prefer_diagonal) ? SYM_RELAX1 : RELAX1 ;
+    fnzeros = Work->fnzeros ;
+    new_fnzeros = fnzeros ;
+    jj = EMPTY ;
+
+    Fcblock = Work->Fcblock ;	    /* current contribution block */
+    Flblock = Work->Flblock ;	    /* current L block */
+    Fublock = Work->Fublock ;	    /* current U block */
+    Flublock = Work->Flublock ;	    /* current LU block */
+
+    /* The pivot column degree cannot exceed max_cdeg */
+    max_cdeg = Work->fnrows_max ;
+    ASSERT (Work->fnrows_max <= Symbolic->maxnrows) ;
+    ASSERT (Work->fncols_max <= Symbolic->maxncols) ;
+
+    if (fnrows == 0 && fncols == 0)
+    {
+	/* frontal matrix is empty */
+	Work->firstsuper = Work->ksuper ;
+    }
+
+#ifndef NDEBUG
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    DEBUG2 (("\n========LOCAL SEARCH:  current frontal matrix: ========= \n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+    if (UMF_debug > 0 || MAX (n_row, n_col) < 1000)
+    {
+	for (i = 0 ; i < MAX (n_row, n_col) ; i++)
+	{
+	    ASSERT (Wp [i] < 0) ;
+	}
+    }
+
+    DEBUGm2 ((ID" pivot column Candidates: lo "ID" hi "ID"\n",
+	Work->nCandidates, Work->lo, Work->hi)) ;
+    for (j = 0 ; j < Work->nCandidates ; j++)
+    {
+	col = Work->Candidates [j] ;
+	DEBUGm2 ((ID" ", col));
+	ASSERT (col >= 0 && col < n_col) ;
+	ASSERT (NON_PIVOTAL_COL (col)) ;
+	ASSERT (col >= Work->lo && col <= Work->hi) ;
+    }
+
+    DEBUGm2 (("\n")) ;
+    /* there are no 0-by-c or r-by-0 fronts, where c and r are > 0 */
+    /* a front is either 0-by-0, or r-by-c */
+    DEBUG2 (("\n\n::: "ID" : Npiv: "ID" + fnpiv "ID" = "ID". "
+	"size "ID"-by-"ID"\n", Work->frontid,
+	Work->npiv, Work->fnpiv, Work->npiv + Work->fnpiv, fnrows, fncols)) ;
+    ASSERT ((fnrows == 0 && fncols == 0) ||(fnrows != 0 && fncols != 0)) ;
+#endif
+
+    /* ====================================================================== */
+    /* === PIVOT SEARCH ===================================================== */
+    /* ====================================================================== */
+
+    /* initialize */
+
+    pivcol [IN] = EMPTY ;
+    pivcol [OUT] = EMPTY ;
+
+    cdeg_in = Int_MAX ;
+    cdeg_out = Int_MAX ;
+
+    pivrow [IN][IN] = EMPTY ;
+    pivrow [IN][OUT] = EMPTY ;
+    pivrow [OUT][IN] = EMPTY ;
+    pivrow [OUT][OUT] = EMPTY ;
+
+    rdeg [IN][IN] = Int_MAX ;
+    rdeg [IN][OUT] = Int_MAX ;
+    rdeg [OUT][IN] = Int_MAX ;
+    rdeg [OUT][OUT] = Int_MAX ;
+
+    freebie [IN] = FALSE ;
+    freebie [OUT] = FALSE ;
+
+    Work->pivot_case = EMPTY ;
+    bestcost = EMPTY ;
+
+    nr_out = EMPTY ;
+    nr_in = EMPTY ;
+
+    jcand [IN] = EMPTY ;
+    jcand [OUT] = EMPTY ;
+
+    fnrows_new [IN][IN] = EMPTY ;
+    fnrows_new [IN][OUT] = EMPTY ;
+    fnrows_new [OUT][IN] = EMPTY ;
+    fnrows_new [OUT][OUT] = EMPTY ;
+
+    fncols_new [IN][IN] = EMPTY ;
+    fncols_new [IN][OUT] = EMPTY ;
+    fncols_new [OUT][IN] = EMPTY ;
+    fncols_new [OUT][OUT] = EMPTY ;
+
+#ifndef NDEBUG
+	/* check Frpos */
+	DEBUG4 (("Check Frpos : fnrows "ID" col "ID" maxcdeg "ID"\n",
+		fnrows, pivcol [IN], max_cdeg)) ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    row = Frows [i] ;
+	    DEBUG4 (("  row: "ID"\n", row)) ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (Frpos [row] == i) ;
+	}
+	DEBUG4 (("All:\n")) ;
+	if (UMF_debug > 0 || n_row < 1000)
+	{
+	    Int cnt = fnrows ;
+	    for (row = 0 ; row < n_row ; row++)
+	    {
+		if (Frpos [row] == EMPTY)
+		{
+		    cnt++ ;
+		}
+		else
+		{
+		    DEBUG4 (("  row: "ID" pos "ID"\n", row, Frpos [row])) ;
+		}
+	    }
+	    ASSERT (cnt == n_row) ;
+	}
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* find shortest column in the front, and shortest column not in the */
+    /* front, from the candidate pivot column set */
+    /* ---------------------------------------------------------------------- */
+
+    /* If there are too many candidates, then only look at the first */
+    /* MAX_CANDIDATES of them.   Otherwise, if there are O(n) candidates, */
+    /* this code could take O(n^2) time. */
+
+    /* ------------------------------------------------------------------ */
+    /* look in the candidate set for the best column */
+    /* ------------------------------------------------------------------ */
+
+    DEBUG2 (("Max candidates %d, Work->ncand "ID" jmax "ID"\n",
+	MAX_CANDIDATES, Work->ncand, Work->nCandidates)) ;
+    col = Work->Candidates [0] ;
+    ASSERT (Work->nCandidates > 0) ;
+    DEBUG3 (("Pivot column candidate: "ID" j = "ID"\n", col, j)) ;
+    ASSERT (col >= 0 && col < n_col) ;
+
+    /* there is no Col_degree if fixQ is true */
+    deg = Symbolic->fixQ ? EMPTY : Col_degree [col] ;
+
+#ifndef NDEBUG
+    DEBUG3 (("Pivot column candidate: "ID" cost: "ID"  Fcpos[col] "ID"\n",
+	col, deg, Fcpos [col])) ;
+    UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ;
+    if (Symbolic->fixQ)
+    {
+	DEBUG1 (("FIXQ: Candidates "ID" pivcol "ID" npiv "ID" fnpiv "ID
+	    " ndiscard "ID "\n", Work->nCandidates, col, Work->npiv,
+	    Work->fnpiv, Work->ndiscard)) ;
+	ASSERT (Work->nCandidates == 1) ;
+	ASSERT (col == Work->npiv + Work->fnpiv + Work->ndiscard) ;
+    }
+#endif
+
+    if (Fcpos [col] >= 0)
+    {
+	/* best column in front, so far */
+	pivcol [IN] = col ;
+	cdeg_in = deg ;		/* ignored, if fixQ is true */
+	jcand [IN] = 0 ;
+    }
+    else
+    {
+	/* best column not in front, so far */
+	pivcol [OUT] = col ;
+	cdeg_out = deg ;	/* ignored, if fixQ is true */
+	jcand [OUT] = 0 ;
+    }
+
+    /* look at the rest of the candidates */
+    for (j = 1 ; j < Work->nCandidates ; j++)
+    {
+	col = Work->Candidates [j] ;
+
+	DEBUG3 (("Pivot col candidate: "ID" j = "ID"\n", col, j)) ;
+	ASSERT (col >= 0 && col < n_col) ;
+	ASSERT (!Symbolic->fixQ) ;
+	deg = Col_degree [col] ;
+#ifndef NDEBUG
+	DEBUG3 (("Pivot col candidate: "ID" cost: "ID" Fcpos[col] "ID"\n",
+		col, deg, Fcpos [col])) ;
+	UMF_dump_rowcol (1, Numeric, Work, col, !Symbolic->fixQ) ;
+#endif
+	if (Fcpos [col] >= 0)
+	{
+#ifndef NDEBUG
+	    Int fs ;
+	    fs = Fcpos [col] / fnr_curr ;
+	    ASSERT (fs >= 0 && fs < fncols) ;
+#endif
+	    if (deg < cdeg_in || (deg == cdeg_in && col < pivcol [IN]))
+	    {
+		/* best column in front, so far */
+		pivcol [IN] = col ;
+		cdeg_in = deg ;
+		jcand [IN] = j ;
+	    }
+	}
+	else
+	{
+	    if (deg < cdeg_out || (deg == cdeg_out && col < pivcol [OUT]))
+	    {
+		/* best column not in front, so far */
+		pivcol [OUT] = col ;
+		cdeg_out = deg ;
+		jcand [OUT] = j ;
+	    }
+	}
+    }
+
+    DEBUG2 (("Pivcol in "ID" out "ID"\n", pivcol [IN], pivcol [OUT])) ;
+    ASSERT ((pivcol [IN] >= 0 && pivcol [IN] < n_col)
+	|| (pivcol [OUT] >= 0 && pivcol [OUT] < n_col)) ;
+
+    cdeg_in = EMPTY ;
+    cdeg_out = EMPTY ;
+
+    /* ---------------------------------------------------------------------- */
+    /* construct candidate column in front, and search for pivot rows */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    /* check Frpos */
+    DEBUG4 (("Prior to col update: fnrows "ID" col "ID" maxcdeg "ID"\n",
+	    fnrows, pivcol [IN], max_cdeg)) ;
+    for (i = 0 ; i < fnrows ; i++)
+    {
+	row = Frows [i] ;
+	DEBUG4 (("  row: "ID"\n", row)) ;
+	ASSERT (row >= 0 && row < n_row) ;
+	ASSERT (Frpos [row] == i) ;
+    }
+    DEBUG4 (("All:\n")) ;
+    if (UMF_debug > 0 || n_row < 1000)
+    {
+	Int cnt = fnrows ;
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    if (Frpos [row] == EMPTY)
+	    {
+		cnt++ ;
+	    }
+	    else
+	    {
+		DEBUG4 (("  row: "ID" pos "ID"\n", row, Frpos [row])) ;
+	    }
+	}
+	ASSERT (cnt == n_row) ;
+    }
+#endif
+
+    if (pivcol [IN] != EMPTY)
+    {
+
+#ifndef NDEBUG
+	DEBUG2 (("col[IN] column "ID" in front at position = "ID"\n",
+		pivcol [IN], Fcpos [pivcol [IN]])) ;
+	UMF_dump_rowcol (1, Numeric, Work, pivcol [IN], !Symbolic->fixQ) ;
+#endif
+
+	/* the only way we can have a pivcol[IN] is if the front is not empty */
+	ASSERT (fnrows > 0 && fncols > 0) ;
+
+	DEBUG4 (("Update pivot column:\n")) ;
+	Fs  = Fcblock  +  Fcpos [pivcol [IN]] ;
+	Fu  = Fublock  + (Fcpos [pivcol [IN]] / fnr_curr) ;
+	Flu = Flublock + fnpiv * nb ;
+
+	/* ------------------------------------------------------------------ */
+	/* copy the pivot column from the U block into the LU block */
+	/* ------------------------------------------------------------------ */
+
+	/* This copy is permanent if the pivcol [IN] is chosen. */
+	for (i = 0 ; i < fnpiv ; i++)
+	{
+	    Flu [i] = Fu [i*fnc_curr] ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* update the pivot column in the LU block using a triangular solve */
+	/* ------------------------------------------------------------------ */
+
+	/* This work will be discarded if the pivcol [OUT] is chosen instead.
+	 * It is permanent if the pivcol [IN] is chosen. */
+
+	if (fnpiv > 1)
+	{
+	    /* solve Lx=b, where b = U (:,k), stored in the LU block */
+
+#ifdef USE_NO_BLAS
+
+	    /* no BLAS available - use plain C code instead */
+	    Entry *Flub = Flublock ;
+	    for (j = 0 ; j < fnpiv ; j++)
+	    {
+		Entry Fuj = Flu [j] ;
+#pragma ivdep
+		for (i = j+1 ; i < fnpiv ; i++)
+		{
+		    /* Flu [i] -= Flublock [i + j*nb] * Flu [j] ; */
+		    MULT_SUB (Flu [i], Flub [i], Fuj) ;
+		}
+		Flub += nb ;
+	    }
+
+#else
+	    BLAS_TRSV (fnpiv, Flublock, Flu, nb) ;
+#endif
+
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* copy the pivot column from the C block into Wy */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    Wy [i] = Fs [i] ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* update the pivot column of L using a matrix-vector multiply */
+	/* ------------------------------------------------------------------ */
+
+	/* this work will be discarded if the pivcol [OUT] is chosen instead */
+
+#ifdef USE_NO_BLAS
+	/* no BLAS available - use plain C code instead */
+	for (j = 0 ; j < fnpiv ; j++)
+	{
+	    Entry Fuj, *Flub = Flblock + j * fnr_curr ;
+	    Fuj = Flu [j] ;
+	    if (IS_NONZERO (Fuj))
+	    {
+#pragma ivdep
+		for (i = 0 ; i < fnrows ; i++)
+		{
+		    /* Wy [i] -= Flblock [i+j*fnr_curr] * Fuj ; */
+		    MULT_SUB (Wy [i], Flub [i], Fuj) ;
+		}
+	    }
+	    /* Flblock += fnr_curr ; */
+	}
+#else
+	/* Using 1-based notation:
+	 * Wy (1:fnrows) -= Flblock (1:fnrows,1:fnpiv) * Flu (1:fnpiv) */
+	BLAS_GEMV (fnrows, fnpiv, Flblock, Flu, Wy, fnr_curr) ;
+#endif
+
+	/* ------------------------------------------------------------------ */
+
+#ifndef NDEBUG
+	DEBUG2 (("Wy after update: fnrows="ID"\n", fnrows)) ;
+	DEBUG4 ((" fnpiv="ID" \n", fnpiv)) ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    DEBUG4 ((ID" "ID" "ID, i, Frows [i], Frpos [Frows [i]])) ;
+	    EDEBUG4 (Wy [i]) ;
+	    DEBUG4 (("\n")) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* construct the candidate column */
+	/* ------------------------------------------------------------------ */
+
+	cdeg_in = fnrows ;
+
+#ifndef NDEBUG
+	/* check Frpos */
+	DEBUG4 (("After col update: fnrows "ID" col "ID" maxcdeg "ID"\n",
+		fnrows, pivcol [IN], max_cdeg)) ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    row = Frows [i] ;
+	    DEBUG4 (("  row: "ID"\n", row)) ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (Frpos [row] == i) ;
+	}
+	DEBUG4 (("All:\n")) ;
+	if (UMF_debug > 0 || n_row < 1000)
+	{
+	    Int cnt = fnrows ;
+	    for (row = 0 ; row < n_row ; row++)
+	    {
+		if (Frpos [row] == EMPTY)
+		{
+		    cnt++ ;
+		}
+		else
+		{
+		    DEBUG4 (("  row: "ID" pos "ID"\n", row, Frpos [row])) ;
+		}
+	    }
+	    ASSERT (cnt == n_row) ;
+	}
+#endif
+
+#ifndef NDEBUG
+	/* check Frpos */
+	DEBUG4 (("COL ASSEMBLE: cdeg "ID"\nREDUCE COL in "ID" max_cdeg "ID"\n",
+		cdeg_in, pivcol [IN], max_cdeg)) ;
+	for (i = 0 ; i < cdeg_in ; i++)
+	{
+	    row = Frows [i] ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (Frpos [row] == i) ;
+	}
+	if (UMF_debug > 0 || n_row < 1000)
+	{
+	    Int cnt = cdeg_in ;
+	    for (row = 0 ; row < n_row ; row++)
+	    {
+		if (Frpos [row] == EMPTY) cnt++ ;
+	    }
+	    ASSERT (cnt == n_row) ;
+	}
+#endif
+
+	/* assemble column into Wy */
+
+	ASSERT (pivcol [IN] >= 0 && pivcol [IN] < n_col) ;
+	ASSERT (NON_PIVOTAL_COL (pivcol [IN])) ;
+
+	tpi = Col_tuples [pivcol [IN]] ;
+	if (tpi)
+	{
+	    tp = (Tuple *) (Memory + tpi) ;
+	    tp1 = tp ;
+	    tp2 = tp ;
+	    tpend = tp + Col_tlen [pivcol [IN]] ;
+	    for ( ; tp < tpend ; tp++)
+	    {
+		e = tp->e ;
+		ASSERT (e > 0 && e <= Work->nel) ;
+		if (!E [e]) continue ;	/* element already deallocated */
+		f = tp->f ;
+		p = Memory + E [e] ;
+		ep = (Element *) p ;
+		p += UNITS (Element, 1) ;
+		Cols = (Int *) p ;
+		if (Cols [f] == EMPTY) continue ; /* column already assembled */
+		ASSERT (pivcol [IN] == Cols [f]) ;
+
+		Rows = Cols + ep->ncols ;
+		nrows = ep->nrows ;
+		p += UNITS (Int, ep->ncols + nrows) ;
+		C = ((Entry *) p) + f * nrows ;
+
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    if (row >= 0) /* skip this if already gone from element */
+		    {
+			ASSERT (row < n_row) ;
+			pos = Frpos [row] ;
+			if (pos < 0)
+			{
+			    /* new entry in the pattern - save Frpos */
+			    ASSERT (cdeg_in < n_row) ;
+			    if (cdeg_in >= max_cdeg)
+			    {
+				/* :: pattern change (cdeg in failure) :: */
+				DEBUGm4 (("cdeg_in failure\n")) ;
+				return (UMFPACK_ERROR_different_pattern) ;
+			    }
+			    Frpos [row] = cdeg_in ;
+			    Frows [cdeg_in] = row ;
+			    Wy [cdeg_in++] = C [i] ;
+			}
+			else
+			{
+			    /* entry already in pattern - sum values in Wy */
+			    /* Wy [pos] += C [i] ; */
+			    ASSERT (pos < max_cdeg) ;
+			    ASSEMBLE (Wy [pos], C [i]) ;
+			}
+		    }
+		}
+		*tp2++ = *tp ;	/* leave the tuple in the list */
+	    }
+	    Col_tlen [pivcol [IN]] = tp2 - tp1 ;
+	}
+
+	/* ------------------------------------------------------------------ */
+
+#ifndef NDEBUG
+	/* check Frpos again */
+	DEBUG4 (("COL DONE: cdeg "ID"\nREDUCE COL in "ID" max_cdeg "ID"\n",
+		cdeg_in, pivcol [IN], max_cdeg)) ;
+	for (i = 0 ; i < cdeg_in ; i++)
+	{
+	    row = Frows [i] ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    ASSERT (Frpos [row] == i) ;
+	}
+	if (UMF_debug > 0 || n_row < 1000)
+	{
+	    Int cnt = cdeg_in ;
+	    for (row = 0 ; row < n_row ; row++)
+	    {
+		if (Frpos [row] == EMPTY) cnt++ ;
+	    }
+	    ASSERT (cnt == n_row) ;
+	}
+#endif
+
+#ifndef NDEBUG
+	DEBUG4 (("Reduced column: cdeg in  "ID" fnrows_max "ID"\n",
+	    cdeg_in, Work->fnrows_max)) ;
+	for (i = 0 ; i < cdeg_in ; i++)
+	{
+	    DEBUG4 ((" "ID" "ID" "ID, i, Frows [i], Frpos [Frows [i]])) ;
+	    EDEBUG4 (Wy [i]) ;
+	    DEBUG4 (("\n")) ;
+	    ASSERT (i == Frpos [Frows [i]]) ;
+	}
+	ASSERT (cdeg_in <= Work->fnrows_max) ;
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* cdeg_in is now the exact degree of this column */
+	/* ------------------------------------------------------------------ */
+
+	nr_in = cdeg_in - fnrows ;
+
+	/* since there are no 0-by-x fronts, if there is a pivcol [IN] the */
+	/* front must have at least one row. */
+	ASSERT (cdeg_in > 0) ;
+
+	/* new degree of pivcol [IN], excluding current front is nr_in */
+	/* column expands by nr_in rows */
+
+	/* ------------------------------------------------------------------ */
+	/* search for two candidate pivot rows */
+	/* ------------------------------------------------------------------ */
+
+	/* for the IN_IN pivot row (if any), */
+	/* extend the pattern in place, using Fcols */
+	status = UMF_row_search (Numeric, Work, Symbolic,
+	    fnrows, cdeg_in, Frows, Frpos,   /* pattern of column to search */
+	    pivrow [IN], rdeg [IN], Fcols, Wio, nothing, Wy,
+	    pivcol [IN], freebie) ;
+	ASSERT (!freebie [IN] && !freebie [OUT]) ;
+
+	/* ------------------------------------------------------------------ */
+	/* fatal error if matrix pattern has changed since symbolic analysis */
+	/* ------------------------------------------------------------------ */
+
+	if (status == UMFPACK_ERROR_different_pattern)
+	{
+	    /* :: pattern change (row search IN failure) :: */
+	    DEBUGm4 (("row search IN failure\n")) ;
+	    return (UMFPACK_ERROR_different_pattern) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* we now must have a structural pivot */
+	/* ------------------------------------------------------------------ */
+
+	/* Since the pivcol[IN] exists, there must be at least one row in the */
+	/* current frontal matrix, and so we must have found a structural */
+	/* pivot.  The numerical value might be zero, of course. */
+
+	ASSERT (status != UMFPACK_WARNING_singular_matrix) ;
+
+	/* ------------------------------------------------------------------ */
+	/* evaluate IN_IN option */
+	/* ------------------------------------------------------------------ */
+
+	if (pivrow [IN][IN] != EMPTY)
+	{
+	    /* The current front would become an (implicit) LUson.
+	     * Both candidate pivot row and column are in the current front.
+	     * Cost is how much the current front would expand */
+
+	    /* pivrow[IN][IN] candidates are not found via row merge search */
+
+	    ASSERT (fnrows >= 0 && fncols >= 0) ;
+
+	    ASSERT (cdeg_in > 0) ;
+	    nc = rdeg [IN][IN] - fncols ;
+
+	    thiscost =
+		/* each column in front (except pivot column) grows by nr_in: */
+		(nr_in * (fncols - 1)) +
+		/* new columns not in old front: */
+		(nc * (cdeg_in - 1)) ;
+
+	    /* no extra cost to relaxed amalgamation */
+
+	    ASSERT (fnrows + nr_in == cdeg_in) ;
+	    ASSERT (fncols + nc == rdeg [IN][IN]) ;
+
+	    /* size of relaxed front (after pivot row column removed): */
+	    fnrows_new [IN][IN] = (fnrows-1) + nr_in ;
+	    fncols_new [IN][IN] = (fncols-1) + nc ;
+	    /* relaxed_front = fnrows_new [IN][IN] * fncols_new [IN][IN] ; */
+
+	    do_extend = TRUE ;
+
+	    DEBUG2 (("Evaluating option IN-IN:\n")) ;
+	    DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_in "ID" nc "ID"\n",
+		Work->fnzeros, fnpiv, nr_in, nc)) ;
+	    DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ;
+
+	    /* determine if BLAS-3 update should be applied before extending. */
+	    /* update if too many zero entries accumulate in the LU block */
+	    fnzeros = Work->fnzeros + fnpiv * (nr_in + nc) ;
+
+	    DEBUG2 (("fnzeros "ID"\n", fnzeros)) ;
+
+	    new_LUsize = (fnpiv+1) * (fnrows + nr_in + fncols + nc) ;
+
+	    DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ;
+
+	    /* There are fnpiv pivots currently in the front.  This one
+	     * will be the (fnpiv+1)st pivot, if it is extended. */
+
+	    /* RELAX2 parameter uses a double relop, but ignore NaN case: */
+	    do_update = fnpiv > 0 &&
+		(((double) fnzeros) / ((double) new_LUsize)) > RELAX2 ;
+
+	    DEBUG2 (("do_update "ID"\n", do_update))
+
+	    DEBUG2 (("option IN  IN : nr "ID" nc "ID" cost "ID"(0) relax "ID
+		"\n", nr_in, nc, thiscost, do_extend)) ;
+
+	    /* this is the best option seen so far */
+	    Work->pivot_case = IN_IN ;
+	    bestcost = thiscost ;
+
+	    /* do the amalgamation and extend the front */
+	    Work->do_extend = do_extend ;
+	    Work->do_update = do_update ;
+	    new_fnzeros = fnzeros ;
+
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* evaluate IN_OUT option */
+	/* ------------------------------------------------------------------ */
+
+	if (pivrow [IN][OUT] != EMPTY)
+	{
+	    /* The current front would become a Uson of the new front.
+	     * Candidate pivot column is in the current front, but the
+	     * candidate pivot row is not. */
+
+	    ASSERT (fnrows >= 0 && fncols > 0) ;
+	    ASSERT (cdeg_in > 0) ;
+
+	    /* must be at least one row outside the front */
+	    /* (the pivrow [IN][OUT] itself) */
+	    ASSERT (nr_in >= 1) ;
+
+	    /* count columns not in current front */
+	    nc = 0 ;
+#ifndef NDEBUG
+	    debug_ok = FALSE ;
+#endif
+	    for (i = 0 ; i < rdeg [IN][OUT] ; i++)
+	    {
+		col = Wio [i] ;
+		DEBUG4 (("counting col "ID" Fcpos[] = "ID"\n", col,
+		    Fcpos [col])) ;
+		ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+		if (Fcpos [col] < 0) nc++ ;
+#ifndef NDEBUG
+		/* we must see the pivot column somewhere */
+		if (col == pivcol [IN])
+		{
+		    ASSERT (Fcpos [col] >= 0) ;
+		    debug_ok = TRUE ;
+		}
+#endif
+	    }
+	    ASSERT (debug_ok) ;
+
+	    thiscost =
+		/* each row in front grows by nc: */
+		(nc * fnrows) +
+		/* new rows not affected by front: */
+		((nr_in-1) * (rdeg [IN][OUT]-1)) ;
+
+	    /* check the cost of relaxed IN_OUT amalgamation */
+
+	    extra_cols = ((fncols-1) + nc ) - (rdeg [IN][OUT] - 1) ;
+	    ASSERT (extra_cols >= 0) ;
+	    ASSERT (fncols + nc == extra_cols + rdeg [IN][OUT]) ;
+	    extra_zeros = (nr_in-1) * extra_cols ;	/* symbolic fill-in */
+
+	    ASSERT (fnrows + nr_in == cdeg_in) ;
+	    ASSERT (fncols + nc == rdeg [IN][OUT] + extra_cols) ;
+
+	    /* size of relaxed front (after pivot column removed): */
+	    fnrows_new [IN][OUT] = fnrows + (nr_in-1) ;
+	    fncols_new [IN][OUT] = (fncols-1) + nc ;
+	    relaxed_front = fnrows_new [IN][OUT] * fncols_new [IN][OUT] ;
+
+	    /* do relaxed amalgamation if the extra zeros are no more */
+	    /* than a fraction (default 0.25) of the relaxed front */
+	    /* if relax = 0: no extra zeros allowed */
+	    /* if relax = +inf: always amalgamate */
+
+	    /* relax parameter uses a double relop, but ignore NaN case: */
+	    if (extra_zeros == 0)
+	    {
+		do_extend = TRUE ;
+	    }
+	    else
+	    {
+		do_extend = ((double) extra_zeros) <
+		   (relax1 * (double) relaxed_front) ;
+	    }
+
+	    if (do_extend)
+	    {
+		/* count the cost of relaxed amalgamation */
+		thiscost += extra_zeros ;
+
+		DEBUG2 (("Evaluating option IN-OUT:\n")) ;
+		DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_in "ID" nc "ID"\n",
+		    Work->fnzeros, fnpiv, nr_in, nc)) ;
+		DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ;
+
+		/* determine if BLAS-3 update to be applied before extending. */
+		/* update if too many zero entries accumulate in the LU block */
+		fnzeros = Work->fnzeros + fnpiv * (nr_in + nc) ;
+
+		DEBUG2 (("fnzeros "ID"\n", fnzeros)) ;
+
+		new_LUsize = (fnpiv+1) * (fnrows + nr_in + fncols + nc) ;
+
+		DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ;
+
+		/* RELAX3 parameter uses a double relop, ignore NaN case: */
+		do_update = fnpiv > 0 &&
+		    (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ;
+		DEBUG2 (("do_update "ID"\n", do_update))
+
+	    }
+	    else
+	    {
+		/* the current front would not be extended */
+		do_update = fnpiv > 0 ;
+		fnzeros = 0 ;
+		DEBUG2 (("IN-OUT do_update forced true: "ID"\n", do_update)) ;
+
+		/* The new front would be just big enough to hold the new
+		 * pivot row and column. */
+		fnrows_new [IN][OUT] = cdeg_in - 1 ;
+		fncols_new [IN][OUT] = rdeg [IN][OUT] - 1 ;
+
+	    }
+
+	    DEBUG2 (("option IN  OUT: nr "ID" nc "ID" cost "ID"("ID") relax "ID
+		"\n", nr_in, nc, thiscost, extra_zeros, do_extend)) ;
+
+	    if (bestcost == EMPTY || thiscost < bestcost)
+	    {
+		/* this is the best option seen so far */
+		Work->pivot_case = IN_OUT ;
+		bestcost = thiscost ;
+		Work->do_extend = do_extend ;
+		Work->do_update = do_update ;
+		new_fnzeros = fnzeros ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct candidate column not in front, and search for pivot rows */
+    /* ---------------------------------------------------------------------- */
+
+    search_pivcol_out = (bestcost != 0 && pivcol [OUT] != EMPTY) ;
+    if (Symbolic->prefer_diagonal)
+    {
+	search_pivcol_out = search_pivcol_out && (pivrow [IN][IN] == EMPTY) ;
+    }
+
+    if (search_pivcol_out)
+    {
+
+#ifndef NDEBUG
+	DEBUG2 (("out_col column "ID" NOT in front at position = "ID"\n",
+		pivcol [OUT], Fcpos [pivcol [OUT]])) ;
+	UMF_dump_rowcol (1, Numeric, Work, pivcol [OUT], !Symbolic->fixQ) ;
+	DEBUG2 (("fncols "ID" fncols_max "ID"\n", fncols, Work->fncols_max)) ;
+	ASSERT (fncols < Work->fncols_max) ;
+#endif
+
+	/* Use Wx as temporary workspace to construct the pivcol [OUT] */
+
+
+	/* ------------------------------------------------------------------ */
+	/* construct the candidate column (currently not in the front) */
+	/* ------------------------------------------------------------------ */
+
+	/* Construct the column in Wx, Wm, using Wp for the positions: */
+	/* Wm [0..cdeg_out-1]	list of row indices in the column */
+	/* Wx [0..cdeg_out-1]	list of corresponding numerical values */
+	/* Wp [0..n-1] starts as all negative, and ends that way too. */
+
+	cdeg_out = 0 ;
+
+#ifndef NDEBUG
+	/* check Wp */
+	DEBUG4 (("COL ASSEMBLE: cdeg 0\nREDUCE COL out "ID"\n", pivcol [OUT])) ;
+	if (UMF_debug > 0 || MAX (n_row, n_col) < 1000)
+	{
+	    for (i = 0 ; i < MAX (n_row, n_col) ; i++)
+	    {
+		ASSERT (Wp [i] < 0) ;
+	    }
+	}
+	DEBUG4 (("max_cdeg: "ID"\n", max_cdeg)) ;
+#endif
+
+	ASSERT (pivcol [OUT] >= 0 && pivcol [OUT] < n_col) ;
+	ASSERT (NON_PIVOTAL_COL (pivcol [OUT])) ;
+
+	tpi = Col_tuples [pivcol [OUT]] ;
+	if (tpi)
+	{
+	    tp = (Tuple *) (Memory + tpi) ;
+	    tp1 = tp ;
+	    tp2 = tp ;
+	    tpend = tp + Col_tlen [pivcol [OUT]] ;
+	    for ( ; tp < tpend ; tp++)
+	    {
+		e = tp->e ;
+		ASSERT (e > 0 && e <= Work->nel) ;
+		if (!E [e]) continue ;	/* element already deallocated */
+		f = tp->f ;
+		p = Memory + E [e] ;
+		ep = (Element *) p ;
+		p += UNITS (Element, 1) ;
+		Cols = (Int *) p ;
+		if (Cols [f] == EMPTY) continue ; /* column already assembled */
+		ASSERT (pivcol [OUT] == Cols [f]) ;
+
+		Rows = Cols + ep->ncols ;
+		nrows = ep->nrows ;
+		p += UNITS (Int, ep->ncols + nrows) ;
+		C = ((Entry *) p) + f * nrows ;
+
+		for (i = 0 ; i < nrows ; i++)
+		{
+		    row = Rows [i] ;
+		    if (row >= 0) /* skip this if already gone from element */
+		    {
+			ASSERT (row < n_row) ;
+			pos = Wp [row] ;
+			if (pos < 0)
+			{
+			    /* new entry in the pattern - save Wp */
+			    ASSERT (cdeg_out < n_row) ;
+			    if (cdeg_out >= max_cdeg)
+			    {
+				/* :: pattern change (cdeg out failure) :: */
+				DEBUGm4 (("cdeg out failure\n")) ;
+				return (UMFPACK_ERROR_different_pattern) ;
+			    }
+			    Wp [row] = cdeg_out ;
+			    Wm [cdeg_out] = row ;
+			    Wx [cdeg_out++] = C [i] ;
+			}
+			else
+			{
+			    /* entry already in pattern - sum the values */
+			    /* Wx [pos] += C [i] ; */
+			    ASSEMBLE (Wx [pos], C [i]) ;
+			}
+		    }
+		}
+		*tp2++ = *tp ;	/* leave the tuple in the list */
+	    }
+	    Col_tlen [pivcol [OUT]] = tp2 - tp1 ;
+	}
+
+	/* ------------------------------------------------------------------ */
+
+#ifndef NDEBUG
+	DEBUG4 (("Reduced column: cdeg out "ID"\n", cdeg_out)) ;
+	for (i = 0 ; i < cdeg_out ; i++)
+	{
+	    DEBUG4 ((" "ID" "ID" "ID, i, Wm [i], Wp [Wm [i]])) ;
+	    EDEBUG4 (Wx [i]) ;
+	    DEBUG4 (("\n")) ;
+	    ASSERT (i == Wp [Wm [i]]) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* new degree of pivcol [OUT] is cdeg_out */
+	/* ------------------------------------------------------------------ */
+
+	/* search for two candidate pivot rows */
+	status = UMF_row_search (Numeric, Work, Symbolic,
+	    0, cdeg_out, Wm, Wp, /* pattern of column to search */
+	    pivrow [OUT], rdeg [OUT], Woi, Woo, pivrow [IN], Wx,
+	    pivcol [OUT], freebie) ;
+
+	/* ------------------------------------------------------------------ */
+	/* fatal error if matrix pattern has changed since symbolic analysis */
+	/* ------------------------------------------------------------------ */
+
+	if (status == UMFPACK_ERROR_different_pattern)
+	{
+	    /* :: pattern change detected in umf_local_search :: */
+	    return (UMFPACK_ERROR_different_pattern) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* Clear Wp */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < cdeg_out ; i++)
+	{
+	    Wp [Wm [i]] = EMPTY ;	/* clear Wp */
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* check for rectangular, singular matrix */
+	/* ------------------------------------------------------------------ */
+
+	if (status == UMFPACK_WARNING_singular_matrix)
+	{
+	    /* Pivot column is empty, and row-merge set is empty too.  The
+	     * matrix is structurally singular.  The current frontal matrix must
+	     * be empty, too.  It it weren't, and pivcol [OUT] exists, then
+	     * there would be at least one row that could be selected.  Since
+	     * the current front is empty, pivcol [IN] must also be EMPTY.
+	     */
+
+	    DEBUGm4 (("Note: pivcol [OUT]: "ID" discard\n", pivcol [OUT])) ;
+	    ASSERT ((Work->fnrows == 0 && Work->fncols == 0)) ;
+	    ASSERT (pivcol [IN] == EMPTY) ;
+
+	    /* remove the failed pivcol [OUT] from candidate set */
+	    ASSERT (pivcol [OUT] == Work->Candidates [jcand [OUT]]) ;
+	    remove_candidate (jcand [OUT], Work, Symbolic) ;
+	    Work->ndiscard++ ;
+
+	    /* delete all of the tuples, and all contributions to this column */
+	    DEBUG1 (("Prune tuples of dead outcol: "ID"\n", pivcol [OUT])) ;
+	    Col_tlen [pivcol [OUT]] = 0 ;
+	    UMF_mem_free_tail_block (Numeric, Col_tuples [pivcol [OUT]]) ;
+	    Col_tuples [pivcol [OUT]] = 0 ;
+
+	    /* no pivot found at all */
+	    return (UMFPACK_WARNING_singular_matrix) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+
+	if (freebie [IN])
+	{
+	    /* the "in" row is the same as the "in" row for the "in" column */
+	    Woi = Fcols ;
+	    rdeg [OUT][IN] = rdeg [IN][IN] ;
+	    DEBUG4 (("Freebie in, row "ID"\n", pivrow [IN][IN])) ;
+	}
+
+	if (freebie [OUT])
+	{
+	    /* the "out" row is the same as the "out" row for the "in" column */
+	    Woo = Wio ;
+	    rdeg [OUT][OUT] = rdeg [IN][OUT] ;
+	    DEBUG4 (("Freebie out, row "ID"\n", pivrow [IN][OUT])) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* evaluate OUT_IN option */
+	/* ------------------------------------------------------------------ */
+
+	if (pivrow [OUT][IN] != EMPTY)
+	{
+	    /* The current front would become an Lson of the new front.
+	     * The candidate pivot row is in the current front, but the
+	     * candidate pivot column is not. */
+
+	    ASSERT (fnrows > 0 && fncols >= 0) ;
+
+	    did_rowmerge = (cdeg_out == 0) ;
+	    if (did_rowmerge)
+	    {
+		/* pivrow [OUT][IN] was found via row merge search */
+		/* it is not (yet) in the pivot column pattern (add it now) */
+		DEBUGm4 (("did row merge OUT col, IN row\n")) ;
+		Wm [0] = pivrow [OUT][IN] ;
+		CLEAR (Wx [0]) ;
+		cdeg_out = 1 ;
+		ASSERT (nr_out == EMPTY) ;
+	    }
+
+	    nc = rdeg [OUT][IN] - fncols ;
+	    ASSERT (nc >= 1) ;
+
+	    /* count rows not in current front */
+	    nr_out = 0 ;
+#ifndef NDEBUG
+	    debug_ok = FALSE ;
+#endif
+	    for (i = 0 ; i < cdeg_out ; i++)
+	    {
+		row = Wm [i] ;
+		ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+		if (Frpos [row] < 0 || Frpos [row] >= fnrows) nr_out++ ;
+#ifndef NDEBUG
+		/* we must see the pivot row somewhere */
+		if (row == pivrow [OUT][IN])
+		{
+		    ASSERT (Frpos [row] >= 0) ;
+		    debug_ok = TRUE ;
+		}
+#endif
+	    }
+	    ASSERT (debug_ok) ;
+
+	    thiscost =
+		/* each column in front grows by nr_out: */
+		(nr_out * fncols) +
+		/* new cols not affected by front: */
+		((nc-1) * (cdeg_out-1)) ;
+
+	    /* check the cost of relaxed OUT_IN amalgamation */
+
+	    extra_rows = ((fnrows-1) + nr_out) - (cdeg_out - 1) ;
+	    ASSERT (extra_rows >= 0) ;
+	    ASSERT (fnrows + nr_out == extra_rows + cdeg_out) ;
+	    extra_zeros = (nc-1) * extra_rows ;	/* symbolic fill-in */
+
+	    ASSERT (fnrows + nr_out == cdeg_out + extra_rows) ;
+	    ASSERT (fncols + nc == rdeg [OUT][IN]) ;
+
+	    /* size of relaxed front (after pivot row removed): */
+	    fnrows_new [OUT][IN] = (fnrows-1) + nr_out ;
+	    fncols_new [OUT][IN] = fncols + (nc-1) ;
+	    relaxed_front = fnrows_new [OUT][IN] * fncols_new [OUT][IN] ;
+
+	    /* do relaxed amalgamation if the extra zeros are no more */
+	    /* than a fraction (default 0.25) of the relaxed front */
+	    /* if relax = 0: no extra zeros allowed */
+	    /* if relax = +inf: always amalgamate */
+	    if (did_rowmerge)
+	    {
+		do_extend = FALSE ;
+	    }
+	    else
+	    {
+		/* relax parameter uses a double relop, but ignore NaN case: */
+		if (extra_zeros == 0)
+		{
+		    do_extend = TRUE ;
+		}
+		else
+		{
+		    do_extend = ((double) extra_zeros) <
+		       (relax1 * (double) relaxed_front) ;
+		}
+	    }
+
+	    if (do_extend)
+	    {
+		/* count the cost of relaxed amalgamation */
+		thiscost += extra_zeros ;
+
+		DEBUG2 (("Evaluating option OUT-IN:\n")) ;
+		DEBUG2 ((" Work->fnzeros "ID" fnpiv "ID" nr_out "ID" nc "ID"\n",
+		Work->fnzeros, fnpiv, nr_out, nc)) ;
+		DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ;
+
+		/* determine if BLAS-3 update to be applied before extending. */
+		/* update if too many zero entries accumulate in the LU block */
+		fnzeros = Work->fnzeros + fnpiv * (nr_out + nc) ;
+
+		DEBUG2 (("fnzeros "ID"\n", fnzeros)) ;
+
+		new_LUsize = (fnpiv+1) * (fnrows + nr_out + fncols + nc) ;
+
+		DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ;
+
+		/* RELAX3 parameter uses a double relop, ignore NaN case: */
+		do_update = fnpiv > 0 &&
+		    (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ;
+		DEBUG2 (("do_update "ID"\n", do_update))
+	    }
+	    else
+	    {
+		/* the current front would not be extended */
+		do_update = fnpiv > 0 ;
+		fnzeros = 0 ;
+		DEBUG2 (("OUT-IN do_update forced true: "ID"\n", do_update)) ;
+
+		/* The new front would be just big enough to hold the new
+		 * pivot row and column. */
+		fnrows_new [OUT][IN] = cdeg_out - 1 ;
+		fncols_new [OUT][IN] = rdeg [OUT][IN] - 1 ;
+	    }
+
+	    DEBUG2 (("option OUT IN : nr "ID" nc "ID" cost "ID"("ID") relax "ID
+		"\n", nr_out, nc, thiscost, extra_zeros, do_extend)) ;
+
+	    if (bestcost == EMPTY || thiscost < bestcost)
+	    {
+		/* this is the best option seen so far */
+		Work->pivot_case = OUT_IN ;
+		bestcost = thiscost ;
+		Work->do_extend = do_extend ;
+		Work->do_update = do_update ;
+		new_fnzeros = fnzeros ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* evaluate OUT_OUT option */
+	/* ------------------------------------------------------------------ */
+
+	if (pivrow [OUT][OUT] != EMPTY)
+	{
+	    /* Neither the candidate pivot row nor the candidate pivot column
+	     * are in the current front. */
+
+	    ASSERT (fnrows >= 0 && fncols >= 0) ;
+
+	    did_rowmerge = (cdeg_out == 0) ;
+	    if (did_rowmerge)
+	    {
+		/* pivrow [OUT][OUT] was found via row merge search */
+		/* it is not (yet) in the pivot column pattern (add it now) */
+		DEBUGm4 (("did row merge OUT col, OUT row\n")) ;
+		Wm [0] = pivrow [OUT][OUT] ;
+		CLEAR (Wx [0]) ;
+		cdeg_out = 1 ;
+		ASSERT (nr_out == EMPTY) ;
+		nr_out = 1 ;
+	    }
+
+	    if (fnrows == 0 && fncols == 0)
+	    {
+		/* the current front is completely empty */
+		ASSERT (fnpiv == 0) ;
+		nc = rdeg [OUT][OUT] ;
+		extra_cols = 0 ;
+		nr_out = cdeg_out ;
+		extra_rows = 0 ;
+		extra_zeros = 0 ;
+
+		thiscost = (nc-1) * (cdeg_out-1) ; /* new columns only */
+
+		/* size of new front: */
+		fnrows_new [OUT][OUT] = nr_out-1 ;
+		fncols_new [OUT][OUT] = nc-1 ;
+		relaxed_front = fnrows_new [OUT][OUT] * fncols_new [OUT][OUT] ;
+	    }
+	    else
+	    {
+
+		/* count rows not in current front */
+		if (nr_out == EMPTY)
+		{
+		    nr_out = 0 ;
+#ifndef NDEBUG
+		    debug_ok = FALSE ;
+#endif
+		    for (i = 0 ; i < cdeg_out ; i++)
+		    {
+			row = Wm [i] ;
+			ASSERT (row >= 0 && row < n_row) ;
+			ASSERT (NON_PIVOTAL_ROW (row)) ;
+			if (Frpos [row] < 0 || Frpos [row] >= fnrows) nr_out++ ;
+#ifndef NDEBUG
+			/* we must see the pivot row somewhere */
+			if (row == pivrow [OUT][OUT])
+			{
+			    ASSERT (Frpos [row] < 0 || Frpos [row] >= fnrows) ;
+			    debug_ok = TRUE ;
+			}
+#endif
+		    }
+		    ASSERT (debug_ok) ;
+		}
+
+		/* count columns not in current front */
+		nc = 0 ;
+#ifndef NDEBUG
+		debug_ok = FALSE ;
+#endif
+		for (i = 0 ; i < rdeg [OUT][OUT] ; i++)
+		{
+		    col = Woo [i] ;
+		    ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+		    if (Fcpos [col] < 0) nc++ ;
+#ifndef NDEBUG
+		    /* we must see the pivot column somewhere */
+		    if (col == pivcol [OUT])
+		    {
+			ASSERT (Fcpos [col] < 0) ;
+			debug_ok = TRUE ;
+		    }
+#endif
+		}
+		ASSERT (debug_ok) ;
+
+		extra_cols = (fncols + (nc-1)) - (rdeg [OUT][OUT] - 1) ;
+		extra_rows = (fnrows + (nr_out-1)) - (cdeg_out - 1) ;
+		ASSERT (extra_rows >= 0) ;
+		ASSERT (extra_cols >= 0) ;
+		extra_zeros = ((nc-1) * extra_rows) + ((nr_out-1) * extra_cols);
+
+		ASSERT (fnrows + nr_out == cdeg_out + extra_rows) ;
+		ASSERT (fncols + nc == rdeg [OUT][OUT] + extra_cols) ;
+
+		thiscost =
+		    /* new columns: */
+		    ((nc-1) * (cdeg_out-1)) +
+		    /* old columns in front grow by nr_out-1: */
+		    ((nr_out-1) * (fncols - extra_cols)) ;
+
+		/* size of relaxed front: */
+		fnrows_new [OUT][OUT] = fnrows + (nr_out-1) ;
+		fncols_new [OUT][OUT] = fncols + (nc-1) ;
+		relaxed_front = fnrows_new [OUT][OUT] * fncols_new [OUT][OUT] ;
+
+	    }
+
+	    /* do relaxed amalgamation if the extra zeros are no more */
+	    /* than a fraction (default 0.25) of the relaxed front */
+	    /* if relax = 0: no extra zeros allowed */
+	    /* if relax = +inf: always amalgamate */
+	    if (did_rowmerge)
+	    {
+		do_extend = FALSE ;
+	    }
+	    else
+	    {
+		/* relax parameter uses a double relop, but ignore NaN case: */
+		if (extra_zeros == 0)
+		{
+		    do_extend = TRUE ;
+		}
+		else
+		{
+		    do_extend = ((double) extra_zeros) <
+		       (relax1 * (double) relaxed_front) ;
+		}
+	    }
+
+	    if (do_extend)
+	    {
+		/* count the cost of relaxed amalgamation */
+		thiscost += extra_zeros ;
+
+		DEBUG2 (("Evaluating option OUT-OUT:\n")) ;
+		DEBUG2 (("Work->fnzeros "ID" fnpiv "ID" nr_out "ID" nc "ID"\n",
+		    Work->fnzeros, fnpiv, nr_out, nc)) ;
+		DEBUG2 (("fncols "ID" fnrows "ID"\n", fncols, fnrows)) ;
+
+		/* determine if BLAS-3 update to be applied before extending. */
+		/* update if too many zero entries accumulate in the LU block */
+		fnzeros = Work->fnzeros + fnpiv * (nr_out + nc) ;
+
+		DEBUG2 (("fnzeros "ID"\n", fnzeros)) ;
+
+		new_LUsize = (fnpiv+1) * (fnrows + nr_out + fncols + nc) ;
+
+		DEBUG2 (("new_LUsize "ID"\n", new_LUsize)) ;
+
+		/* RELAX3 parameter uses a double relop, ignore NaN case: */
+		do_update = fnpiv > 0 &&
+		    (((double) fnzeros) / ((double) new_LUsize)) > RELAX3 ;
+		DEBUG2 (("do_update "ID"\n", do_update))
+	    }
+	    else
+	    {
+		/* the current front would not be extended */
+		do_update = fnpiv > 0 ;
+		fnzeros = 0 ;
+		DEBUG2 (("OUT-OUT do_update forced true: "ID"\n", do_update)) ;
+
+		/* The new front would be just big enough to hold the new
+		 * pivot row and column. */
+		fnrows_new [OUT][OUT] = cdeg_out - 1 ;
+		fncols_new [OUT][OUT] = rdeg [OUT][OUT] - 1 ;
+	    }
+
+	    DEBUG2 (("option OUT OUT: nr "ID" nc "ID" cost "ID"\n",
+		rdeg [OUT][OUT], cdeg_out, thiscost)) ;
+
+	    if (bestcost == EMPTY || thiscost < bestcost)
+	    {
+		/* this is the best option seen so far */
+		Work->pivot_case = OUT_OUT ;
+		bestcost = thiscost ;
+		Work->do_extend = do_extend ;
+		Work->do_update = do_update ;
+		new_fnzeros = fnzeros ;
+	    }
+	}
+    }
+
+    /* At this point, a structural pivot has been found. */
+    /* It may be numerically zero, however. */
+    ASSERT (Work->pivot_case != EMPTY) ;
+    DEBUG2 (("local search, best option "ID", best cost "ID"\n",
+	Work->pivot_case, bestcost)) ;
+
+    /* ====================================================================== */
+    /* Pivot row and column, and extension, now determined */
+    /* ====================================================================== */
+
+    Work->fnzeros = new_fnzeros ;
+
+    /* ---------------------------------------------------------------------- */
+    /* finalize the pivot row and column */
+    /* ---------------------------------------------------------------------- */
+
+    switch (Work->pivot_case)
+    {
+	case IN_IN:
+	    DEBUG2 (("IN-IN option selected\n")) ;
+	    ASSERT (fnrows > 0 && fncols > 0) ;
+	    Work->pivcol_in_front = TRUE ;
+	    Work->pivrow_in_front = TRUE ;
+	    Work->pivcol = pivcol [IN] ;
+	    Work->pivrow = pivrow [IN][IN] ;
+	    Work->ccdeg = nr_in ;
+	    Work->Wrow = Fcols ;
+	    Work->rrdeg = rdeg [IN][IN] ;
+	    jj = jcand [IN] ;
+	    Work->fnrows_new = fnrows_new [IN][IN] ;
+	    Work->fncols_new = fncols_new [IN][IN] ;
+	    break ;
+
+	case IN_OUT:
+	    DEBUG2 (("IN-OUT option selected\n")) ;
+	    ASSERT (fnrows >= 0 && fncols > 0) ;
+	    Work->pivcol_in_front = TRUE ;
+	    Work->pivrow_in_front = FALSE ;
+	    Work->pivcol = pivcol [IN] ;
+	    Work->pivrow = pivrow [IN][OUT] ;
+	    Work->ccdeg = nr_in ;
+	    Work->Wrow = Wio ;
+	    Work->rrdeg = rdeg [IN][OUT] ;
+	    jj = jcand [IN] ;
+	    Work->fnrows_new = fnrows_new [IN][OUT] ;
+	    Work->fncols_new = fncols_new [IN][OUT] ;
+	    break ;
+
+	case OUT_IN:
+	    DEBUG2 (("OUT-IN option selected\n")) ;
+	    ASSERT (fnrows > 0 && fncols >= 0) ;
+	    Work->pivcol_in_front = FALSE ;
+	    Work->pivrow_in_front = TRUE ;
+	    Work->pivcol = pivcol [OUT] ;
+	    Work->pivrow = pivrow [OUT][IN] ;
+	    Work->ccdeg = cdeg_out ;
+	    /* Wrow might be equivalenced to Fcols (Freebie in): */
+	    Work->Wrow = Woi ;
+	    Work->rrdeg = rdeg [OUT][IN] ;
+	    /* Work->Wrow[0..fncols-1] is not there.  See Fcols instead */
+	    jj = jcand [OUT] ;
+	    Work->fnrows_new = fnrows_new [OUT][IN] ;
+	    Work->fncols_new = fncols_new [OUT][IN] ;
+	    break ;
+
+	case OUT_OUT:
+	    DEBUG2 (("OUT-OUT option selected\n")) ;
+	    ASSERT (fnrows >= 0 && fncols >= 0) ;
+	    Work->pivcol_in_front = FALSE ;
+	    Work->pivrow_in_front = FALSE ;
+	    Work->pivcol = pivcol [OUT] ;
+	    Work->pivrow = pivrow [OUT][OUT] ;
+	    Work->ccdeg = cdeg_out ;
+	    /* Wrow might be equivalenced to Wio (Freebie out): */
+	    Work->Wrow = Woo ;
+	    Work->rrdeg = rdeg [OUT][OUT] ;
+	    jj = jcand [OUT] ;
+	    Work->fnrows_new = fnrows_new [OUT][OUT] ;
+	    Work->fncols_new = fncols_new [OUT][OUT] ;
+	    break ;
+
+    }
+
+    ASSERT (IMPLIES (fnrows == 0 && fncols == 0, Work->pivot_case == OUT_OUT)) ;
+
+    if (!Work->pivcol_in_front && pivcol [IN] != EMPTY)
+    {
+	/* clear Frpos if pivcol [IN] was searched, but not selected */
+	for (i = fnrows ; i < cdeg_in ; i++)
+	{
+	    Frpos [Frows [i]] = EMPTY;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* Pivot row and column have been found */
+    /* ---------------------------------------------------------------------- */
+
+    /* ---------------------------------------------------------------------- */
+    /* remove pivot column from candidate pivot column set */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (jj >= 0 && jj < Work->nCandidates) ;
+    ASSERT (Work->pivcol == Work->Candidates [jj]) ;
+    remove_candidate (jj, Work, Symbolic) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check for frontal matrix growth */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG1 (("Check frontal growth:\n")) ;
+    DEBUG1 (("fnrows_new "ID" + 1 = "ID",  fnr_curr "ID"\n",
+	    Work->fnrows_new, Work->fnrows_new + 1, fnr_curr)) ;
+    DEBUG1 (("fncols_new "ID" + 1 = "ID",  fnc_curr "ID"\n",
+	    Work->fncols_new, Work->fncols_new + 1, fnc_curr)) ;
+
+    Work->do_grow = (Work->fnrows_new + 1 > fnr_curr
+		  || Work->fncols_new + 1 > fnc_curr) ;
+    if (Work->do_grow)
+    {
+	DEBUG0 (("\nNeed to grow frontal matrix, force do_update true\n")) ;
+	/* If the front must grow, then apply the pending updates and remove
+	 * the current pivot rows/columns from the front prior to growing the
+	 * front.  This frees up as much space as possible for the new front. */
+	if (!Work->do_update && fnpiv > 0)
+	{
+	    /* This update would not have to be done if the current front
+	     * was big enough. */
+	    Work->nforced++ ;
+	    Work->do_update = TRUE ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* current pivot column */
+    /* ---------------------------------------------------------------------- */
+
+    /*
+	c1) If pivot column index is in the current front:
+
+	    The pivot column pattern is in Frows [0 .. fnrows-1] and
+	    the extension is in Frows [fnrows ... fnrows+ccdeg-1].
+
+	    Frpos [Frows [0 .. fnrows+ccdeg-1]] is
+	    equal to 0 .. fnrows+ccdeg-1.  Wm is not needed.
+
+	    The values are in Wy [0 .. fnrows+ccdeg-1].
+
+	c2) Otherwise, if the pivot column index is not in the current front:
+
+	    c2a) If the front is being extended, old row indices in the the
+		pivot column pattern are in Frows [0 .. fnrows-1].
+
+		All entries are in Wm [0 ... ccdeg-1], with values in
+		Wx [0 .. ccdeg-1].  These may include entries already in
+		Frows [0 .. fnrows-1].
+
+		Frpos [Frows [0 .. fnrows-1]] is equal to 0 .. fnrows-1.
+		Frpos [Wm [0 .. ccdeg-1]] for new entries is < 0.
+
+	    c2b) If the front is not being extended, then the entire pivot
+		column pattern is in Wm [0 .. ccdeg-1].  It includes
+		the pivot row index.  It is does not contain the pattern
+		Frows [0..fnrows-1].  The intersection of these two
+		sets may or may not be empty.  The values are in Wx [0..ccdeg-1]
+
+	In both cases c1 and c2, Frpos [Frows [0 .. fnrows-1]] is equal
+	to 0 .. fnrows-1, which is the pattern of the current front.
+	Any entry of Frpos that is not specified above is < 0.
+    */
+
+
+#ifndef NDEBUG
+    DEBUG2 (("\n\nSEARCH DONE: Pivot col "ID" in: ("ID") pivot row "ID" in: ("ID
+	") extend: "ID"\n\n", Work->pivcol, Work->pivcol_in_front,
+	Work->pivrow, Work->pivrow_in_front, Work->do_extend)) ;
+    UMF_dump_rowcol (1, Numeric, Work, Work->pivcol, !Symbolic->fixQ) ;
+    DEBUG2 (("Pivot col "ID": fnrows "ID" ccdeg "ID"\n", Work->pivcol, fnrows,
+	Work->ccdeg)) ;
+    if (Work->pivcol_in_front)	/* case c1 */
+    {
+	Int found = FALSE ;
+	DEBUG3 (("Pivcol in front\n")) ;
+	for (i = 0 ; i < fnrows ; i++)
+	{
+	    row = Frows [i] ;
+	    DEBUG3 ((ID":   row:: "ID" in front ", i, row)) ;
+	    ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+	    ASSERT (Frpos [row] == i) ;
+	    EDEBUG3 (Wy [i]) ;
+	    if (row == Work->pivrow)
+	    {
+		DEBUG3 ((" <- pivrow")) ;
+		found = TRUE ;
+	    }
+	    DEBUG3 (("\n")) ;
+	}
+	ASSERT (found == Work->pivrow_in_front) ;
+	found = FALSE ;
+	for (i = fnrows ; i < fnrows + Work->ccdeg ; i++)
+	{
+	    row = Frows [i] ;
+	    DEBUG3 ((ID":   row:: "ID" (new)", i, row)) ;
+	    ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+	    ASSERT (Frpos [row] == i) ;
+	    EDEBUG3 (Wy [i]) ;
+	    if (row == Work->pivrow)
+	    {
+		DEBUG3 ((" <- pivrow")) ;
+		found = TRUE ;
+	    }
+	    DEBUG3 (("\n")) ;
+	}
+	ASSERT (found == !Work->pivrow_in_front) ;
+    }
+    else
+    {
+	if (Work->do_extend)
+	{
+	    Int found = FALSE ;
+	    DEBUG3 (("Pivcol not in front (extend)\n")) ;
+	    for (i = 0 ; i < fnrows ; i++)
+	    {
+		row = Frows [i] ;
+		DEBUG3 ((ID":   row:: "ID" in front ", i, row)) ;
+		ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+		ASSERT (Frpos [row] == i) ;
+		if (row == Work->pivrow)
+		{
+		    DEBUG3 ((" <- pivrow")) ;
+		    found = TRUE ;
+		}
+		DEBUG3 (("\n")) ;
+	    }
+	    ASSERT (found == Work->pivrow_in_front) ;
+	    found = FALSE ;
+	    DEBUG3 (("----\n")) ;
+	    for (i = 0 ; i < Work->ccdeg ; i++)
+	    {
+		row = Wm [i] ;
+		ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+		DEBUG3 ((ID":   row:: "ID" ", i, row)) ;
+		EDEBUG3 (Wx [i]) ;
+		if (Frpos [row] < 0)
+		{
+		    DEBUG3 ((" (new) ")) ;
+		}
+		if (row == Work->pivrow)
+		{
+		    DEBUG3 ((" <- pivrow")) ;
+		    found = TRUE ;
+		    /* ... */
+		    if (Work->pivrow_in_front) ASSERT (Frpos [row] >= 0) ;
+		    else ASSERT (Frpos [row] < 0) ;
+		}
+		DEBUG3 (("\n")) ;
+	    }
+	    ASSERT (found) ;
+	}
+	else
+	{
+	    Int found = FALSE ;
+	    DEBUG3 (("Pivcol not in front (no extend)\n")) ;
+	    for (i = 0 ; i < Work->ccdeg ; i++)
+	    {
+		row = Wm [i] ;
+		ASSERT (row >= 0 && row < n_row && NON_PIVOTAL_ROW (row)) ;
+		DEBUG3 ((ID":   row:: "ID" ", i, row)) ;
+		EDEBUG3 (Wx [i]) ;
+		DEBUG3 ((" (new) ")) ;
+		if (row == Work->pivrow)
+		{
+		    DEBUG3 ((" <- pivrow")) ;
+		    found = TRUE ;
+		}
+		DEBUG3 (("\n")) ;
+	    }
+	    ASSERT (found) ;
+	}
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* current pivot row */
+    /* ---------------------------------------------------------------------- */
+
+    /*
+	r1) If the pivot row index is in the current front:
+
+	    The pivot row pattern is in Fcols [0..fncols-1] and the extenson is
+	    in Wrow [fncols .. rrdeg-1].  If the pivot column is in the current
+	    front, then Fcols and Wrow are equivalenced.
+
+	r2)  If the pivot row index is not in the current front:
+
+	    r2a) If the front is being extended, the pivot row pattern is in
+		Fcols [0 .. fncols-1].  New entries are in Wrow [0 .. rrdeg-1],
+		but these may include entries already in Fcols [0 .. fncols-1].
+
+	    r2b) Otherwise, the pivot row pattern is Wrow [0 .. rrdeg-1].
+
+	Fcpos [Fcols [0..fncols-1]] is (0..fncols-1) * fnr_curr.
+	All other entries in Fcpos are < 0.
+
+	These conditions are asserted below.
+
+	------------------------------------------------------------------------
+	Other items in Work structure that are relevant:
+
+	pivcol: the pivot column index
+	pivrow: the pivot column index
+
+	rrdeg:
+	ccdeg:
+
+	fnrows: the number of rows in the currnt contribution block
+	fncols: the number of columns in the current contribution block
+
+	fnrows_new: the number of rows in the new contribution block
+	fncols_new: the number of rows in the new contribution block
+
+	------------------------------------------------------------------------
+    */
+
+
+#ifndef NDEBUG
+    UMF_dump_rowcol (0, Numeric, Work, Work->pivrow, TRUE) ;
+    DEBUG2 (("Pivot row "ID":\n", Work->pivrow)) ;
+    if (Work->pivrow_in_front)
+    {
+	Int found = FALSE ;
+	for (i = 0 ; i < fncols ; i++)
+	{
+	    col = Fcols [i] ;
+	    DEBUG3 (("   col:: "ID" in front\n", col)) ;
+	    ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+	    ASSERT (Fcpos [col] == i * fnr_curr) ;
+	    if (col == Work->pivcol) found = TRUE ;
+	}
+	ASSERT (found == Work->pivcol_in_front) ;
+	found = FALSE ;
+	ASSERT (IMPLIES (Work->pivcol_in_front, Fcols == Work->Wrow)) ;
+	for (i = fncols ; i < Work->rrdeg ; i++)
+	{
+	    col = Work->Wrow [i] ;
+	    ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+	    ASSERT (Fcpos [col] < 0) ;
+	    if (col == Work->pivcol) found = TRUE ;
+	    else DEBUG3 (("   col:: "ID" (new)\n", col)) ;
+	}
+	ASSERT (found == !Work->pivcol_in_front) ;
+    }
+    else
+    {
+	if (Work->do_extend)
+	{
+	    Int found = FALSE ;
+	    for (i = 0 ; i < fncols ; i++)
+	    {
+		col = Fcols [i] ;
+		DEBUG3 (("   col:: "ID" in front\n", col)) ;
+		ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+		ASSERT (Fcpos [col] == i * fnr_curr) ;
+		if (col == Work->pivcol) found = TRUE ;
+	    }
+	    ASSERT (found == Work->pivcol_in_front) ;
+	    found = FALSE ;
+	    for (i = 0 ; i < Work->rrdeg ; i++)
+	    {
+		col = Work->Wrow [i] ;
+		ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+		if (Fcpos [col] >= 0) continue ;
+		if (col == Work->pivcol) found = TRUE ;
+		else DEBUG3 (("   col:: "ID" (new, extend)\n", col)) ;
+	    }
+	    ASSERT (found == !Work->pivcol_in_front) ;
+	}
+	else
+	{
+	    Int found = FALSE ;
+	    for (i = 0 ; i < Work->rrdeg ; i++)
+	    {
+		col = Work->Wrow [i] ;
+		ASSERT (col >= 0 && col < n_col && NON_PIVOTAL_COL (col)) ;
+		if (col == Work->pivcol) found = TRUE ;
+		else DEBUG3 (("   col:: "ID" (all new)\n", col)) ;
+	    }
+	    ASSERT (found) ;
+	}
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* determine whether to do scan2-row and scan2-col */
+    /* ---------------------------------------------------------------------- */
+
+    if (Work->do_extend)
+    {
+	Work->do_scan2row = (fncols > 0) ;
+	Work->do_scan2col = (fnrows > 0) ;
+    }
+    else
+    {
+	Work->do_scan2row = (fncols > 0) && Work->pivrow_in_front ;
+	Work->do_scan2col = (fnrows > 0) && Work->pivcol_in_front ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG2 (("LOCAL SEARCH DONE: pivot column "ID" pivot row: "ID"\n",
+	Work->pivcol, Work->pivrow)) ;
+    DEBUG2 (("do_extend: "ID"\n", Work->do_extend)) ;
+    DEBUG2 (("do_update: "ID"\n", Work->do_update)) ;
+    DEBUG2 (("do_grow:   "ID"\n", Work->do_grow)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* keep track of the diagonal */
+    /* ---------------------------------------------------------------------- */
+
+    if (Symbolic->prefer_diagonal
+	&& Work->pivcol < Work->n_col - Symbolic->nempty_col)
+    {
+	Diagonal_map = Work->Diagonal_map ;
+	Diagonal_imap = Work->Diagonal_imap ;
+	ASSERT (Diagonal_map != (Int *) NULL) ;
+	ASSERT (Diagonal_imap != (Int *) NULL) ;
+
+	row2 = Diagonal_map  [Work->pivcol] ;
+	col2 = Diagonal_imap [Work->pivrow] ;
+
+	if (row2 < 0)
+	{
+	    /* this was an off-diagonal pivot row */
+	    Work->noff_diagonal++ ;
+	    row2 = UNFLIP (row2) ;
+	}
+
+	ASSERT (Diagonal_imap [row2] == Work->pivcol) ;
+	ASSERT (UNFLIP (Diagonal_map [col2]) == Work->pivrow) ;
+
+	if (row2 != Work->pivrow)
+	{
+	    /* swap the diagonal map to attempt to maintain symmetry later on.
+	     * Also mark the map for col2 (via FLIP) to denote that the entry
+	     * now on the diagonal is not the original entry on the diagonal. */
+
+	    DEBUG0 (("Unsymmetric pivot\n")) ;
+	    Diagonal_map  [Work->pivcol] = FLIP (Work->pivrow) ;
+	    Diagonal_imap [Work->pivrow] = Work->pivcol ;
+
+	    Diagonal_map  [col2] = FLIP (row2) ;
+	    Diagonal_imap [row2] = col2 ;
+
+	}
+	ASSERT (n_row == n_col) ;
+#ifndef NDEBUG
+	UMF_dump_diagonal_map (Diagonal_map, Diagonal_imap, Symbolic->n1,
+	    Symbolic->n_col, Symbolic->nempty_col) ;
+#endif
+    }
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_local_search.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_local_search
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,151 @@
+/* ========================================================================== */
+/* === UMF_lsolve =========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  solves Lx = b, where L is the lower triangular factor of a matrix */
+/*  B is overwritten with the solution X. */
+/*  Returns the floating point operation count */
+
+#include "umf_internal.h"
+
+GLOBAL double UMF_lsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],		/* b on input, solution x on output */
+    Int Pattern [ ]		/* a work array of size n */
+)
+{
+    Entry xk ;
+    Entry *xp, *Lval ;
+    Int k, deg, *ip, j, row, *Lpos, *Lilen, *Lip, llen, lp, newLchain,
+	pos, npiv, n1, *Li ;
+
+    /* ---------------------------------------------------------------------- */
+
+    if (Numeric->n_row != Numeric->n_col) return (0.) ;
+    npiv = Numeric->npiv ;
+    Lpos = Numeric->Lpos ;
+    Lilen = Numeric->Lilen ;
+    Lip = Numeric->Lip ;
+    n1 = Numeric->n1 ;
+
+#ifndef NDEBUG
+    DEBUG4 (("Lsolve start:\n")) ;
+    for (j = 0 ; j < Numeric->n_row ; j++)
+    {
+	DEBUG4 (("Lsolve start "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* singletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	xk = X [k] ;
+	deg = Lilen [k] ;
+	if (deg > 0 && IS_NONZERO (xk))
+	{
+	    lp = Lip [k] ;
+	    Li = (Int *) (Numeric->Memory + lp) ;
+	    lp += UNITS (Int, deg) ;
+	    Lval = (Entry *) (Numeric->Memory + lp) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  row "ID"  k "ID" value", Li [j], k)) ;
+		EDEBUG4 (Lval [j]) ;
+		DEBUG4 (("\n")) ;
+		/* X [Li [j]] -= xk * Lval [j] ; */
+		MULT_SUB (X [Li [j]], xk, Lval [j]) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* rest of L */
+    /* ---------------------------------------------------------------------- */
+
+    deg = 0 ;
+
+    for (k = n1 ; k < npiv ; k++)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* make column of L in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	lp = Lip [k] ;
+	newLchain = (lp < 0) ;
+	if (newLchain)
+	{
+	    lp = -lp ;
+	    deg = 0 ;
+	    DEBUG4 (("start of chain for column of L\n")) ;
+	}
+
+	/* remove pivot row */
+	pos = Lpos [k] ;
+	if (pos != EMPTY)
+	{
+	    DEBUG4 (("  k "ID" removing row "ID" at position "ID"\n",
+	    k, Pattern [pos], pos)) ;
+	    ASSERT (!newLchain) ;
+	    ASSERT (deg > 0) ;
+	    ASSERT (pos >= 0 && pos < deg) ;
+	    ASSERT (Pattern [pos] == k) ;
+	    Pattern [pos] = Pattern [--deg] ;
+	}
+
+	/* concatenate the pattern */
+	ip = (Int *) (Numeric->Memory + lp) ;
+	llen = Lilen [k] ;
+	for (j = 0 ; j < llen ; j++)
+	{
+	    row = *ip++ ;
+	    DEBUG4 (("  row "ID"  k "ID"\n", row, k)) ;
+	    ASSERT (row > k) ;
+	    Pattern [deg++] = row ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* use column k of L */
+	/* ------------------------------------------------------------------ */
+
+	xk = X [k] ;
+	if (IS_NONZERO (xk))
+	{
+	    xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  row "ID"  k "ID" value", Pattern [j], k)) ;
+		EDEBUG4 (*xp) ;
+		DEBUG4 (("\n")) ;
+		/* X [Pattern [j]] -= xk * (*xp) ; */
+		MULT_SUB (X [Pattern [j]], xk, *xp) ;
+		xp++ ;
+	    }
+	}
+    }
+
+#ifndef NDEBUG
+    for (j = 0 ; j < Numeric->n_row ; j++)
+    {
+	DEBUG4 (("Lsolve done "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("Lsolve done.\n")) ;
+#endif
+
+    return (MULTSUB_FLOPS * ((double) Numeric->lnz)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_lsolve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL double UMF_lsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,225 @@
+/* ========================================================================== */
+/* === UMF_ltsolve ========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  Solves L'x = b or L.'x=b, where L is the lower triangular factor of a */
+/*  matrix.  B is overwritten with the solution X. */
+/*  Returns the floating point operation count */
+
+#include "umf_internal.h"
+
+GLOBAL double
+#ifdef CONJUGATE_SOLVE
+UMF_lhsolve			/* solve L'x=b  (complex conjugate transpose) */
+#else
+UMF_ltsolve			/* solve L.'x=b (array transpose) */
+#endif
+(
+    NumericType *Numeric,
+    Entry X [ ],		/* b on input, solution x on output */
+    Int Pattern [ ]		/* a work array of size n */
+)
+{
+    Entry xk ;
+    Entry *xp, *Lval ;
+    Int k, deg, *ip, j, row, *Lpos, *Lilen, kstart, kend, *Lip, llen,
+	lp, pos, npiv, n1, *Li ;
+
+    /* ---------------------------------------------------------------------- */
+
+    if (Numeric->n_row != Numeric->n_col) return (0.) ;
+    npiv = Numeric->npiv ;
+    Lpos = Numeric->Lpos ;
+    Lilen = Numeric->Lilen ;
+    Lip = Numeric->Lip ;
+    kstart = npiv ;
+    n1 = Numeric->n1 ;
+
+#ifndef NDEBUG
+    DEBUG4 (("Ltsolve start:\n")) ;
+    for (j = 0 ; j < Numeric->n_row ; j++)
+    {
+	DEBUG4 (("Ltsolve start "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* non-singletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (kend = npiv-1 ; kend >= n1 ; kend = kstart-1)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* find the start of this Lchain */
+	/* ------------------------------------------------------------------ */
+
+	/* for (kstart = kend ; kstart >= 0 && Lip [kstart] > 0 ; kstart--) ; */
+	kstart = kend ;
+	while (kstart >= 0 && Lip [kstart] > 0)
+	{
+	    kstart-- ;
+	}
+
+	/* the Lchain goes from kstart to kend */
+
+	/* ------------------------------------------------------------------ */
+	/* scan the whole chain to find the pattern of the last column of L */
+	/* ------------------------------------------------------------------ */
+
+	deg = 0 ;
+	DEBUG4 (("start of chain for column of L\n")) ;
+	for (k = kstart ; k <= kend ; k++)
+	{
+	    ASSERT (k >= 0 && k < npiv) ;
+
+	    /* -------------------------------------------------------------- */
+	    /* make column k of L in Pattern [0..deg-1] */
+	    /* -------------------------------------------------------------- */
+
+	    /* remove pivot row */
+	    pos = Lpos [k] ;
+	    if (pos != EMPTY)
+	    {
+		DEBUG4 (("  k "ID" removing row "ID" at position "ID"\n",
+		k, Pattern [pos], pos)) ;
+		ASSERT (k != kstart) ;
+		ASSERT (deg > 0) ;
+		ASSERT (pos >= 0 && pos < deg) ;
+		ASSERT (Pattern [pos] == k) ;
+		Pattern [pos] = Pattern [--deg] ;
+	    }
+
+	    /* concatenate the pattern */
+	    lp = Lip [k] ;
+	    if (k == kstart)
+	    {
+		lp = -lp ;
+	    }
+	    ASSERT (lp > 0) ;
+	    ip = (Int *) (Numeric->Memory + lp) ;
+	    llen = Lilen [k] ;
+	    for (j = 0 ; j < llen ; j++)
+	    {
+		row = *ip++ ;
+		DEBUG4 (("  row "ID"  k "ID"\n", row, k)) ;
+		ASSERT (row > k) ;
+		Pattern [deg++] = row ;
+	    }
+
+	}
+	/* Pattern [0..deg-1] is now the pattern of column kend */
+
+	/* ------------------------------------------------------------------ */
+	/* solve using this chain, in reverse order */
+	/* ------------------------------------------------------------------ */
+
+	DEBUG4 (("Unwinding Lchain\n")) ;
+	for (k = kend ; k >= kstart ; k--)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* use column k of L */
+	    /* -------------------------------------------------------------- */
+
+	    ASSERT (k >= 0 && k < npiv) ;
+	    lp = Lip [k] ;
+	    if (k == kstart)
+	    {
+		lp = -lp ;
+	    }
+	    ASSERT (lp > 0) ;
+	    llen = Lilen [k] ;
+	    xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ;
+	    xk = X [k] ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  row "ID"  k "ID" value", Pattern [j], k)) ;
+		EDEBUG4 (*xp) ;
+		DEBUG4 (("\n")) ;
+
+#ifdef CONJUGATE_SOLVE
+		/* xk -= X [Pattern [j]] * conjugate (*xp) ; */
+		MULT_SUB_CONJ (xk, X [Pattern [j]], *xp) ;
+#else
+		/* xk -= X [Pattern [j]] * (*xp) ; */
+		MULT_SUB (xk, X [Pattern [j]], *xp) ;
+#endif
+
+		xp++ ;
+	    }
+	    X [k] = xk ;
+
+	    /* -------------------------------------------------------------- */
+	    /* construct column k-1 of L */
+	    /* -------------------------------------------------------------- */
+
+	    /* un-concatenate the pattern */
+	    deg -= llen ;
+
+	    /* add pivot row */
+	    pos = Lpos [k] ;
+	    if (pos != EMPTY)
+	    {
+		DEBUG4 (("  k "ID" adding row "ID" at position "ID"\n",
+		k, k, pos)) ;
+		ASSERT (k != kstart) ;
+		ASSERT (pos >= 0 && pos <= deg) ;
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* singletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = n1 - 1 ; k >= 0 ; k--)
+    {
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	deg = Lilen [k] ;
+	if (deg > 0)
+	{
+	    xk = X [k] ;
+	    lp = Lip [k] ;
+	    Li = (Int *) (Numeric->Memory + lp) ;
+	    lp += UNITS (Int, deg) ;
+	    Lval = (Entry *) (Numeric->Memory + lp) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  row "ID"  k "ID" value", Li [j], k)) ;
+		EDEBUG4 (Lval [j]) ;
+		DEBUG4 (("\n")) ;
+#ifdef CONJUGATE_SOLVE
+		/* xk -= X [Li [j]] * conjugate (Lval [j]) ; */
+		MULT_SUB_CONJ (xk, X [Li [j]], Lval [j]) ;
+#else
+		/* xk -= X [Li [j]] * Lval [j] ; */
+		MULT_SUB (xk, X [Li [j]], Lval [j]) ;
+#endif
+	    }
+	    X [k] = xk ;
+	}
+    }
+
+#ifndef NDEBUG
+    for (j = 0 ; j < Numeric->n_row ; j++)
+    {
+	DEBUG4 (("Ltsolve done "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("Ltsolve done.\n")) ;
+#endif
+
+    return (MULTSUB_FLOPS * ((double) Numeric->lnz)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_ltsolve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,19 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL double UMF_ltsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
+
+GLOBAL double UMF_lhsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_malloc.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,91 @@
+/* ========================================================================== */
+/* === UMF_malloc =========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Allocate a block of n objects, each of a given size.  This routine does not
+    handle the case when the size is 1 (allocating char's) because of potential
+    integer overflow.  UMFPACK never does that.
+    Also maintains the UMFPACK malloc count.
+*/
+
+#include "umf_internal.h"
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+
+/*
+    UMF_malloc_count is a count of the objects malloc'd by UMFPACK.  If you
+    suspect a memory leak in your program (caused by not properly destroying
+    the Symbolic and Numeric objects) then compile with -DUMF_MALLOC_COUNT and
+    check value of UMF_malloc_count.  By default, UMF_MALLOC_COUNT is not
+    defined, and thus UMFPACK has no global variables.
+*/
+
+GLOBAL Int UMF_malloc_count = 0 ;
+
+#endif
+
+#ifdef UMF_TCOV_TEST
+/* For exhaustive statement coverage testing only! */
+GLOBAL int umf_fail, umf_fail_lo, umf_fail_hi ;
+GLOBAL int umf_realloc_fail, umf_realloc_lo, umf_realloc_hi ;
+#endif
+
+GLOBAL void *UMF_malloc
+(
+    Int n_objects,
+    size_t size_of_object
+)
+{
+    size_t size ;
+    void *p ;
+
+#ifdef UMF_TCOV_TEST
+    /* For exhaustive statement coverage testing only! */
+    /* Pretend to fail, to test out-of-memory conditions. */
+    umf_fail-- ;
+    if (umf_fail <= umf_fail_hi && umf_fail >= umf_fail_lo)
+    {
+	DEBUG0 (("umf_malloc: Pretend to fail %d %d %d\n",
+	    umf_fail, umf_fail_hi, umf_fail_lo)) ;
+	return ((void *) NULL) ;
+    }
+#endif
+
+    DEBUG0 (("UMF_malloc: ")) ;
+
+    /* make sure that we allocate something */
+    n_objects = MAX (1, n_objects) ;
+
+    size = (size_t) n_objects ;
+    ASSERT (size_of_object > 1) ;
+    if (size > Int_MAX / size_of_object)
+    {
+	/* object is too big for integer pointer arithmetic */
+	return ((void *) NULL) ;
+    }
+    size *= size_of_object ;
+
+    /* see umf_config.h for the memory allocator selection */
+    p = ALLOCATE (size) ;
+
+    DEBUG0 ((ID"\n", (Int) p)) ;
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+    if (p)
+    {
+	/* One more object has been malloc'ed.  Keep track of the count. */
+	/* (purely for sanity checks). */
+	UMF_malloc_count++ ;
+	DEBUG0 (("  successful, new malloc count: "ID"\n", UMF_malloc_count)) ;
+    }
+#endif
+
+    return (p) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_malloc.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,20 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#ifndef _UMF_MALLOC
+#define _UMF_MALLOC
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+GLOBAL extern Int UMF_malloc_count ;
+#endif
+
+GLOBAL void *UMF_malloc
+(
+    Int n_objects,
+    size_t size_of_object
+) ;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,82 @@
+/* ========================================================================== */
+/* === UMF_mem_alloc_element ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
+
+/* Allocate a nrows-by-ncols element, and initialize it. */
+/* Returns the index into Numeric->Memory if successful, or 0 on failure. */
+
+#include "umf_internal.h"
+#include "umf_mem_alloc_tail_block.h"
+
+GLOBAL Int UMF_mem_alloc_element
+(
+    NumericType *Numeric,
+    Int nrows,
+    Int ncols,
+    Int **Rows,
+    Int **Cols,
+    Entry **C,
+    Int *size,
+    Element **epout
+)
+{
+
+    Element *ep ;
+    Unit *p ;
+    Int i ;
+
+    ASSERT (Numeric != (NumericType *) NULL) ;
+    ASSERT (Numeric->Memory != (Unit *) NULL) ;
+
+    *size = GET_ELEMENT_SIZE (nrows, ncols) ;
+    if (INT_OVERFLOW (DGET_ELEMENT_SIZE (nrows, ncols) + 1))
+    {
+	/* :: allocate element, int overflow :: */
+	return (0) ;	/* problem is too large */
+    }
+
+    i = UMF_mem_alloc_tail_block (Numeric, *size) ;
+    (*size)++ ;
+    if (!i)
+    {
+	DEBUG0 (("alloc element failed - out of memory\n")) ;
+	return (0) ;	/* out of memory */
+    }
+    p = Numeric->Memory + i ;
+
+    ep = (Element *) p ;
+
+    DEBUG2 (("alloc_element done ("ID" x "ID"): p: "ID" i "ID"\n",
+	nrows, ncols, (Int) (p-Numeric->Memory), i)) ;
+
+    /* Element data structure, in order: */
+    p += UNITS (Element, 1) ;		/* (1) Element header */
+    *Cols = (Int *) p ;			/* (2) col [0..ncols-1] indices */
+    *Rows = *Cols + ncols ;		/* (3) row [0..nrows-1] indices */
+    p += UNITS (Int, ncols + nrows) ;
+    *C = (Entry *) p ;			/* (4) C [0..nrows-1, 0..ncols-1] */
+
+    ep->nrows = nrows ;		/* initialize the header information */
+    ep->ncols = ncols ;
+    ep->nrowsleft = nrows ;
+    ep->ncolsleft = ncols ;
+    ep->cdeg = 0 ;
+    ep->rdeg = 0 ;
+    ep->next = EMPTY ;
+
+    DEBUG2 (("new block size: "ID" ", GET_BLOCK_SIZE (Numeric->Memory + i))) ;
+    DEBUG2 (("Element size needed "ID"\n", GET_ELEMENT_SIZE (nrows, ncols))) ;
+
+    *epout = ep ;
+
+    /* return the offset into Numeric->Memory */
+    return (i) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_element.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,17 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_mem_alloc_element
+(
+    NumericType *Numeric,
+    Int nrows,
+    Int ncols,
+    Int **Rows,
+    Int **Cols,
+    Entry **C,
+    Int *size,
+    Element **epout
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,54 @@
+/* ========================================================================== */
+/* === UMF_mem_alloc_head_block ============================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
+
+/* allocate nunits from head of Numeric->Memory.  No header allocated. */
+/* Returns the index into Numeric->Memory if successful, or 0 on failure. */
+
+#include "umf_internal.h"
+
+GLOBAL Int UMF_mem_alloc_head_block
+(
+    NumericType *Numeric,
+    Int nunits
+)
+{
+    Int p, usage ;
+    DEBUG2 (("GET  BLOCK: from head, size "ID" ", nunits)) ;
+
+    ASSERT (Numeric != (NumericType *) NULL) ;
+    ASSERT (Numeric->Memory != (Unit *) NULL) ;
+
+#ifndef NDEBUG
+    if (UMF_allocfail)
+    {
+	/* pretend to fail, to test garbage_collection */
+	DEBUGm2 (("UMF_mem_alloc_head_block: pretend to fail\n")) ;
+	UMF_allocfail = FALSE ;	/* don't fail the next time */
+	return (0) ;
+    }
+#endif
+
+    if (nunits > (Numeric->itail - Numeric->ihead))
+    {
+	DEBUG2 ((" failed\n")) ;
+	return (0) ;
+    }
+
+    /* return p as an offset from Numeric->Memory */
+    p = Numeric->ihead ;
+    Numeric->ihead += nunits ;
+
+    DEBUG2 (("p: "ID"\n", p)) ;
+    usage = Numeric->ihead + Numeric->tail_usage ;
+    Numeric->max_usage = MAX (Numeric->max_usage, usage) ;
+    return (p) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_head_block.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_mem_alloc_head_block
+(
+    NumericType *Numeric,
+    Int nunits
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,133 @@
+/* ========================================================================== */
+/* === UMF_mem_alloc_tail_block ============================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
+
+#include "umf_internal.h"
+
+/* allocate nunits from tail of Numeric->Memory */
+/* (requires nunits+1, for header). */
+/* Returns the index into Numeric->Memory if successful, or 0 on failure. */
+
+GLOBAL Int UMF_mem_alloc_tail_block
+(
+    NumericType *Numeric,
+    Int nunits
+)
+{
+    Int bigsize, usage ;
+    Unit *p, *pnext, *pbig ;
+
+    ASSERT (Numeric != (NumericType *) NULL) ;
+    ASSERT (Numeric->Memory != (Unit *) NULL) ;
+
+#ifndef NDEBUG
+    if (UMF_allocfail)
+    {
+	/* pretend to fail, to test garbage_collection */
+	DEBUGm2 (("UMF_mem_alloc_tail_block: pretend to fail\n")) ;
+	UMF_allocfail = FALSE ;	/* don't fail the next time */
+	return (0) ;
+    }
+    DEBUG2 (("UMF_mem_alloc_tail_block, size: "ID" + 1 = "ID":  ",
+	nunits, nunits+1)) ;
+#endif
+
+    bigsize = 0 ;
+    pbig = (Unit *) NULL ;
+
+    ASSERT (nunits > 0) ;	/* size must be positive */
+    if (Numeric->ibig != EMPTY)
+    {
+	ASSERT (Numeric->ibig > Numeric->itail) ;
+	ASSERT (Numeric->ibig < Numeric->size) ;
+	pbig = Numeric->Memory + Numeric->ibig ;
+	bigsize = -pbig->header.size ;
+	ASSERT (bigsize > 0) ;	/* Numeric->ibig is free */
+	ASSERT (pbig->header.prevsize >= 0) ;	/* prev. is not free */
+    }
+
+    if (pbig && bigsize >= nunits)
+    {
+
+	/* use the biggest block, somewhere in middle of memory */
+	p = pbig ;
+	pnext = p + 1 + bigsize ;
+	/* next is in range */
+	ASSERT (pnext < Numeric->Memory + Numeric->size) ;
+	/* prevsize of next = this size */
+	ASSERT (pnext->header.prevsize == bigsize) ;
+	/* next is not free */
+	ASSERT (pnext->header.size > 0) ;
+	bigsize -= nunits + 1 ;
+
+	if (bigsize < 4)
+	{
+	    /* internal fragmentation would be too small */
+	    /* allocate the entire free block */
+	    p->header.size = -p->header.size ;
+	    DEBUG2 (("GET  BLOCK: p: "ID" size: "ID", all of big: "ID" size: "
+		ID"\n", (Int) (p-Numeric->Memory), nunits, Numeric->ibig,
+		p->header.size)) ;
+	    /* no more biggest block */
+	    Numeric->ibig = EMPTY ;
+
+	}
+	else
+	{
+
+	    /* allocate just the first nunits Units of the free block */
+	    p->header.size = nunits ;
+	    /* make a new free block */
+	    Numeric->ibig += nunits + 1 ;
+	    pbig = Numeric->Memory + Numeric->ibig ;
+	    pbig->header.size = -bigsize ;
+	    pbig->header.prevsize = nunits ;
+	    pnext->header.prevsize = bigsize ;
+	    DEBUG2 (("GET  BLOCK: p: "ID" size: "ID", some of big: "ID" left: "
+		ID"\n", (Int) (p-Numeric->Memory), nunits, Numeric->ibig,
+		bigsize)) ;
+	}
+
+    }
+    else
+    {
+
+	/* allocate from the top of tail */
+	pnext = Numeric->Memory + Numeric->itail ;
+	DEBUG2 (("GET  BLOCK: from tail ")) ;
+	if ((nunits + 1) > (Numeric->itail - Numeric->ihead))
+	{
+	    DEBUG2 (("\n")) ;
+	    return (0) ;
+	}
+	Numeric->itail -= (nunits + 1) ;
+	p = Numeric->Memory + Numeric->itail ;
+	p->header.size = nunits ;
+	p->header.prevsize = 0 ;
+	pnext->header.prevsize = nunits ;
+	DEBUG2 (("p: "ID" size: "ID", new tail "ID"\n",
+	    (Int) (p-Numeric->Memory), nunits, Numeric->itail)) ;
+    }
+
+    Numeric->tail_usage += p->header.size + 1 ;
+    usage = Numeric->ihead + Numeric->tail_usage ;
+    Numeric->max_usage = MAX (Numeric->max_usage, usage) ;
+
+#ifndef NDEBUG
+    UMF_debug -= 10 ;
+    UMF_dump_memory (Numeric) ;
+    UMF_debug += 10 ;
+#endif
+
+    /* p points to the header.  Add one to point to the usable block itself. */
+    /* return the offset into Numeric->Memory */
+    return ((p - Numeric->Memory) + 1) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_alloc_tail_block.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_mem_alloc_tail_block
+(
+    NumericType *Numeric,
+    Int nunits
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,142 @@
+/* ========================================================================== */
+/* === UMF_mem_free_tail_block ============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
+
+/* free a block from the tail of Numeric->memory */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_mem_free_tail_block
+(
+    NumericType *Numeric,
+    Int i
+)
+{
+    Unit *pprev, *pnext, *p, *pbig ;
+    Int sprev ;
+
+    ASSERT (Numeric != (NumericType *) NULL) ;
+    ASSERT (Numeric->Memory != (Unit *) NULL) ;
+    if (i == EMPTY || i == 0) return ;	/* already deallocated */
+
+    /* ---------------------------------------------------------------------- */
+    /* get the block */
+    /* ---------------------------------------------------------------------- */
+
+    p = Numeric->Memory + i ;
+
+    p-- ;	/* get the corresponding header */
+    DEBUG2 (("free block: p: "ID, (Int) (p-Numeric->Memory))) ;
+    ASSERT (p >= Numeric->Memory + Numeric->itail) ;
+    ASSERT (p < Numeric->Memory + Numeric->size) ;
+    ASSERT (p->header.size > 0) ;		/* block not already free */
+    ASSERT (p->header.prevsize >= 0) ;
+
+    Numeric->tail_usage -= p->header.size + 1 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* merge with next free block, if any */
+    /* ---------------------------------------------------------------------- */
+
+    pnext = p + 1 + p->header.size ;
+    DEBUG2 (("size: "ID" next: "ID" ", p->header.size,
+	(Int) (pnext-Numeric->Memory))) ;
+    ASSERT (pnext < Numeric->Memory + Numeric->size) ;
+    ASSERT (pnext->header.prevsize == p->header.size) ;
+    ASSERT (pnext->header.size != 0) ;
+
+    if (pnext->header.size < 0)
+    {
+	/* next block is also free - merge with current block */
+	p->header.size += (-(pnext->header.size)) + 1 ;
+	DEBUG2 ((" NEXT FREE ")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* merge with previous free block, if any */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    if (p == Numeric->Memory + Numeric->itail)
+    {
+	DEBUG2 ((" at top of tail ")) ;
+	ASSERT (p->header.prevsize == 0) ;
+    }
+#endif
+
+    if (p > Numeric->Memory + Numeric->itail)
+    {
+	ASSERT (p->header.prevsize > 0) ;
+	pprev = p - 1 - p->header.prevsize ;
+	DEBUG2 ((" prev: "ID" ", (Int) (pprev-Numeric->Memory))) ;
+	ASSERT (pprev >= Numeric->Memory + Numeric->itail) ;
+	sprev = pprev->header.size ;
+	if (sprev < 0)
+	{
+	    /* previous block is also free - merge it with current block */
+	    ASSERT (p->header.prevsize == -sprev) ;
+	    pprev->header.size = p->header.size + (-sprev) + 1 ;
+	    p = pprev ;
+	    DEBUG2 ((" PREV FREE ")) ;
+	    /* note that p may now point to Numeric->itail */
+	}
+#ifndef NDEBUG
+	else
+	{
+	    ASSERT (p->header.prevsize == sprev) ;
+	}
+#endif
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the block, p */
+    /* ---------------------------------------------------------------------- */
+
+    pnext = p + 1 + p->header.size ;
+    ASSERT (pnext < Numeric->Memory + Numeric->size) ;
+
+    if (p == Numeric->Memory + Numeric->itail)
+    {
+	/* top block in list is freed */
+	Numeric->itail = pnext - Numeric->Memory ;
+	pnext->header.prevsize = 0 ;
+	DEBUG2 ((" NEW TAIL : "ID" ", Numeric->itail)) ;
+	ASSERT (pnext->header.size > 0) ;
+	if (Numeric->ibig != EMPTY && Numeric->ibig <= Numeric->itail)
+	{
+	    /* the big free block is now above the tail */
+	    Numeric->ibig = EMPTY ;
+	}
+    }
+    else
+    {
+	/* keep track of the biggest free block seen */
+	if (Numeric->ibig == EMPTY)
+	{
+	    Numeric->ibig = p - Numeric->Memory ;
+	}
+	else
+	{
+	    pbig = Numeric->Memory + Numeric->ibig ;
+	    if (-(pbig->header.size) < p->header.size)
+	    {
+		Numeric->ibig = p - Numeric->Memory ;
+	    }
+	}
+	/* flag the block as free, somewhere in the middle of the tail */
+	pnext->header.prevsize = p->header.size ;
+	p->header.size = -(p->header.size) ;
+    }
+
+    DEBUG2 (("new p: "ID" freesize: "ID"\n", (Int) (p-Numeric->Memory),
+	-(p->header.size))) ;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_free_tail_block.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_mem_free_tail_block
+(
+    NumericType *Numeric,
+    Int i
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,64 @@
+/* ========================================================================== */
+/* === UMF_mem_init_memoryspace ============================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
+
+#include "umf_internal.h"
+
+/* initialize the LU and element workspace (Numeric->Memory) */
+
+GLOBAL void UMF_mem_init_memoryspace
+(
+    NumericType *Numeric
+)
+{
+    Unit *p ;
+
+    ASSERT (Numeric != (NumericType *) NULL) ;
+    ASSERT (Numeric->Memory != (Unit *) NULL) ;
+    ASSERT (Numeric->size >= 3) ;
+    DEBUG0 (("Init memory space, size "ID"\n", Numeric->size)) ;
+
+    Numeric->ngarbage = 0 ;
+    Numeric->nrealloc = 0 ;
+    Numeric->ncostly = 0 ;
+    Numeric->ibig = EMPTY ;
+    Numeric->ihead = 0 ;
+    Numeric->itail = Numeric->size ;
+
+#ifndef NDEBUG
+    UMF_allocfail = FALSE ;
+#endif
+
+    /* allocate the 2-unit tail marker block and initialize it */
+    Numeric->itail -= 2 ;
+    p = Numeric->Memory + Numeric->itail ;
+    DEBUG2 (("p "ID" tail "ID"\n", (Int) (p-Numeric->Memory), Numeric->itail)) ;
+    Numeric->tail_usage = 2 ;
+    p->header.prevsize = 0 ;
+    p->header.size = 1 ;
+
+    /* allocate a 1-unit head marker block at the head of memory */
+    /* this is done so that an offset of zero is treated as a NULL pointer */
+    Numeric->ihead++ ;
+
+    /* initial usage in Numeric->Memory */
+    Numeric->max_usage = 3 ;
+    Numeric->init_usage = Numeric->max_usage ;
+
+    /* Note that UMFPACK_*symbolic ensures that Numeric->Memory is of size */
+    /* at least 3, so this initialization will always succeed. */
+
+#ifndef NDEBUG
+    DEBUG2 (("init_memoryspace, all free (except one unit at head\n")) ;
+    UMF_dump_memory (Numeric) ;
+#endif
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_mem_init_memoryspace.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,10 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_mem_init_memoryspace
+(
+    NumericType *Numeric
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_multicompile.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,58 @@
+/* ========================================================================== */
+/* === UMF_multicompile ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* This file is not needed if you have the Unix/Linux "make" command for
+ * compiling UMFPACK.  Microsoft Visual Studio cannot be configured to compile
+ * one file multiple times, with different -D flags.  In this case, you can
+ * use this file instead.  To use this file, see the Demo/simple_compile file.
+ *
+ * This file includes the following source files:
+ *
+ *	umf_ltsolve.c
+ *	umf_utsolve.c
+ *	umf_triplet.c
+ *	umf_assemble.c
+ *	umf_store_lu.c
+ *	umfpack_solve.c
+ *
+ * This file simply compiles the above files with different pre-#define'd flags,
+ * by defining the flags and then #include'ing the source files themselves.
+ * This is a rather unconventional approach, since by convention #include is
+ * supposed to be used with *.h files not *.c.  However, it is one way of
+ * working around the limitations of Microsoft Visual Studio.
+ *
+ * You still need to compile all files separately as well, with none of the
+ * pre-#define'd terms listed below.
+ */
+
+/* compile the complex conjugate forward/backsolves */
+#define CONJUGATE_SOLVE
+#include "umf_ltsolve.c"
+#include "umf_utsolve.c"
+
+/* compile umf_triplet with DO_MAP, DO_VALUES and DO_MAP, and just DO_VALUES */
+#define DO_MAP
+#include "umf_triplet.c"
+#define DO_VALUES
+#include "umf_triplet.c"
+#undef DO_MAP
+#include "umf_triplet.c"
+
+/* compile the FIXQ version of umf_assemble */
+#define FIXQ
+#include "umf_assemble.c"
+
+/* compile the DROP version of umf_store_lu */
+#define DROP
+#include "umf_store_lu.c"
+
+/* compile umfpack_wsolve */
+#define WSOLVE
+#include "umfpack_solve.c"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_realloc.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,75 @@
+/* ========================================================================== */
+/* === UMF_realloc ========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Realloc a block previously allocated by UMF_malloc.
+    Return NULL on failure (in which case the block is still allocated, and will
+    be kept at is present size).  This routine is only used for Numeric->Memory.
+*/
+
+#include "umf_internal.h"
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+#include "umf_malloc.h"
+#endif
+
+GLOBAL void *UMF_realloc
+(
+    void *p,
+    Int n_objects,
+    size_t size_of_object
+)
+{
+    size_t size ;
+    void *p2 ;
+
+#ifdef UMF_TCOV_TEST
+    /* For exhaustive statement coverage testing only! */
+    /* Pretend to fail, to test out-of-memory conditions. */
+    umf_realloc_fail-- ;
+    if (umf_realloc_fail <= umf_realloc_hi &&
+	umf_realloc_fail >= umf_realloc_lo)
+    {
+	return ((void *) NULL) ;
+    }
+#endif
+
+    /* make sure that we allocate something */
+    n_objects = MAX (1, n_objects) ;
+
+    size = (size_t) n_objects ;
+    ASSERT (size_of_object > 1) ;
+    if (size > Int_MAX / size_of_object)
+    {
+	/* :: int overflow in umf_realloc :: */
+	return ((void *) NULL) ;
+    }
+    size *= size_of_object ;
+
+    DEBUG0 (("UMF_realloc: "ID" n_objects "ID"  size_of_object "ID"\n",
+	(Int) p, n_objects, (Int) size_of_object)) ;
+
+    /* see umf_config.h for the memory allocator selection */
+    p2 = REALLOCATE (p, size) ;
+
+#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
+    /* If p didn't exist on input, and p2 exists, then a new object has been
+     * allocated. */
+    if (p == (void *) NULL && p2 != (void *) NULL)
+    {
+	UMF_malloc_count++ ;
+    }
+#endif
+
+    DEBUG0 (("UMF_realloc: "ID" new malloc count "ID"\n",
+	(Int) p2, UMF_malloc_count)) ;
+
+    return (p2) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_realloc.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void *UMF_realloc
+(
+    void *p,
+    Int n_objects,
+    size_t size_of_object
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,85 @@
+/* ========================================================================== */
+/* === UMF_report_perm ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_internal.h"
+
+#define PRINTF4U(params) { if (user || prl >= 4) PRINTF (params) ; }
+
+GLOBAL Int UMF_report_perm
+(
+    Int n,
+    const Int P [ ],
+    Int W [ ],		/* workspace of size n */
+    Int prl,
+    Int user
+)
+{
+    Int i, k, valid, prl1 ;
+
+    ASSERT (prl >= 3) ;
+
+    PRINTF4U (("permutation vector, n = "ID". ", n)) ;
+
+    if (n <= 0)
+    {
+	PRINTF (("ERROR: length of permutation is <= 0\n\n")) ;
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+
+    if (!P)
+    {
+	/* if P is (Int *) NULL, this is the identity permutation */
+	PRINTF (("(not present)\n\n")) ;
+	return (UMFPACK_OK) ;
+    }
+
+    if (!W)
+    {
+	PRINTF (("ERROR: out of memory\n\n")) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    PRINTF4 (("\n")) ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	W [i] = TRUE ;
+    }
+
+    prl1 = prl ;
+    for (k = 0 ; k < n ; k++)
+    {
+	i = P [k] ;
+	PRINTF4 (("    "ID" : "ID" ", INDEX (k), INDEX (i))) ;
+	valid = (i >= 0 && i < n) ;
+	if (valid)
+	{
+	    valid = W [i] ;
+	    W [i] = FALSE ;
+	}
+	if (!valid)
+	{
+	    /* out of range or duplicate entry */
+	    PRINTF (("ERROR: invalid\n\n")) ;
+	    return (UMFPACK_ERROR_invalid_permutation) ;
+	}
+	PRINTF4 (("\n")) ;
+	if (prl == 4 && k == 9 && n > 10)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+    }
+    prl = prl1 ;
+
+    PRINTF4 (("    permutation vector ")) ;
+    PRINTF4U (("OK\n\n")) ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_perm.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,14 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_report_perm
+(
+    Int n,
+    const Int P [ ],
+    Int W [ ],
+    Int prl,
+    Int user
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,110 @@
+/* ========================================================================== */
+/* === UMF_report_vector ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_internal.h"
+
+/* ========================================================================== */
+/* === print_value ========================================================== */
+/* ========================================================================== */
+
+PRIVATE void print_value
+(
+    Int i,
+    const double Xx [ ],
+    const double Xz [ ],    /* used for complex case only */
+    Int scalar		    /* if true, then print real part only */
+)
+{
+    Entry xi ;
+    /* if Xz is null, then X is in "merged" format (compatible with Entry, */
+    /* and ANSI C99 double _Complex type). */
+    PRINTF (("    "ID" :", INDEX (i))) ;
+    if (scalar)
+    {
+	PRINT_SCALAR (Xx [i]) ;
+    }
+    else
+    {
+	ASSIGN (xi, Xx, Xz, i, SPLIT (Xz)) ;
+	PRINT_ENTRY (xi) ;
+    }
+    PRINTF (("\n")) ;
+}
+
+/* ========================================================================== */
+/* === UMF_report_vector ==================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMF_report_vector
+(
+    Int n,
+    const double Xx [ ],
+    const double Xz [ ],
+    Int prl,
+    Int user,
+    Int scalar
+)
+{
+    Int n2, i ;
+
+    if (user || prl >= 4)
+    {
+	PRINTF (("dense vector, n = "ID". ", n)) ;
+    }
+
+    if (user)
+    {
+	if (!Xx)
+	{
+	    PRINTF (("ERROR: vector not present\n\n")) ;
+	    return (UMFPACK_ERROR_argument_missing) ;
+	}
+	if (n < 0)
+	{
+	    PRINTF (("ERROR: length of vector is < 0\n\n")) ;
+	    return (UMFPACK_ERROR_n_nonpositive) ;
+	}
+    }
+
+    if (user || prl >= 4)
+    {
+	PRINTF4 (("\n")) ;
+    }
+
+    if (prl == 4)
+    {
+	/* print level of 4 */
+	n2 = MIN (10, n) ;
+	for (i = 0 ; i < n2 ; i++)
+	{
+	    print_value (i, Xx, Xz, scalar) ;
+	}
+	if (n2 < n)
+	{
+	    PRINTF (("    ...\n")) ;
+	    print_value (n-1, Xx, Xz, scalar) ;
+	}
+    }
+    else if (prl > 4)
+    {
+	/* print level 4 or more */
+	for (i = 0 ; i < n ; i++)
+	{
+	    print_value  (i, Xx, Xz, scalar) ;
+	}
+    }
+
+    PRINTF4 (("    dense vector ")) ;
+    if (user || prl >= 4)
+    {
+	PRINTF (("OK\n\n")) ;
+    }
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_report_vector.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,15 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_report_vector
+(
+    Int n,
+    const double Xx [ ],
+    const double Xz [ ],
+    Int prl,
+    Int user,
+    Int scalar
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_row_search.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,837 @@
+/* ========================================================================== */
+/* === UMF_row_search ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Find two candidate pivot rows in a column: the best one in the front,
+    and the best one not in the front.  Return the two pivot row patterns and
+    their exact degrees.  Called by UMF_local_search.
+
+    Returns UMFPACK_OK if successful, or UMFPACK_WARNING_singular_matrix or
+    UMFPACK_ERROR_different_pattern if not.
+
+*/
+
+#include "umf_internal.h"
+#include "umf_row_search.h"
+
+GLOBAL Int UMF_row_search
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic,
+    Int cdeg0,			/* length of column in Front */
+    Int cdeg1,			/* length of column outside Front */
+    const Int Pattern [ ],	/* pattern of column, Pattern [0..cdeg1 -1] */
+    const Int Pos [ ],		/* Pos [Pattern [0..cdeg1 -1]] = 0..cdeg1 -1 */
+    Int pivrow [2],		/* pivrow [IN] and pivrow [OUT] */
+    Int rdeg [2],		/* rdeg [IN] and rdeg [OUT] */
+    Int W_i [ ],		/* pattern of pivrow [IN], */
+				/* either Fcols or Woi */
+    Int W_o [ ],		/* pattern of pivrow [OUT], */
+				/* either Wio or Woo */
+    Int prior_pivrow [2],	/* the two other rows just scanned, if any */
+    const Entry Wxy [ ],	/* numerical values Wxy [0..cdeg1-1],
+				   either Wx or Wy */
+
+    Int pivcol,			/* the candidate column being searched */
+    Int freebie [ ]
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double maxval, toler, toler2, value, pivot [2] ;
+    Int i, row, deg, col, *Frpos, fnrows, *E, j, ncols, *Cols, *Rows,
+	e, f, Wrpflag, *Fcpos, fncols, tpi, max_rdeg, nans_in_col, was_offdiag,
+	diag_row, prefer_diagonal, *Wrp, found, *Diagonal_map ;
+    Tuple *tp, *tpend, *tp1, *tp2 ;
+    Unit *Memory, *p ;
+    Element *ep ;
+    Int *Row_tuples, *Row_degree, *Row_tlen ;
+
+#ifndef NDEBUG
+    Int *Col_degree ;
+    DEBUG2 (("Row_search:\n")) ;
+    for (i = 0 ; i < cdeg1 ; i++)
+    {
+	row = Pattern [i] ;
+	DEBUG4 (("   row: "ID"\n", row)) ;
+	ASSERT (row >= 0 && row < Numeric->n_row) ;
+	ASSERT (i == Pos [row]) ;
+    }
+    /* If row is not in Pattern [0..cdeg1-1], then Pos [row] == EMPTY */
+    if (UMF_debug > 0 || Numeric->n_row < 1000)
+    {
+	Int cnt = cdeg1 ;
+	DEBUG4 (("Scan all rows:\n")) ;
+	for (row = 0 ; row < Numeric->n_row ; row++)
+	{
+	    if (Pos [row] < 0)
+	    {
+		cnt++ ;
+	    }
+	    else
+	    {
+		DEBUG4 (("   row: "ID" pos "ID"\n", row, Pos [row])) ;
+	    }
+	}
+	ASSERT (cnt == Numeric->n_row) ;
+    }
+    Col_degree = Numeric->Cperm ;   /* for NON_PIVOTAL_COL macro only */
+    ASSERT (pivcol >= 0 && pivcol < Work->n_col) ;
+    ASSERT (NON_PIVOTAL_COL (pivcol)) ;
+#endif
+
+    pivot [IN] = 0. ;
+    pivot [OUT] = 0. ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    Row_degree = Numeric->Rperm ;
+    Row_tuples = Numeric->Uip ;
+    Row_tlen   = Numeric->Uilen ;
+    Wrp = Work->Wrp ;
+    Frpos = Work->Frpos ;
+    E = Work->E ;
+    Memory = Numeric->Memory ;
+    fnrows = Work->fnrows ;
+
+    prefer_diagonal = Symbolic->prefer_diagonal ;
+    Diagonal_map = Work->Diagonal_map ;
+
+    if (Diagonal_map)
+    {
+	diag_row = Diagonal_map [pivcol] ;
+	was_offdiag = diag_row < 0 ;
+	if (was_offdiag)
+	{
+	    /* the "diagonal" entry in this column was permuted here by an
+	     * earlier pivot choice.  The tighter off-diagonal tolerance will
+	     * be used instead of the symmetric tolerance. */
+	    diag_row = FLIP (diag_row) ;
+	}
+	ASSERT (diag_row >= 0 && diag_row < Numeric->n_row) ;
+    }
+    else
+    {
+	diag_row = EMPTY ;	/* unused */
+	was_offdiag = EMPTY ;	/* unused */
+    }
+
+    /* pivot row degree cannot exceed max_rdeg */
+    max_rdeg = Work->fncols_max ;
+
+    /* ---------------------------------------------------------------------- */
+    /* scan pivot column for candidate rows */
+    /* ---------------------------------------------------------------------- */
+
+    maxval = 0.0 ;
+    nans_in_col = FALSE ;
+
+    for (i = 0 ; i < cdeg1 ; i++)
+    {
+	APPROX_ABS (value, Wxy [i]) ;
+	if (SCALAR_IS_NAN (value))
+	{
+	    nans_in_col = TRUE ;
+	    maxval = value ;
+	    break ;
+	}
+	/* This test can now ignore the NaN case: */
+	maxval = MAX (maxval, value) ;
+    }
+
+    /* if maxval is zero, the matrix is numerically singular */
+
+    toler = Numeric->relpt * maxval ;
+    toler2 = Numeric->relpt2 * maxval ;
+    toler2 = was_offdiag ? toler : toler2 ;
+
+    DEBUG5 (("Row_search begins [ maxval %g toler %g %g\n",
+	maxval, toler, toler2)) ;
+    if (SCALAR_IS_NAN (toler) || SCALAR_IS_NAN (toler2))
+    {
+	nans_in_col = TRUE ;
+    }
+
+    if (!nans_in_col)
+    {
+
+	/* look for the diagonal entry, if it exists */
+	found = FALSE ;
+	ASSERT (!SCALAR_IS_NAN (toler)) ;
+
+	if (prefer_diagonal)
+	{
+	    ASSERT (diag_row != EMPTY) ;
+	    i = Pos [diag_row] ;
+	    if (i >= 0)
+	    {
+		double a ;
+		ASSERT (i < cdeg1) ;
+		ASSERT (diag_row == Pattern [i]) ;
+
+		APPROX_ABS (a, Wxy [i]) ;
+
+		ASSERT (!SCALAR_IS_NAN (a)) ;
+		ASSERT (!SCALAR_IS_NAN (toler2)) ;
+
+		if (SCALAR_IS_NONZERO (a) && a >= toler2)
+		{
+		    /* found it! */
+		    DEBUG3 (("Symmetric pivot: "ID" "ID"\n", pivcol, diag_row));
+		    found = TRUE ;
+		    if (Frpos [diag_row] >= 0 && Frpos [diag_row] < fnrows)
+		    {
+			pivrow [IN] = diag_row ;
+			pivrow [OUT] = EMPTY ;
+		    }
+		    else
+		    {
+			pivrow [IN] = EMPTY ;
+			pivrow [OUT] = diag_row ;
+		    }
+		}
+	    }
+	}
+
+	/* either no diagonal found, or we didn't look for it */
+	if (!found)
+	{
+	    if (cdeg0 > 0)
+	    {
+
+		/* this is a column in the front */
+		for (i = 0 ; i < cdeg0 ; i++)
+		{
+		    double a ;
+		    APPROX_ABS (a, Wxy [i]) ;
+		    ASSERT (!SCALAR_IS_NAN (a)) ;
+		    ASSERT (!SCALAR_IS_NAN (toler)) ;
+		    if (SCALAR_IS_NONZERO (a) && a >= toler)
+		    {
+			row = Pattern [i] ;
+			deg = Row_degree [row] ;
+#ifndef NDEBUG
+			DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n",
+			    i, row, deg, a)) ;
+			UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ;
+#endif
+			ASSERT (Frpos [row] >= 0 && Frpos [row] < fnrows) ;
+			ASSERT (Frpos [row] == i) ;
+			/* row is in the current front */
+			DEBUG4 ((" in front\n")) ;
+			if (deg < rdeg [IN]
+			    /* break ties by picking the largest entry: */
+			       || (deg == rdeg [IN] && a > pivot [IN])
+			    /* break ties by picking the diagonal entry: */
+			    /* || (deg == rdeg [IN] && row == diag_row) */
+			   )
+			{
+			    /* best row in front, so far */
+			    pivrow [IN] = row ;
+			    rdeg [IN] = deg ;
+			    pivot [IN] = a ;
+			}
+		    }
+		}
+		for ( ; i < cdeg1 ; i++)
+		{
+		    double a ;
+		    APPROX_ABS (a, Wxy [i]) ;
+		    ASSERT (!SCALAR_IS_NAN (a)) ;
+		    ASSERT (!SCALAR_IS_NAN (toler)) ;
+		    if (SCALAR_IS_NONZERO (a) && a >= toler)
+		    {
+			row = Pattern [i] ;
+			deg = Row_degree [row] ;
+#ifndef NDEBUG
+			DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n",
+			    i, row, deg, a)) ;
+			UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ;
+#endif
+			ASSERT (Frpos [row] == i) ;
+			/* row is not in the current front */
+			DEBUG4 ((" NOT in front\n")) ;
+			if (deg < rdeg [OUT]
+			    /* break ties by picking the largest entry: */
+			       || (deg == rdeg [OUT] && a > pivot [OUT])
+			    /* break ties by picking the diagonal entry: */
+			    /* || (deg == rdeg [OUT] && row == diag_row) */
+			   )
+			{
+			    /* best row not in front, so far */
+			    pivrow [OUT] = row ;
+			    rdeg [OUT] = deg ;
+			    pivot [OUT] = a ;
+			}
+		    }
+		}
+
+	    }
+	    else
+	    {
+
+		/* this column is not in the front */
+		for (i = 0 ; i < cdeg1 ; i++)
+		{
+		    double a ;
+		    APPROX_ABS (a, Wxy [i]) ;
+		    ASSERT (!SCALAR_IS_NAN (a)) ;
+		    ASSERT (!SCALAR_IS_NAN (toler)) ;
+		    if (SCALAR_IS_NONZERO (a) && a >= toler)
+		    {
+			row = Pattern [i] ;
+			deg = Row_degree [row] ;
+#ifndef NDEBUG
+			DEBUG6 ((ID" candidate row "ID" deg "ID" absval %g\n",
+			    i, row, deg, a)) ;
+			UMF_dump_rowcol (0, Numeric, Work, row, TRUE) ;
+#endif
+			if (Frpos [row] >= 0 && Frpos [row] < fnrows)
+			{
+			    /* row is in the current front */
+			    DEBUG4 ((" in front\n")) ;
+			    if (deg < rdeg [IN]
+			    /* break ties by picking the largest entry: */
+			       || (deg == rdeg [IN] && a > pivot [IN])
+			    /* break ties by picking the diagonal entry: */
+			    /* || (deg == rdeg [IN] && row == diag_row) */
+			       )
+			    {
+				/* best row in front, so far */
+				pivrow [IN] = row ;
+				rdeg [IN] = deg ;
+				pivot [IN] = a ;
+			    }
+			}
+			else
+			{
+			    /* row is not in the current front */
+			    DEBUG4 ((" NOT in front\n")) ;
+			    if (deg < rdeg [OUT]
+			    /* break ties by picking the largest entry: */
+			       || (deg == rdeg[OUT] && a > pivot [OUT])
+			    /* break ties by picking the diagonal entry: */
+			    /* || (deg == rdeg[OUT] && row == diag_row) */
+			       )
+			    {
+				/* best row not in front, so far */
+				pivrow [OUT] = row ;
+				rdeg [OUT] = deg ;
+				pivot [OUT] = a ;
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* NaN handling */
+    /* ---------------------------------------------------------------------- */
+
+    /* if cdeg1 > 0 then we must have found a pivot row ... unless NaN's */
+    /* exist.  Try with no numerical tests if no pivot found. */
+
+    if (cdeg1 > 0 && pivrow [IN] == EMPTY && pivrow [OUT] == EMPTY)
+    {
+	/* cleanup for the NaN case */
+	DEBUG0 (("Found a NaN in pivot column!\n")) ;
+
+	/* grab the first entry in the pivot column, ignoring degree, */
+	/* numerical stability, and symmetric preference */
+	row = Pattern [0] ;
+	deg = Row_degree [row] ;
+	if (Frpos [row] >= 0 && Frpos [row] < fnrows)
+	{
+	    /* row is in the current front */
+	    DEBUG4 ((" in front\n")) ;
+	    pivrow [IN] = row ;
+	    rdeg [IN] = deg ;
+	}
+	else
+	{
+	    /* row is not in the current front */
+	    DEBUG4 ((" NOT in front\n")) ;
+	    pivrow [OUT] = row ;
+	    rdeg [OUT] = deg ;
+	}
+
+	/* We are now guaranteed to have a pivot, no matter how broken */
+	/* (non-IEEE compliant) the underlying numerical operators are. */
+	/* This is particularly a problem for Microsoft compilers (they do */
+	/* not handle NaN's properly). Now try to find a sparser pivot, if */
+	/* possible. */
+
+	for (i = 1 ; i < cdeg1 ; i++)
+	{
+	    row = Pattern [i] ;
+	    deg = Row_degree [row] ;
+
+	    if (Frpos [row] >= 0 && Frpos [row] < fnrows)
+	    {
+		/* row is in the current front */
+		DEBUG4 ((" in front\n")) ;
+		if (deg < rdeg [IN] || (deg == rdeg [IN] && row == diag_row))
+		{
+		    /* best row in front, so far */
+		    pivrow [IN] = row ;
+		    rdeg [IN] = deg ;
+		}
+	    }
+	    else
+	    {
+		/* row is not in the current front */
+		DEBUG4 ((" NOT in front\n")) ;
+		if (deg < rdeg [OUT] || (deg == rdeg [OUT] && row == diag_row))
+		{
+		    /* best row not in front, so far */
+		    pivrow [OUT] = row ;
+		    rdeg [OUT] = deg ;
+		}
+	    }
+	}
+    }
+
+    /* We found a pivot if there are entries (even zero ones) in pivot col */
+    ASSERT (IMPLIES (cdeg1 > 0, pivrow[IN] != EMPTY || pivrow[OUT] != EMPTY)) ;
+
+    /* If there are no entries in the pivot column, then no pivot is found */
+    ASSERT (IMPLIES (cdeg1 == 0, pivrow[IN] == EMPTY && pivrow[OUT] == EMPTY)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check for singular matrix */
+    /* ---------------------------------------------------------------------- */
+
+    if (cdeg1  == 0)
+    {
+	if (fnrows > 0)
+	{
+	    /*
+		Get the pivrow [OUT][IN] from the current front.
+		The frontal matrix looks like this:
+
+			pivcol[OUT]
+			|
+			v
+		x x x x 0   <- so grab this row as the pivrow [OUT][IN].
+		x x x x 0
+		x x x x 0
+		0 0 0 0 0
+
+		The current frontal matrix has some rows in it.  The degree
+		of the pivcol[OUT] is zero.  The column is empty, and the
+		current front does not contribute to it.
+
+	    */
+	    pivrow [IN] = Work->Frows [0] ;
+	    DEBUGm4 (("Got zero pivrow[OUT][IN] "ID" from current front\n",
+		pivrow [IN])) ;
+	}
+	else
+	{
+
+	    /*
+		Get a pivot row from the row-merge tree, use as
+		pivrow [OUT][OUT].   pivrow [IN] remains EMPTY.
+		This can only happen if the current front is 0-by-0.
+	    */
+
+	    Int *Front_leftmostdesc, *Front_1strow, *Front_new1strow, row1,
+		row2, fleftmost, nfr, n_row, frontid ;
+
+	    ASSERT (Work->fncols == 0) ;
+
+	    Front_leftmostdesc = Symbolic->Front_leftmostdesc ;
+	    Front_1strow = Symbolic->Front_1strow ;
+	    Front_new1strow = Work->Front_new1strow ;
+	    nfr = Symbolic->nfr ;
+	    n_row = Numeric->n_row ;
+	    frontid = Work->frontid ;
+
+	    DEBUGm4 (("Note: pivcol: "ID" is empty front "ID"\n",
+		pivcol, frontid)) ;
+#ifndef NDEBUG
+	    DEBUG1 (("Calling dump rowmerge\n")) ;
+	    UMF_dump_rowmerge (Numeric, Symbolic, Work) ;
+#endif
+
+	    /* Row-merge set is the non-pivotal rows in the range */
+	    /* Front_new1strow [Front_leftmostdesc [frontid]] to */
+	    /* Front_1strow [frontid+1] - 1. */
+	    /* If this is empty, then use the empty rows, in the range */
+	    /* Front_new1strow [nfr] to n_row-1. */
+	    /* If this too is empty, then pivrow [OUT] will be empty. */
+	    /* In both cases, update Front_new1strow [...]. */
+
+	    fleftmost = Front_leftmostdesc [frontid] ;
+	    row1 = Front_new1strow [fleftmost] ;
+	    row2 = Front_1strow [frontid+1] - 1 ;
+	    DEBUG1 (("Leftmost: "ID" Rows ["ID" to "ID"] srch ["ID" to "ID"]\n",
+		fleftmost, Front_1strow [frontid], row2, row1, row2)) ;
+
+	    /* look in the range row1 ... row2 */
+	    for (row = row1 ; row <= row2 ; row++)
+	    {
+		DEBUG3 (("   Row: "ID"\n", row)) ;
+		if (NON_PIVOTAL_ROW (row))
+		{
+		    /* found it */
+		    DEBUG3 (("   Row: "ID" found\n", row)) ;
+		    ASSERT (Frpos [row] == EMPTY) ;
+		    pivrow [OUT] = row ;
+		    DEBUGm4 (("got row merge pivrow %d\n", pivrow [OUT])) ;
+		    break ;
+		}
+	    }
+	    Front_new1strow [fleftmost] = row ;
+
+	    if (pivrow [OUT] == EMPTY)
+	    {
+		/* not found, look in empty row set in "dummy" front */
+		row1 = Front_new1strow [nfr] ;
+		row2 = n_row-1 ;
+		DEBUG3 (("Empty: "ID" Rows ["ID" to "ID"] srch["ID" to "ID"]\n",
+		    nfr, Front_1strow [nfr], row2, row1, row2)) ;
+
+		/* look in the range row1 ... row2 */
+		for (row = row1 ; row <= row2 ; row++)
+		{
+		    DEBUG3 (("   Empty Row: "ID"\n", row)) ;
+		    if (NON_PIVOTAL_ROW (row))
+		    {
+			/* found it */
+			DEBUG3 (("   Empty Row: "ID" found\n", row)) ;
+			ASSERT (Frpos [row] == EMPTY) ;
+			pivrow [OUT] = row ;
+			DEBUGm4 (("got dummy row pivrow %d\n", pivrow [OUT])) ;
+			break ;
+		    }
+		}
+		Front_new1strow [nfr] = row ;
+	    }
+
+	    if (pivrow [OUT] == EMPTY)
+	    {
+		/* Row-merge set is empty.  We can just discard */
+		/* the candidate pivot column. */
+		DEBUG0 (("Note: row-merge set empty\n")) ;
+		DEBUGm4 (("got no pivrow \n")) ;
+		return (UMFPACK_WARNING_singular_matrix) ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the candidate row in the front, if any */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    /* check Wrp */
+    ASSERT (Work->Wrpflag > 0) ;
+    if (UMF_debug > 0 || Work->n_col < 1000)
+    {
+	for (i = 0 ; i < Work->n_col ; i++)
+	{
+	    ASSERT (Wrp [i] < Work->Wrpflag) ;
+	}
+    }
+#endif
+
+#ifndef NDEBUG
+    DEBUG4 (("pivrow [IN]: "ID"\n", pivrow [IN])) ;
+    UMF_dump_rowcol (0, Numeric, Work, pivrow [IN], TRUE) ;
+#endif
+
+    if (pivrow [IN] != EMPTY)
+    {
+
+	/* the row merge candidate row is not pivrow [IN] */
+	freebie [IN] = (pivrow [IN] == prior_pivrow [IN]) && (cdeg1  > 0) ;
+	ASSERT (cdeg1  >= 0) ;
+
+	if (!freebie [IN])
+	{
+	    /* include current front in the degree of this row */
+
+	    Fcpos = Work->Fcpos ;
+	    fncols = Work->fncols ;
+
+	    Wrpflag = Work->Wrpflag ;
+
+	    /* -------------------------------------------------------------- */
+	    /* construct the pattern of the IN row */
+	    /* -------------------------------------------------------------- */
+
+#ifndef NDEBUG
+	    /* check Fcols */
+	    DEBUG5 (("ROW ASSEMBLE: rdeg "ID"\nREDUCE ROW "ID"\n",
+		fncols, pivrow [IN])) ;
+	    for (j = 0 ; j < fncols ; j++)
+	    {
+		col = Work->Fcols [j] ;
+		ASSERT (col >= 0 && col < Work->n_col) ;
+		ASSERT (Fcpos [col] >= 0) ;
+	    }
+	    if (UMF_debug > 0 || Work->n_col < 1000)
+	    {
+		Int cnt = fncols ;
+		for (col = 0 ; col < Work->n_col ; col++)
+		{
+		    if (Fcpos [col] < 0) cnt++ ;
+		}
+		ASSERT (cnt == Work->n_col) ;
+	    }
+#endif
+
+	    rdeg [IN] = fncols ;
+
+	    ASSERT (pivrow [IN] >= 0 && pivrow [IN] < Work->n_row) ;
+	    ASSERT (NON_PIVOTAL_ROW (pivrow [IN])) ;
+
+	    /* add the pivot column itself */
+	    ASSERT (Wrp [pivcol] != Wrpflag) ;
+	    if (Fcpos [pivcol] < 0)
+	    {
+		DEBUG3 (("Adding pivot col to pivrow [IN] pattern\n")) ;
+		if (rdeg [IN] >= max_rdeg)
+		{
+		    /* :: pattern change (in) :: */
+		    return (UMFPACK_ERROR_different_pattern) ;
+		}
+		Wrp [pivcol] = Wrpflag ;
+		W_i [rdeg [IN]++] = pivcol ;
+	    }
+
+	    tpi = Row_tuples [pivrow [IN]] ;
+	    if (tpi)
+	    {
+		tp = (Tuple *) (Memory + tpi) ;
+		tp1 = tp ;
+		tp2 = tp ;
+		tpend = tp + Row_tlen [pivrow [IN]] ;
+		for ( ; tp < tpend ; tp++)
+		{
+		    e = tp->e ;
+		    ASSERT (e > 0 && e <= Work->nel) ;
+		    if (!E [e])
+		    {
+			continue ;	/* element already deallocated */
+		    }
+		    f = tp->f ;
+		    p = Memory + E [e] ;
+		    ep = (Element *) p ;
+		    p += UNITS (Element, 1) ;
+		    Cols = (Int *) p ;
+		    ncols = ep->ncols ;
+		    Rows = Cols + ncols ;
+		    if (Rows [f] == EMPTY)
+		    {
+			continue ;	/* row already assembled */
+		    }
+		    ASSERT (pivrow [IN] == Rows [f]) ;
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+			ASSERT (col >= EMPTY && col < Work->n_col) ;
+			if ((col >= 0) && (Wrp [col] != Wrpflag)
+			    && Fcpos [col] <0)
+			{
+			    ASSERT (NON_PIVOTAL_COL (col)) ;
+			    if (rdeg [IN] >= max_rdeg)
+			    {
+				/* :: pattern change (rdeg in failure) :: */
+				DEBUGm4 (("rdeg [IN] >= max_rdeg failure\n")) ;
+				return (UMFPACK_ERROR_different_pattern) ;
+			    }
+			    Wrp [col] = Wrpflag ;
+			    W_i [rdeg [IN]++] = col ;
+			}
+		    }
+
+		    *tp2++ = *tp ;	/* leave the tuple in the list */
+		}
+		Row_tlen [pivrow [IN]] = tp2 - tp1 ;
+	    }
+
+#ifndef NDEBUG
+	    DEBUG4 (("Reduced IN row:\n")) ;
+	    for (j = 0 ; j < fncols ; j++)
+	    {
+		DEBUG6 ((" "ID" "ID" "ID"\n",
+		    j, Work->Fcols [j], Fcpos [Work->Fcols [j]])) ;
+		ASSERT (Fcpos [Work->Fcols [j]] >= 0) ;
+	    }
+	    for (j = fncols ; j < rdeg [IN] ; j++)
+	    {
+		DEBUG6 ((" "ID" "ID" "ID"\n", j, W_i [j], Wrp [W_i [j]]));
+		ASSERT (W_i [j] >= 0 && W_i [j] < Work->n_col) ;
+		ASSERT (Wrp [W_i [j]] == Wrpflag) ;
+	    }
+	    /* mark the end of the pattern in case we scan it by mistake */
+	    /* Note that this means W_i must be of size >= fncols_max + 1 */
+	    W_i [rdeg [IN]] = EMPTY ;
+#endif
+
+	    /* rdeg [IN] is now the exact degree of the IN row */
+
+	    /* clear Work->Wrp. */
+	    Work->Wrpflag++ ;
+	    /* All Wrp [0..n_col] is now < Wrpflag */
+	}
+    }
+
+#ifndef NDEBUG
+    /* check Wrp */
+    if (UMF_debug > 0 || Work->n_col < 1000)
+    {
+	for (i = 0 ; i < Work->n_col ; i++)
+	{
+	    ASSERT (Wrp [i] < Work->Wrpflag) ;
+	}
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the candidate row not in the front, if any */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG4 (("pivrow [OUT]: "ID"\n", pivrow [OUT])) ;
+    UMF_dump_rowcol (0, Numeric, Work, pivrow [OUT], TRUE) ;
+#endif
+
+    /* If this is a candidate row from the row merge set, force it to be */
+    /* scanned (ignore prior_pivrow [OUT]). */
+
+    if (pivrow [OUT] != EMPTY)
+    {
+	freebie [OUT] = (pivrow [OUT] == prior_pivrow [OUT]) && cdeg1  > 0 ;
+	ASSERT (cdeg1  >= 0) ;
+
+	if (!freebie [OUT])
+	{
+
+	    Wrpflag = Work->Wrpflag ;
+
+	    /* -------------------------------------------------------------- */
+	    /* construct the pattern of the row */
+	    /* -------------------------------------------------------------- */
+
+	    rdeg [OUT] = 0 ;
+
+	    ASSERT (pivrow [OUT] >= 0 && pivrow [OUT] < Work->n_row) ;
+	    ASSERT (NON_PIVOTAL_ROW (pivrow [OUT])) ;
+
+	    /* add the pivot column itself */
+	    ASSERT (Wrp [pivcol] != Wrpflag) ;
+	    DEBUG3 (("Adding pivot col to pivrow [OUT] pattern\n")) ;
+	    if (rdeg [OUT] >= max_rdeg)
+	    {
+		/* :: pattern change (out) :: */
+		return (UMFPACK_ERROR_different_pattern) ;
+	    }
+	    Wrp [pivcol] = Wrpflag ;
+	    W_o [rdeg [OUT]++] = pivcol ;
+
+	    tpi = Row_tuples [pivrow [OUT]] ;
+	    if (tpi)
+	    {
+		tp = (Tuple *) (Memory + tpi) ;
+		tp1 = tp ;
+		tp2 = tp ;
+		tpend = tp + Row_tlen [pivrow [OUT]] ;
+		for ( ; tp < tpend ; tp++)
+		{
+		    e = tp->e ;
+		    ASSERT (e > 0 && e <= Work->nel) ;
+		    if (!E [e])
+		    {
+			continue ;	/* element already deallocated */
+		    }
+		    f = tp->f ;
+		    p = Memory + E [e] ;
+		    ep = (Element *) p ;
+		    p += UNITS (Element, 1) ;
+		    Cols = (Int *) p ;
+		    ncols = ep->ncols ;
+		    Rows = Cols + ncols ;
+		    if (Rows [f] == EMPTY)
+		    {
+			continue ;	/* row already assembled */
+		    }
+		    ASSERT (pivrow [OUT] == Rows [f]) ;
+
+		    for (j = 0 ; j < ncols ; j++)
+		    {
+			col = Cols [j] ;
+			ASSERT (col >= EMPTY && col < Work->n_col) ;
+			if ((col >= 0) && (Wrp [col] != Wrpflag))
+			{
+			    ASSERT (NON_PIVOTAL_COL (col)) ;
+			    if (rdeg [OUT] >= max_rdeg)
+			    {
+				/* :: pattern change (rdeg out failure) :: */
+				DEBUGm4 (("rdeg [OUT] failure\n")) ;
+				return (UMFPACK_ERROR_different_pattern) ;
+			    }
+			    Wrp [col] = Wrpflag ;
+			    W_o [rdeg [OUT]++] = col ;
+			}
+		    }
+		    *tp2++ = *tp ;	/* leave the tuple in the list */
+		}
+		Row_tlen [pivrow [OUT]] = tp2 - tp1 ;
+	    }
+
+#ifndef NDEBUG
+	    DEBUG4 (("Reduced row OUT:\n")) ;
+	    for (j = 0 ; j < rdeg [OUT] ; j++)
+	    {
+		DEBUG6 ((" "ID" "ID" "ID"\n", j, W_o [j], Wrp [W_o [j]])) ;
+		ASSERT (W_o [j] >= 0 && W_o [j] < Work->n_col) ;
+		ASSERT (Wrp [W_o [j]] == Wrpflag) ;
+	    }
+	    /* mark the end of the pattern in case we scan it by mistake */
+	    /* Note that this means W_o must be of size >= fncols_max + 1 */
+	    W_o [rdeg [OUT]] = EMPTY ;
+#endif
+
+	    /* rdeg [OUT] is now the exact degree of the row */
+
+	    /* clear Work->Wrp. */
+	    Work->Wrpflag++ ;
+	    /* All Wrp [0..n] is now < Wrpflag */
+
+	}
+
+    }
+    DEBUG5 (("Row_search end ] \n")) ;
+
+#ifndef NDEBUG
+    /* check Wrp */
+    if (UMF_debug > 0 || Work->n_col < 1000)
+    {
+	for (i = 0 ; i < Work->n_col ; i++)
+	{
+	    ASSERT (Wrp [i] < Work->Wrpflag) ;
+	}
+    }
+#endif
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_row_search.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,32 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_row_search
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic,
+    Int cdeg0,
+    Int cdeg1,
+    const Int Pattern [ ],
+    const Int Pos [ ],
+    Int pivrow [2],
+    Int rdeg [2],
+    Int W_i [ ],
+    Int W_o [ ],
+    Int prior_pivrow [2],
+    const Entry Wxy [ ],
+    Int pivcol,
+    Int freebie [2]
+) ;
+
+#define IN 0
+#define OUT 1
+
+#define IN_IN 0
+#define IN_OUT 1
+#define OUT_IN 2
+#define OUT_OUT 3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,127 @@
+/* ========================================================================== */
+/* === UMF_scale ============================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Divide a vector of stride 1 by the pivot value. */
+
+#include "umf_internal.h"
+
+GLOBAL void UMF_scale
+(
+    Int n,
+    Entry pivot,
+    Entry X [ ]
+)
+{
+    Entry x ;
+    double s ;
+    Int i ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the approximate absolute value of the pivot, and select method */
+    /* ---------------------------------------------------------------------- */
+
+    APPROX_ABS (s, pivot) ;
+
+    if (s < RECIPROCAL_TOLERANCE || IS_NAN (pivot))
+    {
+	/* ------------------------------------------------------------------ */
+	/* tiny, or zero, pivot case */
+	/* ------------------------------------------------------------------ */
+
+	/* The pivot is tiny, or NaN.  Do not divide zero by the pivot value,
+	 * and do not multiply by 1/pivot, either. */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] /= pivot ; */
+	    x = X [i] ;
+
+#ifndef NO_DIVIDE_BY_ZERO
+	    if (IS_NONZERO (x))
+	    {
+		DIV (X [i], x, pivot) ;
+	    }
+#else
+	    /* Do not divide by zero */
+	    if (IS_NONZERO (x) && IS_NONZERO (pivot))
+	    {
+		DIV (X [i], x, pivot) ;
+	    }
+#endif
+
+	}
+
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* normal case.  select the x/pivot or x * (1/pivot) method */
+	/* ------------------------------------------------------------------ */
+
+	/* The pivot is not tiny, and is not NaN.   Don't bother to check for
+	 * zeros in the pivot column, X. */
+
+#if !defined (NRECIPROCAL) && !(defined (__GNUC__) && defined (COMPLEX))
+
+	    /* -------------------------------------------------------------- */
+	    /* multiply x by (1/pivot) */
+	    /* -------------------------------------------------------------- */
+
+	    /* Slightly less accurate, but faster.  It allows the use of
+	     * the level-1 BLAS dscal or zscal routine.  This not used when
+	     * UMFPACK is used in MATLAB (either as a built-in routine, or as
+	     * a mexFunction).
+	     *
+	     * Using gcc version 3.2 can cause the following code to fail for
+	     * some complex matrices (not all), with or without the BLAS.  This
+	     * was found in Red Hat Linux 7.3 on a Dell Latitude C840 with a
+	     * Pentium 4M.  Thus, this code is not used when gcc is used, for
+	     * the complex case.
+	     *
+	     * It works just fine with Intel's icc compiler, version 7.0.
+	     */
+
+	    /* pivot = 1 / pivot */
+	    RECIPROCAL (pivot) ;
+
+#if defined (USE_NO_BLAS)
+	    for (i = 0 ; i < n ; i++)
+	    {
+		/* X [i] *= pivot ; */
+		x = X [i] ;
+		MULT (X [i], x, pivot) ;
+	    }
+#else
+	    BLAS_SCAL (n, pivot, X) ;
+#endif
+
+#else
+
+	    /* -------------------------------------------------------------- */
+	    /* divide x by the pivot */
+	    /* -------------------------------------------------------------- */
+
+	    /* This is slightly more accurate, particularly if the pivot column
+	     * consists of only IEEE subnormals.  Always do this if UMFPACK is
+	     * being compiled as a built-in routine or mexFunction in MATLAB,
+	     * or if gcc is being used with complex matrices. */
+
+	    for (i = 0 ; i < n ; i++)
+	    {
+		/* X [i] /= pivot ; */
+		x = X [i] ;
+		DIV (X [i], x, pivot) ;
+	    }
+
+#endif
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_scale
+(
+    Int n,
+    Entry alpha,
+    Entry X [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,433 @@
+/* ========================================================================== */
+/* === UMF_scale_column ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Scale the current pivot column, move the pivot row and column into place,
+    and log the permutation.
+*/
+
+#include "umf_internal.h"
+#include "umf_mem_free_tail_block.h"
+#include "umf_scale.h"
+
+/* ========================================================================== */
+/* === shift_pivot_row ====================================================== */
+/* ========================================================================== */
+
+/* Except for the BLAS, most of the time is typically spent in the following
+ * shift_pivot_row routine.  It copies the pivot row into the U block, and
+ * then fills in the whole in the C block by shifting the last row of C into
+ * the row vacated by the pivot row.
+ */
+
+PRIVATE void shift_pivot_row (Entry *Fd, Entry *Fs, Entry *Fe, Int len, Int d)
+{
+    Int j ;
+#pragma ivdep
+    for (j = 0 ; j < len ; j++)
+    {
+	Fd [j]   = Fs [j*d] ;
+	Fs [j*d] = Fe [j*d] ;
+    }
+}
+
+/* ========================================================================== */
+/* === UMF_scale_column ===================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMF_scale_column
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry pivot_value ;
+    Entry *Fcol, *Flublock, *Flblock, *Fublock, *Fcblock ;
+    Int k, k1, fnr_curr, fnrows, fncols, *Frpos, *Fcpos, pivrow, pivcol,
+	*Frows, *Fcols, fnc_curr, fnpiv, *Row_tuples, nb,
+	*Col_tuples, *Rperm, *Cperm, fspos, col2, row2 ;
+#ifndef NDEBUG
+    Int *Col_degree, *Row_degree ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    fnpiv = Work->fnpiv ;
+
+    /* ---------------------------------------------------------------------- */
+
+    Rperm = Numeric->Rperm ;
+    Cperm = Numeric->Cperm ;
+
+    /* ---------------------------------------------------------------------- */
+
+    Flublock = Work->Flublock ;
+    Flblock  = Work->Flblock ;
+    Fublock  = Work->Fublock ;
+    Fcblock  = Work->Fcblock ;
+
+    fnr_curr = Work->fnr_curr ;
+    fnc_curr = Work->fnc_curr ;
+    Frpos = Work->Frpos ;
+    Fcpos = Work->Fcpos ;
+    Frows = Work->Frows ;
+    Fcols = Work->Fcols ;
+    pivrow = Work->pivrow ;
+    pivcol = Work->pivcol ;
+
+    ASSERT (pivrow >= 0 && pivrow < Work->n_row) ;
+    ASSERT (pivcol >= 0 && pivcol < Work->n_col) ;
+
+#ifndef NDEBUG
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+#endif
+
+    Row_tuples = Numeric->Uip ;
+    Col_tuples = Numeric->Lip ;
+    nb = Work->nb ;
+
+#ifndef NDEBUG
+    ASSERT (fnrows == Work->fnrows_new + 1) ;
+    ASSERT (fncols == Work->fncols_new + 1) ;
+    DEBUG1 (("SCALE COL: fnrows "ID" fncols "ID"\n", fnrows, fncols)) ;
+    DEBUG2 (("\nFrontal matrix, including all space:\n"
+		"fnr_curr "ID" fnc_curr "ID" nb    "ID"\n"
+		"fnrows   "ID" fncols   "ID" fnpiv "ID"\n",
+		fnr_curr, fnc_curr, nb, fnrows, fncols, fnpiv)) ;
+    DEBUG2 (("\nJust the active part:\n")) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Fcblock,  fnr_curr, fnrows, fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Flblock,  fnr_curr, fnrows, fnpiv);
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Fublock,  fnc_curr, fncols, fnpiv) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Flublock, nb, fnpiv, fnpiv) ;
+#endif
+
+    /* ====================================================================== */
+    /* === Shift pivot row and column ======================================= */
+    /* ====================================================================== */
+
+    /* ---------------------------------------------------------------------- */
+    /* move pivot column into place */
+    /* ---------------------------------------------------------------------- */
+
+    /* Note that the pivot column is already in place.  Just shift the last
+     * column into the position vacated by the pivot column. */
+
+    fspos = Fcpos [pivcol] ;
+
+    /* one less column in the contribution block */
+    fncols = --(Work->fncols) ;
+
+    if (fspos != fncols * fnr_curr)
+    {
+
+	Int fs = fspos / fnr_curr ;
+
+	DEBUG6 (("Shift pivot column in front\n")) ;
+	DEBUG6 (("fspos: "ID" flpos: "ID"\n", fspos, fncols * fnr_curr)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* move Fe => Fs */
+	/* ------------------------------------------------------------------ */
+
+	/* column of the contribution block: */
+	{
+	    /* Fs: current position of pivot column in contribution block */
+	    /* Fe: position of last column in contribution block */
+	    Int i ;
+	    Entry *Fs, *Fe ;
+	    Fs = Fcblock + fspos ;
+	    Fe = Fcblock + fncols * fnr_curr ;
+#pragma ivdep
+	    for (i = 0 ; i < fnrows ; i++)
+	    {
+		Fs [i] = Fe [i] ;
+	    }
+	}
+
+	/* column of the U2 block */
+	{
+	    /* Fs: current position of pivot column in U block */
+	    /* Fe: last column in U block */
+	    Int i ;
+	    Entry *Fs, *Fe ;
+	    Fs = Fublock + fs ;
+	    Fe = Fublock + fncols ;
+#pragma ivdep
+	    for (i = 0 ; i < fnpiv ; i++)
+	    {
+		Fs [i * fnc_curr] = Fe [i * fnc_curr] ;
+	    }
+	}
+
+	/* move column Fe to Fs in the Fcols pattern */
+	col2 = Fcols [fncols] ;
+	Fcols [fs] = col2 ;
+	Fcpos [col2] = fspos ;
+    }
+
+    /* pivot column is no longer in the frontal matrix */
+    Fcpos [pivcol] = EMPTY ;
+
+#ifndef NDEBUG
+    DEBUG2 (("\nFrontal matrix after col swap, including all space:\n"
+		"fnr_curr "ID" fnc_curr "ID" nb    "ID"\n"
+		"fnrows   "ID" fncols   "ID" fnpiv "ID"\n",
+		fnr_curr, fnc_curr, nb,
+		fnrows, fncols, fnpiv)) ;
+    DEBUG2 (("\nJust the active part:\n")) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Fcblock,  fnr_curr, fnrows, fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Flblock,  fnr_curr, fnrows, fnpiv+1);
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Fublock,  fnc_curr, fncols, fnpiv) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Flublock, nb, fnpiv, fnpiv+1) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* move pivot row into place */
+    /* ---------------------------------------------------------------------- */
+
+    fspos = Frpos [pivrow] ;
+
+    /* one less row in the contribution block */
+    fnrows = --(Work->fnrows) ;
+
+    DEBUG6 (("Swap/shift pivot row in front:\n")) ;
+    DEBUG6 (("fspos: "ID" flpos: "ID"\n", fspos, fnrows)) ;
+
+    if (fspos == fnrows)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* move Fs => Fd */
+	/* ------------------------------------------------------------------ */
+
+	DEBUG6 (("row case 1\n")) ;
+
+	/* row of the contribution block: */
+	{
+	    Int j ;
+	    Entry *Fd, *Fs ;
+	    Fd = Fublock + fnpiv * fnc_curr ;
+	    Fs = Fcblock + fspos ;
+#pragma ivdep
+	    for (j = 0 ; j < fncols ; j++)
+	    {
+		Fd [j] = Fs [j * fnr_curr] ;
+	    }
+	}
+
+	/* row of the L2 block: */
+	if (Work->pivrow_in_front)
+	{
+	    Int j ;
+	    Entry *Fd, *Fs ;
+	    Fd = Flublock + fnpiv ;
+	    Fs = Flblock  + fspos ;
+#pragma ivdep
+	    for (j = 0 ; j <= fnpiv ; j++)
+	    {
+		Fd [j * nb] = Fs [j * fnr_curr] ;
+	    }
+	}
+	else
+	{
+	    Int j ;
+	    Entry *Fd, *Fs ;
+	    Fd = Flublock + fnpiv ;
+	    Fs = Flblock  + fspos ;
+#pragma ivdep
+	    for (j = 0 ; j < fnpiv ; j++)
+	    {
+		ASSERT (IS_ZERO (Fs [j * fnr_curr])) ;
+		CLEAR (Fd [j * nb]) ;
+	    }
+	    Fd [fnpiv * nb] = Fs [fnpiv * fnr_curr] ;
+	}
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* move Fs => Fd */
+	/* move Fe => Fs */
+	/* ------------------------------------------------------------------ */
+
+	DEBUG6 (("row case 2\n")) ;
+	/* this is the most common case, by far */
+
+	/* row of the contribution block: */
+	{
+	    /* Fd: destination of pivot row on U block */
+	    /* Fs: current position of pivot row in contribution block */
+	    /* Fe: position of last row in contribution block */
+	    Entry *Fd, *Fs, *Fe ;
+	    Fd = Fublock + fnpiv * fnc_curr ;
+	    Fs = Fcblock + fspos ;
+	    Fe = Fcblock + fnrows ;
+	    shift_pivot_row (Fd, Fs, Fe, fncols, fnr_curr) ;
+	}
+
+	/* row of the L2 block: */
+	if (Work->pivrow_in_front)
+	{
+	    /* Fd: destination of pivot row in LU block */
+	    /* Fs: current position of pivot row in L block */
+	    /* Fe: last row in L block */
+	    Int j ;
+	    Entry *Fd, *Fs, *Fe ;
+	    Fd = Flublock + fnpiv ;
+	    Fs = Flblock  + fspos ;
+	    Fe = Flblock  + fnrows ;
+#pragma ivdep
+	    for (j = 0 ; j <= fnpiv ; j++)
+	    {
+		Fd [j * nb]       = Fs [j * fnr_curr] ;
+		Fs [j * fnr_curr] = Fe [j * fnr_curr] ;
+	    }
+	}
+	else
+	{
+	    Int j ;
+	    Entry *Fd, *Fs, *Fe ;
+	    Fd = Flublock + fnpiv ;
+	    Fs = Flblock  + fspos ;
+	    Fe = Flblock  + fnrows ;
+#pragma ivdep
+	    for (j = 0 ; j < fnpiv ; j++)
+	    {
+		ASSERT (IS_ZERO (Fs [j * fnr_curr])) ;
+		CLEAR (Fd [j * nb]) ;
+		Fs [j * fnr_curr] = Fe [j * fnr_curr] ;
+	    }
+	    Fd [fnpiv * nb]       = Fs [fnpiv * fnr_curr] ;
+	    Fs [fnpiv * fnr_curr] = Fe [fnpiv * fnr_curr] ;
+	}
+
+	/* move row Fe to Fs in the Frows pattern */
+	row2 = Frows [fnrows] ;
+	Frows [fspos] = row2 ;
+	Frpos [row2] = fspos ;
+
+    }
+    /* pivot row is no longer in the frontal matrix */
+    Frpos [pivrow] = EMPTY ;
+
+#ifndef NDEBUG
+    DEBUG2 (("\nFrontal matrix after row swap, including all space:\n"
+		"fnr_curr "ID" fnc_curr "ID" nb    "ID"\n"
+		"fnrows   "ID" fncols   "ID" fnpiv "ID"\n",
+		Work->fnr_curr, Work->fnc_curr, Work->nb,
+		Work->fnrows, Work->fncols, Work->fnpiv)) ;
+    DEBUG2 (("\nJust the active part:\n")) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Fcblock,  fnr_curr, fnrows, fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Flblock,  fnr_curr, fnrows, fnpiv+1);
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Fublock,  fnc_curr, fncols, fnpiv+1) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Flublock, nb, fnpiv+1, fnpiv+1) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* Frpos [row] >= 0 for each row in pivot column pattern.   */
+    /* offset into pattern is given by:				*/
+    /* Frpos [row] == offset - 1				*/
+    /* Frpos [pivrow] is EMPTY */
+
+    /* Fcpos [col] >= 0 for each col in pivot row pattern.	*/
+    /* Fcpos [col] == (offset - 1) * fnr_curr			*/
+    /* Fcpos [pivcol] is EMPTY */
+
+    /* Fcols [0..fncols-1] is the pivot row pattern (excl pivot cols) */
+    /* Frows [0..fnrows-1] is the pivot col pattern (excl pivot rows) */
+
+    /* ====================================================================== */
+    /* === scale pivot column =============================================== */
+    /* ====================================================================== */
+
+    /* pivot column (except for pivot entry itself) */
+    Fcol = Flblock + fnpiv * fnr_curr ;
+    /* fnpiv-th pivot in frontal matrix located in Flublock (fnpiv, fnpiv) */
+    pivot_value = Flublock [fnpiv + fnpiv * nb] ;
+
+    /* this is the kth global pivot */
+    k = Work->npiv + fnpiv ;
+
+    DEBUG4 (("Pivot value: ")) ;
+    EDEBUG4 (pivot_value) ;
+    DEBUG4 (("\n")) ;
+
+    UMF_scale (fnrows, pivot_value, Fcol) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* deallocate the pivot row and pivot column tuples */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_mem_free_tail_block (Numeric, Row_tuples [pivrow]) ;
+    UMF_mem_free_tail_block (Numeric, Col_tuples [pivcol]) ;
+
+    Row_tuples [pivrow] = 0 ;
+    Col_tuples [pivcol] = 0 ;
+
+    DEBUG5 (("number of pivots prior to this one: "ID"\n", k)) ;
+    ASSERT (NON_PIVOTAL_ROW (pivrow)) ;
+    ASSERT (NON_PIVOTAL_COL (pivcol)) ;
+
+    /* save row and column inverse permutation */
+    k1 = ONES_COMPLEMENT (k) ;
+    Rperm [pivrow] = k1 ;			/* aliased with Row_degree */
+    Cperm [pivcol] = k1 ;			/* aliased with Col_degree */
+
+    ASSERT (!NON_PIVOTAL_ROW (pivrow)) ;
+    ASSERT (!NON_PIVOTAL_COL (pivcol)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* Keep track of the pivot order.  This is the kth pivot row and column. */
+    /* ---------------------------------------------------------------------- */
+
+    /* keep track of pivot rows and columns in the LU, L, and U blocks */
+    ASSERT (fnpiv < MAXNB) ;
+    Work->Pivrow [fnpiv] = pivrow ;
+    Work->Pivcol [fnpiv] = pivcol ;
+
+    /* ====================================================================== */
+    /* === one step in the factorization is done ============================ */
+    /* ====================================================================== */
+
+    /* One more step is done, except for pending updates to the U and C blocks
+     * of this frontal matrix.  Those are saved up, and applied by
+     * UMF_blas3_update when enough pivots have accumulated.   Also, the
+     * LU factors for these pending pivots have not yet been stored. */
+
+    Work->fnpiv++ ;
+
+#ifndef NDEBUG
+    DEBUG7 (("Current frontal matrix: (after pivcol scale)\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_scale_column.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,11 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_scale_column
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,133 @@
+/* ========================================================================== */
+/* === UMF_set_stats ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Sets statistics in Info array.  Calculates everything in double precision,
+    rather than Int or size_t, so that usage estimates can be computed even if
+    the problem is so large that it would cause integer overflow.
+
+    This routine has many double relop's, but the NaN case is ignored.
+*/
+
+#include "umf_internal.h"
+#include "umf_symbolic_usage.h"
+
+GLOBAL void UMF_set_stats
+(
+    double Info [ ],
+    SymbolicType *Symbolic,
+    double max_usage,		/* peak size of Numeric->Memory, in Units */
+    double num_mem_size,	/* final size of Numeric->Memory, in Units */
+    double flops,		/* "true flops" */
+    double lnz,			/* nz in L */
+    double unz,			/* nz in U */
+    double maxfrsize,		/* largest front size */
+    double ulen,		/* size of Numeric->Upattern */
+    double npiv,		/* number of pivots found */
+    double maxnrows,		/* largest #rows in front */
+    double maxncols,		/* largest #cols in front */
+    Int scale,			/* true if scaling the rows of A */
+    Int prefer_diagonal,	/* true if diagonal pivoting (only square A) */
+    Int what			/* ESTIMATE or ACTUAL */
+)
+{
+
+    double sym_size, work_usage, nn, n_row, n_col, n_inner, num_On_size1,
+	num_On_size2, num_usage, sym_maxncols, sym_maxnrows, elen, n1 ;
+
+    n_col = Symbolic->n_col ;
+    n_row = Symbolic->n_row ;
+    n1 = Symbolic->n1 ;
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+    sym_maxncols = MIN (Symbolic->maxncols + Symbolic->nb, n_col) ;
+    sym_maxnrows = MIN (Symbolic->maxnrows + Symbolic->nb, n_row) ;
+    elen = (n_col - n1) + (n_row - n1) + MIN (n_col - n1, n_row - n1) + 1 ;
+
+    /* final Symbolic object size */
+    sym_size = UMF_symbolic_usage (Symbolic->n_row, Symbolic->n_col,
+	Symbolic->nchains, Symbolic->nfr, Symbolic->esize, prefer_diagonal) ;
+
+    /* size of O(n) part of Numeric object during factorization, */
+    /* except Numeric->Memory and Numeric->Upattern */
+    num_On_size1 =
+	DUNITS (NumericType, 1)		/* Numeric structure */
+	+ DUNITS (Entry, n_inner+1)	/* D */
+	+ 4 * DUNITS (Int, n_row+1)	/* Rperm, Lpos, Uilen, Uip */
+	+ 4 * DUNITS (Int, n_col+1)	/* Cperm, Upos, Lilen, Lip */
+	+ (scale ? DUNITS (Entry, n_row) : 0) ;   /* Rs, row scale factors */
+
+    /* size of O(n) part of Numeric object after factorization, */
+    /* except Numeric->Memory and Numeric->Upattern */
+    num_On_size2 =
+	DUNITS (NumericType, 1)		/* Numeric structure */
+	+ DUNITS (Entry, n_inner+1)	/* D */
+	+ DUNITS (Int, n_row+1)		/* Rperm */
+	+ DUNITS (Int, n_col+1)		/* Cperm */
+	+ 6 * DUNITS (Int, npiv+1)	/* Lpos, Uilen, Uip, Upos, Lilen, Lip */
+	+ (scale ? DUNITS (Entry, n_row) : 0) ;	    /* Rs, row scale factors */
+
+    DEBUG1 (("num O(n) size2: %g\n", num_On_size2)) ;
+
+    /* peak size of Numeric->Memory, including LU factors, current frontal
+     * matrix, elements, and tuple lists.  */
+    Info [UMFPACK_VARIABLE_PEAK + what] = max_usage ;
+
+    /* final size of Numeric->Memory (LU factors only) */
+    Info [UMFPACK_VARIABLE_FINAL + what] = num_mem_size ;
+
+    /* final size of Numeric object, including Numeric->Memory and ->Upattern */
+    Info [UMFPACK_NUMERIC_SIZE + what] =
+	num_On_size2
+	+ num_mem_size		/* final Numeric->Memory size */
+	+ DUNITS (Int, ulen+1) ;/* Numeric->Upattern (from Work->Upattern) */
+
+    DEBUG1 (("num mem size: %g\n", num_mem_size)) ;
+    DEBUG1 (("ulen units %g\n", DUNITS (Int, ulen))) ;
+    DEBUG1 (("numeric size %g\n", Info [UMFPACK_NUMERIC_SIZE + what])) ;
+
+    /* largest front size (working array size, or actual size used) */
+    Info [UMFPACK_MAX_FRONT_SIZE + what] = maxfrsize ;
+    Info [UMFPACK_MAX_FRONT_NROWS + what] = maxnrows ;
+    Info [UMFPACK_MAX_FRONT_NCOLS + what] = maxncols ;
+    DEBUGm4 (("maxnrows %g maxncols %g\n", maxnrows, maxncols)) ;
+    DEBUGm4 (("maxfrsize %g\n", maxfrsize)) ;
+
+    /* UMF_kernel usage, from work_alloc routine in umf_kernel.c */
+    work_usage =
+	/* Work-> arrays, except for current frontal matrix which is allocated
+	 * inside Numeric->Memory. */
+	2 * DUNITS (Entry, sym_maxnrows + 1)	/* Wx, Wy */
+	+ 2 * DUNITS (Int, n_row+1)		/* Frpos, Lpattern */
+	+ 2 * DUNITS (Int, n_col+1)		/* Fcpos, Upattern */
+	+ DUNITS (Int, nn + 1)			/* Wp */
+	+ DUNITS (Int, MAX (n_col, sym_maxnrows) + 1)	/* Wrp */
+	+ 2 * DUNITS (Int, sym_maxnrows + 1)	/* Frows, Wm */
+	+ 3 * DUNITS (Int, sym_maxncols + 1)	/* Fcols, Wio, Woi */
+	+ DUNITS (Int, MAX (sym_maxnrows, sym_maxncols) + 1)	/* Woo */
+	+ DUNITS (Int, elen)			/* E */
+	+ DUNITS (Int, Symbolic->nfr + 1)	/* Front_new1strow */
+	+ ((n_row == n_col) ? (2 * DUNITS (Int, nn)) : 0) ;  /* Diag map,imap */
+
+    /* Peak memory for just UMFPACK_numeric. */
+    num_usage =
+	sym_size	/* size of Symbolic object */
+	+ num_On_size1	/* O(n) part of Numeric object (excl. Upattern) */
+	+ work_usage	/* Work-> arrays (including Upattern) */
+	+ max_usage ;	/* peak size of Numeric->Memory */
+
+    /* peak memory usage for both UMFPACK_*symbolic and UMFPACK_numeric. */
+    Info [UMFPACK_PEAK_MEMORY + what] =
+	MAX (Symbolic->peak_sym_usage, num_usage) ;
+
+    Info [UMFPACK_FLOPS + what] = flops ;
+    Info [UMFPACK_LNZ + what] = lnz ;
+    Info [UMFPACK_UNZ + what] = unz ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_set_stats.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,24 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL void UMF_set_stats
+(
+    double Info [ ],
+    SymbolicType *Symbolic,
+    double max_usage,
+    double num_mem_size,
+    double flops,
+    double lnz,
+    double unz,
+    double maxfrsize,
+    double ulen,
+    double npiv,
+    double maxnrows,
+    double maxncols,
+    Int scale,
+    Int prefer_diagonal,
+    Int what
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_singletons.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,915 @@
+/* ========================================================================== */
+/* === UMF_singletons ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Find and order the row and column singletons of a matrix A.  If there are
+ * row and column singletons, the output is a row and column permutation such
+ * that the matrix is in the following form:
+ *
+ *	x x x x x x x x x
+ *	0 x x x x x x x x
+ *	0 0 x x x x x x x
+ *	0 0 0 x 0 0 0 0 0
+ *	0 0 0 x x 0 0 0 0
+ *	0 0 0 x x s s s s
+ *	0 0 0 x x s s s s
+ *	0 0 0 x x s s s s
+ *	0 0 0 x x s s s s
+ *
+ * The above example has 3 column singletons (the first three columns and
+ * their corresponding pivot rows) and 2 row singletons.  The singletons are
+ * ordered first, because they have zero Markowitz cost.  The LU factorization
+ * for these first five rows and columns is free - there is no work to do
+ * (except to scale the pivot columns for the 2 row singletons), and no
+ * fill-in occurs.  * The remaining * submatrix (4-by-4 in the above example)
+ * has no rows or columns with degree one.  It may have empty rows or columns.
+ *
+ * This algorithm does not perform a full permutation to block triangular
+ * form.  If there are one or more singletons, then the matrix can be
+ * permuted to block triangular form, but UMFPACK does not perform the full
+ * BTF permutation (see also "dmperm" in MATLAB).
+ */
+
+#include "umf_internal.h"
+
+#ifndef NDEBUG
+
+/* ========================================================================== */
+/* === debug routines ======================================================= */
+/* ========================================================================== */
+
+/* Dump the singleton queue */
+
+PRIVATE void dump_singletons
+(
+    Int head,		/* head of the queue */
+    Int tail,		/* tail of the queue */
+    Int Next [ ],	/* Next [i] is the next object after i */
+    char *name,		/* "row" or "col" */
+    Int Deg [ ],	/* Deg [i] is the degree of object i */
+    Int n		/* objects are in the range 0 to n-1 */
+)
+{
+    Int i, next, cnt ;
+    DEBUG6 (("%s Singleton list: head "ID" tail "ID"\n", name, head, tail)) ;
+    i = head ;
+    ASSERT (head >= EMPTY && head < n) ;
+    ASSERT (tail >= EMPTY && tail < n) ;
+    cnt = 0 ;
+    while (i != EMPTY)
+    {
+	DEBUG7 ((" "ID": "ID" deg: "ID"\n", cnt, i, Deg [i])) ;
+	ASSERT (i >= 0 && i < n) ;
+	next = Next [i] ;
+	if (i == tail) ASSERT (next == EMPTY) ;
+	i = next ;
+	cnt++ ;
+	ASSERT (cnt <= n) ;
+    }
+}
+
+PRIVATE void dump_mat
+(
+    char *xname,
+    char *yname,
+    Int nx,
+    Int ny,
+    const Int Xp [ ],
+    const Int Xi [ ],
+    Int Xdeg [ ],
+    Int Ydeg [ ]
+)
+{
+    Int x, y, p, p1, p2, xdeg, do_xdeg, ydeg ;
+    DEBUG6 (("\n ==== Dump %s mat:\n", xname)) ;
+    for (x = 0 ; x < nx ; x++)
+    {
+	p1 = Xp [x] ;
+	p2 = Xp [x+1] ;
+	xdeg = Xdeg [x] ;
+	DEBUG6 (("Dump %s "ID" p1 "ID" p2 "ID" deg "ID"\n",
+	    xname, x, p1, p2, xdeg)) ;
+	do_xdeg = (xdeg >= 0) ;
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    y = Xi [p] ;
+	    DEBUG7 (("    %s "ID" deg: ", yname, y)) ;
+	    ASSERT (y >= 0 && y < ny) ;
+	    ydeg = Ydeg [y] ;
+	    DEBUG7 ((ID"\n", ydeg)) ;
+	    if (do_xdeg && ydeg >= 0)
+	    {
+		xdeg-- ;
+	    }
+	}
+	ASSERT (IMPLIES (do_xdeg, xdeg == 0)) ;
+    }
+}
+#endif
+
+/* ========================================================================== */
+/* === create_row_form ====================================================== */
+/* ========================================================================== */
+
+/* Create the row-form R of the column-form input matrix A.  This could be done
+ * by UMF_transpose, except that Rdeg has already been computed.
+ */
+
+PRIVATE void create_row_form
+(
+    /* input, not modified: */
+    Int n_row,		    /* A is n_row-by-n_col, nz = Ap [n_col] */
+    Int n_col,
+    const Int Ap [ ],	    /* Ap [0..n_col]: column pointers for A */
+    const Int Ai [ ],	    /* Ai [0..nz-1]:  row indices for A */
+    Int Rdeg [ ],	    /* Rdeg [0..n_row-1]: row degrees */
+
+    /* output, not defined on input: */
+    Int Rp [ ],		    /* Rp [0..n_row]: row pointers for R */
+    Int Ri [ ],		    /* Ri [0..nz-1]:  column indices for R */
+
+    /* workspace, not defined on input or output */
+    Int W [ ]		    /* size n_row */
+)
+{
+    Int row, col, p, p2 ;
+
+    /* create the row pointers */
+    Rp [0] = 0 ;
+    W [0] = 0 ;
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Rp [row+1] = Rp [row] + Rdeg [row] ;
+	W [row] = Rp [row] ;
+    }
+
+    /* create the indices for the row-form */
+    for (col = 0 ; col < n_col ; col++)
+    {
+	p2 = Ap [col+1] ;
+	for (p = Ap [col] ; p < p2 ; p++)
+	{
+	    Ri [W [Ai [p]]++] = col ;
+	}
+    }
+}
+
+/* ========================================================================== */
+/* === order_singletons ===================================================== */
+/* ========================================================================== */
+
+PRIVATE int order_singletons	/* return new number of singletons */
+(
+    Int k,	    /* the number of singletons so far */
+    Int head,
+    Int tail,
+    Int Next [ ],
+    Int Xdeg [ ], Int Xperm [ ], const Int Xp [ ], const Int Xi [ ],
+    Int Ydeg [ ], Int Yperm [ ], const Int Yp [ ], const Int Yi [ ]
+#ifndef NDEBUG
+    , char *xname, char *yname, Int nx, Int ny
+#endif
+)
+{
+    Int xpivot, x, y, ypivot, p, p2, deg ;
+
+#ifndef NDEBUG
+    Int i, k1 = k ;
+    dump_singletons (head, tail, Next, xname, Xdeg, nx) ;
+    dump_mat (xname, yname, nx, ny, Xp, Xi, Xdeg, Ydeg) ;
+    dump_mat (yname, xname, ny, nx, Yp, Yi, Ydeg, Xdeg) ;
+#endif
+
+    while (head != EMPTY)
+    {
+	/* remove the singleton at the head of the queue */
+	xpivot = head ;
+	DEBUG1 (("------ Order %s singleton: "ID"\n", xname, xpivot)) ;
+	head = Next [xpivot] ;
+	if (head == EMPTY) tail = EMPTY ;
+
+#ifndef NDEBUG
+	if (k % 100 == 0) dump_singletons (head, tail, Next, xname, Xdeg, nx) ;
+#endif
+
+	ASSERT (Xdeg [xpivot] >= 0) ;
+	if (Xdeg [xpivot] != 1)
+	{
+	    /* This row/column x is empty.  The matrix is singular.
+	     * x will be ordered last in Xperm. */
+	    DEBUG1 (("empty %s, after singletons removed\n", xname)) ;
+	    continue ;
+	}
+
+	/* find the ypivot to match with this xpivot */
+#ifndef NDEBUG
+	/* there can only be one ypivot, since the degree of x is 1 */
+	deg = 0 ;
+	p2 = Xp [xpivot+1] ;
+	for (p = Xp [xpivot] ; p < p2 ; p++)
+	{
+	    y = Xi [p] ;
+	    DEBUG1 (("%s: "ID"\n", yname, y)) ;
+	    if (Ydeg [y] >= 0)
+	    {
+		/* this is a live index in this xpivot vector */
+		deg++ ;
+	    }
+	}
+	ASSERT (deg == 1) ;
+#endif
+
+	ypivot = EMPTY ;
+	p2 = Xp [xpivot+1] ;
+	for (p = Xp [xpivot] ; p < p2 ; p++)
+	{
+	    y = Xi [p] ;
+	    DEBUG1 (("%s: "ID"\n", yname, y)) ;
+	    if (Ydeg [y] >= 0)
+	    {
+		/* this is a live index in this xpivot vector */
+		ypivot = y ;
+		break ;
+	    }
+	}
+
+	DEBUG1 (("Pivot %s: "ID"\n", yname, ypivot)) ;
+	ASSERT (ypivot != EMPTY) ;
+	DEBUG1 (("deg "ID"\n", Ydeg [ypivot])) ;
+	ASSERT (Ydeg [ypivot] >= 0) ;
+
+	/* decrement the degrees after removing this singleton */
+	DEBUG1 (("p1 "ID"\n", Yp [ypivot])) ;
+	DEBUG1 (("p2 "ID"\n", Yp [ypivot+1])) ;
+	p2 = Yp [ypivot+1] ;
+	for (p = Yp [ypivot] ; p < p2 ; p++)
+	{
+	    x = Yi [p] ;
+	    DEBUG1 (("    %s: "ID" deg: "ID"\n", xname, x, Xdeg [x])) ;
+	    if (Xdeg [x] < 0) continue ;
+	    ASSERT (Xdeg [x] > 0) ;
+	    if (x == xpivot) continue ;
+	    deg = --(Xdeg [x]) ;
+	    ASSERT (Xdeg [x] >= 0) ;
+	    if (deg == 1)
+	    {
+		/* this is a new singleton, put at the end of the queue */
+		Next [x] = EMPTY ;
+		if (head == EMPTY)
+		{
+		    head = x ;
+		}
+		else
+		{
+		    ASSERT (tail != EMPTY) ;
+		    Next [tail] = x ;
+		}
+		tail = x ;
+		DEBUG1 ((" New %s singleton:  "ID"\n", xname, x)) ;
+#ifndef NDEBUG
+		if (k % 100 == 0)
+		{
+		    dump_singletons (head, tail, Next, xname, Xdeg, nx) ;
+		}
+#endif
+	    }
+	}
+
+	/* flag the xpivot and ypivot by FLIP'ing the degrees */
+	Xdeg [xpivot] = FLIP (1) ;
+	Ydeg [ypivot] = FLIP (Ydeg [ypivot]) ;
+
+	/* keep track of the pivot row and column */
+	Xperm [k] = xpivot ;
+	Yperm [k] = ypivot ;
+	k++ ;
+
+#ifndef NDEBUG
+	if (k % 1000 == 0)
+	{
+	    dump_mat (xname, yname, nx, ny, Xp, Xi, Xdeg, Ydeg) ;
+	    dump_mat (yname, xname, ny, nx, Yp, Yi, Ydeg, Xdeg) ;
+	}
+#endif
+    }
+
+#ifndef NDEBUG
+    DEBUGm4 (("%s singletons: k = "ID"\n", xname, k)) ;
+    for (i = k1 ; i < k ; i++)
+    {
+	DEBUG1 (("  %s: "ID" %s: "ID"\n", xname, Xperm [i], yname, Yperm [i])) ;
+    }
+    ASSERT (k > 0) ;
+#endif
+
+    return (k) ;
+}
+
+/* ========================================================================== */
+/* === find_any_singletons ================================================== */
+/* ========================================================================== */
+
+PRIVATE Int find_any_singletons	    /* returns # of singletons found */
+(
+    /* input, not modified: */
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],	    /* size n_col+1 */
+    const Int Ai [ ],	    /* size nz = Ap [n_col] */
+
+    /* input, modified on output: */
+    Int Cdeg [ ],	    /* size n_col */
+    Int Rdeg [ ],	    /* size n_row */
+
+    /* output, not defined on input: */
+    Int Cperm [ ],	    /* size n_col */
+    Int Rperm [ ],	    /* size n_row */
+    Int *p_n1r,		    /* # of row singletons */
+    Int *p_n1c,		    /* # of col singletons */
+
+    /* workspace, not defined on input or output */
+    Int Rp [ ],		    /* size n_row+1 */
+    Int Ri [ ],		    /* size nz */
+    Int W [ ],		    /* size n_row */
+    Int Next [ ]	    /* size MAX (n_row, n_col) */
+)
+{
+    Int n1, col, row, row_form, head, tail, n1r, n1c ;
+
+    /* ---------------------------------------------------------------------- */
+    /* eliminate column singletons */
+    /* ---------------------------------------------------------------------- */
+
+    n1 = 0 ;
+    n1r = 0 ;
+    n1c = 0 ;
+    row_form = FALSE ;
+
+    head = EMPTY ;
+    tail = EMPTY ;
+    for (col = n_col-1 ; col >= 0 ; col--)
+    {
+	if (Cdeg [col] == 1)
+	{
+	    /* put the column singleton in the queue */
+	    if (head == EMPTY) tail = col ;
+	    Next [col] = head ;
+	    head = col ;
+	    DEBUG1 (("Column singleton: "ID"\n", col)) ;
+	}
+    }
+
+    if (head != EMPTY)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* create the row-form of A */
+	/* ------------------------------------------------------------------ */
+
+	create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ;
+	row_form = TRUE ;
+
+	/* ------------------------------------------------------------------ */
+	/* find and order the column singletons */
+	/* ------------------------------------------------------------------ */
+
+	n1 = order_singletons (0, head, tail, Next,
+		Cdeg, Cperm, Ap, Ai,
+		Rdeg, Rperm, Rp, Ri
+#ifndef NDEBUG
+		, "col", "row", n_col, n_row
+#endif
+		) ;
+	n1c = n1 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* eliminate row singletons */
+    /* ---------------------------------------------------------------------- */
+
+    head = EMPTY ;
+    tail = EMPTY ;
+    for (row = n_row-1 ; row >= 0 ; row--)
+    {
+	if (Rdeg [row] == 1)
+	{
+	    /* put the row singleton in the queue */
+	    if (head == EMPTY) tail = row ;
+	    Next [row] = head ;
+	    head = row ;
+	    DEBUG1 (("Row singleton: "ID"\n", row)) ;
+	}
+    }
+
+    if (head != EMPTY)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* create the row-form of A, if not already created */
+	/* ------------------------------------------------------------------ */
+
+	if (!row_form)
+	{
+	    create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* find and order the row singletons */
+	/* ------------------------------------------------------------------ */
+
+	n1 = order_singletons (n1, head, tail, Next,
+		Rdeg, Rperm, Rp, Ri,
+		Cdeg, Cperm, Ap, Ai
+#ifndef NDEBUG
+		, "row", "col", n_row, n_col
+#endif
+		) ;
+	n1r = n1 - n1c ;
+    }
+
+    DEBUG0 (("n1 "ID"\n", n1)) ;
+    *p_n1r = n1r ;
+    *p_n1c = n1c ;
+    return (n1) ;
+}
+
+/* ========================================================================== */
+/* === find_user_singletons ================================================= */
+/* ========================================================================== */
+
+PRIVATE Int find_user_singletons	/* returns # singletons found */
+(
+    /* input, not modified: */
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],	    /* size n_col+1 */
+    const Int Ai [ ],	    /* size nz = Ap [n_col] */
+    const Int Quser [ ],    /* size n_col if present */
+
+    /* input, modified on output: */
+    Int Cdeg [ ],	    /* size n_col */
+    Int Rdeg [ ],	    /* size n_row */
+
+    /* output, not defined on input */
+    Int Cperm [ ],	    /* size n_col */
+    Int Rperm [ ],	    /* size n_row */
+    Int *p_n1r,		    /* # of row singletons */
+    Int *p_n1c,		    /* # of col singletons */
+
+    /* workspace, not defined on input or output */
+    Int Rp [ ],		    /* size n_row+1 */
+    Int Ri [ ],		    /* size nz */
+    Int W [ ]		    /* size n_row */
+)
+{
+    Int n1, col, row, p, p2, pivcol, pivrow, found, k, n1r, n1c ;
+
+    n1 = 0 ;
+    n1r = 0 ;
+    n1c = 0 ;
+    *p_n1r = 0 ;
+    *p_n1c = 0 ;
+
+    /* find singletons in the user column permutation, Quser */
+    pivcol = Quser [0] ;
+    found = (Cdeg [pivcol] == 1) ;
+    DEBUG0 (("Is first col: "ID" a col singleton?: "ID"\n", pivcol, found)) ;
+    if (!found)
+    {
+	/* the first column is not a column singleton, check for a row
+	 * singleton in the first column. */
+	for (p = Ap [pivcol] ; p < Ap [pivcol+1] ; p++)
+	{
+	    if (Rdeg [Ai [p]] == 1)
+	    {
+		DEBUG0 (("Row singleton in first col: "ID" row: "ID"\n",
+		    pivcol, Ai [p])) ;
+		found = TRUE ;
+		break ;
+	    }
+	}
+    }
+
+    if (!found)
+    {
+	/* no singletons in the leading part of A (:,Quser) */
+	return (0) ;
+    }
+
+    /* there is at least one row or column singleton.  Look for more. */
+    create_row_form (n_row, n_col, Ap, Ai, Rdeg, Rp, Ri, W) ;
+
+    n1 = 0 ;
+
+    for (k = 0 ; k < n_col ; k++)
+    {
+	pivcol = Quser [k] ;
+	pivrow = EMPTY ;
+
+	/* ------------------------------------------------------------------ */
+	/* check if col is a column singleton, or contains a row singleton */
+	/* ------------------------------------------------------------------ */
+
+	found = (Cdeg [pivcol] == 1) ;
+
+	if (found)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* pivcol is a column singleton */
+	    /* -------------------------------------------------------------- */
+
+	    DEBUG0 (("Found a col singleton: k "ID" pivcol "ID"\n", k, pivcol));
+
+	    /* find the pivrow to match with this pivcol */
+#ifndef NDEBUG
+	    /* there can only be one pivrow, since the degree of pivcol is 1 */
+	    {
+		Int deg = 0 ;
+		p2 = Ap [pivcol+1] ;
+		for (p = Ap [pivcol] ; p < p2 ; p++)
+		{
+		    row = Ai [p] ;
+		    DEBUG1 (("row: "ID"\n", row)) ;
+		    if (Rdeg [row] >= 0)
+		    {
+			/* this is a live index in this column vector */
+			deg++ ;
+		    }
+		}
+		ASSERT (deg == 1) ;
+	    }
+#endif
+
+	    p2 = Ap [pivcol+1] ;
+	    for (p = Ap [pivcol] ; p < p2 ; p++)
+	    {
+		row = Ai [p] ;
+		DEBUG1 (("row: "ID"\n", row)) ;
+		if (Rdeg [row] >= 0)
+		{
+		    /* this is a live index in this pivcol vector */
+		    pivrow = row ;
+		    break ;
+		}
+	    }
+
+	    DEBUG1 (("Pivot row: "ID"\n", pivrow)) ;
+	    ASSERT (pivrow != EMPTY) ;
+	    DEBUG1 (("deg "ID"\n", Rdeg [pivrow])) ;
+	    ASSERT (Rdeg [pivrow] >= 0) ;
+
+	    /* decrement the degrees after removing this col singleton */
+	    DEBUG1 (("p1 "ID"\n", Rp [pivrow])) ;
+	    DEBUG1 (("p2 "ID"\n", Rp [pivrow+1])) ;
+	    p2 = Rp [pivrow+1] ;
+	    for (p = Rp [pivrow] ; p < p2 ; p++)
+	    {
+		col = Ri [p] ;
+		DEBUG1 (("    col: "ID" deg: "ID"\n", col, Cdeg [col])) ;
+		if (Cdeg [col] < 0) continue ;
+		ASSERT (Cdeg [col] > 0) ;
+		Cdeg [col]-- ;
+		ASSERT (Cdeg [col] >= 0) ;
+	    }
+
+	    /* flag the pivcol and pivrow by FLIP'ing the degrees */
+	    Cdeg [pivcol] = FLIP (1) ;
+	    Rdeg [pivrow] = FLIP (Rdeg [pivrow]) ;
+	    n1c++ ;
+
+	}
+	else
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* pivcol may contain a row singleton */
+	    /* -------------------------------------------------------------- */
+
+	    p2 = Ap [pivcol+1] ;
+	    for (p = Ap [pivcol] ; p < p2 ; p++)
+	    {
+		pivrow = Ai [p] ;
+		if (Rdeg [pivrow] == 1)
+		{
+		    DEBUG0 (("Row singleton in pivcol: "ID" row: "ID"\n",
+			pivcol, pivrow)) ;
+		    found = TRUE ;
+		    break ;
+		}
+	    }
+
+	    if (!found)
+	    {
+		DEBUG0 (("End of user singletons\n")) ;
+		break ;
+	    }
+
+#ifndef NDEBUG
+	    /* there can only be one pivrow, since the degree of pivcol is 1 */
+	    {
+		Int deg = 0 ;
+		p2 = Rp [pivrow+1] ;
+		for (p = Rp [pivrow] ; p < p2 ; p++)
+		{
+		    col = Ri [p] ;
+		    DEBUG1 (("col: "ID" cdeg::: "ID"\n", col, Cdeg [col])) ;
+		    if (Cdeg [col] >= 0)
+		    {
+			/* this is a live index in this column vector */
+			ASSERT (col == pivcol) ;
+			deg++ ;
+		    }
+		}
+		ASSERT (deg == 1) ;
+	    }
+#endif
+
+	    DEBUG1 (("Pivot row: "ID"\n", pivrow)) ;
+	    DEBUG1 (("pivcol deg "ID"\n", Cdeg [pivcol])) ;
+	    ASSERT (Cdeg [pivcol] > 1) ;
+
+	    /* decrement the degrees after removing this row singleton */
+	    DEBUG1 (("p1 "ID"\n", Ap [pivcol])) ;
+	    DEBUG1 (("p2 "ID"\n", Ap [pivcol+1])) ;
+	    p2 = Ap [pivcol+1] ;
+	    for (p = Ap [pivcol] ; p < p2 ; p++)
+	    {
+		row = Ai [p] ;
+		DEBUG1 (("    row: "ID" deg: "ID"\n", row, Rdeg [row])) ;
+		if (Rdeg [row] < 0) continue ;
+		ASSERT (Rdeg [row] > 0) ;
+		Rdeg [row]-- ;
+		ASSERT (Rdeg [row] >= 0) ;
+	    }
+
+	    /* flag the pivcol and pivrow by FLIP'ing the degrees */
+	    Cdeg [pivcol] = FLIP (Cdeg [pivcol]) ;
+	    Rdeg [pivrow] = FLIP (1) ;
+	    n1r++ ;
+	}
+
+	/* keep track of the pivot row and column */
+	Cperm [k] = pivcol ;
+	Rperm [k] = pivrow ;
+	n1++ ;
+
+#ifndef NDEBUG
+	dump_mat ("col", "row", n_col, n_row, Ap, Ai, Cdeg, Rdeg) ;
+	dump_mat ("row", "col", n_row, n_col, Rp, Ri, Rdeg, Cdeg) ;
+#endif
+
+    }
+
+    DEBUGm4 (("User singletons found: "ID"\n", n1)) ;
+    ASSERT (n1 > 0) ;
+
+    *p_n1r = n1r ;
+    *p_n1c = n1c ;
+    return (n1) ;
+}
+
+/* ========================================================================== */
+/* === finish_permutation =================================================== */
+/* ========================================================================== */
+
+/* Complete the permutation for the pruned submatrix.  The singletons are
+ * already ordered, but remove their flags.  Place rows/columns that are empty
+ * in the pruned submatrix at the end of the output permutation.  This can only
+ * occur if the matrix is singular.
+ */
+
+PRIVATE Int finish_permutation
+(
+    Int n1,
+    Int nx,
+    Int Xdeg [ ],
+    const Int Xuser [ ],
+    Int Xperm [ ],
+    Int *p_max_deg
+)
+{
+    Int nempty, x, deg, s, max_deg, k ;
+    nempty = 0 ;
+    s = n1 ;
+    max_deg = 0 ;
+    DEBUG0 (("n1 "ID" nempty "ID"\n", n1, nempty)) ;
+    for (k = 0 ; k < nx ; k++)
+    {
+	x = (Xuser != (Int *) NULL) ? Xuser [k] : k ;
+	DEBUG0 (("finish perm k "ID" x "ID" nx "ID"\n", k, x, nx)) ;
+	deg = Xdeg [x] ;
+	if (deg == 0)
+	{
+	    /* this row/col is empty in the pruned submatrix */
+	    ASSERT (s < nx - nempty) ;
+	    DEBUG0 (("empty k "ID"\n", k)) ;
+	    nempty++ ;
+	    Xperm [nx - nempty] = x ;
+	}
+	else if (deg > 0)
+	{
+	    /* this row/col is nonempty in the pruned submatrix */
+	    ASSERT (s < nx - nempty) ;
+	    Xperm [s++] = x ;
+	    max_deg = MAX (max_deg, deg) ;
+	}
+	else
+	{
+	    /* This is a singleton row/column - it is already ordered.
+	     * Just clear the flag. */
+	    Xdeg [x] = FLIP (deg) ;
+	}
+    }
+    ASSERT (s == nx - nempty) ;
+    *p_max_deg = max_deg ;
+    return (nempty) ;
+}
+
+/* ========================================================================== */
+/* === UMF_singletons ======================================================= */
+/* ========================================================================== */
+
+GLOBAL Int UMF_singletons
+(
+
+    /* input, not modified: */
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],	    /* size n_col+1 */
+    const Int Ai [ ],	    /* size nz = Ap [n_col] */
+    const Int Quser [ ],    /* size n_col if present */
+    Int strategy,	    /* strategy requested by user */
+
+    /* output, not defined on input: */
+    Int Cdeg [ ],	/* size n_col */
+    Int Cperm [ ],	/* size n_col */
+    Int Rdeg [ ],	/* size n_row */
+    Int Rperm [ ],	/* size n_row */
+    Int InvRperm [ ],	/* size n_row, the inverse of Rperm */
+    Int *p_n1,		/* # of col and row singletons */
+    Int *p_n1c,		/* # of col singletons */
+    Int *p_n1r,		/* # of row singletons */
+    Int *p_nempty_col,	/* # of empty columns in pruned submatrix */
+    Int *p_nempty_row,	/* # of empty columns in pruned submatrix */
+    Int *p_is_sym,	/* TRUE if pruned submatrix is square and has been
+			 * symmetrically permuted by Cperm and Rperm */
+    Int *p_max_rdeg,	/* maximum Rdeg in pruned submatrix */
+
+    /* workspace, not defined on input or output */
+    Int Rp [ ],		/* size n_row+1 */
+    Int Ri [ ],		/* size nz */
+    Int W [ ],		/* size n_row */
+    Int Next [ ]	/* size MAX (n_row, n_col) */
+)
+{
+    Int n1, s, col, row, p, p1, p2, cdeg, last_row, is_sym, k,
+	nempty_row, nempty_col, max_cdeg, max_rdeg, n1c, n1r ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_dump_start ( ) ;
+    DEBUGm4 (("Starting umf_singletons\n")) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* scan the columns, check for errors and count row degrees */
+    /* ---------------------------------------------------------------------- */
+
+    if (Ap [0] != 0 || Ap [n_col] < 0)
+    {
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Rdeg [row] = 0 ;
+    }
+    for (col = 0 ; col < n_col ; col++)
+    {
+	p1 = Ap [col] ;
+	p2 = Ap [col+1] ;
+	cdeg = p2 - p1 ;
+	if (cdeg < 0)
+	{
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+	last_row = EMPTY ;
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    row = Ai [p] ;
+	    if (row <= last_row || row >= n_row)
+	    {
+		return (UMFPACK_ERROR_invalid_matrix) ;
+	    }
+	    Rdeg [row]++ ;
+	    last_row = row ;
+	}
+	Cdeg [col] = cdeg ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* find singletons */
+    /* ---------------------------------------------------------------------- */
+
+    if (Quser != (Int *) NULL)
+    {
+	/* user has provided an input column ordering */
+	if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC)
+	{
+	    /* look for singletons, but respect the user's input permutation */
+	    n1 = find_user_singletons (n_row, n_col, Ap, Ai, Quser,
+		    Cdeg, Rdeg, Cperm, Rperm, &n1r, &n1c, Rp, Ri, W) ;
+	}
+	else
+	{
+	    /* do not look for singletons if Quser given and strategy is
+	     * not unsymmetric */
+	    n1 = 0 ;
+	    n1r = 0 ;
+	    n1c = 0 ;
+	}
+    }
+    else
+    {
+	/* look for singletons anywhere */
+	n1 = find_any_singletons (n_row, n_col, Ap, Ai,
+		Cdeg, Rdeg, Cperm, Rperm, &n1r, &n1c, Rp, Ri, W, Next) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* eliminate empty columns and complete the column permutation */
+    /* ---------------------------------------------------------------------- */
+
+    nempty_col = finish_permutation (n1, n_col, Cdeg, Quser, Cperm, &max_cdeg) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* eliminate empty rows and complete the row permutation */
+    /* ---------------------------------------------------------------------- */
+
+    if (Quser != (Int *) NULL && strategy == UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	/* rows should be symmetrically permuted according to Quser */
+	ASSERT (n_row == n_col) ;
+	nempty_row = finish_permutation (n1, n_row, Rdeg, Quser, Rperm,
+	    &max_rdeg) ;
+    }
+    else
+    {
+	/* rows should not be symmetrically permuted according to Quser */
+	nempty_row = finish_permutation (n1, n_row, Rdeg, (Int *) NULL, Rperm,
+	    &max_rdeg) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the inverse of Rperm */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n_row ; k++)
+    {
+	ASSERT (Rperm [k] >= 0 && Rperm [k] < n_row) ;
+	InvRperm [Rperm [k]] = k ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* see if pruned submatrix is square and has been symmetrically permuted */
+    /* ---------------------------------------------------------------------- */
+
+    if (n_row == n_col && nempty_row == nempty_col)
+    {
+	/* is_sym is true if the submatrix is square, and
+	 * Rperm [n1..n_row-nempty_row-1] = Cperm [n1..n_col-nempty_col-1] */
+	is_sym = TRUE ;
+	for (s = n1 ; s < n_col - nempty_col ; s++)
+	{
+	    if (Cperm [s] != Rperm [s])
+	    {
+		is_sym = FALSE ;
+		break ;
+	    }
+	}
+    }
+    else
+    {
+	is_sym = FALSE ;
+    }
+    DEBUGm4 (("Submatrix square and symmetrically permuted? "ID"\n", is_sym)) ;
+    DEBUGm4 (("singletons "ID" row "ID" col "ID"\n", n1, n1r, n1c)) ;
+    DEBUGm4 (("Empty cols "ID" rows "ID"\n", nempty_col, nempty_row)) ;
+    *p_n1 = n1 ;
+    *p_n1r = n1r ;
+    *p_n1c = n1c ;
+    *p_is_sym = is_sym ;
+    *p_nempty_col = nempty_col ;
+    *p_nempty_row = nempty_row ;
+    *p_max_rdeg = max_rdeg ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_singletons.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,31 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_singletons
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const Int Quser [ ],
+    Int strategy,
+    Int Cdeg [ ],
+    Int Cperm [ ],
+    Int Rdeg [ ],
+    Int Rperm [ ],
+    Int InvRperm [ ],
+    Int *n1,
+    Int *n1c,
+    Int *n1r,
+    Int *nempty_col,
+    Int *nempty_row,
+    Int *is_sym,
+    Int *max_rdeg,
+    Int Rp [ ],
+    Int Ri [ ],
+    Int W [ ],
+    Int Next [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_solve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1392 @@
+/* ========================================================================== */
+/* === UMF_solve ============================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Not user-callable.  Solves a linear system using the numerical factorization
+    computed by UMFPACK_numeric.  No workspace is dynamically allocated.  Counts
+    flops, but excludes floating-point comparisons (thus real abs (...) are
+    zero flops, but complex abs (...) takes 6 flops).
+
+    Returns UMFPACK_OK if successful, UMFPACK_ERROR_argument_missing if
+    required arguments are missing, UMFPACK_ERROR_invalid_system if the sys
+    string is not valid or if the matrix A is not square.
+
+    Uses the sparse backward error method of Arioli, Demmel, and Duff
+    (Solving sparse linear systems with sparse backward error, SIAM J. Matrix
+    Analysis and Applic., vol 10, pp. 165-190).
+*/
+
+#include "umf_internal.h"
+#include "umf_lsolve.h"
+#include "umf_usolve.h"
+#include "umf_ltsolve.h"
+#include "umf_utsolve.h"
+#include "umf_report_vector.h"
+
+PRIVATE Int do_step
+(
+    double omega [3],
+    Int step,
+    const double B2 [ ],
+    Entry X [ ],
+    const Entry W [ ],
+    const double Y [ ],
+    const double Z2 [ ],
+    Entry S [ ],
+    Int n,
+    double Info [UMFPACK_INFO]
+) ;
+
+/* ========================================================================== */
+/* === UMF_solve ============================================================ */
+/* ========================================================================== */
+
+GLOBAL Int UMF_solve
+(
+    Int sys,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+    double Xx [ ],
+    const double Bx [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+    double Xz [ ],
+    const double Bz [ ],
+#endif
+    NumericType *Numeric,
+    Int irstep,
+    double Info [UMFPACK_INFO],
+    Int Pattern [ ],		/* size n */
+    double SolveWork [ ]	/* if irstep>0 real:  size 5*n.  complex:10*n */
+				/* otherwise   real:  size   n.  complex: 4*n */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry axx, wi, xj, zi, xi, aij, bi ;
+    double omega [3], d, z2i, yi, flops ;
+    Entry *W, *Z, *S, *X ;
+    double *Z2, *Y, *B2, *Rs ;
+    Int *Rperm, *Cperm, i, n, p, step, j, nz, status, p2, do_scale ;
+#ifdef COMPLEX
+    Int AXsplit ;
+    Int Bsplit ;
+#endif
+#ifndef NRECIPROCAL
+    Int do_recip = Numeric->do_recip ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* initializations */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_dump_lu (Numeric) ;
+    ASSERT (Numeric && Xx && Bx && Pattern && SolveWork && Info) ;
+#endif
+
+    nz = 0 ;
+    omega [0] = 0. ;
+    omega [1] = 0. ;
+    omega [2] = 0. ;
+    Rperm = Numeric->Rperm ;
+    Cperm = Numeric->Cperm ;
+    Rs = Numeric->Rs ;		/* row scale factors */
+    do_scale = (Rs != (double *) NULL) ;
+    flops = 0 ;
+    Info [UMFPACK_SOLVE_FLOPS] = 0 ;
+    Info [UMFPACK_IR_TAKEN] = 0 ;
+    Info [UMFPACK_IR_ATTEMPTED] = 0 ;
+
+    /* UMFPACK_solve does not call this routine if A is rectangular */
+    ASSERT (Numeric->n_row == Numeric->n_col) ;
+    n = Numeric->n_row ;
+    if (Numeric->nnzpiv < n
+	|| SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond))
+    {
+	/* Note that systems involving just L return UMFPACK_OK, even if */
+	/* A is singular (L is always has a unit diagonal). */
+	DEBUGm4 (("Note, matrix is singular in umf_solve\n")) ;
+	status = UMFPACK_WARNING_singular_matrix ;
+	irstep = 0 ;
+    }
+    else
+    {
+	status = UMFPACK_OK ;
+    }
+    irstep = MAX (0, irstep) ;			/* make sure irstep is >= 0 */
+
+    W = (Entry *) SolveWork ;			/* Entry W [0..n-1] */
+
+    Z = (Entry *) NULL ;	/* unused if no iterative refinement */
+    S = (Entry *) NULL ;
+    Y = (double *) NULL ;
+    Z2 = (double *) NULL ;
+    B2 = (double *) NULL ;
+
+#ifdef COMPLEX
+    if (irstep > 0)
+    {
+	if (!Ap || !Ai || !Ax)
+	{
+	    return (UMFPACK_ERROR_argument_missing) ;
+	}
+	/* A, B, and X in split format if Az, Bz, and Xz present */
+	AXsplit = SPLIT (Az) || SPLIT(Xz);
+	Z = (Entry *) (SolveWork + 4*n) ;	/* Entry Z [0..n-1] */
+	S = (Entry *) (SolveWork + 6*n) ;	/* Entry S [0..n-1] */
+	Y = (double *) (SolveWork + 8*n) ;	/* double Y [0..n-1] */
+	B2 = (double *) (SolveWork + 9*n) ;	/* double B2 [0..n-1] */
+	Z2 = (double *) Z ;		/* double Z2 [0..n-1], equiv. to Z */
+    }
+    else
+    {
+      /* A is ignored, only  look at X for split/packed cases */
+      AXsplit = SPLIT(Xz);
+    }
+    Bsplit = SPLIT (Bz);
+
+    if (AXsplit)
+    {
+	X = (Entry *) (SolveWork + 2*n) ;	/* Entry X [0..n-1] */
+    }
+    else
+    {
+	X = (Entry *) Xx ;			/* Entry X [0..n-1] */
+    }
+#else
+    X = (Entry *) Xx ;				/* Entry X [0..n-1] */
+    if (irstep > 0)
+    {
+	if (!Ap || !Ai || !Ax)
+	{
+	    return (UMFPACK_ERROR_argument_missing) ;
+	}
+	Z = (Entry *) (SolveWork + n) ;		/* Entry Z [0..n-1] */
+	S = (Entry *) (SolveWork + 2*n) ;	/* Entry S [0..n-1] */
+	Y = (double *) (SolveWork + 3*n) ;	/* double Y [0..n-1] */
+	B2 = (double *) (SolveWork + 4*n) ;	/* double B2 [0..n-1] */
+	Z2 = (double *) Z ;		/* double Z2 [0..n-1], equiv. to Z */
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* determine which system to solve */
+    /* ---------------------------------------------------------------------- */
+
+    if (sys == UMFPACK_A)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* solve A x = b with optional iterative refinement */
+	/* ------------------------------------------------------------------ */
+
+	if (irstep > 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* using iterative refinement:  compute Y and B2 */
+	    /* -------------------------------------------------------------- */
+
+	    nz = Ap [n] ;
+	    Info [UMFPACK_NZ] = nz ;
+
+	    /* A is stored by column */
+	    /* Y (i) = ||R A_i||, 1-norm of row i of R A */
+	    for (i = 0 ; i < n ; i++)
+	    {
+		Y [i] = 0. ;
+	    }
+	    flops += (ABS_FLOPS + 1) * nz ;
+	    p2 = Ap [n] ;
+	    for (p = 0 ; p < p2 ; p++)
+	    {
+		/* Y [Ai [p]] += ABS (Ax [p]) ; */
+	        ASSIGN (aij, Ax, Az, p, AXsplit) ;
+		ABS (d, aij) ;
+		Y [Ai [p]] += d ;
+	    }
+
+	    /* B2 = abs (B) */
+	    flops += ABS_FLOPS * n ;
+	    for (i = 0 ; i < n ; i++)
+	    {
+		/* B2 [i] = ABS (B [i]) ; */
+		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+		ABS (B2 [i], bi) ;
+	    }
+
+	    /* scale Y and B2. */
+	    if (do_scale)
+	    {
+		/* Y = R Y */
+		/* B2 = R B2 */
+#ifndef NRECIPROCAL
+		if (do_recip)
+		{
+		    /* multiply by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			Y [i]  *= Rs [i] ;
+			B2 [i] *= Rs [i] ;
+		    }
+		}
+		else
+#endif
+		{
+		    /* divide by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			Y [i]  /= Rs [i] ;
+			B2 [i] /= Rs [i] ;
+		    }
+		}
+
+		flops += 2 * n ;
+	    }
+
+	}
+
+	for (step = 0 ; step <= irstep ; step++)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* Solve A x = b (step 0): */
+	    /*  x = Q (U \ (L \ (P R b))) */
+	    /* and then perform iterative refinement (step > 0): */
+	    /*  x = x + Q (U \ (L \ (P R (b - A x)))) */
+	    /* -------------------------------------------------------------- */
+
+	    if (step == 0)
+	    {
+		if (do_scale)
+		{
+		    /* W = P R b, using X as workspace, since Z is not
+		     * allocated if irstep = 0. */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+			    SCALE (X [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+			    SCALE_DIV (X [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		    for (i = 0 ; i < n ; i++)
+		    {
+			W [i] = X [Rperm [i]] ;
+		    }
+		}
+		else
+		{
+		    /* W = P b, since the row scaling R = I */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			/* W [i] = B [Rperm [i]] ; */
+			ASSIGN (W [i], Bx, Bz, Rperm [i], Bsplit) ;
+		    }
+		}
+	    }
+	    else
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* Z [i] = B [i] ; */
+		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+		}
+		flops += MULTSUB_FLOPS * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    xi = X [i] ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* Z [Ai [p]] -= Ax [p] * xi ; */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			MULT_SUB (Z [Ai [p]], aij, xi) ;
+		    }
+		}
+		/* scale, Z = R Z */
+		if (do_scale)
+		{
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (Z [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (Z [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		}
+		for (i = 0 ; i < n ; i++)
+		{
+		    W [i] = Z [Rperm [i]] ;
+		}
+	    }
+
+	    flops += UMF_lsolve (Numeric, W, Pattern) ;
+	    flops += UMF_usolve (Numeric, W, Pattern) ;
+
+	    if (step == 0)
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    X [Cperm [i]] = W [i] ;
+		}
+	    }
+	    else
+	    {
+		flops += ASSEMBLE_FLOPS * n ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* X [Cperm [i]] += W [i] ; */
+		    ASSEMBLE (X [Cperm [i]], W [i]) ;
+		}
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* sparse backward error estimate */
+	    /* -------------------------------------------------------------- */
+
+	    if (irstep > 0)
+	    {
+
+		/* ---------------------------------------------------------- */
+		/* A is stored by column */
+		/* W (i) = R (b - A x)_i, residual */
+		/* Z2 (i) = R (|A||x|)_i */
+		/* ---------------------------------------------------------- */
+
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* W [i] = B [i] ; */
+		    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+		    Z2 [i] = 0. ;
+		}
+		flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ;
+		for (j = 0 ; j < n ; j++)
+		{
+		    xj = X [j] ;
+		    p2 = Ap [j+1] ;
+		    for (p = Ap [j] ; p < p2 ; p++)
+		    {
+			i = Ai [p] ;
+
+			/* axx = Ax [p] * xj ; */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			MULT (axx, aij, xj) ;
+
+			/* W [i] -= axx ; */
+			DECREMENT (W [i], axx) ;
+
+			/* Z2 [i] += ABS (axx) ; */
+			ABS (d, axx) ;
+			Z2 [i] += d ;
+		    }
+		}
+
+		/* scale W and Z2 */
+		if (do_scale)
+		{
+		    /* Z2 = R Z2 */
+		    /* W = R W */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (W [i], Rs [i]) ;
+			    Z2 [i] *= Rs [i] ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (W [i], Rs [i]) ;
+			    Z2 [i] /= Rs [i] ;
+			}
+		    }
+		    flops += (SCALE_FLOPS + 1) * n ;
+		}
+
+		flops += (2*ABS_FLOPS + 5) * n ;
+		if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info))
+		{
+		    /* iterative refinement is done */
+		    break ;
+		}
+
+	    }
+
+	}
+
+    }
+    else if (sys == UMFPACK_At)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* solve A' x = b with optional iterative refinement */
+	/* ------------------------------------------------------------------ */
+
+	/* A' is the complex conjugate transpose */
+
+	if (irstep > 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* using iterative refinement:  compute Y */
+	    /* -------------------------------------------------------------- */
+
+	    nz = Ap [n] ;
+	    Info [UMFPACK_NZ] = nz ;
+
+	    /* A' is stored by row */
+	    /* Y (i) = ||(A' R)_i||, 1-norm of row i of A' R */
+
+	    if (do_scale)
+	    {
+		flops += (ABS_FLOPS + 2) * nz ;
+#ifndef NRECIPROCAL
+		if (do_recip)
+		{
+		    /* multiply by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			yi = 0. ;
+			p2 = Ap [i+1] ;
+			for (p = Ap [i] ; p < p2 ; p++)
+			{
+			    /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */
+			    /* note that abs (aij) is the same as
+			     * abs (conj (aij)) */
+			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			    ABS (d, aij) ;
+			    yi += (d * Rs [Ai [p]]) ;
+			}
+			Y [i] = yi ;
+		    }
+		}
+		else
+#endif
+		{
+		    /* divide by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			yi = 0. ;
+			p2 = Ap [i+1] ;
+			for (p = Ap [i] ; p < p2 ; p++)
+			{
+			    /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */
+			    /* note that abs (aij) is the same as
+			     * abs (conj (aij)) */
+			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			    ABS (d, aij) ;
+			    yi += (d / Rs [Ai [p]]) ;
+			}
+			Y [i] = yi ;
+		    }
+		}
+	    }
+	    else
+	    {
+		/* no scaling */
+		flops += (ABS_FLOPS + 1) * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    yi = 0. ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* yi += ABS (Ax [p]) ; */
+			/* note that abs (aij) is the same as
+			 * abs (conj (aij)) */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			ABS (d, aij) ;
+			yi += d ;
+		    }
+		    Y [i] = yi ;
+		}
+	    }
+
+	    /* B2 = abs (B) */
+	    for (i = 0 ; i < n ; i++)
+	    {
+		/* B2 [i] = ABS (B [i]) ; */
+		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+		ABS (B2 [i], bi) ;
+	    }
+
+	}
+
+	for (step = 0 ; step <= irstep ; step++)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* Solve A' x = b (step 0): */
+	    /*	x = R P' (L' \ (U' \ (Q' b))) */
+	    /* and then perform iterative refinement (step > 0): */
+	    /*	x = x + R P' (L' \ (U' \ (Q' (b - A' x)))) */
+	    /* -------------------------------------------------------------- */
+
+	    if (step == 0)
+	    {
+		/* W = Q' b */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* W [i] = B [Cperm [i]] ; */
+		    ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ;
+		}
+	    }
+	    else
+	    {
+		/* Z = b - A' x */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* Z [i] = B [i] ; */
+		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+		}
+		flops += MULTSUB_FLOPS * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    zi = Z [i] ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* zi -= conjugate (Ax [p]) * X [Ai [p]] ; */
+			ASSIGN (aij, Ax, Az, p, Bsplit) ;
+			MULT_SUB_CONJ (zi, X [Ai [p]], aij) ;
+		    }
+		    Z [i] = zi ;
+		}
+		/* W = Q' Z */
+		for (i = 0 ; i < n ; i++)
+		{
+		    W [i] = Z [Cperm [i]] ;
+		}
+	    }
+
+	    flops += UMF_uhsolve (Numeric, W, Pattern) ;
+	    flops += UMF_lhsolve (Numeric, W, Pattern) ;
+
+	    if (step == 0)
+	    {
+
+		/* X = R P' W */
+		/* do not use Z, since it isn't allocated if irstep = 0 */
+
+		/* X = P' W */
+		for (i = 0 ; i < n ; i++)
+		{
+		    X [Rperm [i]] = W [i] ;
+		}
+		if (do_scale)
+		{
+		    /* X = R X */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (X [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (X [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		}
+
+	    }
+	    else
+	    {
+
+		/* Z = P' W */
+		for (i = 0 ; i < n ; i++)
+		{
+		    Z [Rperm [i]] = W [i] ;
+		}
+		if (do_scale)
+		{
+		    /* Z = R Z */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (Z [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (Z [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		}
+
+		flops += ASSEMBLE_FLOPS * n ;
+		/* X += Z */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* X [i] += Z [i] ; was +=W[i] in v4.3, which is wrong */
+		    ASSEMBLE (X [i], Z [i]) ;	/* bug fix, v4.3.1 */
+		}
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* sparse backward error estimate */
+	    /* -------------------------------------------------------------- */
+
+	    if (irstep > 0)
+	    {
+
+		/* ---------------------------------------------------------- */
+		/* A' is stored by row */
+		/* W (i) = (b - A' x)_i, residual */
+		/* Z2 (i) = (|A'||x|)_i */
+		/* ---------------------------------------------------------- */
+
+		flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* wi = B [i] ; */
+		    ASSIGN (wi, Bx, Bz, i, Bsplit) ;
+		    z2i = 0. ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* axx = conjugate (Ax [p]) * X [Ai [p]] ; */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			MULT_CONJ (axx, X [Ai [p]], aij) ;
+
+			/* wi -= axx ; */
+			DECREMENT (wi, axx) ;
+
+			/* z2i += ABS (axx) ; */
+			ABS (d, axx) ;
+			z2i += d ;
+		    }
+		    W [i] = wi ;
+		    Z2 [i] = z2i ;
+		}
+
+		flops += (2*ABS_FLOPS + 5) * n ;
+		if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info))
+		{
+		    /* iterative refinement is done */
+		    break ;
+		}
+
+	    }
+
+	}
+
+    }
+    else if (sys == UMFPACK_Aat)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* solve A.' x = b with optional iterative refinement */
+	/* ------------------------------------------------------------------ */
+
+	/* A' is the array transpose */
+
+	if (irstep > 0)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* using iterative refinement:  compute Y */
+	    /* -------------------------------------------------------------- */
+
+	    nz = Ap [n] ;
+	    Info [UMFPACK_NZ] = nz ;
+
+	    /* A.' is stored by row */
+	    /* Y (i) = ||(A.' R)_i||, 1-norm of row i of A.' R */
+
+	    if (do_scale)
+	    {
+		flops += (ABS_FLOPS + 2) * nz ;
+#ifndef NRECIPROCAL
+		if (do_recip)
+		{
+		    /* multiply by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			yi = 0. ;
+			p2 = Ap [i+1] ;
+			for (p = Ap [i] ; p < p2 ; p++)
+			{
+			    /* yi += ABS (Ax [p]) * Rs [Ai [p]] ; */
+			    /* note that A.' is the array transpose,
+			     * so no conjugate */
+			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			    ABS (d, aij) ;
+			    yi += (d * Rs [Ai [p]]) ;
+			}
+			Y [i] = yi ;
+		    }
+		}
+		else
+#endif
+		{
+		    /* divide by the scale factors */
+		    for (i = 0 ; i < n ; i++)
+		    {
+			yi = 0. ;
+			p2 = Ap [i+1] ;
+			for (p = Ap [i] ; p < p2 ; p++)
+			{
+			    /* yi += ABS (Ax [p]) / Rs [Ai [p]] ; */
+			    /* note that A.' is the array transpose,
+			     * so no conjugate */
+			    ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			    ABS (d, aij) ;
+			    yi += (d / Rs [Ai [p]]) ;
+			}
+			Y [i] = yi ;
+		    }
+		}
+	    }
+	    else
+	    {
+		/* no scaling */
+		flops += (ABS_FLOPS + 1) * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    yi = 0. ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* yi += ABS (Ax [p]) */
+			/* note that A.' is the array transpose,
+			 * so no conjugate */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			ABS (d, aij) ;
+			yi += d ;
+		    }
+		    Y [i] = yi ;
+		}
+	    }
+
+	    /* B2 = abs (B) */
+	    for (i = 0 ; i < n ; i++)
+	    {
+		/* B2 [i] = ABS (B [i]) ; */
+		ASSIGN (bi, Bx, Bz, i, Bsplit) ;
+		ABS (B2 [i], bi) ;
+	    }
+
+	}
+
+	for (step = 0 ; step <= irstep ; step++)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* Solve A.' x = b (step 0): */
+	    /*	x = R P' (L.' \ (U.' \ (Q' b))) */
+	    /* and then perform iterative refinement (step > 0): */
+	    /*	x = x + R P' (L.' \ (U.' \ (Q' (b - A.' x)))) */
+	    /* -------------------------------------------------------------- */
+
+	    if (step == 0)
+	    {
+		/* W = Q' b */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* W [i] = B [Cperm [i]] ; */
+		    ASSIGN (W [i], Bx, Bz, Cperm [i], Bsplit) ;
+		}
+	    }
+	    else
+	    {
+		/* Z = b - A.' x */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* Z [i] = B [i] ; */
+		    ASSIGN (Z [i], Bx, Bz, i, Bsplit) ;
+		}
+		flops += MULTSUB_FLOPS * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    zi = Z [i] ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* zi -= Ax [p] * X [Ai [p]] ; */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			MULT_SUB (zi, aij, X [Ai [p]]) ;
+		    }
+		    Z [i] = zi ;
+		}
+		/* W = Q' Z */
+		for (i = 0 ; i < n ; i++)
+		{
+		    W [i] = Z [Cperm [i]] ;
+		}
+	    }
+
+	    flops += UMF_utsolve (Numeric, W, Pattern) ;
+	    flops += UMF_ltsolve (Numeric, W, Pattern) ;
+
+	    if (step == 0)
+	    {
+
+		/* X = R P' W */
+		/* do not use Z, since it isn't allocated if irstep = 0 */
+
+		/* X = P' W */
+		for (i = 0 ; i < n ; i++)
+		{
+		    X [Rperm [i]] = W [i] ;
+		}
+		if (do_scale)
+		{
+		    /* X = R X */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (X [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (X [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		}
+
+	    }
+	    else
+	    {
+
+		/* Z = P' W */
+		for (i = 0 ; i < n ; i++)
+		{
+		    Z [Rperm [i]] = W [i] ;
+		}
+		if (do_scale)
+		{
+		    /* Z = R Z */
+#ifndef NRECIPROCAL
+		    if (do_recip)
+		    {
+			/* multiply by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE (Z [i], Rs [i]) ;
+			}
+		    }
+		    else
+#endif
+		    {
+			/* divide by the scale factors */
+			for (i = 0 ; i < n ; i++)
+			{
+			    SCALE_DIV (Z [i], Rs [i]) ;
+			}
+		    }
+		    flops += SCALE_FLOPS * n ;
+		}
+
+		flops += ASSEMBLE_FLOPS * n ;
+		/* X += Z */
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* X [i] += Z [i] ; was +=W[i] in v4.3, which is wrong */
+		    ASSEMBLE (X [i], Z [i]) ;	/* bug fix, v4.3.1 */
+		}
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* sparse backward error estimate */
+	    /* -------------------------------------------------------------- */
+
+	    if (irstep > 0)
+	    {
+
+		/* ---------------------------------------------------------- */
+		/* A.' is stored by row */
+		/* W (i) = (b - A.' x)_i, residual */
+		/* Z (i) = (|A.'||x|)_i */
+		/* ---------------------------------------------------------- */
+
+		flops += (MULT_FLOPS + DECREMENT_FLOPS + ABS_FLOPS + 1) * nz ;
+		for (i = 0 ; i < n ; i++)
+		{
+		    /* wi = B [i] ; */
+		    ASSIGN (wi, Bx, Bz, i, Bsplit) ;
+		    z2i = 0. ;
+		    p2 = Ap [i+1] ;
+		    for (p = Ap [i] ; p < p2 ; p++)
+		    {
+			/* axx = Ax [p] * X [Ai [p]] ; */
+			ASSIGN (aij, Ax, Az, p, AXsplit) ;
+			MULT (axx, aij, X [Ai [p]]) ;
+
+			/* wi -= axx ; */
+			DECREMENT (wi, axx) ;
+
+			/* z2i += ABS (axx) ; */
+			ABS (d, axx) ;
+			z2i += d ;
+		    }
+		    W [i] = wi ;
+		    Z2 [i] = z2i ;
+		}
+
+		flops += (2*ABS_FLOPS + 5) * n ;
+		if (do_step (omega, step, B2, X, W, Y, Z2, S, n, Info))
+		{
+		    /* iterative refinement is done */
+		    break ;
+		}
+
+	    }
+
+	}
+
+    }
+    else if (sys == UMFPACK_Pt_L)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve P'Lx=b:  x = L \ Pb */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [Rperm [i]] ; */
+	    ASSIGN (X [i], Bx, Bz, Rperm [i], Bsplit) ;
+	}
+	flops = UMF_lsolve (Numeric, X, Pattern) ;
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_L)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve Lx=b:  x = L \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_lsolve (Numeric, X, Pattern) ;
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_Lt_P)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve L'Px=b:  x = P' (L' \ b) */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* W [i] = B [i] ; */
+	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_lhsolve (Numeric, W, Pattern) ;
+	for (i = 0 ; i < n ; i++)
+	{
+	    X [Rperm [i]] = W [i] ;
+	}
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_Lat_P)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve L.'Px=b:  x = P' (L.' \ b) */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* W [i] = B [i] ; */
+	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_ltsolve (Numeric, W, Pattern) ;
+	for (i = 0 ; i < n ; i++)
+	{
+	    X [Rperm [i]] = W [i] ;
+	}
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_Lt)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve L'x=b:  x = L' \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_lhsolve (Numeric, X, Pattern) ;
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_Lat)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve L.'x=b:  x = L.' \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_ltsolve (Numeric, X, Pattern) ;
+	status = UMFPACK_OK ;
+
+    }
+    else if (sys == UMFPACK_U_Qt)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve UQ'x=b:  x = Q (U \ b) */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* W [i] = B [i] ; */
+	    ASSIGN (W [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_usolve (Numeric, W, Pattern) ;
+	for (i = 0 ; i < n ; i++)
+	{
+	    X [Cperm [i]] = W [i] ;
+	}
+
+    }
+    else if (sys == UMFPACK_U)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve Ux=b:  x = U \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_usolve (Numeric, X, Pattern) ;
+
+    }
+    else if (sys == UMFPACK_Q_Ut)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve QU'x=b:  x = U' \ Q'b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [Cperm [i]] ; */
+	    ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ;
+	}
+	flops = UMF_uhsolve (Numeric, X, Pattern) ;
+
+    }
+    else if (sys == UMFPACK_Q_Uat)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve QU.'x=b:  x = U.' \ Q'b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [Cperm [i]] ; */
+	    ASSIGN (X [i], Bx, Bz, Cperm [i], Bsplit) ;
+	}
+	flops = UMF_utsolve (Numeric, X, Pattern) ;
+
+    }
+    else if (sys == UMFPACK_Ut)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve U'x=b:  x = U' \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	  ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_uhsolve (Numeric, X, Pattern) ;
+
+    }
+    else if (sys == UMFPACK_Uat)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* Solve U'x=b:  x = U' \ b */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < n ; i++)
+	{
+	    /* X [i] = B [i] ; */
+	    ASSIGN (X [i], Bx, Bz, i, Bsplit) ;
+	}
+	flops = UMF_utsolve (Numeric, X, Pattern) ;
+
+    }
+    else
+    {
+	return (UMFPACK_ERROR_invalid_system) ;
+    }
+
+#ifdef COMPLEX
+    /* copy the solution back, from Entry X [ ] to double Xx [ ] and Xz [ ] */
+    if (AXsplit)
+    {
+	for (i = 0 ; i < n ; i++)
+	{
+	    Xx [i] = REAL_COMPONENT (X [i]) ;
+	    Xz [i] = IMAG_COMPONENT (X [i]) ;
+	}
+    }
+#endif
+
+    /* return UMFPACK_OK, or UMFPACK_WARNING_singular_matrix */
+    /* Note that systems involving just L will return UMFPACK_OK */
+    Info [UMFPACK_SOLVE_FLOPS] = flops ;
+    return (status) ;
+}
+
+
+/* ========================================================================== */
+/* === do_step ============================================================== */
+/* ========================================================================== */
+
+/* Perform one step of iterative refinement, for A x = b or A' x = b */
+
+PRIVATE Int do_step		/* return TRUE if iterative refinement done */
+(
+    double omega [3],
+    Int step,			/* which step of iterative refinement to do */
+    const double B2 [ ],	/* abs (B) */
+    Entry X [ ],
+    const Entry W [ ],
+    const double Y [ ],
+    const double Z2 [ ],
+    Entry S [ ],
+    Int n,
+    double Info [UMFPACK_INFO]
+)
+{
+    double last_omega [3], tau, nctau, d1, wd1, d2, wd2, xi, yix, wi, xnorm ;
+    Int i ;
+
+    /* DBL_EPSILON is a standard ANSI C term defined in <float.h> */
+    /* It is the smallest positive x such that 1.0+x != 1.0 */
+
+    nctau = 1000 * n * DBL_EPSILON ;
+    DEBUG0 (("do_step start: nctau = %30.20e\n", nctau)) ;
+    ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug,
+	FALSE, FALSE) == UMFPACK_OK) ;
+
+    /* for approximate flop count, assume d1 > tau is always true */
+    /* flops += (2*ABS_FLOPS + 5) * n ; (done in UMF_solve, above) */
+
+    /* ---------------------------------------------------------------------- */
+    /* save the last iteration in case we need to reinstate it */
+    /* ---------------------------------------------------------------------- */
+
+    last_omega [0] = omega [0] ;
+    last_omega [1] = omega [1] ;
+    last_omega [2] = omega [2] ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute sparse backward errors: omega [1] and omega [2] */
+    /* ---------------------------------------------------------------------- */
+
+    /* xnorm = ||x|| maxnorm */
+    xnorm = 0.0 ;
+    for (i = 0 ; i < n ; i++)
+    {
+	/* xi = ABS (X [i]) ; */
+	ABS (xi, X [i]) ;
+	if (SCALAR_IS_NAN (xi))
+	{
+	    xnorm = xi ;
+	    break ;
+	}
+	/* no NaN's to consider here: */
+	xnorm = MAX (xnorm, xi) ;
+    }
+
+    omega [1] = 0. ;
+    omega [2] = 0. ;
+    for (i = 0 ; i < n ; i++)
+    {
+	yix = Y [i] * xnorm ;
+	tau = (yix + B2 [i]) * nctau ;
+	d1 = Z2 [i] + B2 [i] ;
+	/* wi = ABS (W [i]) ; */
+	ABS (wi, W [i]) ;
+	if (SCALAR_IS_NAN (d1))
+	{
+	    omega [1] = d1 ;
+	    omega [2] = d1 ;
+	    break ;
+	}
+	if (SCALAR_IS_NAN (tau))
+	{
+	    omega [1] = tau ;
+	    omega [2] = tau ;
+	    break ;
+	}
+	if (d1 > tau)		/* a double relop, but no NaN's here */
+	{
+	    wd1 = wi / d1 ;
+	    omega [1] = MAX (omega [1], wd1) ;
+	}
+	else if (tau > 0.0)	/* a double relop, but no NaN's here */
+	{
+	    d2 = Z2 [i] + yix ;
+	    wd2 = wi / d2 ;
+	    omega [2] = MAX (omega [2], wd2) ;
+	}
+    }
+
+    omega [0] = omega [1] + omega [2] ;
+    Info [UMFPACK_OMEGA1] = omega [1] ;
+    Info [UMFPACK_OMEGA2] = omega [2] ;
+
+    /* ---------------------------------------------------------------------- */
+    /* stop the iterations if the backward error is small, or NaN */
+    /* ---------------------------------------------------------------------- */
+
+    Info [UMFPACK_IR_TAKEN] = step ;
+    Info [UMFPACK_IR_ATTEMPTED] = step ;
+
+    if (SCALAR_IS_NAN (omega [0]))
+    {
+	DEBUG0 (("omega[0] is NaN - done.\n")) ;
+	ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug,
+	    FALSE, FALSE) == UMFPACK_OK) ;
+	return (TRUE) ;
+    }
+
+    if (omega [0] < DBL_EPSILON)    /* double relop, but no NaN case here */
+    {
+	DEBUG0 (("omega[0] too small - done.\n")) ;
+	ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug,
+	    FALSE, FALSE) == UMFPACK_OK) ;
+	return (TRUE) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* stop if insufficient decrease in omega */
+    /* ---------------------------------------------------------------------- */
+
+    /* double relop, but no NaN case here: */
+    if (step > 0 && omega [0] > last_omega [0] / 2)
+    {
+	DEBUG0 (("stop refinement\n")) ;
+	if (omega [0] > last_omega [0])
+	{
+	    /* last iteration better than this one, reinstate it */
+	    DEBUG0 (("last iteration better\n")) ;
+	    for (i = 0 ; i < n ; i++)
+	    {
+		X [i] = S [i] ;
+	    }
+	    Info [UMFPACK_OMEGA1] = last_omega [1] ;
+	    Info [UMFPACK_OMEGA2] = last_omega [2] ;
+	}
+	Info [UMFPACK_IR_TAKEN] = step - 1 ;
+	ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug,
+	    FALSE, FALSE) == UMFPACK_OK) ;
+	return (TRUE) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* save current solution in case we need to reinstate */
+    /* ---------------------------------------------------------------------- */
+
+    for (i = 0 ; i < n ; i++)
+    {
+	S [i] = X [i] ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* iterative refinement continues */
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (UMF_report_vector (n, (double *) X, (double *) NULL, UMF_debug,
+	FALSE, FALSE) == UMFPACK_OK) ;
+    return (FALSE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_solve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,25 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_solve
+(
+    Int sys,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+    double Xx [ ],
+    const double Bx [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+    double Xz [ ],
+    const double Bz [ ],
+#endif
+    NumericType *Numeric,
+    Int irstep,
+    double Info [UMFPACK_INFO],
+    Int Pattern [ ],
+    double SolveWork [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_start_front.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,283 @@
+/* ========================================================================== */
+/* === UMF_start_front ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Allocate the initial frontal matrix working array for a single chain.  The
+ * front does not have to be big enough, since if it's too small it will get
+ * reallocated.  The size computed here is just an estimate. */
+
+#include "umf_internal.h"
+#include "umf_grow_front.h"
+
+GLOBAL Int UMF_start_front    /* returns TRUE if successful, FALSE otherwise */
+(
+    Int chain,
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+    double maxbytes ;
+    Int fnrows_max, fncols_max, fnr2, fnc2, fsize, fcurr_size, maxfrsize,
+	overflow, nb, f, cdeg ;
+
+    nb = Symbolic->nb ;
+    fnrows_max = Symbolic->Chain_maxrows [chain] ;
+    fncols_max = Symbolic->Chain_maxcols [chain] ;
+
+    DEBUGm2 (("Start Front for chain "ID".  fnrows_max "ID" fncols_max "ID"\n",
+	chain, fnrows_max, fncols_max)) ;
+
+    Work->fnrows_max = fnrows_max ;
+    Work->fncols_max = fncols_max ;
+    Work->any_skip = FALSE ;
+
+    maxbytes = sizeof (Entry) *
+	(double) (fnrows_max + nb) * (double) (fncols_max + nb) ;
+    fcurr_size = Work->fcurr_size ;
+
+    if (Symbolic->prefer_diagonal)
+    {
+	/* Get a rough upper bound on the degree of the first pivot column in
+	 * this front.  Note that Col_degree is not maintained if diagonal
+	 * pivoting is preferred.  For most matrices, the first pivot column
+	 * of the first frontal matrix of a new chain has only one tuple in
+	 * it anyway, so this bound is exact in that case. */
+	Int col, tpi, e, *E, *Col_tuples, *Col_tlen, *Cols ;
+	Tuple *tp, *tpend ;
+	Unit *Memory, *p ;
+	Element *ep ;
+	E = Work->E ;
+	Memory = Numeric->Memory ;
+	Col_tuples = Numeric->Lip ;
+	Col_tlen = Numeric->Lilen ;
+	col = Work->nextcand ;
+	tpi = Col_tuples [col] ;
+	tp = (Tuple *) Memory + tpi ;
+	tpend = tp + Col_tlen [col] ;
+	cdeg = 0 ;
+	DEBUGm3 (("\n=============== start front: col "ID" tlen "ID"\n",
+		col, Col_tlen [col])) ;
+	for ( ; tp < tpend ; tp++)
+	{
+	    DEBUG1 (("Tuple ("ID","ID")\n", tp->e, tp->f)) ;
+	    e = tp->e ;
+	    if (!E [e]) continue ;
+	    f = tp->f ;
+	    p = Memory + E [e] ;
+	    ep = (Element *) p ;
+	    p += UNITS (Element, 1) ;
+	    Cols = (Int *) p ;
+	    if (Cols [f] == EMPTY) continue ;
+	    DEBUG1 (("  nrowsleft "ID"\n", ep->nrowsleft)) ;
+	    cdeg += ep->nrowsleft ;
+	}
+#ifndef NDEBUG
+	DEBUGm3 (("start front cdeg: "ID" col "ID"\n", cdeg, col)) ;
+	UMF_dump_rowcol (1, Numeric, Work, col, FALSE) ;
+#endif
+
+	/* cdeg is now the rough upper bound on the degree of the next pivot
+	 * column. */
+
+	/* If AMD was called, we know the maximum number of nonzeros in any
+	 * column of L.  Use this as an upper bound for cdeg, but add 2 to
+	 * account for a small amount of off-diagonal pivoting. */
+	if (Symbolic->amd_dmax > 0)
+	{
+	    cdeg = MIN (cdeg, Symbolic->amd_dmax) ;
+	}
+
+	/* Increase it to account for larger columns later on.
+	 * Also ensure that it's larger than zero. */
+	cdeg += 2 ;
+
+	/* cdeg cannot be larger than fnrows_max */
+	cdeg = MIN (cdeg, fnrows_max) ;
+
+    }
+    else
+    {
+	/* don't do the above cdeg computation */
+	cdeg = 0 ;
+    }
+
+    DEBUGm2 (("fnrows max "ID" fncols_max "ID"\n", fnrows_max, fncols_max)) ;
+
+    /* the current frontal matrix is empty */
+    ASSERT (Work->fnrows == 0 && Work->fncols == 0 && Work->fnpiv == 0) ;
+
+    /* maximum row dimension is always odd, to avoid bad cache effects */
+    ASSERT (fnrows_max >= 0) ;
+    ASSERT (fnrows_max % 2 == 1) ;
+
+    /* ----------------------------------------------------------------------
+     * allocate working array for current frontal matrix:
+     * minimum size: 1-by-1
+     * maximum size: fnrows_max-by-fncols_max
+     * desired size:
+     *
+     *   if Numeric->front_alloc_init >= 0:
+     *
+     *	    for unsymmetric matrices:
+     *	    Numeric->front_alloc_init * (fnrows_max-by-fncols_max)
+     *
+     *	    for symmetric matrices (diagonal pivoting preference, actually):
+     *	    Numeric->front_alloc_init * (fnrows_max-by-fncols_max), or
+     *	    cdeg*cdeg, whichever is smaller.
+     *
+     *   if Numeric->front_alloc_init < 0:
+     *	    allocate a front of size -Numeric->front_alloc_init.
+     *
+     * Allocate the whole thing if it's small (less than 2*nb^2).  Make sure the
+     * leading dimension of the frontal matrix is odd.
+     *
+     * Also allocate the nb-by-nb LU block, the dr-by-nb L block, and the
+     * nb-by-dc U block.
+     * ---------------------------------------------------------------------- */
+
+    /* get the maximum front size, avoiding integer overflow */
+    overflow = INT_OVERFLOW (maxbytes) ;
+    if (overflow)
+    {
+	/* :: int overflow, max front size :: */
+	maxfrsize = Int_MAX / sizeof (Entry) ;
+    }
+    else
+    {
+	maxfrsize = (fnrows_max + nb) * (fncols_max + nb) ;
+    }
+    ASSERT (!INT_OVERFLOW ((double) maxfrsize * sizeof (Entry))) ;
+
+    if (Numeric->front_alloc_init < 0)
+    {
+	/* allocate a front of -Numeric->front_alloc_init entries */
+	fsize = -Numeric->front_alloc_init ;
+	fsize = MAX (1, fsize) ;
+    }
+    else
+    {
+	if (INT_OVERFLOW (Numeric->front_alloc_init * maxbytes))
+	{
+	    /* :: int overflow, requested front size :: */
+	    fsize = Int_MAX / sizeof (Entry) ;
+	}
+	else
+	{
+	    fsize = Numeric->front_alloc_init * maxfrsize ;
+	}
+
+	if (cdeg > 0)
+	{
+	    /* diagonal pivoting is in use.  cdeg was computed above */
+	    Int fsize2 ;
+
+	    /* add the L and U blocks */
+	    cdeg += nb ;
+
+	    if (INT_OVERFLOW (((double) cdeg * (double) cdeg) * sizeof (Entry)))
+	    {
+		/* :: int overflow, symmetric front size :: */
+		fsize2 = Int_MAX / sizeof (Entry) ;
+	    }
+	    else
+	    {
+		fsize2 = MAX (cdeg * cdeg, fcurr_size) ;
+	    }
+	    fsize = MIN (fsize, fsize2) ;
+	}
+    }
+
+    fsize = MAX (fsize, 2*nb*nb) ;
+
+    /* fsize and maxfrsize are now safe from integer overflow.  They both
+     * include the size of the pivot blocks. */
+    ASSERT (!INT_OVERFLOW ((double) fsize * sizeof (Entry))) ;
+
+    Work->fnrows_new = 0 ;
+    Work->fncols_new = 0 ;
+
+    /* desired size is fnr2-by-fnc2 (includes L and U blocks): */
+    DEBUGm2 (("    fsize "ID"  fcurr_size "ID"\n", fsize, fcurr_size)) ;
+    DEBUGm2 (("    maxfrsize "ID"  fnr_curr "ID" fnc_curr "ID"\n", maxfrsize,
+	Work->fnr_curr, Work->fnc_curr)) ;
+
+    if (fsize >= maxfrsize && !overflow)
+    {
+	/* max working array is small, allocate all of it */
+	fnr2 = fnrows_max + nb ;
+	fnc2 = fncols_max + nb ;
+	fsize = maxfrsize ;
+	DEBUGm1 (("   sufficient for ("ID"+"ID")-by-("ID"+"ID")\n",
+	    fnrows_max, nb, fncols_max, nb)) ;
+    }
+    else
+    {
+	/* allocate a smaller working array */
+	if (fnrows_max <= fncols_max)
+	{
+	    fnr2 = (Int) sqrt ((double) fsize) ;
+	    /* make sure fnr2 is odd */
+	    fnr2 = MAX (fnr2, 1) ;
+	    if (fnr2 % 2 == 0) fnr2++ ;
+	    fnr2 = MIN (fnr2, fnrows_max + nb) ;
+	    fnc2 = fsize / fnr2 ;
+	}
+	else
+	{
+	    fnc2 = (Int) sqrt ((double) fsize) ;
+	    fnc2 = MIN (fnc2, fncols_max + nb) ;
+	    fnr2 = fsize / fnc2 ;
+	    /* make sure fnr2 is odd */
+	    fnr2 = MAX (fnr2, 1) ;
+	    if (fnr2 % 2 == 0)
+	    {
+		fnr2++ ;
+		fnc2 = fsize / fnr2 ;
+	    }
+	}
+	DEBUGm1 (("   smaller "ID"-by-"ID"\n", fnr2, fnc2)) ;
+    }
+    fnr2 = MIN (fnr2, fnrows_max + nb) ;
+    fnc2 = MIN (fnc2, fncols_max + nb) ;
+    ASSERT (fnr2 % 2 == 1) ;
+    ASSERT (fnr2 * fnc2 <= fsize) ;
+
+    fnr2 -= nb ;
+    fnc2 -= nb ;
+    ASSERT (fnr2 >= 0) ;
+    ASSERT (fnc2 >= 0) ;
+
+    if (fsize > fcurr_size)
+    {
+	DEBUGm1 (("   Grow front \n")) ;
+	Work->do_grow = TRUE ;
+	if (!UMF_grow_front (Numeric, fnr2, fnc2, Work, -1))
+	{
+	    /* since the minimum front size is 1-by-1, it would be nearly
+	     * impossible to run out of memory here. */
+	    DEBUGm4 (("out of memory: start front\n")) ;
+	    return (FALSE) ;
+	}
+    }
+    else
+    {
+	/* use the existing front */
+	DEBUGm1 (("   existing front ok\n")) ;
+	Work->fnr_curr = fnr2 ;
+	Work->fnc_curr = fnc2 ;
+	Work->Flblock  = Work->Flublock + nb * nb ;
+	Work->Fublock  = Work->Flblock  + nb * fnr2 ;
+	Work->Fcblock  = Work->Fublock  + nb * fnc2 ;
+    }
+    ASSERT (Work->Flblock  == Work->Flublock + Work->nb*Work->nb) ;
+    ASSERT (Work->Fublock  == Work->Flblock  + Work->fnr_curr*Work->nb) ;
+    ASSERT (Work->Fcblock  == Work->Fublock  + Work->nb*Work->fnc_curr) ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_start_front.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,13 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_start_front
+(
+    Int chain,
+    NumericType *Numeric,
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1056 @@
+/* ========================================================================== */
+/* === UMF_store_lu ========================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Store the LU factors.  Called by the kernel.
+    Returns TRUE if successful, FALSE if out of memory.
+*/
+
+#include "umf_internal.h"
+#include "umf_mem_alloc_head_block.h"
+#include "umf_get_memory.h"
+
+/* ========================================================================== */
+
+#ifdef DROP
+GLOBAL Int UMF_store_lu_drop
+#else
+GLOBAL Int UMF_store_lu
+#endif
+(
+    NumericType *Numeric,
+    WorkType *Work
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry pivot_value ;
+#ifdef DROP
+    double droptol ;
+#endif
+    Entry *D, *Lval, *Uval, *Fl1, *Fl2, *Fu1, *Fu2,
+	*Flublock, *Flblock, *Fublock ;
+    Int i, k, fnr_curr, fnrows, fncols, row, col, pivrow, pivcol, *Frows,
+	*Fcols, *Lpattern, *Upattern, *Lpos, *Upos, llen, ulen, fnc_curr, fnpiv,
+	uilen, lnz, unz, nb, *Lilen,
+	*Uilen, *Lip, *Uip, *Li, *Ui, pivcol_position, newLchain, newUchain,
+	pivrow_position, p, size, lip, uip, lnzi, lnzx, unzx, lnz2i, lnz2x,
+	unz2i, unz2x, zero_pivot, *Pivrow, *Pivcol, kk,
+	Lnz [MAXNB] ;
+
+#ifndef NDEBUG
+    Int *Col_degree, *Row_degree ;
+#endif
+
+#ifdef DROP
+    Int all_lnz, all_unz ;
+    droptol = Numeric->droptol ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    fnrows = Work->fnrows ;
+    fncols = Work->fncols ;
+    fnpiv = Work->fnpiv ;
+
+    Lpos = Numeric->Lpos ;
+    Upos = Numeric->Upos ;
+    Lilen = Numeric->Lilen ;
+    Uilen = Numeric->Uilen ;
+
+    Lip = Numeric->Lip ;
+    Uip = Numeric->Uip ;
+    D = Numeric->D ;
+
+    Flublock = Work->Flublock ;
+    Flblock  = Work->Flblock ;
+    Fublock  = Work->Fublock ;
+
+    fnr_curr = Work->fnr_curr ;
+    fnc_curr = Work->fnc_curr ;
+    Frows = Work->Frows ;
+    Fcols = Work->Fcols ;
+
+#ifndef NDEBUG
+    Col_degree = Numeric->Cperm ;	/* for NON_PIVOTAL_COL macro */
+    Row_degree = Numeric->Rperm ;	/* for NON_PIVOTAL_ROW macro */
+#endif
+
+    Lpattern = Work->Lpattern ;
+    llen = Work->llen ;
+    Upattern = Work->Upattern ;
+    ulen = Work->ulen ;
+
+    nb = Work->nb ;
+
+#ifndef NDEBUG
+    DEBUG1 (("\nSTORE LU: fnrows "ID
+	" fncols "ID"\n", fnrows, fncols)) ;
+
+    DEBUG2 (("\nFrontal matrix, including all space:\n"
+		"fnr_curr "ID" fnc_curr "ID" nb    "ID"\n"
+		"fnrows   "ID" fncols   "ID" fnpiv "ID"\n",
+		fnr_curr, fnc_curr, nb, fnrows, fncols, fnpiv)) ;
+
+    DEBUG2 (("\nJust the active part:\n")) ;
+    DEBUG7 (("C  block: ")) ;
+    UMF_dump_dense (Work->Fcblock,  fnr_curr, fnrows, fncols) ;
+    DEBUG7 (("L  block: ")) ;
+    UMF_dump_dense (Work->Flblock,  fnr_curr, fnrows, fnpiv);
+    DEBUG7 (("U' block: ")) ;
+    UMF_dump_dense (Work->Fublock,  fnc_curr, fncols, fnpiv) ;
+    DEBUG7 (("LU block: ")) ;
+    UMF_dump_dense (Work->Flublock, nb, fnpiv, fnpiv) ;
+    DEBUG7 (("Current frontal matrix: (prior to store LU)\n")) ;
+    UMF_dump_current_front (Numeric, Work, TRUE) ;
+#endif
+
+    Pivrow = Work->Pivrow ;
+    Pivcol = Work->Pivcol ;
+
+    /* ---------------------------------------------------------------------- */
+    /* store the columns of L */
+    /* ---------------------------------------------------------------------- */
+
+    for (kk = 0 ; kk < fnpiv ; kk++)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* one more pivot row and column is being stored into L and U */
+	/* ------------------------------------------------------------------ */
+
+	k = Work->npiv + kk ;
+
+	/* ------------------------------------------------------------------ */
+	/* find the kth pivot row and pivot column */
+	/* ------------------------------------------------------------------ */
+
+	pivrow = Pivrow [kk] ;
+	pivcol = Pivcol [kk] ;
+
+#ifndef NDEBUG
+	ASSERT (pivrow >= 0 && pivrow < Work->n_row) ;
+	ASSERT (pivcol >= 0 && pivcol < Work->n_col) ;
+
+	DEBUGm4 ((
+	"\n -------------------------------------------------------------"
+	"Store LU: step " ID"\n", k))  ;
+	ASSERT (k < MIN (Work->n_row, Work->n_col)) ;
+	DEBUG2 (("Store column of L, k = "ID", llen "ID"\n", k, llen)) ;
+	for (i = 0 ; i < llen ; i++)
+	{
+	    row = Lpattern [i] ;
+	    ASSERT (row >= 0 && row < Work->n_row) ;
+	    DEBUG2 (("    Lpattern["ID"] "ID" Lpos "ID, i, row, Lpos [row])) ;
+	    if (row == pivrow) DEBUG2 ((" <- pivot row")) ;
+	    DEBUG2 (("\n")) ;
+	    ASSERT (i == Lpos [row]) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* remove pivot row from L */
+	/* ------------------------------------------------------------------ */
+
+	/* remove pivot row index from current column of L */
+	/* if a new Lchain starts, then all entries are removed later */
+	DEBUG2 (("Removing pivrow from Lpattern, k = "ID"\n", k)) ;
+	ASSERT (!NON_PIVOTAL_ROW (pivrow)) ;
+	pivrow_position = Lpos [pivrow] ;
+	if (pivrow_position != EMPTY)
+	{
+	    /* place the last entry in the column in the */
+	    /* position of the pivot row index */
+	    ASSERT (pivrow == Lpattern [pivrow_position]) ;
+	    row = Lpattern [--llen] ;
+	    /* ASSERT (NON_PIVOTAL_ROW (row)) ; */
+	    Lpattern [pivrow_position] = row ;
+	    Lpos [row] = pivrow_position ;
+	    Lpos [pivrow] = EMPTY ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* store the pivot value, for the diagonal matrix D */
+	/* ------------------------------------------------------------------ */
+
+	/* kk-th column of LU block */
+	Fl1 = Flublock + kk * nb ;
+
+	/* kk-th column of L in the L block */
+	Fl2 = Flblock + kk * fnr_curr ;
+
+	/* kk-th pivot in frontal matrix located in Flublock [kk, kk] */
+	pivot_value = Fl1 [kk] ;
+
+	D [k] = pivot_value ;
+	zero_pivot = IS_ZERO (pivot_value) ;
+
+	DEBUG4 (("Pivot D["ID"]=", k)) ;
+	EDEBUG4 (pivot_value) ;
+	DEBUG4 (("\n")) ;
+
+	/* ------------------------------------------------------------------ */
+	/* count nonzeros in kth column of L */
+	/* ------------------------------------------------------------------ */
+
+	lnz = 0 ;
+	lnz2i = 0 ;
+	lnz2x = llen ;
+
+#ifdef DROP
+	    all_lnz = 0 ;
+
+	    for (i = kk + 1 ; i < fnpiv ; i++)
+	    {
+		Entry x ;
+		double s ;
+		x = Fl1 [i] ;
+		if (IS_ZERO (x)) continue ;
+		all_lnz++ ;
+		APPROX_ABS (s, x) ;
+		if (s <= droptol) continue ;
+		lnz++ ;
+		if (Lpos [Pivrow [i]] == EMPTY) lnz2i++ ;
+	    }
+
+	    for (i = 0 ; i < fnrows ; i++)
+	    {
+		Entry x ;
+		double s ;
+		x = Fl2 [i] ;
+		if (IS_ZERO (x)) continue ;
+		all_lnz++ ;
+		APPROX_ABS (s, x) ;
+		if (s <= droptol) continue ;
+		lnz++ ;
+		if (Lpos [Frows [i]] == EMPTY) lnz2i++ ;
+	    }
+
+#else
+
+	    for (i = kk + 1 ; i < fnpiv ; i++)
+	    {
+		if (IS_ZERO (Fl1 [i])) continue ;
+		lnz++ ;
+		if (Lpos [Pivrow [i]] == EMPTY) lnz2i++ ;
+	    }
+
+	    for (i = 0 ; i < fnrows ; i++)
+	    {
+		if (IS_ZERO (Fl2 [i])) continue ;
+		lnz++ ;
+		if (Lpos [Frows [i]] == EMPTY) lnz2i++ ;
+	    }
+
+#endif
+
+	lnz2x += lnz2i ;
+
+	/* determine if we start a new Lchain or continue the old one */
+	if (llen == 0 || zero_pivot)
+	{
+	    /* llen == 0 means there is no prior Lchain */
+	    /* D [k] == 0 means the pivot column is empty */
+	    newLchain = TRUE ;
+	}
+	else
+	{
+	    newLchain =
+		    /* storage for starting a new Lchain */
+		    UNITS (Entry, lnz) + UNITS (Int, lnz)
+		<=
+		    /* storage for continuing a prior Lchain */
+		    UNITS (Entry, lnz2x) + UNITS (Int, lnz2i) ;
+	}
+
+	if (newLchain)
+	{
+	    /* start a new chain for column k of L */
+	    DEBUG2 (("Start new Lchain, k = "ID"\n", k)) ;
+
+	    pivrow_position = EMPTY ;
+
+	    /* clear the prior Lpattern */
+	    for (i = 0 ; i < llen ; i++)
+	    {
+		row = Lpattern [i] ;
+		Lpos [row] = EMPTY ;
+	    }
+	    llen = 0 ;
+
+	    lnzi = lnz ;
+	    lnzx = lnz ;
+	}
+	else
+	{
+	    /* continue the prior Lchain */
+	    DEBUG2 (("Continue  Lchain, k = "ID"\n", k)) ;
+	    lnzi = lnz2i ;
+	    lnzx = lnz2x ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* allocate space for the column of L */
+	/* ------------------------------------------------------------------ */
+
+	size = UNITS (Int, lnzi) + UNITS (Entry, lnzx) ;
+
+#ifndef NDEBUG
+	UMF_allocfail = FALSE ;
+	if (UMF_gprob > 0)
+	{
+	    double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ;
+	    DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+	    UMF_allocfail = rrr < UMF_gprob ;
+	    if (UMF_allocfail) DEBUGm2 (("Random garbage coll. (store LU)\n"));
+	}
+#endif
+
+	p = UMF_mem_alloc_head_block (Numeric, size) ;
+	if (!p)
+	{
+	    Int r2, c2 ;
+	    /* Do garbage collection, realloc, and try again. */
+	    /* Note that there are pivot rows/columns in current front. */
+	    if (Work->do_grow)
+	    {
+		/* full compaction of current frontal matrix, since
+		 * UMF_grow_front will be called next anyway. */
+		r2 = fnrows ;
+		c2 = fncols ;
+	    }
+	    else
+	    {
+		/* partial compaction. */
+		r2 = MAX (fnrows, Work->fnrows_new + 1) ;
+		c2 = MAX (fncols, Work->fncols_new + 1) ;
+	    }
+	    DEBUGm3 (("get_memory from umf_store_lu:\n")) ;
+	    if (!UMF_get_memory (Numeric, Work, size, r2, c2, TRUE))
+	    {
+		DEBUGm4 (("out of memory: store LU (1)\n")) ;
+		return (FALSE) ;	/* out of memory */
+	    }
+	    p = UMF_mem_alloc_head_block (Numeric, size) ;
+	    if (!p)
+	    {
+		DEBUGm4 (("out of memory: store LU (2)\n")) ;
+		return (FALSE) ;	/* out of memory */
+	    }
+	    /* garbage collection may have moved the current front */
+	    fnc_curr = Work->fnc_curr ;
+	    fnr_curr = Work->fnr_curr ;
+	    Flublock = Work->Flublock ;
+	    Flblock  = Work->Flblock ;
+	    Fublock  = Work->Fublock ;
+	    Fl1 = Flublock + kk * nb ;
+	    Fl2 = Flblock  + kk * fnr_curr ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* store the column of L */
+	/* ------------------------------------------------------------------ */
+
+	lip = p ;
+
+	Li = (Int *) (Numeric->Memory + p) ;
+	p += UNITS (Int, lnzi) ;
+	Lval = (Entry *) (Numeric->Memory + p) ;
+	p += UNITS (Entry, lnzx) ;
+
+	for (i = 0 ; i < lnzx ; i++)
+	{
+	    CLEAR (Lval [i]) ;
+	}
+
+	/* store the numerical entries */
+
+	if (newLchain)
+	{
+	    /* flag the first column in the Lchain by negating Lip [k] */
+	    lip = -lip ;
+
+	    ASSERT (llen == 0) ;
+
+#ifdef DROP
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int row2, pos ;
+		    x = Fl1 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    row2 = Pivrow [i] ;
+		    pos = llen++ ;
+		    Lpattern [pos] = row2 ;
+		    Lpos [row2] = pos ;
+		    Li [pos] = row2 ;
+		    Lval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fnrows ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int row2, pos ;
+		    x = Fl2 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    row2 = Frows [i] ;
+		    pos = llen++ ;
+		    Lpattern [pos] = row2 ;
+		    Lpos [row2] = pos ;
+		    Li [pos] = row2 ;
+		    Lval [pos] = x ;
+		}
+
+#else
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    Int row2, pos ;
+		    x = Fl1 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    row2 = Pivrow [i] ;
+		    pos = llen++ ;
+		    Lpattern [pos] = row2 ;
+		    Lpos [row2] = pos ;
+		    Li [pos] = row2 ;
+		    Lval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fnrows ; i++)
+		{
+		    Entry x ;
+		    Int row2, pos ;
+		    x = Fl2 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    row2 = Frows [i] ;
+		    pos = llen++ ;
+		    Lpattern [pos] = row2 ;
+		    Lpos [row2] = pos ;
+		    Li [pos] = row2 ;
+		    Lval [pos] = x ;
+		}
+
+#endif
+
+	}
+	else
+	{
+	    ASSERT (llen > 0) ;
+
+#ifdef DROP
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int row2, pos ;
+		    x = Fl1 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    row2 = Pivrow [i] ;
+		    pos = Lpos [row2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = llen++ ;
+			Lpattern [pos] = row2 ;
+			Lpos [row2] = pos ;
+			*Li++ = row2 ;
+		    }
+		    Lval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fnrows ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int row2, pos ;
+		    x = Fl2 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    row2 = Frows [i] ;
+		    pos = Lpos [row2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = llen++ ;
+			Lpattern [pos] = row2 ;
+			Lpos [row2] = pos ;
+			*Li++ = row2 ;
+		    }
+		    Lval [pos] = x ;
+		}
+
+#else
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    Int row2, pos ;
+		    x = Fl1 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    row2 = Pivrow [i] ;
+		    pos = Lpos [row2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = llen++ ;
+			Lpattern [pos] = row2 ;
+			Lpos [row2] = pos ;
+			*Li++ = row2 ;
+		    }
+		    Lval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fnrows ; i++)
+		{
+		    Entry x ;
+		    Int row2, pos ;
+		    x = Fl2 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    row2 = Frows [i] ;
+		    pos = Lpos [row2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = llen++ ;
+			Lpattern [pos] = row2 ;
+			Lpos [row2] = pos ;
+			*Li++ = row2 ;
+		    }
+		    Lval [pos] = x ;
+		}
+
+#endif
+
+	}
+	DEBUG4 (("llen "ID" lnzx "ID"\n", llen, lnzx)) ;
+	ASSERT (llen == lnzx) ;
+	ASSERT (lnz <= llen) ;
+	DEBUG4 (("lnz "ID" \n", lnz)) ;
+
+#ifdef DROP
+
+	    DEBUG4 (("all_lnz "ID" \n", all_lnz)) ;
+	    ASSERT (lnz <= all_lnz) ;
+	    Numeric->lnz += lnz ;
+	    Numeric->all_lnz += all_lnz ;
+	    Lnz [kk] = all_lnz ;
+
+#else
+
+	    Numeric->lnz += lnz ;
+	    Numeric->all_lnz += lnz ;
+	    Lnz [kk] = lnz ;
+#endif
+
+	Numeric->nLentries += lnzx ;
+	Work->llen = llen ;
+	Numeric->isize += lnzi ;
+
+	/* ------------------------------------------------------------------ */
+	/* the pivot column is fully assembled and scaled, and is now the */
+	/* k-th column of L */
+	/* ------------------------------------------------------------------ */
+
+	Lpos [pivrow] = pivrow_position ;	/* not aliased */
+	Lip [pivcol] = lip ;			/* aliased with Col_tuples */
+	Lilen [pivcol] = lnzi ;			/* aliased with Col_tlen */
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* store the rows of U */
+    /* ---------------------------------------------------------------------- */
+
+    for (kk = 0 ; kk < fnpiv ; kk++)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* one more pivot row and column is being stored into L and U */
+	/* ------------------------------------------------------------------ */
+
+	k = Work->npiv + kk ;
+
+	/* ------------------------------------------------------------------ */
+	/* find the kth pivot row and pivot column */
+	/* ------------------------------------------------------------------ */
+
+	pivrow = Pivrow [kk] ;
+	pivcol = Pivcol [kk] ;
+
+#ifndef NDEBUG
+	ASSERT (pivrow >= 0 && pivrow < Work->n_row) ;
+	ASSERT (pivcol >= 0 && pivcol < Work->n_col) ;
+
+	DEBUG2 (("Store row of U, k = "ID", ulen "ID"\n", k, ulen)) ;
+	for (i = 0 ; i < ulen ; i++)
+	{
+	    col = Upattern [i] ;
+	    DEBUG2 (("    Upattern["ID"] "ID, i, col)) ;
+	    if (col == pivcol) DEBUG2 ((" <- pivot col")) ;
+	    DEBUG2 (("\n")) ;
+	    ASSERT (col >= 0 && col < Work->n_col) ;
+	    ASSERT (i == Upos [col]) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* get the pivot value, for the diagonal matrix D */
+	/* ------------------------------------------------------------------ */
+
+	zero_pivot = IS_ZERO (D [k]) ;
+
+	/* ------------------------------------------------------------------ */
+	/* count the nonzeros in the row of U */
+	/* ------------------------------------------------------------------ */
+
+	/* kk-th row of U in the LU block */
+	Fu1 = Flublock + kk ;
+
+	/* kk-th row of U in the U block */
+	Fu2 = Fublock + kk * fnc_curr ;
+
+	unz = 0 ;
+	unz2i = 0 ;
+	unz2x = ulen ;
+	DEBUG2 (("unz2x is "ID", lnzx "ID"\n", unz2x, lnzx)) ;
+
+	/* if row k does not end a Uchain, pivcol not included in ulen */
+	ASSERT (!NON_PIVOTAL_COL (pivcol)) ;
+	pivcol_position = Upos [pivcol] ;
+	if (pivcol_position != EMPTY)
+	{
+	    unz2x-- ;
+	    DEBUG2 (("(exclude pivcol) unz2x is now "ID"\n", unz2x)) ;
+	}
+
+	ASSERT (unz2x >= 0) ;
+
+#ifdef DROP
+	    all_unz = 0 ;
+
+	    for (i = kk + 1 ; i < fnpiv ; i++)
+	    {
+		Entry x ;
+		double s ;
+		x = Fu1 [i*nb] ;
+		if (IS_ZERO (x)) continue ;
+		all_unz++ ;
+		APPROX_ABS (s, x) ;
+		if (s <= droptol) continue ;
+		unz++ ;
+		if (Upos [Pivcol [i]] == EMPTY) unz2i++ ;
+	    }
+
+	    for (i = 0 ; i < fncols ; i++)
+	    {
+		Entry x ;
+		double s ;
+		x = Fu2 [i] ;
+		if (IS_ZERO (x)) continue ;
+		all_unz++ ;
+		APPROX_ABS (s, x) ;
+		if (s <= droptol) continue ;
+		unz++ ;
+		if (Upos [Fcols [i]] == EMPTY) unz2i++ ;
+	    }
+
+#else
+
+	    for (i = kk + 1 ; i < fnpiv ; i++)
+	    {
+		if (IS_ZERO (Fu1 [i*nb])) continue ;
+		unz++ ;
+		if (Upos [Pivcol [i]] == EMPTY) unz2i++ ;
+	    }
+
+	    for (i = 0 ; i < fncols ; i++)
+	    {
+		if (IS_ZERO (Fu2 [i])) continue ;
+		unz++ ;
+		if (Upos [Fcols [i]] == EMPTY) unz2i++ ;
+	    }
+
+#endif
+
+	unz2x += unz2i ;
+
+	ASSERT (IMPLIES (k == 0, ulen == 0)) ;
+
+	/* determine if we start a new Uchain or continue the old one */
+	if (ulen == 0 || zero_pivot)
+	{
+	    /* ulen == 0 means there is no prior Uchain */
+	    /* D [k] == 0 means the matrix is singular (pivot row might */
+	    /* not be empty, however, but start a new Uchain to prune zero */
+	    /* entries for the deg > 0 test in UMF_u*solve) */
+	    newUchain = TRUE ;
+	}
+	else
+	{
+	    newUchain =
+		    /* approximate storage for starting a new Uchain */
+		    UNITS (Entry, unz) + UNITS (Int, unz)
+		<=
+		    /* approximate storage for continuing a prior Uchain */
+		    UNITS (Entry, unz2x) + UNITS (Int, unz2i) ;
+
+	    /* this would be exact, except for the Int to Unit rounding, */
+	    /* because the Upattern is stored only at the end of the Uchain */
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* allocate space for the row of U */
+	/* ------------------------------------------------------------------ */
+
+	size = 0 ;
+	if (newUchain)
+	{
+	    /* store the pattern of the last row in the prior Uchain */
+	    size += UNITS (Int, ulen) ;
+	    unzx = unz ;
+	}
+	else
+	{
+	    unzx = unz2x ;
+	}
+	size += UNITS (Entry, unzx) ;
+
+#ifndef NDEBUG
+	UMF_allocfail = FALSE ;
+	if (UMF_gprob > 0)
+	{
+	    double rrr = ((double) (rand ( ))) / (((double) RAND_MAX) + 1) ;
+	    DEBUG4 (("Check random %e %e\n", rrr, UMF_gprob)) ;
+	    UMF_allocfail = rrr < UMF_gprob ;
+	    if (UMF_allocfail) DEBUGm2 (("Random garbage coll. (store LU)\n"));
+	}
+#endif
+
+	p = UMF_mem_alloc_head_block (Numeric, size) ;
+	if (!p)
+	{
+	    Int r2, c2 ;
+	    /* Do garbage collection, realloc, and try again. */
+	    /* Note that there are pivot rows/columns in current front. */
+	    if (Work->do_grow)
+	    {
+		/* full compaction of current frontal matrix, since
+		 * UMF_grow_front will be called next anyway. */
+		r2 = fnrows ;
+		c2 = fncols ;
+	    }
+	    else
+	    {
+		/* partial compaction. */
+		r2 = MAX (fnrows, Work->fnrows_new + 1) ;
+		c2 = MAX (fncols, Work->fncols_new + 1) ;
+	    }
+	    DEBUGm3 (("get_memory from umf_store_lu:\n")) ;
+	    if (!UMF_get_memory (Numeric, Work, size, r2, c2, TRUE))
+	    {
+		/* :: get memory, column of L :: */
+		DEBUGm4 (("out of memory: store LU (1)\n")) ;
+		return (FALSE) ;	/* out of memory */
+	    }
+	    p = UMF_mem_alloc_head_block (Numeric, size) ;
+	    if (!p)
+	    {
+		/* :: out of memory, column of U :: */
+		DEBUGm4 (("out of memory: store LU (2)\n")) ;
+		return (FALSE) ;	/* out of memory */
+	    }
+	    /* garbage collection may have moved the current front */
+	    fnc_curr = Work->fnc_curr ;
+	    fnr_curr = Work->fnr_curr ;
+	    Flublock = Work->Flublock ;
+	    Flblock  = Work->Flblock ;
+	    Fublock  = Work->Fublock ;
+	    Fu1 = Flublock + kk ;
+	    Fu2 = Fublock  + kk * fnc_curr ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* store the row of U */
+	/* ------------------------------------------------------------------ */
+
+	uip = p ;
+
+	if (newUchain)
+	{
+	    /* starting a new Uchain - flag this by negating Uip [k] */
+	    uip = -uip ;
+	    DEBUG2 (("Start new Uchain, k = "ID"\n", k)) ;
+
+	    pivcol_position = EMPTY ;
+
+	    /* end the prior Uchain */
+	    /* save the current Upattern, and then */
+	    /* clear it and start a new Upattern */
+	    DEBUG2 (("Ending prior chain, k-1 = "ID"\n", k-1)) ;
+	    uilen = ulen ;
+	    Ui = (Int *) (Numeric->Memory + p) ;
+	    Numeric->isize += ulen ;
+	    p += UNITS (Int, ulen) ;
+	    for (i = 0 ; i < ulen ; i++)
+	    {
+		col = Upattern [i] ;
+		ASSERT (col >= 0 && col < Work->n_col) ;
+		Upos [col] = EMPTY ;
+		Ui [i] = col ;
+	    }
+
+	    ulen = 0 ;
+
+	}
+	else
+	{
+	    /* continue the prior Uchain */
+	    DEBUG2 (("Continue  Uchain, k = "ID"\n", k)) ;
+	    ASSERT (k > 0) ;
+
+	    /* remove pivot col index from current row of U */
+	    /* if a new Uchain starts, then all entries are removed later */
+	    DEBUG2 (("Removing pivcol from Upattern, k = "ID"\n", k)) ;
+
+	    if (pivcol_position != EMPTY)
+	    {
+		/* place the last entry in the row in the */
+		/* position of the pivot col index */
+		ASSERT (pivcol == Upattern [pivcol_position]) ;
+		col = Upattern [--ulen] ;
+		ASSERT (col >= 0 && col < Work->n_col) ;
+		Upattern [pivcol_position] = col ;
+		Upos [col] = pivcol_position ;
+		Upos [pivcol] = EMPTY ;
+	    }
+
+	    /* this row continues the Uchain.  Keep track of how much */
+	    /* to trim from the k-th length to get the length of the */
+	    /* (k-1)st row of U */
+	    uilen = unz2i ;
+
+	}
+
+	Uval = (Entry *) (Numeric->Memory + p) ;
+	/* p += UNITS (Entry, unzx), no need to increment p */
+
+	for (i = 0 ; i < unzx ; i++)
+	{
+	    CLEAR (Uval [i]) ;
+	}
+
+	if (newUchain)
+	{
+	    ASSERT (ulen == 0) ;
+
+#ifdef DROP
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int col2, pos ;
+		    x = Fu1 [i*nb] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    col2 = Pivcol [i] ;
+		    pos = ulen++ ;
+		    Upattern [pos] = col2 ;
+		    Upos [col2] = pos ;
+		    Uval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fncols ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int col2, pos ;
+		    x = Fu2 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    col2 = Fcols [i] ;
+		    pos = ulen++ ;
+		    Upattern [pos] = col2 ;
+		    Upos [col2] = pos ;
+		    Uval [pos] = x ;
+		}
+
+#else
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    Int col2, pos ;
+		    x = Fu1 [i*nb] ;
+		    if (IS_ZERO (x)) continue ;
+		    col2 = Pivcol [i] ;
+		    pos = ulen++ ;
+		    Upattern [pos] = col2 ;
+		    Upos [col2] = pos ;
+		    Uval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fncols ; i++)
+		{
+		    Entry x ;
+		    Int col2, pos ;
+		    x = Fu2 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    col2 = Fcols [i] ;
+		    pos = ulen++ ;
+		    Upattern [pos] = col2 ;
+		    Upos [col2] = pos ;
+		    Uval [pos] = x ;
+		}
+
+#endif
+
+	}
+	else
+	{
+
+	    ASSERT (ulen > 0) ;
+
+	    /* store the numerical entries and find new nonzeros */
+
+#ifdef DROP
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int col2, pos ;
+		    x = Fu1 [i*nb] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    col2 = Pivcol [i] ;
+		    pos = Upos [col2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = ulen++ ;
+			Upattern [pos] = col2 ;
+			Upos [col2] = pos ;
+		    }
+		    Uval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fncols ; i++)
+		{
+		    Entry x ;
+		    double s ;
+		    Int col2, pos ;
+		    x = Fu2 [i] ;
+		    APPROX_ABS (s, x) ;
+		    if (s <= droptol) continue ;
+		    col2 = Fcols [i] ;
+		    pos = Upos [col2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = ulen++ ;
+			Upattern [pos] = col2 ;
+			Upos [col2] = pos ;
+		    }
+		    Uval [pos] = x ;
+		}
+
+#else
+
+		for (i = kk + 1 ; i < fnpiv ; i++)
+		{
+		    Entry x ;
+		    Int col2, pos ;
+		    x = Fu1 [i*nb] ;
+		    if (IS_ZERO (x)) continue ;
+		    col2 = Pivcol [i] ;
+		    pos = Upos [col2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = ulen++ ;
+			Upattern [pos] = col2 ;
+			Upos [col2] = pos ;
+		    }
+		    Uval [pos] = x ;
+		}
+
+		for (i = 0 ; i < fncols ; i++)
+		{
+		    Entry x ;
+		    Int col2, pos ;
+		    x = Fu2 [i] ;
+		    if (IS_ZERO (x)) continue ;
+		    col2 = Fcols [i] ;
+		    pos = Upos [col2] ;
+		    if (pos == EMPTY)
+		    {
+			pos = ulen++ ;
+			Upattern [pos] = col2 ;
+			Upos [col2] = pos ;
+		    }
+		    Uval [pos] = x ;
+		}
+
+#endif
+
+	}
+
+	ASSERT (ulen == unzx) ;
+	ASSERT (unz <= ulen) ;
+	DEBUG4 (("unz "ID" \n", unz)) ;
+
+#ifdef DROP
+
+	    DEBUG4 (("all_unz "ID" \n", all_unz)) ;
+	    ASSERT (unz <= all_unz) ;
+	    Numeric->unz += unz ;
+	    Numeric->all_unz += all_unz ;
+	    /* count the "true" flops, based on LU pattern only */
+	    Numeric->flops += DIV_FLOPS * Lnz [kk]	/* scale pivot column */
+		+ MULTSUB_FLOPS * (Lnz [kk] * all_unz) ;    /* outer product */
+
+#else
+
+	    Numeric->unz += unz ;
+	    Numeric->all_unz += unz ;
+	    /* count the "true" flops, based on LU pattern only */
+	    Numeric->flops += DIV_FLOPS * Lnz [kk]	/* scale pivot column */
+		+ MULTSUB_FLOPS * (Lnz [kk] * unz) ;    /* outer product */
+#endif
+
+	Numeric->nUentries += unzx ;
+	Work->ulen = ulen ;
+	DEBUG1 (("Work->ulen = "ID" at end of pivot step, k: "ID"\n", ulen, k));
+
+	/* ------------------------------------------------------------------ */
+	/* the pivot row is the k-th row of U */
+	/* ------------------------------------------------------------------ */
+
+	Upos [pivcol] = pivcol_position ;	/* not aliased */
+	Uip [pivrow] = uip ;			/* aliased with Row_tuples */
+	Uilen [pivrow] = uilen ;		/* aliased with Row_tlen */
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* no more pivots in frontal working array */
+    /* ---------------------------------------------------------------------- */
+
+    Work->npiv += fnpiv ;
+    Work->fnpiv = 0 ;
+    Work->fnzeros = 0 ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_store_lu.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,17 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_store_lu
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
+
+GLOBAL Int UMF_store_lu_drop
+(
+    NumericType *Numeric,
+    WorkType *Work
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,45 @@
+/* ========================================================================== */
+/* === UMF_symbolic_usage =================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Returns the final size of the Symbolic object, in Units */
+
+#include "umf_internal.h"
+
+GLOBAL double UMF_symbolic_usage
+(
+    Int n_row,
+    Int n_col,
+    Int nchains,
+    Int nfr,
+    Int esize,	    /* zero if no dense rows.  Otherwise, equal to the
+		     * number of non-singleton, non-empty columns */
+    Int prefer_diagonal
+)
+{
+    double units ;
+
+    units =
+	DUNITS (SymbolicType, 1)	/* Symbolic structure */
+	+ 2 * DUNITS (Int, n_col+1)	/* Cperm_init, Cdeg */
+	+ 2 * DUNITS (Int, n_row+1)	/* Rperm_init, Rdeg */
+	+ 3 * DUNITS (Int, nchains+1)	/* Chain_ */
+	+ 4 * DUNITS (Int, nfr+1) ;	/* Front_ */
+
+    /* if dense rows are present */
+    units += DUNITS (Int, esize) ;	/* Esize */
+
+    /* for diagonal pivoting */
+    if (prefer_diagonal)
+    {
+	units += DUNITS (Int, n_col+1) ;    /* Diagonal_map */
+    }
+
+    return (units) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_symbolic_usage.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,15 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL double UMF_symbolic_usage
+(
+    Int n_row,
+    Int n_col,
+    Int nchains,
+    Int nfr,
+    Int esize,
+    Int prefer_diagonal
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_transpose.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,400 @@
+/* ========================================================================== */
+/* === UMF_transpose ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  Not user-callable.  Computes a permuted transpose, R = (A (P,Q(1:nq)))' in
+	MATLAB notation, where R is in column-form.  A is n_row-by-n_col, the
+	row-form matrix R is n_row-by-nq, where nq <= n_col.  A may be singular.
+	The complex version can do transpose (') or array transpose (.').
+
+	Uses Gustavson's method (Two Fast Algorithms for Sparse Matrices:
+	Multiplication and Permuted Transposition, ACM Trans. on Math. Softw.,
+	vol 4, no 3, pp. 250-269).
+*/
+
+#include "umf_internal.h"
+#include "umf_is_permutation.h"
+
+GLOBAL Int UMF_transpose
+(
+    Int n_row,			/* A is n_row-by-n_col */
+    Int n_col,
+    const Int Ap [ ],		/* size n_col+1 */
+    const Int Ai [ ],		/* size nz = Ap [n_col] */
+    const double Ax [ ],	/* size nz if present */
+
+    const Int P [ ],	/* P [k] = i means original row i is kth row in A(P,Q)*/
+			/* P is identity if not present */
+			/* size n_row, if present */
+
+    const Int Q [ ],	/* Q [k] = j means original col j is kth col in A(P,Q)*/
+			/* Q is identity if not present */
+			/* size nq, if present */
+    Int nq,		/* size of Q, ignored if Q is (Int *) NULL */
+
+			/* output matrix: Rp, Ri, Rx, and Rz: */
+    Int Rp [ ],		/* size n_row+1 */
+    Int Ri [ ],		/* size nz */
+    double Rx [ ],	/* size nz, if present */
+
+    Int W [ ],		/* size max (n_row,n_col) workspace */
+
+    Int check		/* if true, then check inputs */
+#ifdef COMPLEX
+    , const double Az [ ]	/* size nz */
+    , double Rz [ ]		/* size nz */
+    , Int do_conjugate		/* if true, then do conjugate transpose */
+				/* otherwise, do array transpose */
+#endif
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int i, j, k, p, bp, newj, do_values ;
+#ifdef COMPLEX
+    Int split ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* check inputs */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    Int nz ;
+    ASSERT (n_col >= 0) ;
+    nz = (Ap != (Int *) NULL) ? Ap [n_col] : 0 ;
+    DEBUG2 (("UMF_transpose: "ID"-by-"ID" nz "ID"\n", n_row, n_col, nz)) ;
+#endif
+
+    if (check)
+    {
+	/* UMFPACK_symbolic skips this check */
+	/* UMFPACK_transpose always does this check */
+	if (!Ai || !Ap || !Ri || !Rp || !W)
+	{
+	    return (UMFPACK_ERROR_argument_missing) ;
+	}
+	if (n_row <= 0 || n_col <= 0)		/* n_row,n_col must be > 0 */
+	{
+	    return (UMFPACK_ERROR_n_nonpositive) ;
+	}
+	if (!UMF_is_permutation (P, W, n_row, n_row) ||
+	    !UMF_is_permutation (Q, W, nq, nq))
+	{
+	    return (UMFPACK_ERROR_invalid_permutation) ;
+	}
+	if (!AMD_valid (n_row, n_col, Ap, Ai))
+	{
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+    }
+
+#ifndef NDEBUG
+    DEBUG2 (("UMF_transpose, input matrix:\n")) ;
+    UMF_dump_col_matrix (Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+	Ai, Ap, n_row, n_col, nz) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* count the entries in each row of A */
+    /* ---------------------------------------------------------------------- */
+
+    /* use W as workspace for RowCount */
+
+    for (i = 0 ; i < n_row ; i++)
+    {
+	W [i] = 0 ;
+	Rp [i] = 0 ;
+    }
+
+    if (Q != (Int *) NULL)
+    {
+	for (newj = 0 ; newj < nq ; newj++)
+	{
+	    j = Q [newj] ;
+	    ASSERT (j >= 0 && j < n_col) ;
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		ASSERT (i >= 0 && i < n_row) ;
+		W [i]++ ;
+	    }
+	}
+    }
+    else
+    {
+	for (j = 0 ; j < n_col ; j++)
+	{
+	    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+	    {
+		i = Ai [p] ;
+		ASSERT (i >= 0 && i < n_row) ;
+		W [i]++ ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the row pointers for R = A (P,Q) */
+    /* ---------------------------------------------------------------------- */
+
+    if (P != (Int *) NULL)
+    {
+	Rp [0] = 0 ;
+	for (k = 0 ; k < n_row ; k++)
+	{
+	    i = P [k] ;
+	    ASSERT (i >= 0 && i < n_row) ;
+	    Rp [k+1] = Rp [k] + W [i] ;
+	}
+	for (k = 0 ; k < n_row ; k++)
+	{
+	    i = P [k] ;
+	    ASSERT (i >= 0 && i < n_row) ;
+	    W [i] = Rp [k] ;
+	}
+    }
+    else
+    {
+	Rp [0] = 0 ;
+	for (i = 0 ; i < n_row ; i++)
+	{
+	    Rp [i+1] = Rp [i] + W [i] ;
+	}
+	for (i = 0 ; i < n_row ; i++)
+	{
+	    W [i] = Rp [i] ;
+	}
+    }
+    ASSERT (Rp [n_row] <= Ap [n_col]) ;
+
+    /* at this point, W holds the permuted row pointers */
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the row form of B */
+    /* ---------------------------------------------------------------------- */
+
+    do_values = Ax && Rx ;
+
+#ifdef COMPLEX
+    split = SPLIT (Az) && SPLIT (Rz) ;
+
+    if (do_conjugate && do_values)
+    {
+	if (Q != (Int *) NULL)
+	{
+	    if (split)
+	    {
+		/* R = A (P,Q)' */
+		for (newj = 0 ; newj < nq ; newj++)
+		{
+		    j = Q [newj] ;
+		    ASSERT (j >= 0 && j < n_col) ;
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			bp = W [Ai [p]]++ ;
+			Ri [bp] = newj ;
+			Rx [bp] = Ax [p] ;
+			Rz [bp] = -Az [p] ;
+		    }
+		}
+	    }
+	    else
+	    {
+		/* R = A (P,Q)' (merged complex values) */
+		for (newj = 0 ; newj < nq ; newj++)
+		{
+		    j = Q [newj] ;
+		    ASSERT (j >= 0 && j < n_col) ;
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			bp = W [Ai [p]]++ ;
+			Ri [bp] = newj ;
+			Rx [2*bp] = Ax [2*p] ;
+			Rx [2*bp+1] = -Ax [2*p+1] ;
+		    }
+		}
+	    }
+	}
+	else
+	{
+	    if (split)
+	    {
+		/* R = A (P,:)' */
+		for (j = 0 ; j < n_col ; j++)
+		{
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			bp = W [Ai [p]]++ ;
+			Ri [bp] = j ;
+			Rx [bp] = Ax [p] ;
+			Rz [bp] = -Az [p] ;
+		    }
+		}
+	    }
+	    else
+	    {
+		/* R = A (P,:)' (merged complex values) */
+		for (j = 0 ; j < n_col ; j++)
+		{
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			bp = W [Ai [p]]++ ;
+			Ri [bp] = j ;
+			Rx [2*bp] = Ax [2*p] ;
+			Rx [2*bp+1] = -Ax [2*p+1] ;
+		    }
+		}
+	    }
+	}
+    }
+    else
+#endif
+    {
+	if (Q != (Int *) NULL)
+	{
+	    if (do_values)
+	    {
+#ifdef COMPLEX
+		if (split)
+#endif
+		{
+		    /* R = A (P,Q).' */
+		    for (newj = 0 ; newj < nq ; newj++)
+		    {
+			j = Q [newj] ;
+			ASSERT (j >= 0 && j < n_col) ;
+			for (p = Ap [j] ; p < Ap [j+1] ; p++)
+			{
+			    bp = W [Ai [p]]++ ;
+			    Ri [bp] = newj ;
+			    Rx [bp] = Ax [p] ;
+#ifdef COMPLEX
+			    Rz [bp] = Az [p] ;
+#endif
+			}
+		    }
+		}
+#ifdef COMPLEX
+		else
+		{
+		    /* R = A (P,Q).' (merged complex values) */
+		    for (newj = 0 ; newj < nq ; newj++)
+		    {
+			j = Q [newj] ;
+			ASSERT (j >= 0 && j < n_col) ;
+			for (p = Ap [j] ; p < Ap [j+1] ; p++)
+			{
+			    bp = W [Ai [p]]++ ;
+			    Ri [bp] = newj ;
+			    Rx [2*bp] = Ax [2*p] ;
+			    Rx [2*bp+1] = Ax [2*p+1] ;
+			}
+		    }
+		}
+#endif
+	    }
+	    else
+	    {
+		/* R = pattern of A (P,Q).' */
+		for (newj = 0 ; newj < nq ; newj++)
+		{
+		    j = Q [newj] ;
+		    ASSERT (j >= 0 && j < n_col) ;
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			Ri [W [Ai [p]]++] = newj ;
+		    }
+		}
+	    }
+	}
+	else
+	{
+	    if (do_values)
+	    {
+#ifdef COMPLEX
+		if (split)
+#endif
+		{
+		    /* R = A (P,:).' */
+		    for (j = 0 ; j < n_col ; j++)
+		    {
+			for (p = Ap [j] ; p < Ap [j+1] ; p++)
+			{
+			    bp = W [Ai [p]]++ ;
+			    Ri [bp] = j ;
+			    Rx [bp] = Ax [p] ;
+#ifdef COMPLEX
+			    Rz [bp] = Az [p] ;
+#endif
+			}
+		    }
+		}
+#ifdef COMPLEX
+		else
+		{
+		    /* R = A (P,:).' (merged complex values) */
+		    for (j = 0 ; j < n_col ; j++)
+		    {
+			for (p = Ap [j] ; p < Ap [j+1] ; p++)
+			{
+			    bp = W [Ai [p]]++ ;
+			    Ri [bp] = j ;
+			    Rx [2*bp] = Ax [2*p] ;
+			    Rx [2*bp+1] = Ax [2*p+1] ;
+			}
+		    }
+		}
+#endif
+	    }
+	    else
+	    {
+		/* R = pattern of A (P,:).' */
+		for (j = 0 ; j < n_col ; j++)
+		{
+		    for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		    {
+			Ri [W [Ai [p]]++] = j ;
+		    }
+		}
+	    }
+	}
+    }
+
+#ifndef NDEBUG
+    for (k = 0 ; k < n_row ; k++)
+    {
+	if (P != (Int *) NULL)
+	{
+	    i = P [k] ;
+	}
+	else
+	{
+	    i = k ;
+	}
+	DEBUG3 ((ID":  W[i] "ID" Rp[k+1] "ID"\n", i, W [i], Rp [k+1])) ;
+	ASSERT (W [i] == Rp [k+1]) ;
+    }
+    DEBUG2 (("UMF_transpose, output matrix:\n")) ;
+    UMF_dump_col_matrix (Rx,
+#ifdef COMPLEX
+	Rz,
+#endif
+	Ri, Rp, n_col, n_row, Rp [n_row]) ;
+    ASSERT (AMD_valid (n_col, n_row, Rp, Ri)) ;
+#endif
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_transpose.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,27 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_transpose
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+    const Int P [ ],
+    const Int Q [ ],
+    Int nq,
+    Int Rp [ ],
+    Int Ri [ ],
+    double Rx [ ],
+    Int W [ ],
+    Int check
+#ifdef COMPLEX
+    , const double Az [ ]
+    , double Rz [ ]
+    , Int do_conjugate
+#endif
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_triplet.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,428 @@
+/* ========================================================================== */
+/* === UMF_triplet ========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Not user callable.  Converts triplet input to column-oriented form.
+    Duplicate entries may exist (they are summed in the output).  The columns
+    of the column-oriented form are in sorted order.  The input is not modified.
+    Returns 1 if OK, 0 if an error occurred.
+
+    Compiled into four different routines for each version (di, dl, zi, zl),
+    for a total of 16 different routines.
+*/
+
+#include "umf_internal.h"
+
+#ifdef DO_MAP
+#ifdef DO_VALUES
+GLOBAL Int UMF_triplet_map_x
+#else
+GLOBAL Int UMF_triplet_map_nox
+#endif
+#else
+#ifdef DO_VALUES
+GLOBAL Int UMF_triplet_nomap_x
+#else
+GLOBAL Int UMF_triplet_nomap_nox
+#endif
+#endif
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],		/* size nz */
+    const Int Tj [ ],		/* size nz */
+    Int Ap [ ],			/* size n_col + 1 */
+    Int Ai [ ],			/* size nz */
+    Int Rp [ ],			/* size n_row + 1 */
+    Int Rj [ ],			/* size nz */
+    Int W [ ],			/* size max (n_row, n_col) */
+    Int RowCount [ ]		/* size n_row */
+#ifdef DO_VALUES
+    , const double Tx [ ]	/* size nz */
+    , double Ax [ ]		/* size nz */
+    , double Rx [ ]		/* size nz */
+#ifdef COMPLEX
+    , const double Tz [ ]	/* size nz */
+    , double Az [ ]		/* size nz */
+    , double Rz [ ]		/* size nz */
+#endif
+#endif
+#ifdef DO_MAP
+    , Int Map [ ]		/* size nz */
+    , Int Map2 [ ]		/* size nz */
+#endif
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int i, j, k, p, cp, p1, p2, pdest, pj ;
+#ifdef DO_MAP
+    Int duplicates ;
+#endif
+#ifdef DO_VALUES
+#ifdef COMPLEX
+    Int split = SPLIT (Tz) && SPLIT (Az) && SPLIT (Rz) ;
+#endif
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* count the entries in each row (also counting duplicates) */
+    /* ---------------------------------------------------------------------- */
+
+    /* use W as workspace for row counts (including duplicates) */
+    for (i = 0 ; i < n_row ; i++)
+    {
+	W [i] = 0 ;
+    }
+
+    for (k = 0 ; k < nz ; k++)
+    {
+	i = Ti [k] ;
+	j = Tj [k] ;
+	if (i < 0 || i >= n_row || j < 0 || j >= n_col)
+	{
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+	W [i]++ ;
+#ifndef NDEBUG
+	DEBUG1 ((ID " triplet: "ID" "ID" ", k, i, j)) ;
+#ifdef DO_VALUES
+	{
+	    Entry tt ;
+	    ASSIGN (tt, Tx, Tz, k, split) ;
+	    EDEBUG2 (tt) ;
+	    DEBUG1 (("\n")) ;
+	}
+#endif
+#endif
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the row pointers */
+    /* ---------------------------------------------------------------------- */
+
+    Rp [0] = 0 ;
+    for (i = 0 ; i < n_row ; i++)
+    {
+	Rp [i+1] = Rp [i] + W [i] ;
+	W [i] = Rp [i] ;
+    }
+
+    /* W is now equal to the row pointers */
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the row form */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < nz ; k++)
+    {
+	p = W [Ti [k]]++ ;
+#ifdef DO_MAP
+	Map [k] = p ;
+#endif
+	Rj [p] = Tj [k] ;
+#ifdef DO_VALUES
+#ifdef COMPLEX
+	if (split)
+	{
+	    Rx [p] = Tx [k] ;
+	    Rz [p] = Tz [k] ;
+	}
+	else
+	{
+	    Rx [2*p  ] = Tx [2*k  ] ;
+	    Rx [2*p+1] = Tx [2*k+1] ;
+	}
+#else
+	Rx [p] = Tx [k] ;
+#endif
+#endif
+    }
+
+    /* Rp stays the same, but W [i] is advanced to the start of row i+1 */
+
+#ifndef NDEBUG
+    for (i = 0 ; i < n_row ; i++)
+    {
+	ASSERT (W [i] == Rp [i+1]) ;
+    }
+#ifdef DO_MAP
+    for (k = 0 ; k < nz ; k++)
+    {
+	/* make sure that kth triplet is mapped correctly */
+	p = Map [k] ;
+	DEBUG1 (("First row map: Map ["ID"] = "ID"\n", k, p)) ;
+	i = Ti [k] ;
+	j = Tj [k] ;
+	ASSERT (j == Rj [p]) ;
+	ASSERT (Rp [i] <= p && p < Rp [i+1]) ;
+    }
+#endif
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* sum up duplicates */
+    /* ---------------------------------------------------------------------- */
+
+    /* use W [j] to hold position in Ri/Rx/Rz of a_ij, for row i [ */
+
+    for (j = 0 ; j < n_col ; j++)
+    {
+	W [j] = EMPTY ;
+    }
+
+#ifdef DO_MAP
+    duplicates = FALSE ;
+#endif
+
+    for (i = 0 ; i < n_row ; i++)
+    {
+	p1 = Rp [i] ;
+	p2 = Rp [i+1] ;
+	pdest = p1 ;
+	/* At this point, W [j] < p1 holds true for all columns j, */
+	/* because Ri/Rx/Rz is stored in row oriented order. */
+#ifndef NDEBUG
+	if (UMF_debug >= -2)
+	{
+	    for (j = 0 ; j < n_col ; j++)
+	    {
+		ASSERT (W [j] < p1) ;
+	    }
+	}
+#endif
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    j = Rj [p] ;
+	    ASSERT (j >= 0 && j < n_col) ;
+	    pj = W [j] ;
+	    if (pj >= p1)
+	    {
+		/* this column index, j, is already in row i, at position pj */
+		ASSERT (pj < p) ;
+		ASSERT (Rj [pj] == j) ;
+#ifdef DO_MAP
+		Map2 [p] = pj ;
+		duplicates = TRUE ;
+#endif
+#ifdef DO_VALUES
+		/* sum the entry */
+#ifdef COMPLEX
+		if (split)
+		{
+		    Rx [pj] += Rx [p] ;
+		    Rz [pj] += Rz [p] ;
+		}
+		else
+		{
+		    Rx[2*pj  ] += Rx[2*p  ] ;
+		    Rx[2*pj+1] += Rx[2*p+1] ;
+		}
+#else
+		Rx [pj] += Rx [p] ;
+#endif
+#endif
+	    }
+	    else
+	    {
+		/* keep the entry */
+		/* also keep track in W[j] of position of a_ij for case above */
+		W [j] = pdest ;
+#ifdef DO_MAP
+		Map2 [p] = pdest ;
+#endif
+		/* no need to move the entry if pdest is equal to p */
+		if (pdest != p)
+		{
+		    Rj [pdest] = j ;
+#ifdef DO_VALUES
+#ifdef COMPLEX
+		    if (split)
+		    {
+			Rx [pdest] = Rx [p] ;
+			Rz [pdest] = Rz [p] ;
+		    }
+		    else
+		    {
+			Rx [2*pdest  ] = Rx [2*p  ] ;
+			Rx [2*pdest+1] = Rx [2*p+1] ;
+		    }
+#else
+		    Rx [pdest] = Rx [p] ;
+#endif
+#endif
+		}
+		pdest++ ;
+	    }
+	}
+	RowCount [i] = pdest - p1 ;
+    }
+
+    /* done using W for position of a_ij ] */
+
+    /* ---------------------------------------------------------------------- */
+    /* merge Map and Map2 into a single Map */
+    /* ---------------------------------------------------------------------- */
+
+#ifdef DO_MAP
+    if (duplicates)
+    {
+	for (k = 0 ; k < nz ; k++)
+	{
+	    Map [k] = Map2 [Map [k]] ;
+	}
+    }
+#ifndef NDEBUG
+    else
+    {
+	/* no duplicates, so no need to recompute Map */
+	for (k = 0 ; k < nz ; k++)
+	{
+	    ASSERT (Map2 [k] == k) ;
+	}
+    }
+    for (k = 0 ; k < nz ; k++)
+    {
+	/* make sure that kth triplet is mapped correctly */
+	p = Map [k] ;
+	DEBUG1 (("Second row map: Map ["ID"] = "ID"\n", k, p)) ;
+	i = Ti [k] ;
+	j = Tj [k] ;
+	ASSERT (j == Rj [p]) ;
+	ASSERT (Rp [i] <= p && p < Rp [i+1]) ;
+    }
+#endif
+#endif
+
+    /* now the kth triplet maps to p = Map [k], and thus to Rj/Rx [p] */
+
+    /* ---------------------------------------------------------------------- */
+    /* count the entries in each column */
+    /* ---------------------------------------------------------------------- */
+
+    /* [ use W as work space for column counts of A */
+    for (j = 0 ; j < n_col ; j++)
+    {
+	W [j] = 0 ;
+    }
+
+    for (i = 0 ; i < n_row ; i++)
+    {
+	for (p = Rp [i] ; p < Rp [i] + RowCount [i] ; p++)
+	{
+	    j = Rj [p] ;
+	    ASSERT (j >= 0 && j < n_col) ;
+	    W [j]++ ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* create the column pointers */
+    /* ---------------------------------------------------------------------- */
+
+    Ap [0] = 0 ;
+    for (j = 0 ; j < n_col ; j++)
+    {
+	Ap [j+1] = Ap [j] + W [j] ;
+    }
+    /* done using W as workspace for column counts of A ] */
+
+    for (j = 0 ; j < n_col ; j++)
+    {
+	W [j] = Ap [j] ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the column form */
+    /* ---------------------------------------------------------------------- */
+
+    for (i = 0 ; i < n_row ; i++)
+    {
+	for (p = Rp [i] ; p < Rp [i] + RowCount [i] ; p++)
+	{
+	    cp = W [Rj [p]]++ ;
+#ifdef DO_MAP
+	    Map2 [p] = cp ;
+#endif
+	    Ai [cp] = i ;
+#ifdef DO_VALUES
+#ifdef COMPLEX
+	    if (split)
+	    {
+		Ax [cp] = Rx [p] ;
+		Az [cp] = Rz [p] ;
+	    }
+	    else
+	    {
+		Ax [2*cp  ] = Rx [2*p  ] ;
+		Ax [2*cp+1] = Rx [2*p+1] ;
+	    }
+#else
+	    Ax [cp] = Rx [p] ;
+#endif
+#endif
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* merge Map and Map2 into a single Map */
+    /* ---------------------------------------------------------------------- */
+
+#ifdef DO_MAP
+    for (k = 0 ; k < nz ; k++)
+    {
+	Map [k] = Map2 [Map [k]] ;
+    }
+#endif
+
+    /* now the kth triplet maps to p = Map [k], and thus to Ai/Ax [p] */
+
+#ifndef NDEBUG
+    for (j = 0 ; j < n_col ; j++)
+    {
+	ASSERT (W [j] == Ap [j+1]) ;
+    }
+
+    UMF_dump_col_matrix (
+#ifdef DO_VALUES
+	Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+#else
+	(double *) NULL,
+#ifdef COMPLEX
+	(double *) NULL,
+#endif
+#endif
+	Ai, Ap, n_row, n_col, nz) ;
+
+#ifdef DO_MAP
+    for (k = 0 ; k < nz ; k++)
+    {
+	/* make sure that kth triplet is mapped correctly */
+	p = Map [k] ;
+	DEBUG1 (("Col map: Map ["ID"] = "ID"\t", k, p)) ;
+	i = Ti [k] ;
+	j = Tj [k] ;
+	ASSERT (i == Ai [p]) ;
+	DEBUG1 (("   i "ID" j "ID" Ap[j] "ID" p "ID" Ap[j+1] "ID"\n",
+		i, j, Ap [j], p, Ap [j+1])) ;
+	ASSERT (Ap [j] <= p && p < Ap [j+1]) ;
+    }
+#endif
+#endif
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_triplet.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,85 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_triplet_map_x
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],
+    const Int Tj [ ],
+    Int Ap [ ],
+    Int Ai [ ],
+    Int Rp [ ],
+    Int Rj [ ],
+    Int W [ ],
+    Int RowCount [ ]
+    , const double Tx [ ]
+    , double Ax [ ]
+    , double Rx [ ]
+#ifdef COMPLEX
+    , const double Tz [ ]
+    , double Az [ ]
+    , double Rz [ ]
+#endif
+    , Int Map [ ]
+    , Int Map2 [ ]
+) ;
+
+GLOBAL Int UMF_triplet_map_nox
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],
+    const Int Tj [ ],
+    Int Ap [ ],
+    Int Ai [ ],
+    Int Rp [ ],
+    Int Rj [ ],
+    Int W [ ],
+    Int RowCount [ ]
+    , Int Map [ ]
+    , Int Map2 [ ]
+) ;
+
+GLOBAL Int UMF_triplet_nomap_x
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],
+    const Int Tj [ ],
+    Int Ap [ ],
+    Int Ai [ ],
+    Int Rp [ ],
+    Int Rj [ ],
+    Int W [ ],
+    Int RowCount [ ]
+    , const double Tx [ ]
+    , double Ax [ ]
+    , double Rx [ ]
+#ifdef COMPLEX
+    , const double Tz [ ]
+    , double Az [ ]
+    , double Rz [ ]
+#endif
+) ;
+
+GLOBAL Int UMF_triplet_nomap_nox
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],
+    const Int Tj [ ],
+    Int Ap [ ],
+    Int Ai [ ],
+    Int Rp [ ],
+    Int Rj [ ],
+    Int W [ ],
+    Int RowCount [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,135 @@
+/* ========================================================================== */
+/* === UMF_tuple_lengths ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Determine the tuple list lengths, and the amount of memory required for */
+/* them.  Return the amount of memory needed to store all the tuples. */
+/* This routine assumes that the tuple lists themselves are either already */
+/* deallocated, or will be shortly (so Row[ ].tlen and Col[ ].tlen are */
+/* overwritten) */
+
+#include "umf_internal.h"
+
+GLOBAL Int UMF_tuple_lengths	    /* return memory usage */
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    double *p_dusage		    /* output argument */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double dusage ;
+    Int e, nrows, ncols, nel, i, *Rows, *Cols, row, col, n_row, n_col, *E,
+	*Row_degree, *Row_tlen, *Col_degree, *Col_tlen, usage, n1 ;
+    Element *ep ;
+    Unit *p ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    E = Work->E ;
+    Row_degree = Numeric->Rperm ;   /* for NON_PIVOTAL_ROW macro only */
+    Col_degree = Numeric->Cperm ;   /* for NON_PIVOTAL_COL macro only */
+    Row_tlen   = Numeric->Uilen ;
+    Col_tlen   = Numeric->Lilen ;
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    n1 = Work->n1 ;
+    nel = Work->nel ;
+
+    DEBUG3 (("TUPLE_LENGTHS: n_row "ID" n_col "ID" nel "ID"\n",
+	n_row, n_col, nel)) ;
+    ASSERT (nel < Work->elen) ;
+
+    /* tuple list lengths already initialized to zero */
+
+    /* ---------------------------------------------------------------------- */
+    /* scan each element: count tuple list lengths (include element 0) */
+    /* ---------------------------------------------------------------------- */
+
+    for (e = 1 ; e <= nel ; e++)	/* for all elements, in any order */
+    {
+	if (E [e])
+	{
+#ifndef NDEBUG
+	    UMF_dump_element (Numeric, Work, e, FALSE) ;
+#endif
+	    p = Numeric->Memory + E [e] ;
+	    GET_ELEMENT_PATTERN (ep, p, Cols, Rows, ncols) ;
+	    nrows = ep->nrows ;
+	    for (i = 0 ; i < nrows ; i++)
+	    {
+		row = Rows [i] ;
+		ASSERT (row == EMPTY || (row >= n1 && row < n_row)) ;
+		if (row >= n1)
+		{
+		    ASSERT (NON_PIVOTAL_ROW (row)) ;
+		    Row_tlen [row] ++ ;
+		}
+	    }
+	    for (i = 0 ; i < ncols ; i++)
+	    {
+		col = Cols [i] ;
+		ASSERT (col == EMPTY || (col >= n1 && col < n_col)) ;
+		if (col >= n1)
+		{
+		    ASSERT (NON_PIVOTAL_COL (col)) ;
+		    Col_tlen [col] ++ ;
+		}
+	    }
+	}
+    }
+
+    /* note: tuple lengths are now modified, but the tuple lists are not */
+    /* updated to reflect that fact. */
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the required memory to hold all the tuple lists */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG0 (("UMF_build_tuples_usage\n")) ;
+
+    usage = 0 ;
+    dusage = 0 ;
+
+    ASSERT (Col_tlen && Col_degree) ;
+
+    for (col = n1 ; col < n_col ; col++)
+    {
+	if (NON_PIVOTAL_COL (col))
+	{
+	    usage  += 1 +  UNITS (Tuple, TUPLES (Col_tlen [col])) ;
+	    dusage += 1 + DUNITS (Tuple, TUPLES (Col_tlen [col])) ;
+	    DEBUG0 ((" col: "ID" tlen "ID" usage so far: "ID"\n",
+		     col, Col_tlen [col], usage)) ;
+	}
+    }
+
+    ASSERT (Row_tlen && Row_degree) ;
+
+    for (row = n1 ; row < n_row ; row++)
+    {
+	if (NON_PIVOTAL_ROW (row))
+	{
+	    usage  += 1 +  UNITS (Tuple, TUPLES (Row_tlen [row])) ;
+	    dusage += 1 + DUNITS (Tuple, TUPLES (Row_tlen [row])) ;
+	    DEBUG0 ((" row: "ID" tlen "ID" usage so far: "ID"\n",
+		     row, Row_tlen [row], usage)) ;
+	}
+    }
+
+    DEBUG0 (("UMF_build_tuples_usage "ID" %g\n", usage, dusage)) ;
+
+    *p_dusage = dusage ;
+    return (usage) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_tuple_lengths.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_tuple_lengths
+(
+    NumericType *Numeric,
+    WorkType *Work,
+    double *dusage
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_usolve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,226 @@
+/* ========================================================================== */
+/* === UMF_usolve =========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  solves Ux = b, where U is the upper triangular factor of a matrix. */
+/*  B is overwritten with the solution X. */
+/*  Returns the floating point operation count */
+
+#include "umf_internal.h"
+
+GLOBAL double UMF_usolve
+(
+    NumericType *Numeric,
+    Entry X [ ],		/* b on input, solution x on output */
+    Int Pattern [ ]		/* a work array of size n */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry xk ;
+    Entry *xp, *D, *Uval ;
+    Int k, deg, j, *ip, col, *Upos, *Uilen, pos,
+	*Uip, n, ulen, up, newUchain, npiv, n1, *Ui ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    if (Numeric->n_row != Numeric->n_col) return (0.) ;
+    n = Numeric->n_row ;
+    npiv = Numeric->npiv ;
+    Upos = Numeric->Upos ;
+    Uilen = Numeric->Uilen ;
+    Uip = Numeric->Uip ;
+    D = Numeric->D ;
+    n1 = Numeric->n1 ;
+
+#ifndef NDEBUG
+    DEBUG4 (("Usolve start:  npiv = "ID" n = "ID"\n", npiv, n)) ;
+    for (j = 0 ; j < n ; j++)
+    {
+	DEBUG4 (("Usolve start "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* singular case */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NO_DIVIDE_BY_ZERO
+    /* handle the singular part of D, up to just before the last pivot */
+    for (k = n-1 ; k >= npiv ; k--)
+    {
+	/* This is an *** intentional *** divide-by-zero, to get Inf or Nan,
+	 * as appropriate.  It is not a bug. */
+	ASSERT (IS_ZERO (D [k])) ;
+	xk = X [k] ;
+	/* X [k] = xk / D [k] ; */
+	DIV (X [k], xk, D [k]) ;
+    }
+#else
+    /* Do not divide by zero */
+#endif
+
+    deg = Numeric->ulen ;
+    if (deg > 0)
+    {
+	/* :: make last pivot row of U (singular matrices only) :: */
+	for (j = 0 ; j < deg ; j++)
+	{
+	    DEBUG1 (("Last row of U: j="ID"\n", j)) ;
+	    DEBUG1 (("Last row of U: Upattern[j]="ID"\n",
+		Numeric->Upattern [j]) );
+	    Pattern [j] = Numeric->Upattern [j] ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* nonsingletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = npiv-1 ; k >= n1 ; k--)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* use row k of U */
+	/* ------------------------------------------------------------------ */
+
+	up = Uip [k] ;
+	ulen = Uilen [k] ;
+	newUchain = (up < 0) ;
+	if (newUchain)
+	{
+	    up = -up ;
+	    xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ;
+	}
+	else
+	{
+	    xp = (Entry *) (Numeric->Memory + up) ;
+	}
+
+	xk = X [k] ;
+	for (j = 0 ; j < deg ; j++)
+	{
+	    DEBUG4 (("  k "ID" col "ID" value", k, Pattern [j])) ;
+	    EDEBUG4 (*xp) ;
+	    DEBUG4 (("\n")) ;
+	    /* xk -= X [Pattern [j]] * (*xp) ; */
+	    MULT_SUB (xk, X [Pattern [j]], *xp) ;
+	    xp++ ;
+	}
+
+#ifndef NO_DIVIDE_BY_ZERO
+	/* Go ahead and divide by zero if D [k] is zero */
+	/* X [k] = xk / D [k] ; */
+	DIV (X [k], xk, D [k]) ;
+#else
+	/* Do not divide by zero */
+	if (IS_NONZERO (D [k]))
+	{
+	    /* X [k] = xk / D [k] ; */
+	    DIV (X [k], xk, D [k]) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* make row k-1 of U in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	if (k == n1) break ;
+
+	if (newUchain)
+	{
+	    /* next row is a new Uchain */
+	    deg = ulen ;
+	    ASSERT (IMPLIES (k == 0, deg == 0)) ;
+	    DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ;
+	    ip = (Int *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = *ip++ ;
+		DEBUG4 (("  k "ID" col "ID"\n", k-1, col)) ;
+		ASSERT (k <= col) ;
+		Pattern [j] = col ;
+	    }
+	}
+	else
+	{
+	    deg -= ulen ;
+	    DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k, deg)) ;
+	    ASSERT (deg >= 0) ;
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* add the pivot column */
+		DEBUG4 (("k "ID" add pivot entry at pos "ID"\n", k, pos)) ;
+		ASSERT (pos >= 0 && pos <= deg) ;
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* singletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = n1 - 1 ; k >= 0 ; k--)
+    {
+	deg = Uilen [k] ;
+	xk = X [k] ;
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	if (deg > 0)
+	{
+	    up = Uip [k] ;
+	    Ui = (Int *) (Numeric->Memory + up) ;
+	    up += UNITS (Int, deg) ;
+	    Uval = (Entry *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  k "ID" col "ID" value", k, Ui [j])) ;
+		EDEBUG4 (Uval [j]) ;
+		DEBUG4 (("\n")) ;
+		/* xk -= X [Ui [j]] * Uval [j] ; */
+		ASSERT (Ui [j] >= 0 && Ui [j] < n) ;
+		MULT_SUB (xk, X [Ui [j]], Uval [j]) ;
+	    }
+	}
+
+#ifndef NO_DIVIDE_BY_ZERO
+	/* Go ahead and divide by zero if D [k] is zero */
+	/* X [k] = xk / D [k] ; */
+	DIV (X [k], xk, D [k]) ;
+#else
+	/* Do not divide by zero */
+	if (IS_NONZERO (D [k]))
+	{
+	    /* X [k] = xk / D [k] ; */
+	    DIV (X [k], xk, D [k]) ;
+	}
+#endif
+
+    }
+
+#ifndef NDEBUG
+    for (j = 0 ; j < n ; j++)
+    {
+	DEBUG4 (("Usolve done "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("Usolve done.\n")) ;
+#endif
+
+    return (DIV_FLOPS * ((double) n) + MULTSUB_FLOPS * ((double) Numeric->unz));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_usolve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,12 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL double UMF_usolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,331 @@
+/* ========================================================================== */
+/* === UMF_utsolve ========================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  solves U'x = b or U.'x=b, where U is the upper triangular factor of a */
+/*  matrix.  B is overwritten with the solution X. */
+/*  Returns the floating point operation count */
+
+#include "umf_internal.h"
+
+GLOBAL double
+#ifdef CONJUGATE_SOLVE
+UMF_uhsolve			/* solve U'x=b  (complex conjugate transpose) */
+#else
+UMF_utsolve			/* solve U.'x=b (array transpose) */
+#endif
+(
+    NumericType *Numeric,
+    Entry X [ ],		/* b on input, solution x on output */
+    Int Pattern [ ]		/* a work array of size n */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry xk ;
+    Entry *xp, *D, *Uval ;
+    Int k, deg, j, *ip, col, *Upos, *Uilen, kstart, kend, up,
+	*Uip, n, uhead, ulen, pos, npiv, n1, *Ui ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    if (Numeric->n_row != Numeric->n_col) return (0.) ;
+    n = Numeric->n_row ;
+    npiv = Numeric->npiv ;
+    Upos = Numeric->Upos ;
+    Uilen = Numeric->Uilen ;
+    Uip = Numeric->Uip ;
+    D = Numeric->D ;
+    kend = 0 ;
+    n1 = Numeric->n1 ;
+
+#ifndef NDEBUG
+    DEBUG4 (("Utsolve start: npiv "ID" n "ID"\n", npiv, n)) ;
+    for (j = 0 ; j < n ; j++)
+    {
+	DEBUG4 (("Utsolve start "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* singletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+
+#ifndef NO_DIVIDE_BY_ZERO
+	/* Go ahead and divide by zero if D [k] is zero. */
+#ifdef CONJUGATE_SOLVE
+	/* xk = X [k] / conjugate (D [k]) ; */
+	DIV_CONJ (xk, X [k], D [k]) ;
+#else
+	/* xk = X [k] / D [k] ; */
+	DIV (xk, X [k], D [k]) ;
+#endif
+#else
+	/* Do not divide by zero */
+	if (IS_NONZERO (D [k]))
+	{
+#ifdef CONJUGATE_SOLVE
+	    /* xk = X [k] / conjugate (D [k]) ; */
+	    DIV_CONJ (xk, X [k], D [k]) ;
+#else
+	    /* xk = X [k] / D [k] ; */
+	    DIV (xk, X [k], D [k]) ;
+#endif
+	}
+#endif
+
+	X [k] = xk ;
+	deg = Uilen [k] ;
+	if (deg > 0 && IS_NONZERO (xk))
+	{
+	    up = Uip [k] ;
+	    Ui = (Int *) (Numeric->Memory + up) ;
+	    up += UNITS (Int, deg) ;
+	    Uval = (Entry *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		DEBUG4 (("  k "ID" col "ID" value", k, Ui [j])) ;
+		EDEBUG4 (Uval [j]) ;
+		DEBUG4 (("\n")) ;
+#ifdef CONJUGATE_SOLVE
+		/* X [Ui [j]] -= xk * conjugate (Uval [j]) ; */
+		MULT_SUB_CONJ (X [Ui [j]], xk, Uval [j]) ;
+#else
+		/* X [Ui [j]] -= xk * Uval [j] ; */
+		MULT_SUB (X [Ui [j]], xk, Uval [j]) ;
+#endif
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* nonsingletons */
+    /* ---------------------------------------------------------------------- */
+
+    for (kstart = n1 ; kstart < npiv ; kstart = kend + 1)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* find the end of this Uchain */
+	/* ------------------------------------------------------------------ */
+
+	DEBUG4 (("kstart "ID" kend "ID"\n", kstart, kend)) ;
+	/* for (kend = kstart ; kend < npiv && Uip [kend+1] > 0 ; kend++) ; */
+	kend = kstart ;
+	while (kend < npiv && Uip [kend+1] > 0)
+	{
+	    kend++ ;
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* scan the whole Uchain to find the pattern of the first row of U */
+	/* ------------------------------------------------------------------ */
+
+	k = kend+1 ;
+	DEBUG4 (("\nKend "ID" K "ID"\n", kend, k)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* start with last row in Uchain of U in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	if (k == npiv)
+	{
+	    deg = Numeric->ulen ;
+	    if (deg > 0)
+	    {
+		/* :: make last pivot row of U (singular matrices only) :: */
+		for (j = 0 ; j < deg ; j++)
+		{
+		    Pattern [j] = Numeric->Upattern [j] ;
+		}
+	    }
+	}
+	else
+	{
+	    ASSERT (k >= 0 && k < npiv) ;
+	    up = -Uip [k] ;
+	    ASSERT (up > 0) ;
+	    deg = Uilen [k] ;
+	    DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ;
+	    ip = (Int *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = *ip++ ;
+		DEBUG4 (("  k "ID" col "ID"\n", k-1, col)) ;
+		ASSERT (k <= col) ;
+		Pattern [j] = col ;
+	    }
+	}
+
+	/* empty the stack at the bottom of Pattern */
+	uhead = n ;
+
+	for (k = kend ; k > kstart ; k--)
+	{
+	    /* Pattern [0..deg-1] is the pattern of row k of U */
+
+	    /* -------------------------------------------------------------- */
+	    /* make row k-1 of U in Pattern [0..deg-1] */
+	    /* -------------------------------------------------------------- */
+
+	    ASSERT (k >= 0 && k < npiv) ;
+	    ulen = Uilen [k] ;
+	    /* delete, and push on the stack */
+	    for (j = 0 ; j < ulen ; j++)
+	    {
+		ASSERT (uhead >= deg) ;
+		Pattern [--uhead] = Pattern [--deg] ;
+	    }
+	    DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k, deg)) ;
+	    ASSERT (deg >= 0) ;
+
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* add the pivot column */
+		DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ;
+		ASSERT (pos >= 0 && pos <= deg) ;
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	}
+
+	/* Pattern [0..deg-1] is now the pattern of the first row in Uchain */
+
+	/* ------------------------------------------------------------------ */
+	/* solve using this Uchain, in reverse order */
+	/* ------------------------------------------------------------------ */
+
+	DEBUG4 (("Unwinding Uchain\n")) ;
+	for (k = kstart ; k <= kend ; k++)
+	{
+
+	    /* -------------------------------------------------------------- */
+	    /* construct row k */
+	    /* -------------------------------------------------------------- */
+
+	    ASSERT (k >= 0 && k < npiv) ;
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* remove the pivot column */
+		DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ;
+		ASSERT (k > kstart) ;
+		ASSERT (pos >= 0 && pos < deg) ;
+		ASSERT (Pattern [pos] == k) ;
+		Pattern [pos] = Pattern [--deg] ;
+	    }
+
+	    up = Uip [k] ;
+	    ulen = Uilen [k] ;
+	    if (k > kstart)
+	    {
+		/* concatenate the deleted pattern; pop from the stack */
+		for (j = 0 ; j < ulen ; j++)
+		{
+		    ASSERT (deg <= uhead && uhead < n) ;
+		    Pattern [deg++] = Pattern [uhead++] ;
+		}
+		DEBUG4 (("middle of chain, row of U "ID" deg "ID"\n", k, deg)) ;
+		ASSERT (deg >= 0) ;
+	    }
+
+	    /* -------------------------------------------------------------- */
+	    /* use row k of U */
+	    /* -------------------------------------------------------------- */
+
+#ifndef NO_DIVIDE_BY_ZERO
+	    /* Go ahead and divide by zero if D [k] is zero. */
+#ifdef CONJUGATE_SOLVE
+	    /* xk = X [k] / conjugate (D [k]) ; */
+	    DIV_CONJ (xk, X [k], D [k]) ;
+#else
+	    /* xk = X [k] / D [k] ; */
+	    DIV (xk, X [k], D [k]) ;
+#endif
+#else
+	    /* Do not divide by zero */
+	    if (IS_NONZERO (D [k]))
+	    {
+#ifdef CONJUGATE_SOLVE
+		/* xk = X [k] / conjugate (D [k]) ; */
+		DIV_CONJ (xk, X [k], D [k]) ;
+#else
+		/* xk = X [k] / D [k] ; */
+		DIV (xk, X [k], D [k]) ;
+#endif
+	    }
+#endif
+
+	    X [k] = xk ;
+	    if (IS_NONZERO (xk))
+	    {
+		if (k == kstart)
+		{
+		    up = -up ;
+		    xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ;
+		}
+		else
+		{
+		    xp = (Entry *) (Numeric->Memory + up) ;
+		}
+		for (j = 0 ; j < deg ; j++)
+		{
+		    DEBUG4 (("  k "ID" col "ID" value", k, Pattern [j])) ;
+		    EDEBUG4 (*xp) ;
+		    DEBUG4 (("\n")) ;
+#ifdef CONJUGATE_SOLVE
+		    /* X [Pattern [j]] -= xk * conjugate (*xp) ; */
+		    MULT_SUB_CONJ (X [Pattern [j]], xk, *xp) ;
+#else
+		    /* X [Pattern [j]] -= xk * (*xp) ; */
+		    MULT_SUB (X [Pattern [j]], xk, *xp) ;
+#endif
+		    xp++ ;
+		}
+	    }
+	}
+	ASSERT (uhead == n) ;
+    }
+
+#ifndef NO_DIVIDE_BY_ZERO
+    for (k = npiv ; k < n ; k++)
+    {
+	/* This is an *** intentional *** divide-by-zero, to get Inf or Nan,
+	 * as appropriate.  It is not a bug. */
+	ASSERT (IS_ZERO (D [k])) ;
+	/* For conjugate solve, D [k] == conjugate (D [k]), in this case */
+	/* xk = X [k] / D [k] ; */
+	DIV (xk, X [k], D [k]) ;
+	X [k] = xk ;
+    }
+#endif
+
+#ifndef NDEBUG
+    for (j = 0 ; j < n ; j++)
+    {
+	DEBUG4 (("Utsolve done "ID": ", j)) ;
+	EDEBUG4 (X [j]) ;
+	DEBUG4 (("\n")) ;
+    }
+    DEBUG4 (("Utsolve done.\n")) ;
+#endif
+
+    return (DIV_FLOPS * ((double) n) + MULTSUB_FLOPS * ((double) Numeric->unz));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_utsolve.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,20 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL double UMF_utsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
+
+
+GLOBAL double UMF_uhsolve
+(
+    NumericType *Numeric,
+    Entry X [ ],
+    Int Pattern [ ]
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,46 @@
+/* ========================================================================== */
+/* === UMF_valid_numeric ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/* Returns TRUE if the Numeric object is valid, FALSE otherwise. */
+/* Does not check everything.  UMFPACK_report_numeric checks more. */
+
+#include "umf_internal.h"
+
+GLOBAL Int UMF_valid_numeric
+(
+    NumericType *Numeric
+)
+{
+    /* This routine does not check the contents of the individual arrays, so */
+    /* it can miss some errors.  All it checks for is the presence of the */
+    /* arrays, and the Numeric "valid" entry. */
+
+    if (!Numeric)
+    {
+	return (FALSE) ;
+    }
+
+    if (Numeric->valid != NUMERIC_VALID)
+    {
+	/* Numeric does not point to a NumericType object */
+	return (FALSE) ;
+    }
+
+    if (Numeric->n_row <= 0 || Numeric->n_col <= 0 || !Numeric->D ||
+	!Numeric->Rperm || !Numeric->Cperm ||
+	!Numeric->Lpos || !Numeric->Upos ||
+	!Numeric->Lilen || !Numeric->Uilen || !Numeric->Lip || !Numeric->Uip ||
+	!Numeric->Memory || (Numeric->ulen > 0 && !Numeric->Upattern))
+    {
+	return (FALSE) ;
+    }
+
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_numeric.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,10 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_valid_numeric
+(
+    NumericType *Numeric
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,47 @@
+/* ========================================================================== */
+/* === UMF_valid_symbolic =================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+#include "umf_internal.h"
+
+/* Returns TRUE if the Symbolic object is valid, FALSE otherwise. */
+/* The UMFPACK_report_symbolic routine does a more thorough check. */
+
+GLOBAL Int UMF_valid_symbolic
+(
+    SymbolicType *Symbolic
+)
+{
+    /* This routine does not check the contents of the individual arrays, so */
+    /* it can miss some errors.  All it checks for is the presence of the */
+    /* arrays, and the Symbolic "valid" entry. */
+
+    if (!Symbolic)
+    {
+	return (FALSE) ;
+    }
+
+    if (Symbolic->valid != SYMBOLIC_VALID)
+    {
+	/* Symbolic does not point to a SymbolicType object */
+	return (FALSE) ;
+    }
+
+    if (!Symbolic->Cperm_init || !Symbolic->Rperm_init ||
+	!Symbolic->Front_npivcol || !Symbolic->Front_1strow ||
+	!Symbolic->Front_leftmostdesc ||
+	!Symbolic->Front_parent || !Symbolic->Chain_start ||
+	!Symbolic->Chain_maxrows || !Symbolic->Chain_maxcols ||
+	Symbolic->n_row <= 0 || Symbolic->n_col <= 0)
+    {
+	return (FALSE) ;
+    }
+
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_valid_symbolic.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,10 @@
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+GLOBAL Int UMF_valid_symbolic
+(
+    SymbolicType *Symbolic
+) ;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umf_version.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1001 @@
+/* ========================================================================== */
+/* === umf_version.h ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+   Define routine names, depending on version being compiled.
+
+   DINT:	double precision, int's as integers
+   DLONG:	double precision, long's as integers
+   ZLONG:	complex double precision, long's as integers
+   ZINT:	complex double precision, int's as integers
+*/
+
+/* Set DINT as the default, if nothing is defined */
+#if !defined (DLONG) && !defined (DINT) && !defined (ZLONG) && !defined (ZINT)
+#define DINT
+#endif
+
+/* Determine if this is a real or complex version */
+#if defined (ZLONG) || defined (ZINT)
+#define COMPLEX
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* integer type (Int is int or long) now defined in amd_internal.h */
+/* -------------------------------------------------------------------------- */
+
+#if defined (DLONG) || defined (ZLONG)
+#define LONG_INTEGER
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* Numerical relop macros for correctly handling the NaN case */
+/* -------------------------------------------------------------------------- */
+
+/*
+SCALAR_IS_NAN(x):
+    True if x is NaN.  False otherwise.  The commonly-existing isnan(x)
+    function could be used, but it's not in Kernighan & Ritchie 2nd edition
+    (ANSI C).  It may appear in <math.h>, but I'm not certain about
+    portability.  The expression x != x is true if and only if x is NaN,
+    according to the IEEE 754 floating-point standard.
+
+SCALAR_IS_ZERO(x):
+    True if x is zero.  False if x is nonzero, NaN, or +/- Inf.
+    This is (x == 0) if the compiler is IEEE 754 compliant.
+
+SCALAR_IS_NONZERO(x):
+    True if x is nonzero, NaN, or +/- Inf.  False if x zero.
+    This is (x != 0) if the compiler is IEEE 754 compliant.
+
+SCALAR_IS_LTZERO(x):
+    True if x is < zero or -Inf.  False if x is >= 0, NaN, or +Inf.
+    This is (x < 0) if the compiler is IEEE 754 compliant.
+*/
+
+#if defined (MATHWORKS)
+
+/* The MathWorks has their own macros in util.h that handle NaN's properly. */
+#define SCALAR_IS_NAN(x)	(utIsNaN (x))
+#define SCALAR_IS_ZERO(x)	(utEQZero (x))
+#define SCALAR_IS_NONZERO(x)	(utNEZero (x))
+#define SCALAR_IS_LTZERO(x)	(utLTZero (x))
+
+#elif defined (UMF_WINDOWS)
+
+/* Yes, this is exceedingly ugly.  Blame Microsoft, which hopelessly */
+/* violates the IEEE 754 floating-point standard in a bizarre way. */
+/* If you're using an IEEE 754-compliant compiler, then x != x is true */
+/* iff x is NaN.  For Microsoft, (x < x) is true iff x is NaN. */
+/* So either way, this macro safely detects a NaN. */
+#define SCALAR_IS_NAN(x)	(((x) != (x)) || (((x) < (x))))
+#define SCALAR_IS_ZERO(x)	(((x) == 0.) && !SCALAR_IS_NAN(x))
+#define SCALAR_IS_NONZERO(x)	(((x) != 0.) || SCALAR_IS_NAN(x))
+#define SCALAR_IS_LTZERO(x)	(((x) < 0.) && !SCALAR_IS_NAN(x))
+
+#else
+
+/* These all work properly, according to the IEEE 754 standard ... except on */
+/* a PC with windows.  Works fine in Linux on the same PC... */
+#define SCALAR_IS_NAN(x)	((x) != (x))
+#define SCALAR_IS_ZERO(x)	((x) == 0.)
+#define SCALAR_IS_NONZERO(x)	((x) != 0.)
+#define SCALAR_IS_LTZERO(x)	((x) < 0.)
+
+#endif
+
+/* scalar absolute value macro. If x is NaN, the result is NaN: */
+#define SCALAR_ABS(x) ((SCALAR_IS_LTZERO (x)) ? -(x) : (x))
+
+/* true if an integer (stored in double x) would overflow (or if x is NaN) */
+#define INT_OVERFLOW(x) ((!((x) * (1.0+1e-8) <= (double) Int_MAX)) \
+			|| SCALAR_IS_NAN (x))
+
+/* print a scalar (avoid printing "-0" for negative zero).  */
+#define PRINT_SCALAR(a) \
+{ \
+    if (SCALAR_IS_NONZERO (a)) \
+    { \
+	PRINTF ((" (%g)", (a))) ; \
+    } \
+    else \
+    { \
+	PRINTF ((" (0)")) ; \
+    } \
+}
+
+/* -------------------------------------------------------------------------- */
+/* Real floating-point arithmetic */
+/* -------------------------------------------------------------------------- */
+
+#ifndef COMPLEX
+
+#define Entry double
+
+#define SPLIT(s)    		    (1)
+#define REAL_COMPONENT(c)	    (c)
+#define IMAG_COMPONENT(c)	    (0.)
+#define ASSIGN(c,s1,s2,p,split)	    { (c) = (s1)[p] ; }
+#define CLEAR(c)		    { (c) = 0. ; }
+#define CLEAR_AND_INCREMENT(p)	    { *p++ = 0. ; }
+#define IS_NAN(a)		    SCALAR_IS_NAN (a)
+#define IS_ZERO(a)		    SCALAR_IS_ZERO (a)
+#define IS_NONZERO(a)		    SCALAR_IS_NONZERO (a)
+#define SCALE_DIV(c,s)		    { (c) /= (s) ; }
+#define SCALE(c,s)		    { (c) *= (s) ; }
+#define ASSEMBLE(c,a)		    { (c) += (a) ; }
+#define ASSEMBLE_AND_INCREMENT(c,p) { (c) += *p++ ; }
+#define DECREMENT(c,a)		    { (c) -= (a) ; }
+#define MULT(c,a,b)		    { (c) = (a) * (b) ; }
+#define MULT_CONJ(c,a,b)	    { (c) = (a) * (b) ; }
+#define MULT_SUB(c,a,b)		    { (c) -= (a) * (b) ; }
+#define MULT_SUB_CONJ(c,a,b)	    { (c) -= (a) * (b) ; }
+#define DIV(c,a,b)		    { (c) = (a) / (b) ; }
+#define RECIPROCAL(c)		    { (c) = 1.0 / (c) ; }
+#define DIV_CONJ(c,a,b)		    { (c) = (a) / (b) ; }
+#define APPROX_ABS(s,a)		    { (s) = SCALAR_ABS (a) ; }
+#define ABS(s,a)		    { (s) = SCALAR_ABS (a) ; }
+#define PRINT_ENTRY(a)		    PRINT_SCALAR (a)
+
+/* for flop counts */
+#define MULTSUB_FLOPS	2.	/* c -= a*b */
+#define DIV_FLOPS	1.	/* c = a/b */
+#define ABS_FLOPS	0.	/* c = abs (a) */
+#define ASSEMBLE_FLOPS	1.	/* c += a */
+#define DECREMENT_FLOPS	1.	/* c -= a */
+#define MULT_FLOPS	1.	/* c = a*b */
+#define SCALE_FLOPS	1.	/* c = a/s */
+
+#else
+
+/* -------------------------------------------------------------------------- */
+/* Complex floating-point arithmetic */
+/* -------------------------------------------------------------------------- */
+
+/*
+    Note:  An alternative to this DoubleComplex type would be to use a
+    struct { double r ; double i ; }.  The problem with that method
+    (used by the Sun Performance Library, for example) is that ANSI C provides
+    no guarantee about the layout of a struct.  It is possible that the sizeof
+    the struct above would be greater than 2 * sizeof (double).  This would
+    mean that the complex BLAS could not be used.  The method used here avoids
+    that possibility.  ANSI C *does* guarantee that an array of structs has
+    the same size as n times the size of one struct.
+
+    The ANSI C99 version of the C language includes a "double _Complex" type.
+    It should be possible in that case to do the following:
+
+    #define Entry double _Complex
+
+    and remove the DoubleComplex struct.  The macros, below, could then be
+    replaced with instrinsic operators.  Note that the #define Real and
+    #define Imag should also be removed (they only appear in this file).
+
+    For the MULT, MULT_SUB, MULT_SUB_CONJ, and MULT_CONJ macros,
+    the output argument c cannot be the same as any input argument.
+
+*/
+
+typedef struct
+{
+    double component [2] ;	/* real and imaginary parts */
+
+} DoubleComplex ;
+
+#define Entry DoubleComplex
+#define Real component [0]
+#define Imag component [1]
+
+/* for flop counts */
+#define MULTSUB_FLOPS	8.	/* c -= a*b */
+#define DIV_FLOPS	9.	/* c = a/b */
+#define ABS_FLOPS	6.	/* c = abs (a), count sqrt as one flop */
+#define ASSEMBLE_FLOPS	2.	/* c += a */
+#define DECREMENT_FLOPS	2.	/* c -= a */
+#define MULT_FLOPS	6.	/* c = a*b */
+#define SCALE_FLOPS	2.	/* c = a/s or c = a*s */
+
+/* -------------------------------------------------------------------------- */
+
+/* real part of c */
+#define REAL_COMPONENT(c) ((c).Real)
+
+/* -------------------------------------------------------------------------- */
+
+/* imag part of c */
+#define IMAG_COMPONENT(c) ((c).Imag)
+
+/* -------------------------------------------------------------------------- */
+
+/* Return TRUE if a complex number is in split form, FALSE if in packed form */
+#define SPLIT(sz) ((sz) != (double *) NULL)
+
+/* -------------------------------------------------------------------------- */
+
+/* c = (s1) + (s2)*i, if s2 is null, then X is in "packed" format (compatible
+ * with Entry and ANSI C99 double _Complex type).  */
+#define ASSIGN(c,s1,s2,p,split)	\
+{ \
+    if (split) \
+    { \
+        (c).Real = (s1)[p] ; \
+        (c).Imag = (s2)[p] ; \
+    }  \
+    else \
+    { \
+ 	(c) = ((Entry *)(s1))[p] ; \
+    }  \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c = 0 */
+#define CLEAR(c) \
+{ \
+    (c).Real = 0. ; \
+    (c).Imag = 0. ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* *p++ = 0 */
+#define CLEAR_AND_INCREMENT(p) \
+{ \
+    p->Real = 0. ; \
+    p->Imag = 0. ; \
+    p++ ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* True if a == 0 */
+#define IS_ZERO(a) \
+    (SCALAR_IS_ZERO ((a).Real) && SCALAR_IS_ZERO ((a).Imag))
+
+/* -------------------------------------------------------------------------- */
+
+/* True if a is NaN */
+#define IS_NAN(a) \
+    (SCALAR_IS_NAN ((a).Real) || SCALAR_IS_NAN ((a).Imag))
+
+/* -------------------------------------------------------------------------- */
+
+/* True if a != 0 */
+#define IS_NONZERO(a) \
+    (SCALAR_IS_NONZERO ((a).Real) || SCALAR_IS_NONZERO ((a).Imag))
+
+/* -------------------------------------------------------------------------- */
+
+/* c /= s */
+#define SCALE_DIV(c,s) \
+{ \
+    (c).Real /= (s) ; \
+    (c).Imag /= (s) ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c *= s */
+#define SCALE(c,s) \
+{ \
+    (c).Real *= (s) ; \
+    (c).Imag *= (s) ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c += a */
+#define ASSEMBLE(c,a) \
+{ \
+    (c).Real += (a).Real ; \
+    (c).Imag += (a).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c += *p++ */
+#define ASSEMBLE_AND_INCREMENT(c,p) \
+{ \
+    (c).Real += p->Real ; \
+    (c).Imag += p->Imag ; \
+    p++ ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c -= a */
+#define DECREMENT(c,a) \
+{ \
+    (c).Real -= (a).Real ; \
+    (c).Imag -= (a).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c = a*b, assert because c cannot be the same as a or b */
+#define MULT(c,a,b) \
+{ \
+    ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
+    (c).Real = (a).Real * (b).Real - (a).Imag * (b).Imag ; \
+    (c).Imag = (a).Imag * (b).Real + (a).Real * (b).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c = a*conjugate(b), assert because c cannot be the same as a or b */
+#define MULT_CONJ(c,a,b) \
+{ \
+    ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
+    (c).Real = (a).Real * (b).Real + (a).Imag * (b).Imag ; \
+    (c).Imag = (a).Imag * (b).Real - (a).Real * (b).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c -= a*b, assert because c cannot be the same as a or b */
+#define MULT_SUB(c,a,b) \
+{ \
+    ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
+    (c).Real -= (a).Real * (b).Real - (a).Imag * (b).Imag ; \
+    (c).Imag -= (a).Imag * (b).Real + (a).Real * (b).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c -= a*conjugate(b), assert because c cannot be the same as a or b */
+#define MULT_SUB_CONJ(c,a,b) \
+{ \
+    ASSERT (&(c) != &(a) && &(c) != &(b)) ; \
+    (c).Real -= (a).Real * (b).Real + (a).Imag * (b).Imag ; \
+    (c).Imag -= (a).Imag * (b).Real - (a).Real * (b).Imag ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* c = a/b, be careful to avoid underflow and overflow */
+#ifdef MATHWORKS
+#define DIV(c,a,b) \
+{ \
+    (void) utDivideComplex ((a).Real, (a).Imag, (b).Real, (b).Imag, \
+	&((c).Real), &((c).Imag)) ; \
+}
+#else
+/* This uses ACM Algo 116, by R. L. Smith, 1962. */
+/* c can be the same variable as a or b. */
+/* Ignore NaN case for double relop br>=bi. */
+#define DIV(c,a,b) \
+{ \
+    double r, den, ar, ai, br, bi ; \
+    br = (b).Real ; \
+    bi = (b).Imag ; \
+    ar = (a).Real ; \
+    ai = (a).Imag ; \
+    if (SCALAR_ABS (br) >= SCALAR_ABS (bi)) \
+    { \
+	r = bi / br ; \
+	den = br + r * bi ; \
+	(c).Real = (ar + ai * r) / den ; \
+	(c).Imag = (ai - ar * r) / den ; \
+    } \
+    else \
+    { \
+	r = br / bi ; \
+	den = r * br + bi ; \
+	(c).Real = (ar * r + ai) / den ; \
+	(c).Imag = (ai * r - ar) / den ; \
+    } \
+}
+#endif
+
+/* -------------------------------------------------------------------------- */
+
+/* c = 1/c, be careful to avoid underflow and overflow */
+/* Not used if MATHWORKS is defined. */
+/* This uses ACM Algo 116, by R. L. Smith, 1962. */
+/* Ignore NaN case for double relop cr>=ci. */
+#define RECIPROCAL(c) \
+{ \
+    double r, den, cr, ci ; \
+    cr = (c).Real ; \
+    ci = (c).Imag ; \
+    if (SCALAR_ABS (cr) >= SCALAR_ABS (ci)) \
+    { \
+	r = ci / cr ; \
+	den = cr + r * ci ; \
+	(c).Real = 1.0 / den ; \
+	(c).Imag = - r / den ; \
+    } \
+    else \
+    { \
+	r = cr / ci ; \
+	den = r * cr + ci ; \
+	(c).Real = r / den ; \
+	(c).Imag = - 1.0 / den ; \
+    } \
+}
+
+
+/* -------------------------------------------------------------------------- */
+
+/* c = a/conjugate(b), be careful to avoid underflow and overflow */
+#ifdef MATHWORKS
+#define DIV_CONJ(c,a,b) \
+{ \
+    (void) utDivideComplex ((a).Real, (a).Imag, (b).Real, (-(b).Imag), \
+	&((c).Real), &((c).Imag)) ; \
+}
+#else
+/* This uses ACM Algo 116, by R. L. Smith, 1962. */
+/* c can be the same variable as a or b. */
+/* Ignore NaN case for double relop br>=bi. */
+#define DIV_CONJ(c,a,b) \
+{ \
+    double r, den, ar, ai, br, bi ; \
+    br = (b).Real ; \
+    bi = (b).Imag ; \
+    ar = (a).Real ; \
+    ai = (a).Imag ; \
+    if (SCALAR_ABS (br) >= SCALAR_ABS (bi)) \
+    { \
+	r = (-bi) / br ; \
+	den = br - r * bi ; \
+	(c).Real = (ar + ai * r) / den ; \
+	(c).Imag = (ai - ar * r) / den ; \
+    } \
+    else \
+    { \
+	r = br / (-bi) ; \
+	den =  r * br - bi; \
+	(c).Real = (ar * r + ai) / den ; \
+	(c).Imag = (ai * r - ar) / den ; \
+    } \
+}
+#endif
+
+/* -------------------------------------------------------------------------- */
+
+/* approximate absolute value, s = |r|+|i| */
+#define APPROX_ABS(s,a) \
+{ \
+    (s) = SCALAR_ABS ((a).Real) + SCALAR_ABS ((a).Imag) ; \
+}
+
+/* -------------------------------------------------------------------------- */
+
+/* exact absolute value, s = sqrt (a.real^2 + amag^2) */
+#ifdef MATHWORKS
+#define ABS(s,a) \
+{ \
+    (s) = utFdlibm_hypot ((a).Real, (a).Imag) ; \
+}
+#else
+/* Ignore NaN case for the double relops ar>=ai and ar+ai==ar. */
+#define ABS(s,a) \
+{ \
+    double r, ar, ai ; \
+    ar = SCALAR_ABS ((a).Real) ; \
+    ai = SCALAR_ABS ((a).Imag) ; \
+    if (ar >= ai) \
+    { \
+	if (ar + ai == ar) \
+	{ \
+	    (s) = ar ; \
+	} \
+	else \
+	{ \
+	    r = ai / ar ; \
+	    (s) = ar * sqrt (1.0 + r*r) ; \
+	} \
+    } \
+    else \
+    { \
+	if (ai + ar == ai) \
+	{ \
+	    (s) = ai ; \
+	} \
+	else \
+	{ \
+	    r = ar / ai ; \
+	    (s) = ai * sqrt (1.0 + r*r) ; \
+	} \
+    } \
+}
+#endif
+
+/* -------------------------------------------------------------------------- */
+
+/* print an entry (avoid printing "-0" for negative zero).  */
+#define PRINT_ENTRY(a) \
+{ \
+    if (SCALAR_IS_NONZERO ((a).Real)) \
+    { \
+	PRINTF ((" (%g", (a).Real)) ; \
+    } \
+    else \
+    { \
+	PRINTF ((" (0")) ; \
+    } \
+    if (SCALAR_IS_LTZERO ((a).Imag)) \
+    { \
+	PRINTF ((" - %gi)", -(a).Imag)) ; \
+    } \
+    else if (SCALAR_IS_ZERO ((a).Imag)) \
+    { \
+	PRINTF ((" + 0i)")) ; \
+    } \
+    else \
+    { \
+	PRINTF ((" + %gi)", (a).Imag)) ; \
+    } \
+}
+
+/* -------------------------------------------------------------------------- */
+
+#endif	/* #ifndef COMPLEX */
+
+/* -------------------------------------------------------------------------- */
+/* Double precision, with int's as integers */
+/* -------------------------------------------------------------------------- */
+
+#ifdef DINT
+
+#define UMF_analyze		 umf_i_analyze
+#define UMF_apply_order		 umf_i_apply_order
+#define UMF_assemble		 umfdi_assemble
+#define UMF_assemble_fixq	 umfdi_assemble_fixq
+#define UMF_blas3_update	 umfdi_blas3_update
+#define UMF_build_tuples	 umfdi_build_tuples
+#define UMF_build_tuples_usage	 umfdi_build_tuples_usage
+#define UMF_colamd		 umf_i_colamd
+#define UMF_colamd_set_defaults	 umf_i_colamd_set_defaults
+#define UMF_create_element	 umfdi_create_element
+#define UMF_extend_front	 umfdi_extend_front
+#define UMF_free		 umf_i_free
+#define UMF_fsize		 umf_i_fsize
+#define UMF_garbage_collection	 umfdi_garbage_collection
+#define UMF_get_memory		 umfdi_get_memory
+#define UMF_grow_front		 umfdi_grow_front
+#define UMF_init_front		 umfdi_init_front
+#define UMF_is_permutation	 umf_i_is_permutation
+#define UMF_kernel		 umfdi_kernel
+#define UMF_kernel_init		 umfdi_kernel_init
+#define UMF_kernel_init_usage	 umfdi_kernel_init_usage
+#define UMF_kernel_wrapup	 umfdi_kernel_wrapup
+#define UMF_local_search	 umfdi_local_search
+#define UMF_lsolve		 umfdi_lsolve
+#define UMF_ltsolve		 umfdi_ltsolve
+#define UMF_lhsolve		 umfdi_lhsolve
+#define UMF_malloc		 umf_i_malloc
+#define UMF_mem_alloc_element	 umfdi_mem_alloc_element
+#define UMF_mem_alloc_head_block umfdi_mem_alloc_head_block
+#define UMF_mem_alloc_tail_block umfdi_mem_alloc_tail_block
+#define UMF_mem_free_tail_block	 umfdi_mem_free_tail_block
+#define UMF_mem_init_memoryspace umfdi_mem_init_memoryspace
+#define UMF_realloc		 umf_i_realloc
+#define UMF_report_perm		 umf_i_report_perm
+#define UMF_report_vector	 umfdi_report_vector
+#define UMF_row_search		 umfdi_row_search
+#define UMF_scale		 umfdi_scale
+#define UMF_scale_column	 umfdi_scale_column
+#define UMF_set_stats		 umf_i_set_stats
+#define UMF_singletons		 umf_i_singletons
+#define UMF_solve		 umfdi_solve
+#define UMF_start_front		 umfdi_start_front
+#define UMF_store_lu		 umfdi_store_lu
+#define UMF_store_lu_drop	 umfdi_store_lu_drop
+#define UMF_symbolic_usage	 umfdi_symbolic_usage
+#define UMF_transpose		 umfdi_transpose
+#define UMF_tuple_lengths	 umfdi_tuple_lengths
+#define UMF_usolve		 umfdi_usolve
+#define UMF_utsolve		 umfdi_utsolve
+#define UMF_uhsolve		 umfdi_uhsolve
+#define UMF_valid_numeric	 umfdi_valid_numeric
+#define UMF_valid_symbolic	 umfdi_valid_symbolic
+#define UMF_triplet_map_x	 umfdi_triplet_map_x
+#define UMF_triplet_map_nox	 umfdi_triplet_map_nox
+#define UMF_triplet_nomap_x	 umfdi_triplet_nomap_x
+#define UMF_triplet_nomap_nox	 umfdi_triplet_nomap_nox
+#define UMF_2by2		 umfdi_2by2
+
+#define UMFPACK_col_to_triplet	 umfpack_di_col_to_triplet
+#define UMFPACK_defaults	 umfpack_di_defaults
+#define UMFPACK_free_numeric	 umfpack_di_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_di_free_symbolic
+#define UMFPACK_get_lunz	 umfpack_di_get_lunz
+#define UMFPACK_get_numeric	 umfpack_di_get_numeric
+#define UMFPACK_get_symbolic	 umfpack_di_get_symbolic
+#define UMFPACK_get_determinant	 umfpack_di_get_determinant
+#define UMFPACK_numeric		 umfpack_di_numeric
+#define UMFPACK_qsymbolic	 umfpack_di_qsymbolic
+#define UMFPACK_report_control	 umfpack_di_report_control
+#define UMFPACK_report_info	 umfpack_di_report_info
+#define UMFPACK_report_matrix	 umfpack_di_report_matrix
+#define UMFPACK_report_numeric	 umfpack_di_report_numeric
+#define UMFPACK_report_perm	 umfpack_di_report_perm
+#define UMFPACK_report_status	 umfpack_di_report_status
+#define UMFPACK_report_symbolic	 umfpack_di_report_symbolic
+#define UMFPACK_report_triplet	 umfpack_di_report_triplet
+#define UMFPACK_report_vector	 umfpack_di_report_vector
+#define UMFPACK_save_numeric	 umfpack_di_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_di_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_di_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_di_load_symbolic
+#define UMFPACK_scale		 umfpack_di_scale
+#define UMFPACK_solve		 umfpack_di_solve
+#define UMFPACK_symbolic	 umfpack_di_symbolic
+#define UMFPACK_transpose	 umfpack_di_transpose
+#define UMFPACK_triplet_to_col	 umfpack_di_triplet_to_col
+#define UMFPACK_wsolve		 umfpack_di_wsolve
+
+/* for debugging only: */
+#define UMF_malloc_count	 umf_i_malloc_count
+#define UMF_debug		 umfdi_debug
+#define UMF_allocfail		 umfdi_allocfail
+#define UMF_gprob		 umfdi_gprob
+#define UMF_dump_dense		 umfdi_dump_dense
+#define UMF_dump_element	 umfdi_dump_element
+#define UMF_dump_rowcol		 umfdi_dump_rowcol
+#define UMF_dump_matrix		 umfdi_dump_matrix
+#define UMF_dump_current_front	 umfdi_dump_current_front
+#define UMF_dump_lu		 umfdi_dump_lu
+#define UMF_dump_memory		 umfdi_dump_memory
+#define UMF_dump_packed_memory	 umfdi_dump_packed_memory
+#define UMF_dump_col_matrix	 umfdi_dump_col_matrix
+#define UMF_dump_chain		 umfdi_dump_chain
+#define UMF_dump_start		 umfdi_dump_start
+#define UMF_dump_rowmerge	 umfdi_dump_rowmerge
+#define UMF_dump_diagonal_map	 umfdi_dump_diagonal_map
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* Double precision, with long's as integers */
+/* -------------------------------------------------------------------------- */
+
+#ifdef DLONG
+
+#define UMF_analyze		 umf_l_analyze
+#define UMF_apply_order		 umf_l_apply_order
+#define UMF_assemble		 umfdl_assemble
+#define UMF_assemble_fixq	 umfdl_assemble_fixq
+#define UMF_blas3_update	 umfdl_blas3_update
+#define UMF_build_tuples	 umfdl_build_tuples
+#define UMF_build_tuples_usage	 umfdl_build_tuples_usage
+#define UMF_colamd		 umf_l_colamd
+#define UMF_colamd_set_defaults	 umf_l_colamd_set_defaults
+#define UMF_create_element	 umfdl_create_element
+#define UMF_extend_front	 umfdl_extend_front
+#define UMF_free		 umf_l_free
+#define UMF_fsize		 umf_l_fsize
+#define UMF_garbage_collection	 umfdl_garbage_collection
+#define UMF_get_memory		 umfdl_get_memory
+#define UMF_grow_front		 umfdl_grow_front
+#define UMF_init_front		 umfdl_init_front
+#define UMF_is_permutation	 umf_l_is_permutation
+#define UMF_kernel		 umfdl_kernel
+#define UMF_kernel_init		 umfdl_kernel_init
+#define UMF_kernel_init_usage	 umfdl_kernel_init_usage
+#define UMF_kernel_wrapup	 umfdl_kernel_wrapup
+#define UMF_local_search	 umfdl_local_search
+#define UMF_lsolve		 umfdl_lsolve
+#define UMF_ltsolve		 umfdl_ltsolve
+#define UMF_lhsolve		 umfdl_lhsolve
+#define UMF_malloc		 umf_l_malloc
+#define UMF_mem_alloc_element	 umfdl_mem_alloc_element
+#define UMF_mem_alloc_head_block umfdl_mem_alloc_head_block
+#define UMF_mem_alloc_tail_block umfdl_mem_alloc_tail_block
+#define UMF_mem_free_tail_block	 umfdl_mem_free_tail_block
+#define UMF_mem_init_memoryspace umfdl_mem_init_memoryspace
+#define UMF_realloc		 umf_l_realloc
+#define UMF_report_perm		 umf_l_report_perm
+#define UMF_report_vector	 umfdl_report_vector
+#define UMF_row_search		 umfdl_row_search
+#define UMF_scale		 umfdl_scale
+#define UMF_scale_column	 umfdl_scale_column
+#define UMF_set_stats		 umf_l_set_stats
+#define UMF_singletons		 umf_l_singletons
+#define UMF_solve		 umfdl_solve
+#define UMF_start_front		 umfdl_start_front
+#define UMF_store_lu		 umfdl_store_lu
+#define UMF_store_lu_drop	 umfdl_store_lu_drop
+#define UMF_symbolic_usage	 umfdl_symbolic_usage
+#define UMF_transpose		 umfdl_transpose
+#define UMF_tuple_lengths	 umfdl_tuple_lengths
+#define UMF_usolve		 umfdl_usolve
+#define UMF_utsolve		 umfdl_utsolve
+#define UMF_uhsolve		 umfdl_uhsolve
+#define UMF_valid_numeric	 umfdl_valid_numeric
+#define UMF_valid_symbolic	 umfdl_valid_symbolic
+#define UMF_triplet_map_x	 umfdl_triplet_map_x
+#define UMF_triplet_map_nox	 umfdl_triplet_map_nox
+#define UMF_triplet_nomap_x	 umfdl_triplet_nomap_x
+#define UMF_triplet_nomap_nox	 umfdl_triplet_nomap_nox
+#define UMF_2by2		 umfdl_2by2
+
+#define UMFPACK_col_to_triplet	 umfpack_dl_col_to_triplet
+#define UMFPACK_defaults	 umfpack_dl_defaults
+#define UMFPACK_free_numeric	 umfpack_dl_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_dl_free_symbolic
+#define UMFPACK_get_lunz	 umfpack_dl_get_lunz
+#define UMFPACK_get_numeric	 umfpack_dl_get_numeric
+#define UMFPACK_get_symbolic	 umfpack_dl_get_symbolic
+#define UMFPACK_get_determinant	 umfpack_dl_get_determinant
+#define UMFPACK_numeric		 umfpack_dl_numeric
+#define UMFPACK_qsymbolic	 umfpack_dl_qsymbolic
+#define UMFPACK_report_control	 umfpack_dl_report_control
+#define UMFPACK_report_info	 umfpack_dl_report_info
+#define UMFPACK_report_matrix	 umfpack_dl_report_matrix
+#define UMFPACK_report_numeric	 umfpack_dl_report_numeric
+#define UMFPACK_report_perm	 umfpack_dl_report_perm
+#define UMFPACK_report_status	 umfpack_dl_report_status
+#define UMFPACK_report_symbolic	 umfpack_dl_report_symbolic
+#define UMFPACK_report_triplet	 umfpack_dl_report_triplet
+#define UMFPACK_report_vector	 umfpack_dl_report_vector
+#define UMFPACK_save_numeric	 umfpack_dl_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_dl_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_dl_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_dl_load_symbolic
+#define UMFPACK_scale		 umfpack_dl_scale
+#define UMFPACK_solve		 umfpack_dl_solve
+#define UMFPACK_symbolic	 umfpack_dl_symbolic
+#define UMFPACK_transpose	 umfpack_dl_transpose
+#define UMFPACK_triplet_to_col	 umfpack_dl_triplet_to_col
+#define UMFPACK_wsolve		 umfpack_dl_wsolve
+
+/* for debugging only: */
+#define UMF_malloc_count	 umf_l_malloc_count
+#define UMF_debug		 umfdl_debug
+#define UMF_allocfail		 umfdl_allocfail
+#define UMF_gprob		 umfdl_gprob
+#define UMF_dump_dense		 umfdl_dump_dense
+#define UMF_dump_element	 umfdl_dump_element
+#define UMF_dump_rowcol		 umfdl_dump_rowcol
+#define UMF_dump_matrix		 umfdl_dump_matrix
+#define UMF_dump_current_front	 umfdl_dump_current_front
+#define UMF_dump_lu		 umfdl_dump_lu
+#define UMF_dump_memory		 umfdl_dump_memory
+#define UMF_dump_packed_memory	 umfdl_dump_packed_memory
+#define UMF_dump_col_matrix	 umfdl_dump_col_matrix
+#define UMF_dump_chain		 umfdl_dump_chain
+#define UMF_dump_start		 umfdl_dump_start
+#define UMF_dump_rowmerge	 umfdl_dump_rowmerge
+#define UMF_dump_diagonal_map	 umfdl_dump_diagonal_map
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* Complex double precision, with int's as integers */
+/* -------------------------------------------------------------------------- */
+
+#ifdef ZINT
+
+#define UMF_analyze		 umf_i_analyze
+#define UMF_apply_order		 umf_i_apply_order
+#define UMF_assemble		 umfzi_assemble
+#define UMF_assemble_fixq	 umfzi_assemble_fixq
+#define UMF_blas3_update	 umfzi_blas3_update
+#define UMF_build_tuples	 umfzi_build_tuples
+#define UMF_build_tuples_usage	 umfzi_build_tuples_usage
+#define UMF_colamd		 umf_i_colamd
+#define UMF_colamd_set_defaults	 umf_i_colamd_set_defaults
+#define UMF_create_element	 umfzi_create_element
+#define UMF_extend_front	 umfzi_extend_front
+#define UMF_free		 umf_i_free
+#define UMF_fsize		 umf_i_fsize
+#define UMF_garbage_collection	 umfzi_garbage_collection
+#define UMF_get_memory		 umfzi_get_memory
+#define UMF_grow_front		 umfzi_grow_front
+#define UMF_init_front		 umfzi_init_front
+#define UMF_is_permutation	 umf_i_is_permutation
+#define UMF_kernel		 umfzi_kernel
+#define UMF_kernel_init		 umfzi_kernel_init
+#define UMF_kernel_init_usage	 umfzi_kernel_init_usage
+#define UMF_kernel_wrapup	 umfzi_kernel_wrapup
+#define UMF_local_search	 umfzi_local_search
+#define UMF_lsolve		 umfzi_lsolve
+#define UMF_ltsolve		 umfzi_ltsolve
+#define UMF_lhsolve		 umfzi_lhsolve
+#define UMF_malloc		 umf_i_malloc
+#define UMF_mem_alloc_element	 umfzi_mem_alloc_element
+#define UMF_mem_alloc_head_block umfzi_mem_alloc_head_block
+#define UMF_mem_alloc_tail_block umfzi_mem_alloc_tail_block
+#define UMF_mem_free_tail_block	 umfzi_mem_free_tail_block
+#define UMF_mem_init_memoryspace umfzi_mem_init_memoryspace
+#define UMF_realloc		 umf_i_realloc
+#define UMF_report_perm		 umf_i_report_perm
+#define UMF_report_vector	 umfzi_report_vector
+#define UMF_row_search		 umfzi_row_search
+#define UMF_scale		 umfzi_scale
+#define UMF_scale_column	 umfzi_scale_column
+#define UMF_set_stats		 umfzi_set_stats
+#define UMF_singletons		 umf_i_singletons
+#define UMF_solve		 umfzi_solve
+#define UMF_start_front		 umfzi_start_front
+#define UMF_store_lu		 umfzi_store_lu
+#define UMF_store_lu_drop	 umfzi_store_lu_drop
+#define UMF_symbolic_usage	 umfzi_symbolic_usage
+#define UMF_transpose		 umfzi_transpose
+#define UMF_tuple_lengths	 umfzi_tuple_lengths
+#define UMF_usolve		 umfzi_usolve
+#define UMF_utsolve		 umfzi_utsolve
+#define UMF_uhsolve		 umfzi_uhsolve
+#define UMF_valid_numeric	 umfzi_valid_numeric
+#define UMF_valid_symbolic	 umfzi_valid_symbolic
+#define UMF_triplet_map_x	 umfzi_triplet_map_x
+#define UMF_triplet_map_nox	 umfzi_triplet_map_nox
+#define UMF_triplet_nomap_x	 umfzi_triplet_nomap_x
+#define UMF_triplet_nomap_nox	 umfzi_triplet_nomap_nox
+#define UMF_2by2		 umfzi_2by2
+
+#define UMFPACK_col_to_triplet	 umfpack_zi_col_to_triplet
+#define UMFPACK_defaults	 umfpack_zi_defaults
+#define UMFPACK_free_numeric	 umfpack_zi_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_zi_free_symbolic
+#define UMFPACK_get_lunz	 umfpack_zi_get_lunz
+#define UMFPACK_get_numeric	 umfpack_zi_get_numeric
+#define UMFPACK_get_symbolic	 umfpack_zi_get_symbolic
+#define UMFPACK_get_determinant	 umfpack_zi_get_determinant
+#define UMFPACK_numeric		 umfpack_zi_numeric
+#define UMFPACK_qsymbolic	 umfpack_zi_qsymbolic
+#define UMFPACK_report_control	 umfpack_zi_report_control
+#define UMFPACK_report_info	 umfpack_zi_report_info
+#define UMFPACK_report_matrix	 umfpack_zi_report_matrix
+#define UMFPACK_report_numeric	 umfpack_zi_report_numeric
+#define UMFPACK_report_perm	 umfpack_zi_report_perm
+#define UMFPACK_report_status	 umfpack_zi_report_status
+#define UMFPACK_report_symbolic	 umfpack_zi_report_symbolic
+#define UMFPACK_report_triplet	 umfpack_zi_report_triplet
+#define UMFPACK_report_vector	 umfpack_zi_report_vector
+#define UMFPACK_save_numeric	 umfpack_zi_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_zi_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_zi_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_zi_load_symbolic
+#define UMFPACK_scale		 umfpack_zi_scale
+#define UMFPACK_solve		 umfpack_zi_solve
+#define UMFPACK_symbolic	 umfpack_zi_symbolic
+#define UMFPACK_transpose	 umfpack_zi_transpose
+#define UMFPACK_triplet_to_col	 umfpack_zi_triplet_to_col
+#define UMFPACK_wsolve		 umfpack_zi_wsolve
+
+/* for debugging only: */
+#define UMF_malloc_count	 umf_i_malloc_count
+#define UMF_debug		 umfzi_debug
+#define UMF_allocfail		 umfzi_allocfail
+#define UMF_gprob		 umfzi_gprob
+#define UMF_dump_dense		 umfzi_dump_dense
+#define UMF_dump_element	 umfzi_dump_element
+#define UMF_dump_rowcol		 umfzi_dump_rowcol
+#define UMF_dump_matrix		 umfzi_dump_matrix
+#define UMF_dump_current_front	 umfzi_dump_current_front
+#define UMF_dump_lu		 umfzi_dump_lu
+#define UMF_dump_memory		 umfzi_dump_memory
+#define UMF_dump_packed_memory	 umfzi_dump_packed_memory
+#define UMF_dump_col_matrix	 umfzi_dump_col_matrix
+#define UMF_dump_chain		 umfzi_dump_chain
+#define UMF_dump_start		 umfzi_dump_start
+#define UMF_dump_rowmerge	 umfzi_dump_rowmerge
+#define UMF_dump_diagonal_map	 umfzi_dump_diagonal_map
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+/* Complex double precision, with long's as integers */
+/* -------------------------------------------------------------------------- */
+
+#ifdef ZLONG
+
+#define UMF_analyze		 umf_l_analyze
+#define UMF_apply_order		 umf_l_apply_order
+#define UMF_assemble		 umfzl_assemble
+#define UMF_assemble_fixq	 umfzl_assemble_fixq
+#define UMF_blas3_update	 umfzl_blas3_update
+#define UMF_build_tuples	 umfzl_build_tuples
+#define UMF_build_tuples_usage	 umfzl_build_tuples_usage
+#define UMF_colamd		 umf_l_colamd
+#define UMF_colamd_set_defaults	 umf_l_colamd_set_defaults
+#define UMF_create_element	 umfzl_create_element
+#define UMF_extend_front	 umfzl_extend_front
+#define UMF_free		 umf_l_free
+#define UMF_fsize		 umf_l_fsize
+#define UMF_garbage_collection	 umfzl_garbage_collection
+#define UMF_get_memory		 umfzl_get_memory
+#define UMF_grow_front		 umfzl_grow_front
+#define UMF_init_front		 umfzl_init_front
+#define UMF_is_permutation	 umf_l_is_permutation
+#define UMF_kernel		 umfzl_kernel
+#define UMF_kernel_init		 umfzl_kernel_init
+#define UMF_kernel_init_usage	 umfzl_kernel_init_usage
+#define UMF_kernel_wrapup	 umfzl_kernel_wrapup
+#define UMF_local_search	 umfzl_local_search
+#define UMF_lsolve		 umfzl_lsolve
+#define UMF_ltsolve		 umfzl_ltsolve
+#define UMF_lhsolve		 umfzl_lhsolve
+#define UMF_malloc		 umf_l_malloc
+#define UMF_mem_alloc_element	 umfzl_mem_alloc_element
+#define UMF_mem_alloc_head_block umfzl_mem_alloc_head_block
+#define UMF_mem_alloc_tail_block umfzl_mem_alloc_tail_block
+#define UMF_mem_free_tail_block	 umfzl_mem_free_tail_block
+#define UMF_mem_init_memoryspace umfzl_mem_init_memoryspace
+#define UMF_realloc		 umf_l_realloc
+#define UMF_report_perm		 umf_l_report_perm
+#define UMF_report_vector	 umfzl_report_vector
+#define UMF_row_search		 umfzl_row_search
+#define UMF_scale		 umfzl_scale
+#define UMF_scale_column	 umfzl_scale_column
+#define UMF_set_stats		 umfzl_set_stats
+#define UMF_singletons		 umf_l_singletons
+#define UMF_solve		 umfzl_solve
+#define UMF_start_front		 umfzl_start_front
+#define UMF_store_lu		 umfzl_store_lu
+#define UMF_store_lu_drop	 umfzl_store_lu_drop
+#define UMF_symbolic_usage	 umfzl_symbolic_usage
+#define UMF_transpose		 umfzl_transpose
+#define UMF_tuple_lengths	 umfzl_tuple_lengths
+#define UMF_usolve		 umfzl_usolve
+#define UMF_utsolve		 umfzl_utsolve
+#define UMF_uhsolve		 umfzl_uhsolve
+#define UMF_valid_numeric	 umfzl_valid_numeric
+#define UMF_valid_symbolic	 umfzl_valid_symbolic
+#define UMF_triplet_map_x	 umfzl_triplet_map_x
+#define UMF_triplet_map_nox	 umfzl_triplet_map_nox
+#define UMF_triplet_nomap_x	 umfzl_triplet_nomap_x
+#define UMF_triplet_nomap_nox	 umfzl_triplet_nomap_nox
+#define UMF_2by2		 umfzl_2by2
+
+#define UMFPACK_col_to_triplet	 umfpack_zl_col_to_triplet
+#define UMFPACK_defaults	 umfpack_zl_defaults
+#define UMFPACK_free_numeric	 umfpack_zl_free_numeric
+#define UMFPACK_free_symbolic	 umfpack_zl_free_symbolic
+#define UMFPACK_get_lunz	 umfpack_zl_get_lunz
+#define UMFPACK_get_numeric	 umfpack_zl_get_numeric
+#define UMFPACK_get_symbolic	 umfpack_zl_get_symbolic
+#define UMFPACK_get_determinant	 umfpack_zl_get_determinant
+#define UMFPACK_numeric		 umfpack_zl_numeric
+#define UMFPACK_qsymbolic	 umfpack_zl_qsymbolic
+#define UMFPACK_report_control	 umfpack_zl_report_control
+#define UMFPACK_report_info	 umfpack_zl_report_info
+#define UMFPACK_report_matrix	 umfpack_zl_report_matrix
+#define UMFPACK_report_numeric	 umfpack_zl_report_numeric
+#define UMFPACK_report_perm	 umfpack_zl_report_perm
+#define UMFPACK_report_status	 umfpack_zl_report_status
+#define UMFPACK_report_symbolic	 umfpack_zl_report_symbolic
+#define UMFPACK_report_triplet	 umfpack_zl_report_triplet
+#define UMFPACK_report_vector	 umfpack_zl_report_vector
+#define UMFPACK_save_numeric	 umfpack_zl_save_numeric
+#define UMFPACK_save_symbolic	 umfpack_zl_save_symbolic
+#define UMFPACK_load_numeric	 umfpack_zl_load_numeric
+#define UMFPACK_load_symbolic	 umfpack_zl_load_symbolic
+#define UMFPACK_scale		 umfpack_zl_scale
+#define UMFPACK_solve		 umfpack_zl_solve
+#define UMFPACK_symbolic	 umfpack_zl_symbolic
+#define UMFPACK_transpose	 umfpack_zl_transpose
+#define UMFPACK_triplet_to_col	 umfpack_zl_triplet_to_col
+#define UMFPACK_wsolve		 umfpack_zl_wsolve
+
+/* for debugging only: */
+#define UMF_malloc_count	 umf_l_malloc_count
+#define UMF_debug		 umfzl_debug
+#define UMF_allocfail		 umfzl_allocfail
+#define UMF_gprob		 umfzl_gprob
+#define UMF_dump_dense		 umfzl_dump_dense
+#define UMF_dump_element	 umfzl_dump_element
+#define UMF_dump_rowcol		 umfzl_dump_rowcol
+#define UMF_dump_matrix		 umfzl_dump_matrix
+#define UMF_dump_current_front	 umfzl_dump_current_front
+#define UMF_dump_lu		 umfzl_dump_lu
+#define UMF_dump_memory		 umfzl_dump_memory
+#define UMF_dump_packed_memory	 umfzl_dump_packed_memory
+#define UMF_dump_col_matrix	 umfzl_dump_col_matrix
+#define UMF_dump_chain		 umfzl_dump_chain
+#define UMF_dump_start		 umfzl_dump_start
+#define UMF_dump_rowmerge	 umfzl_dump_rowmerge
+#define UMF_dump_diagonal_map	 umfzl_dump_diagonal_map
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_col_to_triplet.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,72 @@
+/* ========================================================================== */
+/* === UMFPACK_col_to_triplet =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User callable.  Converts a column-oriented input matrix to triplet form by
+    constructing the column indices Tj from the column pointers Ap.  The matrix
+    may be singular.  See umfpack_col_to_triplet.h for details.
+
+*/
+
+#include "umf_internal.h"
+
+GLOBAL Int UMFPACK_col_to_triplet
+(
+    Int n_col,
+    const Int Ap [ ],
+    Int Tj [ ]
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int nz, j, p, p1, p2, length ;
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the column indices */
+    /* ---------------------------------------------------------------------- */
+
+    if (!Ap || !Tj)
+    {
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+    if (n_col <= 0)
+    {
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+    if (Ap [0] != 0)
+    {
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+    nz = Ap [n_col] ;
+    if (nz < 0)
+    {
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    for (j = 0 ; j < n_col ; j++)
+    {
+	p1 = Ap [j] ;
+	p2 = Ap [j+1] ;
+	length = p2 - p1 ;
+	if (length < 0 || p2 > nz)
+	{
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    Tj [p] = j ;
+	}
+    }
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_defaults.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,118 @@
+/* ========================================================================== */
+/* === UMFPACK_defaults ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Sets default control parameters.  See umfpack_defaults.h
+    for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL void UMFPACK_defaults
+(
+    double Control [UMFPACK_CONTROL]
+)
+{
+    Int i ;
+
+    if (!Control)
+    {
+	/* silently return if no Control array */
+	return ;
+    }
+
+    for (i = 0 ; i < UMFPACK_CONTROL ; i++)
+    {
+	Control [i] = 0 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* default control settings: can be modified at run-time */
+    /* ---------------------------------------------------------------------- */
+
+    /* used in UMFPACK_report_* routines: */
+    Control [UMFPACK_PRL] = UMFPACK_DEFAULT_PRL ;
+
+    /* used in UMFPACK_*symbolic: */
+    Control [UMFPACK_DENSE_ROW] = UMFPACK_DEFAULT_DENSE_ROW ;
+    Control [UMFPACK_DENSE_COL] = UMFPACK_DEFAULT_DENSE_COL ;
+    Control [UMFPACK_AMD_DENSE] = UMFPACK_DEFAULT_AMD_DENSE ;
+    Control [UMFPACK_STRATEGY] = UMFPACK_DEFAULT_STRATEGY ;
+    Control [UMFPACK_2BY2_TOLERANCE] = UMFPACK_DEFAULT_2BY2_TOLERANCE ;
+    Control [UMFPACK_AGGRESSIVE] = UMFPACK_DEFAULT_AGGRESSIVE ;
+
+    /* used in UMFPACK_numeric: */
+    Control [UMFPACK_PIVOT_TOLERANCE] = UMFPACK_DEFAULT_PIVOT_TOLERANCE ;
+    Control [UMFPACK_SYM_PIVOT_TOLERANCE] = UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE;
+    Control [UMFPACK_BLOCK_SIZE] = UMFPACK_DEFAULT_BLOCK_SIZE ;
+    Control [UMFPACK_ALLOC_INIT] = UMFPACK_DEFAULT_ALLOC_INIT ;
+    Control [UMFPACK_FRONT_ALLOC_INIT] = UMFPACK_DEFAULT_FRONT_ALLOC_INIT ;
+    Control [UMFPACK_SCALE] = UMFPACK_DEFAULT_SCALE ;
+
+    /* used in UMFPACK_*solve: */
+    Control [UMFPACK_IRSTEP] = UMFPACK_DEFAULT_IRSTEP ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compile-time settings: cannot be modified at run-time */
+    /* ---------------------------------------------------------------------- */
+
+#ifdef USE_NO_BLAS
+    /* do not use the BLAS - use in-line C code instead */
+    Control [UMFPACK_COMPILED_WITH_BLAS] = 0 ;
+#else
+    /* use externally-provided BLAS (dgemm, dger, dgemv, zgemm, zgeru, zgemv) */
+    Control [UMFPACK_COMPILED_WITH_BLAS] = 1 ;
+#endif
+
+#ifdef MATLAB_MEX_FILE
+    /* use mxMalloc, mxFree, mxRealloc, and mexPrintf */
+    /* use mxAssert if debugging is enabled */
+    Control [UMFPACK_COMPILED_FOR_MATLAB] = 1 ;
+#else
+#ifdef MATHWORKS
+    /* use internal utMalloc, utFree, utRealloc, and utPrintf routines. */
+    /* use utDivideComplex and utFdlibm_hypot for complex version. */
+    /* use utAssert if debugging is enabled. */
+    Control [UMFPACK_COMPILED_FOR_MATLAB] = 2 ;
+#else
+    /* use ANSI C malloc, free, realloc, and print */
+    /* use ANSI C assert if debugging is enabled */
+    Control [UMFPACK_COMPILED_FOR_MATLAB] = 0 ;
+#endif
+#endif
+
+#ifdef NO_TIMER
+    /* no timer used */
+    Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 3 ;
+#ifndef NPOSIX
+    /* uses the POSIX sysconf ( ) and times ( ) routines in UMFPACK_tic, toc */
+    Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 2 ;
+#else
+#ifdef GETRUSAGE
+    /* uses the non-standard getrusage to get CPU time (Solaris) */
+    Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 1 ;
+#else
+    /* uses the ANSI standard clock routine to get CPU time */
+    /* this may wrap around */
+    Control [UMFPACK_COMPILED_WITH_GETRUSAGE] = 0 ;
+#endif
+#endif
+#endif
+
+#ifndef NDEBUG
+    /* UMFPACK is compiled in debug mode. */
+    /* This is exceedingly slow. */
+    DEBUG0 (("UMFPACK is running in debug mode.  This is very slow!\n")) ;
+    Control [UMFPACK_COMPILED_IN_DEBUG_MODE] = 1 ;
+#else
+    /* UMFPACK is compiled in normal (non-debug) mode */
+    Control [UMFPACK_COMPILED_IN_DEBUG_MODE] = 0 ;
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_free_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,57 @@
+/* ========================================================================== */
+/* === UMFPACK_free_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*  User-callable.  Free the entire Numeric object (consists of 11 to 13
+ *  malloc'd objects.  See UMFPACK_free_numeric.h for details.
+ */
+
+#include "umf_internal.h"
+#include "umf_free.h"
+
+GLOBAL void UMFPACK_free_numeric
+(
+    void **NumericHandle
+)
+{
+
+    NumericType *Numeric ;
+    if (!NumericHandle)
+    {
+	return ;
+    }
+    Numeric = *((NumericType **) NumericHandle) ;
+    if (!Numeric)
+    {
+	return ;
+    }
+
+    /* these 9 objects always exist */
+    (void) UMF_free ((void *) Numeric->D) ;
+    (void) UMF_free ((void *) Numeric->Rperm) ;
+    (void) UMF_free ((void *) Numeric->Cperm) ;
+    (void) UMF_free ((void *) Numeric->Lpos) ;
+    (void) UMF_free ((void *) Numeric->Lilen) ;
+    (void) UMF_free ((void *) Numeric->Lip) ;
+    (void) UMF_free ((void *) Numeric->Upos) ;
+    (void) UMF_free ((void *) Numeric->Uilen) ;
+    (void) UMF_free ((void *) Numeric->Uip) ;
+
+    /* Rs does not exist if scaling was not performed */
+    (void) UMF_free ((void *) Numeric->Rs) ;
+
+    /* Upattern can only exist for singular or rectangular matrices */
+    (void) UMF_free ((void *) Numeric->Upattern) ;
+
+    /* these 2 objects always exist */
+    (void) UMF_free ((void *) Numeric->Memory) ;
+    (void) UMF_free ((void *) Numeric) ;
+
+    *NumericHandle = (void *) NULL ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_free_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,56 @@
+/* ========================================================================== */
+/* === UMFPACK_free_symbolic ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  See umfpack_free_symbolic.h for details.
+    All 10 objects comprising the Symbolic object are free'd via UMF_free.
+*/
+
+#include "umf_internal.h"
+#include "umf_free.h"
+
+GLOBAL void UMFPACK_free_symbolic
+(
+    void **SymbolicHandle
+)
+{
+
+    SymbolicType *Symbolic ;
+    if (!SymbolicHandle)
+    {
+	return ;
+    }
+    Symbolic = *((SymbolicType **) SymbolicHandle) ;
+    if (!Symbolic)
+    {
+	return ;
+    }
+
+    (void) UMF_free ((void *) Symbolic->Cperm_init) ;
+    (void) UMF_free ((void *) Symbolic->Rperm_init) ;
+    (void) UMF_free ((void *) Symbolic->Front_npivcol) ;
+    (void) UMF_free ((void *) Symbolic->Front_parent) ;
+    (void) UMF_free ((void *) Symbolic->Front_1strow) ;
+    (void) UMF_free ((void *) Symbolic->Front_leftmostdesc) ;
+    (void) UMF_free ((void *) Symbolic->Chain_start) ;
+    (void) UMF_free ((void *) Symbolic->Chain_maxrows) ;
+    (void) UMF_free ((void *) Symbolic->Chain_maxcols) ;
+    (void) UMF_free ((void *) Symbolic->Cdeg) ;
+    (void) UMF_free ((void *) Symbolic->Rdeg) ;
+
+    /* only when dense rows are present */
+    (void) UMF_free ((void *) Symbolic->Esize) ;
+
+    /* only when diagonal pivoting is prefered */
+    (void) UMF_free ((void *) Symbolic->Diagonal_map) ;
+
+    (void) UMF_free ((void *) Symbolic) ;
+    *SymbolicHandle = (void *) NULL ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_determinant.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,307 @@
+/* ========================================================================== */
+/* === UMFPACK_get_determinant ============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  From the LU factors, scale factor, and permutation vectors
+    held in the Numeric object, calculates the determinant of the matrix A.
+    See umfpack_get_determinant.h for a more detailed description.
+
+    Dynamic memory usage:  calls UMF_malloc once, for a total space of
+    n integers, and then frees all of it via UMF_free when done.
+
+    Contributed by David Bateman, Motorola, Nov. 2004.
+    Modified for V4.4, Jan. 2005.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+/* ========================================================================== */
+/* === rescale_determinant ================================================== */
+/* ========================================================================== */
+
+/* If the mantissa is too big or too small, rescale it and change exponent */
+
+PRIVATE Int rescale_determinant
+(
+    Entry *d_mantissa,
+    double *d_exponent
+)
+{
+    double d_abs ;
+
+    ABS (d_abs, *d_mantissa) ;
+
+    if (SCALAR_IS_ZERO (d_abs))
+    {
+	/* the determinant is zero */
+	*d_exponent = 0 ;
+	return (FALSE) ;
+    }
+
+    if (SCALAR_IS_NAN (d_abs))
+    {
+	/* the determinant is NaN */
+	return (FALSE) ;
+    }
+
+    while (d_abs < 1.)
+    {
+	SCALE (*d_mantissa, 10.0) ;
+	*d_exponent = *d_exponent - 1.0 ;
+	ABS (d_abs, *d_mantissa) ;
+    }
+
+    while (d_abs >= 10.)
+    {
+	SCALE (*d_mantissa, 0.1) ;
+	*d_exponent = *d_exponent + 1.0 ;
+	ABS (d_abs, *d_mantissa) ;
+    }
+
+    return (TRUE) ;
+}
+
+/* ========================================================================== */
+/* === UMFPACK_get_determinant ============================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_get_determinant
+(
+    double *Mx,
+#ifdef COMPLEX
+    double *Mz,
+#endif
+    double *Ex,
+    void *NumericHandle,
+    double User_Info [UMFPACK_INFO]
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry d_mantissa, d_tmp ;
+    double d_exponent, Info2 [UMFPACK_INFO], one [2] = {1.0, 0.0}, d_sign ;
+    Entry *D ;
+    double *Info, *Rs ;
+    NumericType *Numeric ;
+    Int i, n, itmp, npiv, *Wi, *Rperm, *Cperm, do_scale ;
+
+#ifndef NRECIPROCAL
+    Int do_recip ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* check input parameters */
+    /* ---------------------------------------------------------------------- */
+
+    if (User_Info != (double *) NULL)
+    {
+	/* return Info in user's array */
+	Info = User_Info ;
+    }
+    else
+    {
+	/* no Info array passed - use local one instead */
+	Info = Info2 ;
+	for (i = 0 ; i < UMFPACK_INFO ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+    }
+
+    Info [UMFPACK_STATUS] = UMFPACK_OK ;
+
+    Numeric = (NumericType *) NumericHandle ;
+    if (!UMF_valid_numeric (Numeric))
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Numeric_object ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    if (Numeric->n_row != Numeric->n_col)
+    {
+	/* only square systems can be handled */
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_system ;
+	return (UMFPACK_ERROR_invalid_system) ;
+    }
+
+    if (Mx == (double *) NULL)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    n = Numeric->n_row ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* ---------------------------------------------------------------------- */
+
+    Wi = (Int *) UMF_malloc (n, sizeof (Int)) ;
+
+    if (!Wi)
+    {
+	DEBUGm4 (("out of memory: get determinant\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    Rs = Numeric->Rs ;		/* row scale factors */
+    do_scale = (Rs != (double *) NULL) ;
+
+#ifndef NRECIPROCAL
+    do_recip = Numeric->do_recip ;
+#endif
+
+    d_mantissa = ((Entry *) one) [0] ;
+    d_exponent = 0.0 ;
+    D = Numeric->D ;
+
+    /* compute product of diagonal entries of U */
+    for (i = 0 ; i < n ; i++)
+    {
+	MULT (d_tmp, d_mantissa, D [i]) ;
+	d_mantissa = d_tmp ;
+
+	if (!rescale_determinant (&d_mantissa, &d_exponent))
+	{
+	    /* the determinant is zero or NaN */
+	    Info [UMFPACK_STATUS] = UMFPACK_WARNING_singular_matrix ;
+	    /* no need to compute the determinant of R */
+	    do_scale = FALSE ;
+	    break ;
+	}
+    }
+
+    /* compute product of diagonal entries of R (or its inverse) */
+    if (do_scale)
+    {
+	for (i = 0 ; i < n ; i++)
+	{
+#ifndef NRECIPROCAL
+	    if (do_recip)
+	    {
+		/* compute determinant of R inverse */
+		SCALE_DIV (d_mantissa, Rs [i]) ;
+	    }
+	    else
+#endif
+	    {
+		/* compute determinant of R */
+		SCALE (d_mantissa, Rs [i]) ;
+	    }
+	    if (!rescale_determinant (&d_mantissa, &d_exponent))
+	    {
+		/* the determinant is zero or NaN.  This is very unlikey to
+		 * occur here, since the scale factors for a tiny or zero row
+		 * are set to 1. */
+		Info [UMFPACK_STATUS] = UMFPACK_WARNING_singular_matrix ;
+		break ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* determine if P and Q are odd or even permutations */
+    /* ---------------------------------------------------------------------- */
+
+    npiv = 0 ;
+    Rperm = Numeric->Rperm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	Wi [i] = Rperm [i] ;
+    }
+
+    for (i = 0 ; i < n ; i++)
+    {
+	while (Wi [i] != i)
+	{
+	    itmp = Wi [Wi [i]] ;
+	    Wi [Wi [i]] = Wi [i] ;
+	    Wi [i] = itmp ;
+	    npiv++ ;
+	}
+    }
+
+    Cperm = Numeric->Cperm ;
+
+    for (i = 0 ; i < n ; i++)
+    {
+	Wi [i] = Cperm [i] ;
+    }
+
+    for (i = 0 ; i < n ; i++)
+    {
+	while (Wi [i] != i)
+	{
+	    itmp = Wi [Wi [i]] ;
+	    Wi [Wi [i]] = Wi [i] ;
+	    Wi [i] = itmp ;
+	    npiv++ ;
+	}
+    }
+
+    /* if npiv is odd, the sign is -1.  if it is even, the sign is +1 */
+    d_sign = (npiv % 2) ? -1. : 1. ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free workspace */
+    /* ---------------------------------------------------------------------- */
+
+    (void) UMF_free ((void *) Wi) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* compute the magnitude and exponent of the determinant */
+    /* ---------------------------------------------------------------------- */
+
+    if (Ex == (double *) NULL)
+    {
+	/* Ex is not provided, so return the entire determinant in d_mantissa */
+	SCALE (d_mantissa, pow (10.0, d_exponent)) ;
+    }
+    else
+    {
+	Ex [0] = d_exponent ;
+    }
+
+    Mx [0] = d_sign * REAL_COMPONENT (d_mantissa) ;
+
+#ifdef COMPLEX
+    if (SPLIT (Mz))
+    {
+	Mz [0] = d_sign * IMAG_COMPONENT (d_mantissa) ;
+    }
+    else
+    {
+	Mx [1] = d_sign * IMAG_COMPONENT (d_mantissa) ;
+    }
+#endif
+
+    /* determine if the determinant has (or will) overflow or underflow */
+    if (d_exponent + 1.0 > log10 (DBL_MAX))
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_WARNING_determinant_overflow ;
+    }
+    else if (d_exponent - 1.0 < log10 (DBL_MIN))
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_WARNING_determinant_underflow ;
+    }
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_lunz.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,55 @@
+/* ========================================================================== */
+/* === UMFPACK_get_lunz ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Determines the number of nonzeros in L and U, and the size
+    of L and U.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+
+GLOBAL Int UMFPACK_get_lunz
+(
+    Int *lnz,
+    Int *unz,
+    Int *n_row,
+    Int *n_col,
+    Int *nz_udiag,
+    void *NumericHandle
+)
+{
+    NumericType *Numeric ;
+
+    Numeric = (NumericType *) NumericHandle ;
+
+    if (!UMF_valid_numeric (Numeric))
+    {
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+    if (!lnz || !unz || !n_row || !n_col || !nz_udiag)
+    {
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    *n_row = Numeric->n_row ;
+    *n_col = Numeric->n_col ;
+
+    /* number of nz's in L below diagonal, plus the unit diagonal of L */
+    *lnz = Numeric->lnz + MIN (Numeric->n_row, Numeric->n_col) ;
+
+    /* number of nz's in U above diagonal, plus nz's on diagaonal of U */
+    *unz = Numeric->unz + Numeric->nnzpiv ;
+
+    /* number of nz's on the diagonal */
+    *nz_udiag = Numeric->nnzpiv ;
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1057 @@
+/* ========================================================================== */
+/* === UMFPACK_get_numeric ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Gets the LU factors and the permutation vectors held in the
+    Numeric object.  L is returned in sparse row form with sorted rows, U is
+    returned in sparse column form with sorted columns, and P and Q are
+    returned as permutation vectors.  See umfpack_get_numeric.h for a more
+    detailed description.
+
+    Returns TRUE if successful, FALSE if the Numeric object is invalid or
+    if out of memory.
+
+    Dynamic memory usage:  calls UMF_malloc twice, for a total space of
+    2*n integers, and then frees all of it via UMF_free when done.
+
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+
+PRIVATE void get_L
+(
+    Int Lp [ ],
+    Int Lj [ ],
+    double Lx [ ],
+#ifdef COMPLEX
+    double Lz [ ],
+#endif
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int Wi [ ]
+) ;
+
+PRIVATE void get_U
+(
+    Int Up [ ],
+    Int Ui [ ],
+    double Ux [ ],
+#ifdef COMPLEX
+    double Uz [ ],
+#endif
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int Wi [ ]
+) ;
+
+/* ========================================================================== */
+/* === UMFPACK_get_numeric ================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_get_numeric
+(
+    Int Lp [ ],
+    Int Lj [ ],
+    double Lx [ ],
+#ifdef COMPLEX
+    double Lz [ ],
+#endif
+    Int Up [ ],
+    Int Ui [ ],
+    double Ux [ ],
+#ifdef COMPLEX
+    double Uz [ ],
+#endif
+    Int P [ ],
+    Int Q [ ],
+    double Dx [ ],
+#ifdef COMPLEX
+    double Dz [ ],
+#endif
+    Int *p_do_recip,
+    double Rs [ ],
+    void *NumericHandle
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    NumericType *Numeric ;
+    Int getL, getU, *Rperm, *Cperm, k, nn, n_row, n_col, *Wi, *Pattern,
+	n_inner ;
+    double *Rs1 ;
+    Entry *D ;
+
+#ifndef NDEBUG
+    init_count = UMF_malloc_count ;
+#endif
+
+    Wi = (Int *) NULL ;
+    Pattern = (Int *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check input parameters */
+    /* ---------------------------------------------------------------------- */
+
+    Numeric = (NumericType *) NumericHandle ;
+    if (!UMF_valid_numeric (Numeric))
+    {
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    n_row = Numeric->n_row ;
+    n_col = Numeric->n_col ;
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* ---------------------------------------------------------------------- */
+
+    getL = Lp && Lj && Lx ;
+    getU = Up && Ui && Ux ;
+
+    if (getL || getU)
+    {
+	Wi = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+	Pattern = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+	if (!Wi || !Pattern)
+	{
+	    (void) UMF_free ((void *) Wi) ;
+	    (void) UMF_free ((void *) Pattern) ;
+	    ASSERT (UMF_malloc_count == init_count) ;
+	    DEBUGm4 (("out of memory: get numeric\n")) ;
+	    return (UMFPACK_ERROR_out_of_memory) ;
+	}
+	ASSERT (UMF_malloc_count == init_count + 2) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* get contents of Numeric */
+    /* ---------------------------------------------------------------------- */
+
+    if (P != (Int *) NULL)
+    {
+	Rperm = Numeric->Rperm ;
+	for (k = 0 ; k < n_row ; k++)
+	{
+	    P [k] = Rperm [k] ;
+	}
+    }
+
+    if (Q != (Int *) NULL)
+    {
+	Cperm = Numeric->Cperm ;
+	for (k = 0 ; k < n_col ; k++)
+	{
+	    Q [k] = Cperm [k] ;
+	}
+    }
+
+    if (getL)
+    {
+	get_L (Lp, Lj, Lx,
+#ifdef COMPLEX
+	    Lz,
+#endif
+	    Numeric, Pattern, Wi) ;
+    }
+
+    if (getU)
+    {
+	get_U (Up, Ui, Ux,
+#ifdef COMPLEX
+	    Uz,
+#endif
+	    Numeric, Pattern, Wi) ;
+    }
+
+    if (Dx != (double *) NULL)
+    {
+	D = Numeric->D ;
+#ifdef COMPLEX
+	if (SPLIT (Dz))
+	{
+	    for (k = 0 ; k < n_inner ; k++)
+	    {
+		Dx [k] = REAL_COMPONENT (D [k]) ;
+		Dz [k] = IMAG_COMPONENT (D [k]) ;
+	    }
+	}
+	else
+	{
+	    for (k = 0 ; k < n_inner ; k++)
+	    {
+	        Dx [2*k  ] =  REAL_COMPONENT (D [k]) ;
+	        Dx [2*k+1] =  IMAG_COMPONENT (D [k]) ;
+	    }
+	}
+#else
+	{
+	    D = Numeric->D ;
+	    for (k = 0 ; k < n_inner ; k++)
+	    {
+		Dx [k] = D [k] ;
+	    }
+	}
+#endif
+    }
+
+    /* return the flag stating whether the scale factors are to be multiplied,
+     * or divided.   If do_recip is TRUE, multiply.  Otherwise, divided.
+     * If NRECIPROCAL is defined at compile time, the scale factors are always
+     * to be used by dividing.
+     */
+    if (p_do_recip != (Int *) NULL)
+    {
+#ifndef NRECIPROCAL
+	*p_do_recip = Numeric->do_recip ;
+#else
+	*p_do_recip = FALSE ;
+#endif
+    }
+
+    if (Rs != (double *) NULL)
+    {
+	Rs1 = Numeric->Rs ;
+	if (Rs1 == (double *) NULL)
+	{
+	    /* R is the identity matrix.  */
+	    for (k = 0 ; k < n_row ; k++)
+	    {
+		Rs [k] = 1.0 ;
+	    }
+	}
+	else
+	{
+	    for (k = 0 ; k < n_row ; k++)
+	    {
+		Rs [k] = Rs1 [k] ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the workspace */
+    /* ---------------------------------------------------------------------- */
+
+    (void) UMF_free ((void *) Wi) ;
+    (void) UMF_free ((void *) Pattern) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+
+    return (UMFPACK_OK) ;
+}
+
+
+/* ========================================================================== */
+/* === get_L ================================================================ */
+/* ========================================================================== */
+
+/*
+    The matrix L is stored in the following arrays in the Numeric object:
+
+	Int Lpos [0..npiv]
+	Int Lip [0..npiv], index into Numeric->Memory
+	Int Lilen [0..npiv]
+	Unit *(Numeric->Memory), pointer to memory space holding row indices
+		and numerical values
+
+    where npiv is the number of pivot entries found.  If A is n_row-by-n_col,
+    then npiv <= MIN (n_row,n_col).
+
+    Let L_k denote the pattern of entries in column k of L (excluding the
+    diagonal).
+
+    An Lchain is a sequence of columns of L whose nonzero patterns are related.
+    The start of an Lchain is denoted by a negative value of Lip [k].
+
+    To obtain L_k:
+
+    (1)	If column k starts an Lchain, then L_k is stored in its entirety.
+	|Lip [k]| is an index into Numeric->Memory for the integer row indices
+	in L_k.  The number of entries in the column is |L_k| = Lilen [k].
+	This defines the pattern of the "leading" column of this chain.
+	Lpos [k] is not used for the first column in the chain.  Column zero
+	is always a leading column.
+
+    (2) If column k does not start an Lchain, then L_k is represented as a
+	superset of L_k-1.  Define Lnew_k such that (L_k-1 - {k} union Lnew_k)
+	= L_k, where Lnew_k and (L_k-1)-{k} are disjoint.  Lnew_k are the
+	entries in L_k that are not in L_k-1.  Lpos [k] holds the position of
+	pivot row index k in the prior pattern L_k-1 (if it is present), so
+	that the set subtraction (L_k-1)-{k} can be computed quickly, when
+	computing the pattern of L_k from L_k-1.  The number of new entries in
+	L_k is stored in Lilen [k] = |Lnew_k|.
+
+	Note that this means we must have the pattern L_k-1 to compute L_k.
+
+    In both cases (1) and (2), we obtain the pattern L_k.
+
+    The numerical values are stored in Numeric->Memory, starting at the index
+    |Lip [k]| + Lilen [k].  It is stored in the same order as the entries
+    in L_k, after L_k is obtained from cases (1) or (2), above.
+
+    The advantage of using this "packed" data structure is that it can
+    dramatically reduce the amount of storage needed for the pattern of L.
+    The disadvantage is that it can be difficult for the user to access,
+    and it does not match the sparse matrix data structure used in MATLAB.
+    Thus, this routine is provided to create a conventional sparse matrix
+    data structure for L, in sparse-row form.  A row-form of L appears to
+    MATLAB to be a column-oriented from of the transpose of L.  If you would
+    like a column-form of L, then use UMFPACK_transpose (an example of this
+    is in umfpackmex.c).
+
+*/
+/* ========================================================================== */
+
+PRIVATE void get_L
+(
+    Int Lp [ ],		/* of size n_row+1 */
+    Int Lj [ ],		/* of size lnz, where lnz = Lp [n_row] */
+    double Lx [ ],	/* of size lnz */
+#ifdef COMPLEX
+    double Lz [ ],	/* of size lnz */
+#endif
+    NumericType *Numeric,
+    Int Pattern [ ],	/* workspace of size n_row */
+    Int Wi [ ]		/* workspace of size n_row */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry value ;
+    Entry *xp, *Lval ;
+    Int deg, *ip, j, row, n_row, n_col, n_inner, *Lpos, *Lilen, *Lip, p, llen,
+        lnz2, lp, newLchain, k, pos, npiv, *Li, n1 ;
+#ifdef COMPLEX
+    Int split = SPLIT (Lz) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG4 (("get_L start:\n")) ;
+    n_row = Numeric->n_row ;
+    n_col = Numeric->n_col ;
+    n_inner = MIN (n_row, n_col) ;
+    npiv = Numeric->npiv ;
+    n1 = Numeric->n1 ;
+    Lpos = Numeric->Lpos ;
+    Lilen = Numeric->Lilen ;
+    Lip = Numeric->Lip ;
+    deg = 0 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* count the nonzeros in each row of L */
+    /* ---------------------------------------------------------------------- */
+
+#pragma ivdep
+    for (row = 0 ; row < n_inner ; row++)
+    {
+	/* include the diagonal entry in the row counts */
+	Wi [row] = 1 ;
+    }
+#pragma ivdep
+    for (row = n_inner ; row < n_row ; row++)
+    {
+	Wi [row] = 0 ;
+    }
+
+    /* singletons */
+    for (k = 0 ; k < n1 ; k++)
+    {
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	deg = Lilen [k] ;
+	if (deg > 0)
+	{
+	    lp = Lip [k] ;
+	    Li = (Int *) (Numeric->Memory + lp) ;
+	    lp += UNITS (Int, deg) ;
+	    Lval = (Entry *) (Numeric->Memory + lp) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		row = Li [j] ;
+		value = Lval [j] ;
+		DEBUG4 (("  row "ID"  k "ID" value", row, k)) ;
+		EDEBUG4 (value) ;
+		DEBUG4 (("\n")) ;
+		if (IS_NONZERO (value))
+		{
+		    Wi [row]++ ;
+		}
+	    }
+	}
+    }
+
+    /* non-singletons */
+    for (k = n1 ; k < npiv ; k++)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* make column of L in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	lp = Lip [k] ;
+	newLchain = (lp < 0) ;
+	if (newLchain)
+	{
+	    lp = -lp ;
+	    deg = 0 ;
+	    DEBUG4 (("start of chain for column of L\n")) ;
+	}
+
+	/* remove pivot row */
+	pos = Lpos [k] ;
+	if (pos != EMPTY)
+	{
+	    DEBUG4 (("  k "ID" removing row "ID" at position "ID"\n",
+	    k, Pattern [pos], pos)) ;
+	    ASSERT (!newLchain) ;
+	    ASSERT (deg > 0) ;
+	    ASSERT (pos >= 0 && pos < deg) ;
+	    ASSERT (Pattern [pos] == k) ;
+	    Pattern [pos] = Pattern [--deg] ;
+	}
+
+	/* concatenate the pattern */
+	ip = (Int *) (Numeric->Memory + lp) ;
+	llen = Lilen [k] ;
+	for (j = 0 ; j < llen ; j++)
+	{
+	    row = *ip++ ;
+	    DEBUG4 (("  row "ID"  k "ID"\n", row, k)) ;
+	    ASSERT (row > k && row < n_row) ;
+	    Pattern [deg++] = row ;
+	}
+
+	xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ;
+
+	for (j = 0 ; j < deg ; j++)
+	{
+	    DEBUG4 (("  row "ID"  k "ID" value", Pattern [j], k)) ;
+	    row = Pattern [j] ;
+	    value = *xp++ ;
+	    EDEBUG4 (value) ;
+	    DEBUG4 (("\n")) ;
+	    if (IS_NONZERO (value))
+	    {
+		Wi [row]++ ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the final row form of L */
+    /* ---------------------------------------------------------------------- */
+
+    /* create the row pointers */
+    lnz2 = 0 ;
+    for (row = 0 ; row < n_row ; row++)
+    {
+	Lp [row] = lnz2 ;
+	lnz2 += Wi [row] ;
+	Wi [row] = Lp [row] ;
+    }
+    Lp [n_row] = lnz2 ;
+    ASSERT (Numeric->lnz + n_inner == lnz2) ;
+
+    /* add entries from the rows of L (singletons) */
+    for (k = 0 ; k < n1 ; k++)
+    {
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	deg = Lilen [k] ;
+	if (deg > 0)
+	{
+	    lp = Lip [k] ;
+	    Li = (Int *) (Numeric->Memory + lp) ;
+	    lp += UNITS (Int, deg) ;
+	    Lval = (Entry *) (Numeric->Memory + lp) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		row = Li [j] ;
+		value = Lval [j] ;
+		DEBUG4 (("  row "ID"  k "ID" value", row, k)) ;
+		EDEBUG4 (value) ;
+		DEBUG4 (("\n")) ;
+		if (IS_NONZERO (value))
+		{
+		    p = Wi [row]++ ;
+		    Lj [p] = k ;
+#ifdef COMPLEX
+		    if (split)
+		    {
+
+		        Lx [p] = REAL_COMPONENT (value) ;
+			Lz [p] = IMAG_COMPONENT (value) ;
+		    }
+		    else
+		    {
+			Lx [2*p  ] = REAL_COMPONENT (value) ;
+			Lx [2*p+1] = IMAG_COMPONENT (value) ;
+		    }
+#else
+		    Lx [p] = value ;
+#endif
+		}
+	    }
+	}
+    }
+
+    /* add entries from the rows of L (non-singletons) */
+    for (k = n1 ; k < npiv ; k++)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* make column of L in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	lp = Lip [k] ;
+	newLchain = (lp < 0) ;
+	if (newLchain)
+	{
+	    lp = -lp ;
+	    deg = 0 ;
+	    DEBUG4 (("start of chain for column of L\n")) ;
+	}
+
+	/* remove pivot row */
+	pos = Lpos [k] ;
+	if (pos != EMPTY)
+	{
+	    DEBUG4 (("  k "ID" removing row "ID" at position "ID"\n",
+	    k, Pattern [pos], pos)) ;
+	    ASSERT (!newLchain) ;
+	    ASSERT (deg > 0) ;
+	    ASSERT (pos >= 0 && pos < deg) ;
+	    ASSERT (Pattern [pos] == k) ;
+	    Pattern [pos] = Pattern [--deg] ;
+	}
+
+	/* concatenate the pattern */
+	ip = (Int *) (Numeric->Memory + lp) ;
+	llen = Lilen [k] ;
+	for (j = 0 ; j < llen ; j++)
+	{
+	    row = *ip++ ;
+	    DEBUG4 (("  row "ID"  k "ID"\n", row, k)) ;
+	    ASSERT (row > k) ;
+	    Pattern [deg++] = row ;
+	}
+
+	xp = (Entry *) (Numeric->Memory + lp + UNITS (Int, llen)) ;
+
+	for (j = 0 ; j < deg ; j++)
+	{
+	    DEBUG4 (("  row "ID"  k "ID" value", Pattern [j], k)) ;
+	    row = Pattern [j] ;
+	    value = *xp++ ;
+	    EDEBUG4 (value) ;
+	    DEBUG4 (("\n")) ;
+	    if (IS_NONZERO (value))
+	    {
+		p = Wi [row]++ ;
+		Lj [p] = k ;
+#ifdef COMPLEX
+		if (split)
+		{
+		    Lx [p] = REAL_COMPONENT (value) ;
+		    Lz [p] = IMAG_COMPONENT (value) ;
+		}
+		else
+		{
+		    Lx [2*p  ] = REAL_COMPONENT (value) ;
+		    Lx [2*p+1] = IMAG_COMPONENT (value) ;
+		}
+#else
+		Lx [p] = value ;
+#endif
+	    }
+	}
+    }
+
+    /* add all of the diagonal entries (L is unit diagonal) */
+    for (row = 0 ; row < n_inner ; row++)
+    {
+	p = Wi [row]++ ;
+	Lj [p] = row ;
+
+#ifdef COMPLEX
+	if (split)
+	{
+	    Lx [p] = 1. ;
+	    Lz [p] = 0. ;
+	}
+	else
+	{
+	    Lx [2*p  ] = 1. ;
+	    Lx [2*p+1] = 0. ;
+	}
+#else
+	Lx [p] = 1. ;
+#endif
+
+	ASSERT (Wi [row] == Lp [row+1]) ;
+    }
+
+#ifndef NDEBUG
+    DEBUG6 (("L matrix (stored by rows):")) ;
+    UMF_dump_col_matrix (Lx,
+#ifdef COMPLEX
+	Lz,
+#endif
+	Lj, Lp, n_inner, n_row, Numeric->lnz+n_inner) ;
+#endif
+
+    DEBUG4 (("get_L done:\n")) ;
+}
+
+
+/* ========================================================================== */
+/* === get_U ================================================================ */
+/* ========================================================================== */
+
+/*
+    The matrix U is stored in the following arrays in the Numeric object:
+
+	Int Upos [0..npiv]
+	Int Uip [0..npiv], index into Numeric->Memory
+	Int Uilen [0..npiv]
+	Unit *(Numeric->Memory), pointer to memory space holding column indices
+		and numerical values
+
+    where npiv is the number of pivot entries found.  If A is n_row-by-n_col,
+    then npiv <= MIN (n_row,n_col).
+
+    Let U_k denote the pattern of entries in row k of U (excluding the
+    diagonal).
+
+    A Uchain is a sequence of columns of U whose nonzero patterns are related.
+    The start of a Uchain is denoted by a negative value of Uip [k].
+
+    To obtain U_k-1:
+
+    (1) If row k is the start of a Uchain then Uip [k] is negative and |Uip [k]|
+	is an index into Numeric->Memory for the integer column indices in
+	U_k-1.  The number of entries in the row is |U_k-1| = Uilen [k].  This
+	defines the pattern of the "trailing" row of this chain that ends at
+	row k-1.
+
+
+    (2) If row k is not the start of a Uchain, then U_k-1 is a subset of U_k.
+	The indices in U_k are arranged so that last Uilen [k] entries of
+	U_k are those indices not in U_k-1.  Next, the pivot column index k is
+	added if it appears in row U_k-1 (it never appears in U_k).  Upos [k]
+	holds the position of pivot column index k in the pattern U_k-1 (if it
+	is present), so that the set union (U_k-1)+{k} can be computed quickly,
+	when computing the pattern of U_k-1 from U_k.
+
+	Note that this means we must have the pattern U_k to compute L_k-1.
+
+    In both cases (1) and (2), we obtain the pattern U_k.
+
+    The numerical values are stored in Numeric->Memory.  If k is the start of a
+    Uchain, then the offset is |Uip [k]| plus the size of the space needed to
+    store the pattern U_k-1.  Otherwise, Uip [k] is the offset itself of the
+    numerical values, since in this case no pattern is stored.
+    The numerical values are stored in the same order as the entries in U_k,
+    after U_k is obtained from cases (1) or (2), above.
+
+    The advantage of using this "packed" data structure is that it can
+    dramatically reduce the amount of storage needed for the pattern of U.
+    The disadvantage is that it can be difficult for the user to access,
+    and it does not match the sparse matrix data structure used in MATLAB.
+    Thus, this routine is provided to create a conventional sparse matrix
+    data structure for U, in sparse-column form.
+
+*/
+/* ========================================================================== */
+
+PRIVATE void get_U
+(
+    Int Up [ ],		/* of size n_col+1 */
+    Int Ui [ ],		/* of size unz, where unz = Up [n_col] */
+    double Ux [ ],	/* of size unz */
+#ifdef COMPLEX
+    double Uz [ ],	/* of size unz */
+#endif
+    NumericType *Numeric,
+    Int Pattern [ ],	/* workspace of size n_col */
+    Int Wi [ ]		/* workspace of size n_col */
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Entry value ;
+    Entry *xp, *D, *Uval ;
+    Int deg, j, *ip, col, *Upos, *Uilen, *Uip, n_col, ulen, *Usi,
+        unz2, p, k, up, newUchain, pos, npiv, n1 ;
+#ifdef COMPLEX
+    Int split = SPLIT (Uz) ;
+#endif
+#ifndef NDEBUG
+    Int nnzpiv = 0 ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    DEBUG4 (("get_U start:\n")) ;
+    n_col = Numeric->n_col ;
+    n1 = Numeric->n1 ;
+    npiv = Numeric->npiv ;
+    Upos = Numeric->Upos ;
+    Uilen = Numeric->Uilen ;
+    Uip = Numeric->Uip ;
+    D = Numeric->D ;
+
+    /* ---------------------------------------------------------------------- */
+    /* count the nonzeros in each column of U */
+    /* ---------------------------------------------------------------------- */
+
+    for (col = 0 ; col < npiv ; col++)
+    {
+	/* include the diagonal entry in the column counts */
+	DEBUG4 (("D ["ID"] = ", col)) ;
+	EDEBUG4 (D [col]) ;
+	Wi [col] = IS_NONZERO (D [col]) ;
+	DEBUG4 ((" is nonzero: "ID"\n", Wi [col])) ;
+#ifndef NDEBUG
+	nnzpiv += IS_NONZERO (D [col]) ;
+#endif
+    }
+    DEBUG4 (("nnzpiv "ID" "ID"\n", nnzpiv, Numeric->nnzpiv)) ;
+    ASSERT (nnzpiv == Numeric->nnzpiv) ;
+    for (col = npiv ; col < n_col ; col++)
+    {
+	/* diagonal entries are zero for structurally singular part */
+	Wi [col] = 0 ;
+    }
+
+    deg = Numeric->ulen ;
+    if (deg > 0)
+    {
+	/* make last pivot row of U (singular matrices only) */
+	DEBUG0 (("Last pivot row of U: ulen "ID"\n", deg)) ;
+	for (j = 0 ; j < deg ; j++)
+	{
+	    Pattern [j] = Numeric->Upattern [j] ;
+	    DEBUG0 (("    column "ID"\n", Pattern [j])) ;
+	}
+    }
+
+    /* non-singletons */
+    for (k = npiv-1 ; k >= n1 ; k--)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* use row k of U */
+	/* ------------------------------------------------------------------ */
+
+	up = Uip [k] ;
+	ulen = Uilen [k] ;
+	newUchain = (up < 0) ;
+	if (newUchain)
+	{
+	    up = -up ;
+	    xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ;
+	}
+	else
+	{
+	    xp = (Entry *) (Numeric->Memory + up) ;
+	}
+
+	for (j = 0 ; j < deg ; j++)
+	{
+	    DEBUG4 (("  k "ID" col "ID" value\n", k, Pattern [j])) ;
+	    col = Pattern [j] ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    value = *xp++ ;
+	    EDEBUG4 (value) ;
+	    DEBUG4 (("\n")) ;
+	    if (IS_NONZERO (value))
+	    {
+		Wi [col]++ ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* make row k-1 of U in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	if (k == n1) break ;
+
+	if (newUchain)
+	{
+	    /* next row is a new Uchain */
+	    deg = ulen ;
+	    DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ;
+	    ip = (Int *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = *ip++ ;
+		DEBUG4 (("  k "ID" col "ID"\n", k-1, col)) ;
+		ASSERT (k <= col) ;
+		Pattern [j] = col ;
+	    }
+	}
+	else
+	{
+	    deg -= ulen ;
+	    DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k-1, deg));
+	    ASSERT (deg >= 0) ;
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* add the pivot column */
+		DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ;
+		ASSERT (pos >= 0 && pos <= deg) ;
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	}
+    }
+
+    /* singletons */
+    for (k = n1 - 1 ; k >= 0 ; k--)
+    {
+	deg = Uilen [k] ;
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	if (deg > 0)
+	{
+	    up = Uip [k] ;
+	    Usi = (Int *) (Numeric->Memory + up) ;
+	    up += UNITS (Int, deg) ;
+	    Uval = (Entry *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = Usi [j] ;
+		value = Uval [j] ;
+		DEBUG4 (("  k "ID" col "ID" value", k, col)) ;
+		EDEBUG4 (value) ;
+		DEBUG4 (("\n")) ;
+		if (IS_NONZERO (value))
+		{
+		    Wi [col]++ ;
+		}
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* construct the final column form of U */
+    /* ---------------------------------------------------------------------- */
+
+    /* create the column pointers */
+    unz2 = 0 ;
+    for (col = 0 ; col < n_col ; col++)
+    {
+	Up [col] = unz2 ;
+	unz2 += Wi [col] ;
+    }
+    Up [n_col] = unz2 ;
+    DEBUG1 (("Numeric->unz "ID"  npiv "ID" nnzpiv "ID" unz2 "ID"\n",
+	Numeric->unz, npiv, Numeric->nnzpiv, unz2)) ;
+    ASSERT (Numeric->unz + Numeric->nnzpiv == unz2) ;
+
+    for (col = 0 ; col < n_col ; col++)
+    {
+	Wi [col] = Up [col+1] ;
+    }
+
+    /* add all of the diagonal entries */
+    for (col = 0 ; col < npiv ; col++)
+    {
+	if (IS_NONZERO (D [col]))
+	{
+	    p = --(Wi [col]) ;
+	    Ui [p] = col ;
+#ifdef COMPLEX
+	    if (split)
+	    {
+
+	        Ux [p] = REAL_COMPONENT (D [col]) ;
+		Uz [p] = IMAG_COMPONENT (D [col]) ;
+	    }
+	    else
+	    {
+		Ux [2*p  ] = REAL_COMPONENT (D [col]) ;
+		Ux [2*p+1] = IMAG_COMPONENT (D [col]) ;
+	    }
+#else
+	    Ux [p] = D [col] ;
+#endif
+	}
+    }
+
+    /* add all the entries from the rows of U */
+
+    deg = Numeric->ulen ;
+    if (deg > 0)
+    {
+	/* make last pivot row of U (singular matrices only) */
+	for (j = 0 ; j < deg ; j++)
+	{
+	    Pattern [j] = Numeric->Upattern [j] ;
+	}
+    }
+
+    /* non-singletons */
+    for (k = npiv-1 ; k >= n1 ; k--)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* use row k of U */
+	/* ------------------------------------------------------------------ */
+
+	up = Uip [k] ;
+	ulen = Uilen [k] ;
+	newUchain = (up < 0) ;
+	if (newUchain)
+	{
+	    up = -up ;
+	    xp = (Entry *) (Numeric->Memory + up + UNITS (Int, ulen)) ;
+	}
+	else
+	{
+	    xp = (Entry *) (Numeric->Memory + up) ;
+	}
+
+	xp += deg ;
+	for (j = deg-1 ; j >= 0 ; j--)
+	{
+	    DEBUG4 (("  k "ID" col "ID" value", k, Pattern [j])) ;
+	    col = Pattern [j] ;
+	    ASSERT (col >= 0 && col < n_col) ;
+	    value = *(--xp) ;
+	    EDEBUG4 (value) ;
+	    DEBUG4 (("\n")) ;
+	    if (IS_NONZERO (value))
+	    {
+		p = --(Wi [col]) ;
+		Ui [p] = k ;
+#ifdef COMPLEX
+		if (split)
+		{
+		    Ux [p] = REAL_COMPONENT (value) ;
+		    Uz [p] = IMAG_COMPONENT (value) ;
+		}
+		else
+		{
+		    Ux [2*p  ] = REAL_COMPONENT (value) ;
+		    Ux [2*p+1] = IMAG_COMPONENT (value) ;
+		}
+#else
+		Ux [p] = value ;
+#endif
+
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* make row k-1 of U in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	if (newUchain)
+	{
+	    /* next row is a new Uchain */
+	    deg = ulen ;
+	    DEBUG4 (("end of chain for row of U "ID" deg "ID"\n", k-1, deg)) ;
+	    ip = (Int *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = *ip++ ;
+		DEBUG4 (("  k "ID" col "ID"\n", k-1, col)) ;
+		ASSERT (k <= col) ;
+		Pattern [j] = col ;
+	    }
+	}
+	else
+	{
+	    deg -= ulen ;
+	    DEBUG4 (("middle of chain for row of U "ID" deg "ID"\n", k-1, deg));
+	    ASSERT (deg >= 0) ;
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* add the pivot column */
+		DEBUG4 (("k "ID" add pivot entry at position "ID"\n", k, pos)) ;
+		ASSERT (pos >= 0 && pos <= deg) ;
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	}
+    }
+
+    /* singletons */
+    for (k = n1 - 1 ; k >= 0 ; k--)
+    {
+	deg = Uilen [k] ;
+	DEBUG4 (("Singleton k "ID"\n", k)) ;
+	if (deg > 0)
+	{
+	    up = Uip [k] ;
+	    Usi = (Int *) (Numeric->Memory + up) ;
+	    up += UNITS (Int, deg) ;
+	    Uval = (Entry *) (Numeric->Memory + up) ;
+	    for (j = 0 ; j < deg ; j++)
+	    {
+		col = Usi [j] ;
+		value = Uval [j] ;
+		DEBUG4 (("  k "ID" col "ID" value", k, col)) ;
+		EDEBUG4 (value) ;
+		DEBUG4 (("\n")) ;
+		if (IS_NONZERO (value))
+		{
+		    p = --(Wi [col]) ;
+		    Ui [p] = k ;
+#ifdef COMPLEX
+		    if (split)
+		    {
+			Ux [p] = REAL_COMPONENT (value) ;
+			Uz [p] = IMAG_COMPONENT (value) ;
+		    }
+		    else
+		    {
+			Ux [2*p  ] = REAL_COMPONENT (value) ;
+			Ux [2*p+1] = IMAG_COMPONENT (value) ;
+		    }
+#else
+		    Ux [p] = value ;
+#endif
+		}
+	    }
+	}
+    }
+
+#ifndef NDEBUG
+    DEBUG6 (("U matrix:")) ;
+    UMF_dump_col_matrix (Ux,
+#ifdef COMPLEX
+	Uz,
+#endif
+	Ui, Up, Numeric->n_row, n_col, Numeric->unz + Numeric->nnzpiv) ;
+#endif
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_get_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,191 @@
+/* ========================================================================== */
+/* === UMFPACK_get_symbolic ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Gets the symbolic information held in the Symbolic object.
+    See umfpack_get_symbolic.h for a more detailed description.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_symbolic.h"
+
+GLOBAL Int UMFPACK_get_symbolic
+(
+    Int *p_n_row,
+    Int *p_n_col,
+    Int *p_n1,			/* number of singletons */
+    Int *p_nz,
+    Int *p_nfr,
+    Int *p_nchains,
+    Int P [ ],
+    Int Q [ ],
+    Int Front_npivcol [ ],
+    Int Front_parent [ ],
+    Int Front_1strow [ ],
+    Int Front_leftmostdesc [ ],
+    Int Chain_start [ ],
+    Int Chain_maxrows [ ],
+    Int Chain_maxcols [ ],
+    void *SymbolicHandle
+)
+{
+    SymbolicType *Symbolic ;
+    Int k, n_row, n_col, n1, nfr, nchains, *p ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check inputs */
+    /* ---------------------------------------------------------------------- */
+
+    Symbolic = (SymbolicType *) SymbolicHandle ;
+    if (!UMF_valid_symbolic (Symbolic))
+    {
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* get contents of Symbolic */
+    /* ---------------------------------------------------------------------- */
+
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+    n1 = Symbolic->n1 ;
+    nfr = Symbolic->nfr ;
+    nchains = Symbolic->nchains ;
+
+    if (p_n_row)
+    {
+	*p_n_row = n_row ;
+    }
+
+    if (p_n_col)
+    {
+	*p_n_col = n_col ;
+    }
+
+    if (p_n1)
+    {
+	*p_n1 = n1 ;
+    }
+
+    if (p_nz)
+    {
+	*p_nz = Symbolic->nz ;
+    }
+
+    if (p_nfr)
+    {
+	*p_nfr = nfr ;
+    }
+
+    if (p_nchains)
+    {
+	*p_nchains = nchains ;
+    }
+
+    if (P != (Int *) NULL)
+    {
+	Int *Rperm_init, *Diagonal_map ;
+	Rperm_init = Symbolic->Rperm_init ;
+	Diagonal_map = Symbolic->Diagonal_map ;
+	if (Diagonal_map != (Int *) NULL)
+	{
+	    ASSERT (n_row == n_col) ;
+	    /* next pivot rows are found in the diagonal map */
+	    for (k = 0 ; k < n_row ; k++)
+	    {
+		P [k] = Rperm_init [Diagonal_map [k]] ;
+	    }
+	}
+	else
+	{
+	    /* there is no diagonal map.  */
+	    for (k = 0 ; k < n_row ; k++)
+	    {
+		P [k] = Rperm_init [k] ;
+	    }
+	}
+    }
+
+    if (Q != (Int *) NULL)
+    {
+	p = Symbolic->Cperm_init ;
+	for (k = 0 ; k < n_col ; k++)
+	{
+	    Q [k] = p [k] ;
+	}
+    }
+
+    if (Front_npivcol != (Int *) NULL)
+    {
+	p = Symbolic->Front_npivcol ;
+	for (k = 0 ; k <= nfr ; k++)
+	{
+	    Front_npivcol [k] = p [k] ;
+	}
+    }
+
+    if (Front_parent != (Int *) NULL)
+    {
+	p = Symbolic->Front_parent ;
+	for (k = 0 ; k <= nfr ; k++)
+	{
+	    Front_parent [k] = p [k] ;
+	}
+    }
+
+    if (Front_1strow != (Int *) NULL)
+    {
+	p = Symbolic->Front_1strow ;
+	for (k = 0 ; k <= nfr ; k++)
+	{
+	    Front_1strow [k] = p [k] ;
+	}
+    }
+
+    if (Front_leftmostdesc != (Int *) NULL)
+    {
+	p = Symbolic->Front_leftmostdesc ;
+	for (k = 0 ; k <= nfr ; k++)
+	{
+	    Front_leftmostdesc [k] = p [k] ;
+	}
+    }
+
+    if (Chain_start != (Int *) NULL)
+    {
+	p = Symbolic->Chain_start ;
+	for (k = 0 ; k <= nchains ; k++)
+	{
+	    Chain_start [k] = p [k] ;
+	}
+    }
+
+    if (Chain_maxrows != (Int *) NULL)
+    {
+	p = Symbolic->Chain_maxrows ;
+	for (k = 0 ; k < nchains ; k++)
+	{
+	    Chain_maxrows [k] = p [k] ;
+	}
+	Chain_maxrows [nchains] = 0 ;
+    }
+
+    if (Chain_maxcols != (Int *) NULL)
+    {
+	p = Symbolic->Chain_maxcols ;
+	for (k = 0 ; k < nchains ; k++)
+	{
+	    Chain_maxcols [k] = p [k] ;
+	}
+	Chain_maxcols [nchains] = 0 ;
+    }
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_load_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,161 @@
+/* ========================================================================== */
+/* === UMFPACK_load_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Loads a Numeric object from a file created by
+    umfpack_*_save_numeric.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+#define READ(object,type,n) \
+{ \
+    object = (type *) UMF_malloc (n, sizeof (type)) ; \
+    if (object == (type *) NULL) \
+    { \
+	UMFPACK_free_numeric ((void **) &Numeric) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_out_of_memory) ; \
+    } \
+    if (fread (object, sizeof (type), n, f) != n) \
+    { \
+	UMFPACK_free_numeric ((void **) &Numeric) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+    if (ferror (f)) \
+    { \
+	UMFPACK_free_numeric ((void **) &Numeric) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+}
+
+/* ========================================================================== */
+/* === UMFPACK_load_numeric ================================================= */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_load_numeric
+(
+    void **NumericHandle,
+    char *user_filename
+)
+{
+    NumericType *Numeric ;
+    char *filename ;
+    FILE *f ;
+
+    *NumericHandle = (void *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get the filename, or use the default name if filename is NULL */
+    /* ---------------------------------------------------------------------- */
+
+    if (user_filename == (char *) NULL)
+    {
+	filename = "numeric.umf" ;
+    }
+    else
+    {
+	filename = user_filename ;
+    }
+    f = fopen (filename, "rb") ;
+    if (!f)
+    {
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* read the Numeric header from the file, in binary */
+    /* ---------------------------------------------------------------------- */
+
+    Numeric = (NumericType *) UMF_malloc (1, sizeof (NumericType)) ;
+    if (Numeric == (NumericType *) NULL)
+    {
+	fclose (f) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    if (fread (Numeric, sizeof (NumericType), 1, f) != 1)
+    {
+	(void) UMF_free ((void *) Numeric) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+    if (ferror (f))
+    {
+	(void) UMF_free ((void *) Numeric) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    if (Numeric->valid != NUMERIC_VALID || Numeric->n_row <= 0 ||
+	Numeric->n_col <= 0 || Numeric->npiv < 0 || Numeric->ulen < 0 ||
+	Numeric->size <= 0)
+    {
+	/* Numeric does not point to a NumericType object */
+	(void) UMF_free ((void *) Numeric) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    Numeric->D        = (Entry *) NULL ;
+    Numeric->Rperm    = (Int *) NULL ;
+    Numeric->Cperm    = (Int *) NULL ;
+    Numeric->Lpos     = (Int *) NULL ;
+    Numeric->Lilen    = (Int *) NULL ;
+    Numeric->Lip      = (Int *) NULL ;
+    Numeric->Upos     = (Int *) NULL ;
+    Numeric->Uilen    = (Int *) NULL ;
+    Numeric->Uip      = (Int *) NULL ;
+    Numeric->Rs       = (double *) NULL ;
+    Numeric->Memory   = (Unit *) NULL ;
+    Numeric->Upattern = (Int *) NULL ;
+
+    /* umfpack_free_numeric can now be safely called if an error occurs */
+
+    /* ---------------------------------------------------------------------- */
+    /* read the rest of the Numeric object */
+    /* ---------------------------------------------------------------------- */
+
+    READ (Numeric->D,     Entry, MIN (Numeric->n_row, Numeric->n_col)+1) ;
+    READ (Numeric->Rperm, Int,   Numeric->n_row+1) ;
+    READ (Numeric->Cperm, Int,   Numeric->n_col+1) ;
+    READ (Numeric->Lpos,  Int,   Numeric->npiv+1) ;
+    READ (Numeric->Lilen, Int,   Numeric->npiv+1) ;
+    READ (Numeric->Lip,   Int,   Numeric->npiv+1) ;
+    READ (Numeric->Upos,  Int,   Numeric->npiv+1) ;
+    READ (Numeric->Uilen, Int,   Numeric->npiv+1) ;
+    READ (Numeric->Uip,   Int,   Numeric->npiv+1) ;
+    if (Numeric->scale != UMFPACK_SCALE_NONE)
+    {
+	READ (Numeric->Rs, double, Numeric->n_row) ;
+    }
+    if (Numeric->ulen > 0)
+    {
+	READ (Numeric->Upattern, Int, Numeric->ulen+1) ;
+    }
+    READ (Numeric->Memory, Unit, Numeric->size) ;
+
+    /* close the file */
+    fclose (f) ;
+
+    /* make sure the Numeric object is valid */
+    if (!UMF_valid_numeric (Numeric))
+    {
+	UMFPACK_free_numeric ((void **) &Numeric) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    *NumericHandle = (void *) Numeric ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_load_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,165 @@
+/* ========================================================================== */
+/* === UMFPACK_load_symbolic ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Loads a Symbolic object from a file created by
+    umfpack_*_save_symbolic.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_symbolic.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+#define READ(object,type,n) \
+{ \
+    object = (type *) UMF_malloc (n, sizeof (type)) ; \
+    if (object == (type *) NULL) \
+    { \
+	UMFPACK_free_symbolic ((void **) &Symbolic) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_out_of_memory) ; \
+    } \
+    if (fread (object, sizeof (type), n, f) != n) \
+    { \
+	UMFPACK_free_symbolic ((void **) &Symbolic) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+    if (ferror (f)) \
+    { \
+	UMFPACK_free_symbolic ((void **) &Symbolic) ; \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+}
+
+/* ========================================================================== */
+/* === UMFPACK_load_symbolic ================================================ */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_load_symbolic
+(
+    void **SymbolicHandle,
+    char *user_filename
+)
+{
+    SymbolicType *Symbolic ;
+    char *filename ;
+    FILE *f ;
+
+    *SymbolicHandle = (void *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get the filename, or use the default name if filename is NULL */
+    /* ---------------------------------------------------------------------- */
+
+    if (user_filename == (char *) NULL)
+    {
+	filename = "symbolic.umf" ;
+    }
+    else
+    {
+	filename = user_filename ;
+    }
+    f = fopen (filename, "rb") ;
+    if (!f)
+    {
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* read the Symbolic header from the file, in binary */
+    /* ---------------------------------------------------------------------- */
+
+    Symbolic = (SymbolicType *) UMF_malloc (1, sizeof (SymbolicType)) ;
+    if (Symbolic == (SymbolicType *) NULL)
+    {
+	fclose (f) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    if (fread (Symbolic, sizeof (SymbolicType), 1, f) != 1)
+    {
+	(void) UMF_free ((void *) Symbolic) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+    if (ferror (f))
+    {
+	(void) UMF_free ((void *) Symbolic) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    if (Symbolic->valid != SYMBOLIC_VALID || Symbolic->n_row <= 0 ||
+	Symbolic->n_col <= 0 || Symbolic->nfr < 0 || Symbolic->nchains < 0 ||
+	Symbolic->esize < 0)
+    {
+	/* Symbolic does not point to a Symbolic object */
+	(void) UMF_free ((void *) Symbolic) ;
+	fclose (f) ;
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    Symbolic->Cperm_init         = (Int *) NULL ;
+    Symbolic->Rperm_init         = (Int *) NULL ;
+    Symbolic->Front_npivcol      = (Int *) NULL ;
+    Symbolic->Front_parent       = (Int *) NULL ;
+    Symbolic->Front_1strow       = (Int *) NULL ;
+    Symbolic->Front_leftmostdesc = (Int *) NULL ;
+    Symbolic->Chain_start        = (Int *) NULL ;
+    Symbolic->Chain_maxrows      = (Int *) NULL ;
+    Symbolic->Chain_maxcols      = (Int *) NULL ;
+    Symbolic->Cdeg               = (Int *) NULL ;
+    Symbolic->Rdeg               = (Int *) NULL ;
+    Symbolic->Esize              = (Int *) NULL ;
+    Symbolic->Diagonal_map       = (Int *) NULL ;
+
+    /* umfpack_free_symbolic can now be safely called if an error occurs */
+
+    /* ---------------------------------------------------------------------- */
+    /* read the rest of the Symbolic object */
+    /* ---------------------------------------------------------------------- */
+
+    READ (Symbolic->Cperm_init,         Int, Symbolic->n_col+1) ;
+    READ (Symbolic->Rperm_init,         Int, Symbolic->n_row+1) ;
+    READ (Symbolic->Front_npivcol,      Int, Symbolic->nfr+1) ;
+    READ (Symbolic->Front_parent,       Int, Symbolic->nfr+1) ;
+    READ (Symbolic->Front_1strow,       Int, Symbolic->nfr+1) ;
+    READ (Symbolic->Front_leftmostdesc, Int, Symbolic->nfr+1) ;
+    READ (Symbolic->Chain_start,        Int, Symbolic->nchains+1) ;
+    READ (Symbolic->Chain_maxrows,      Int, Symbolic->nchains+1) ;
+    READ (Symbolic->Chain_maxcols,      Int, Symbolic->nchains+1) ;
+    READ (Symbolic->Cdeg,               Int, Symbolic->n_col+1) ;
+    READ (Symbolic->Rdeg,               Int, Symbolic->n_row+1) ;
+    if (Symbolic->esize > 0)
+    {
+	/* only when dense rows are present */
+	READ (Symbolic->Esize, Int, Symbolic->esize) ;
+    }
+    if (Symbolic->prefer_diagonal)
+    {
+	/* only when diagonal pivoting is prefered */
+	READ (Symbolic->Diagonal_map, Int, Symbolic->n_col+1) ;
+    }
+
+    /* close the file */
+    fclose (f) ;
+
+    /* make sure the Symbolic object is valid */
+    if (!UMF_valid_symbolic (Symbolic))
+    {
+	UMFPACK_free_symbolic ((void **) &Symbolic) ;
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    *SymbolicHandle = (void *) Symbolic ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,792 @@
+/* ========================================================================== */
+/* === UMFPACK_numeric ====================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Factorizes A into its LU factors, given a symbolic
+    pre-analysis computed by UMFPACK_symbolic.  See umfpack_numeric.h for a
+    description.
+
+    Dynamic memory allocation:  substantial.  See comments (1) through (7),
+    below.  If an error occurs, all allocated space is free'd by UMF_free.
+    If successful, the Numeric object contains 11 to 13 objects allocated by
+    UMF_malloc that hold the LU factors of the input matrix.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_symbolic.h"
+#include "umf_set_stats.h"
+#include "umf_kernel.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+#include "umf_realloc.h"
+
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+
+PRIVATE Int work_alloc
+(
+    WorkType *Work,
+    SymbolicType *Symbolic
+) ;
+
+PRIVATE void free_work
+(
+    WorkType *Work
+) ;
+
+PRIVATE Int numeric_alloc
+(
+    NumericType **NumericHandle,
+    SymbolicType *Symbolic,
+    double alloc_init,
+    Int scale
+) ;
+
+PRIVATE void error
+(
+    NumericType **Numeric,
+    WorkType *Work
+) ;
+
+
+/* ========================================================================== */
+/* === UMFPACK_numeric ====================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_numeric
+(
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    void *SymbolicHandle,
+    void **NumericHandle,
+    const double Control [UMFPACK_CONTROL],
+    double User_Info [UMFPACK_INFO]
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double Info2 [UMFPACK_INFO], alloc_init, relpt, relpt2, droptol,
+	front_alloc_init, stats [2] ;
+    double *Info ;
+    WorkType WorkSpace, *Work ;
+    NumericType *Numeric ;
+    SymbolicType *Symbolic ;
+    Int n_row, n_col, n_inner, newsize, i, status, *inew, npiv, ulen, scale ;
+    Unit *mnew ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get the amount of time used by the process so far */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (stats) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* initialize and check inputs */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    UMF_dump_start ( ) ;
+    init_count = UMF_malloc_count ;
+    DEBUGm4 (("\nUMFPACK numeric: U transpose version\n")) ;
+#endif
+
+    /* If front_alloc_init negative then allocate that size of front in
+     * UMF_start_front.  If alloc_init negative, then allocate that initial
+     * size of Numeric->Memory. */
+
+    relpt = GET_CONTROL (UMFPACK_PIVOT_TOLERANCE,
+	UMFPACK_DEFAULT_PIVOT_TOLERANCE) ;
+    relpt2 = GET_CONTROL (UMFPACK_SYM_PIVOT_TOLERANCE,
+	UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE) ;
+    alloc_init = GET_CONTROL (UMFPACK_ALLOC_INIT, UMFPACK_DEFAULT_ALLOC_INIT) ;
+    front_alloc_init = GET_CONTROL (UMFPACK_FRONT_ALLOC_INIT,
+	UMFPACK_DEFAULT_FRONT_ALLOC_INIT) ;
+    scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ;
+    droptol = GET_CONTROL (UMFPACK_DROPTOL, UMFPACK_DEFAULT_DROPTOL) ;
+
+    relpt   = MAX (0.0, MIN (relpt,  1.0)) ;
+    relpt2  = MAX (0.0, MIN (relpt2, 1.0)) ;
+    droptol = MAX (0.0, droptol) ;
+    front_alloc_init = MIN (1.0, front_alloc_init) ;
+
+    if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX)
+    {
+	scale = UMFPACK_DEFAULT_SCALE ;
+    }
+
+    if (User_Info != (double *) NULL)
+    {
+	/* return Info in user's array */
+	Info = User_Info ;
+	/* clear the parts of Info that are set by UMFPACK_numeric */
+	for (i = UMFPACK_NUMERIC_SIZE ; i <= UMFPACK_MAX_FRONT_NCOLS ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+	for (i = UMFPACK_NUMERIC_DEFRAG ; i < UMFPACK_IR_TAKEN ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+    }
+    else
+    {
+	/* no Info array passed - use local one instead */
+	Info = Info2 ;
+	for (i = 0 ; i < UMFPACK_INFO ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+    }
+
+    Symbolic = (SymbolicType *) SymbolicHandle ;
+    Numeric = (NumericType *) NULL ;
+    if (!UMF_valid_symbolic (Symbolic))
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Symbolic_object ;
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    /* compute alloc_init automatically for AMD ordering */
+    if (Symbolic->ordering == UMFPACK_ORDERING_AMD && alloc_init >= 0)
+    {
+	alloc_init = (Symbolic->nz + Symbolic->amd_lunz) / Symbolic->lunz_bound;
+	alloc_init = MIN (1.0, alloc_init) ;
+	alloc_init *= UMF_REALLOC_INCREASE ;
+    }
+
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+    n_inner = MIN (n_row, n_col) ;
+
+    /* check for integer overflow in Numeric->Memory minimum size */
+    if (INT_OVERFLOW (Symbolic->dnum_mem_init_usage * sizeof (Unit)))
+    {
+	/* :: int overflow, initial Numeric->Memory size :: */
+	/* There's no hope to allocate a Numeric object big enough simply to
+	 * hold the initial matrix, so return an out-of-memory condition */
+	DEBUGm4 (("out of memory: numeric int overflow\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    Info [UMFPACK_STATUS] = UMFPACK_OK ;
+    Info [UMFPACK_NROW] = n_row ;
+    Info [UMFPACK_NCOL] = n_col ;
+    Info [UMFPACK_SIZE_OF_UNIT] = (double) (sizeof (Unit)) ;
+
+    if (!Ap || !Ai || !Ax || !NumericHandle)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    Info [UMFPACK_NZ] = Ap [n_col] ;
+    *NumericHandle = (void *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the Work object */
+    /* ---------------------------------------------------------------------- */
+
+    /* (1) calls UMF_malloc 15 or 17 times, to obtain temporary workspace of
+     * size c+1 Entry's and 2*(n_row+1) + 3*(n_col+1) + (n_col+n_inner+1) +
+     * (nn+1) + * 3*(c+1) + 2*(r+1) + max(r,c) + (nfr+1) integers plus 2*nn
+     * more integers if diagonal pivoting is to be done.  r is the maximum
+     * number of rows in any frontal matrix, c is the maximum number of columns
+     * in any frontal matrix, n_inner is min (n_row,n_col), nn is
+     * max (n_row,n_col), and nfr is the number of frontal matrices.  For a
+     * square matrix, this is c+1 Entry's and about 8n + 3c + 2r + max(r,c) +
+     * nfr integers, plus 2n more for diagonal pivoting.
+     */
+
+    Work = &WorkSpace ;
+    Work->n_row = n_row ;
+    Work->n_col = n_col ;
+    Work->nfr = Symbolic->nfr ;
+    Work->nb = Symbolic->nb ;
+    Work->n1 = Symbolic->n1 ;
+
+    if (!work_alloc (Work, Symbolic))
+    {
+	DEBUGm4 (("out of memory: numeric work\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Numeric, Work) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    ASSERT (UMF_malloc_count == init_count + 16 + 2*Symbolic->prefer_diagonal) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate Numeric object */
+    /* ---------------------------------------------------------------------- */
+
+    /* (2) calls UMF_malloc 10 or 11 times, for a total space of
+     * sizeof (NumericType) bytes, 4*(n_row+1) + 4*(n_row+1) integers, and
+     * (n_inner+1) Entry's, plus n_row Entry's if row scaling is to be done.
+     * sizeof (NumericType) is a small constant.  Next, it calls UMF_malloc
+     * once, for the variable-sized part of the Numeric object
+     * (Numeric->Memory).  The size of this object is the larger of
+     * (Control [UMFPACK_ALLOC_INIT]) *  (the approximate upper bound computed
+     * by UMFPACK_symbolic), and the minimum required to start the numerical
+     * factorization.  * This request is reduced if it fails.
+     */
+
+    if (!numeric_alloc (&Numeric, Symbolic, alloc_init, scale))
+    {
+	DEBUGm4 (("out of memory: initial numeric\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Numeric, Work) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n",
+	init_count, UMF_malloc_count)) ;
+    ASSERT (UMF_malloc_count == init_count
+	+ (16 + 2*Symbolic->prefer_diagonal)
+	+ (11 + (scale != UMFPACK_SCALE_NONE))) ;
+
+    /* set control parameters */
+    Numeric->relpt = relpt ;
+    Numeric->relpt2 = relpt2 ;
+    Numeric->droptol = droptol ;
+    Numeric->alloc_init = alloc_init ;
+    Numeric->front_alloc_init = front_alloc_init ;
+    Numeric->scale = scale ;
+
+    DEBUG0 (("umf relpt %g %g init %g %g inc %g red %g\n",
+	relpt, relpt2, alloc_init, front_alloc_init,
+	UMF_REALLOC_INCREASE, UMF_REALLOC_REDUCTION)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* scale and factorize */
+    /* ---------------------------------------------------------------------- */
+
+    /* (3) During numerical factorization (inside UMF_kernel), the variable-size
+     * block of memory is increased in size via a call to UMF_realloc if it is
+     * found to be too small.  During factorization, this block holds the
+     * pattern and values of L and U at the top end, and the elements
+     * (contibution blocks) and the current frontal matrix (Work->F*) at the
+     * bottom end.  The peak size of the variable-sized object is estimated in
+     * UMFPACK_*symbolic (Info [UMFPACK_VARIABLE_PEAK_ESTIMATE]), although this
+     * upper bound can be very loose.  The size of the Symbolic object
+     * (which is currently allocated) is in Info [UMFPACK_SYMBOLIC_SIZE], and
+     * is between 2*n and 13*n integers.
+     */
+
+    DEBUG0 (("Calling umf_kernel\n")) ;
+    status = UMF_kernel (Ap, Ai, Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+	Numeric, Work, Symbolic) ;
+
+    Info [UMFPACK_STATUS] = status ;
+    if (status < UMFPACK_OK)
+    {
+	/* out of memory, or pattern has changed */
+	error (&Numeric, Work) ;
+	return (status) ;
+    }
+
+    Info [UMFPACK_FORCED_UPDATES] = Work->nforced ;
+    Info [UMFPACK_VARIABLE_INIT] = Numeric->init_usage ;
+    if (Symbolic->prefer_diagonal)
+    {
+	Info [UMFPACK_NOFF_DIAG] = Work->noff_diagonal ;
+    }
+
+    DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n",
+	init_count, UMF_malloc_count)) ;
+
+    npiv = Numeric->npiv ;	/* = n_inner for nonsingular matrices */
+    ulen = Numeric->ulen ;	/* = 0 for square nonsingular matrices */
+
+    /* ---------------------------------------------------------------------- */
+    /* free Work object */
+    /* ---------------------------------------------------------------------- */
+
+    /* (4) After numerical factorization all of the objects allocated in step
+     * (1) are freed via UMF_free, except that one object of size n_col+1 is
+     * kept if there are off-diagonal nonzeros in the last pivot row (can only
+     * occur for singular or rectangular matrices).  This is Work->Upattern,
+     * which is transfered to Numeric->Upattern if ulen > 0.
+     */
+
+    DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n",
+	init_count, UMF_malloc_count)) ;
+
+    free_work (Work) ;
+
+    DEBUG0 (("malloc: init_count "ID" UMF_malloc_count "ID"\n",
+	init_count, UMF_malloc_count)) ;
+    DEBUG0 (("Numeric->ulen: "ID" scale: "ID"\n", ulen, scale)) ;
+    ASSERT (UMF_malloc_count == init_count + (ulen > 0) +
+	(11 + (scale != UMFPACK_SCALE_NONE))) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* reduce Lpos, Lilen, Lip, Upos, Uilen and Uip to size npiv+1 */
+    /* ---------------------------------------------------------------------- */
+
+    /* (5) Six components of the Numeric object are reduced in size if the
+     * matrix is singular or rectangular.   The original size is 3*(n_row+1) +
+     * 3*(n_col+1) integers.  The new size is 6*(npiv+1) integers.  For
+     * square non-singular matrices, these two sizes are the same.
+     */
+
+    if (npiv < n_row)
+    {
+	/* reduce Lpos, Uilen, and Uip from size n_row+1 to size npiv */
+	inew = (Int *) UMF_realloc (Numeric->Lpos, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Lpos = inew ;
+	}
+	inew = (Int *) UMF_realloc (Numeric->Uilen, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Uilen = inew ;
+	}
+	inew = (Int *) UMF_realloc (Numeric->Uip, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Uip = inew ;
+	}
+    }
+
+    if (npiv < n_col)
+    {
+	/* reduce Upos, Lilen, and Lip from size n_col+1 to size npiv */
+	inew = (Int *) UMF_realloc (Numeric->Upos, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Upos = inew ;
+	}
+	inew = (Int *) UMF_realloc (Numeric->Lilen, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Lilen = inew ;
+	}
+	inew = (Int *) UMF_realloc (Numeric->Lip, npiv+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Lip = inew ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* reduce Numeric->Upattern from size n_col+1 to size ulen+1 */
+    /* ---------------------------------------------------------------------- */
+
+    /* (6) The size of Numeric->Upattern (formerly Work->Upattern) is reduced
+     * from size n_col+1 to size ulen + 1.  If ulen is zero, the object does
+     * not exist. */
+
+    DEBUG4 (("ulen: "ID" Upattern "ID"\n", ulen, (Int) Numeric->Upattern)) ;
+    ASSERT (IMPLIES (ulen == 0, Numeric->Upattern == (Int *) NULL)) ;
+    if (ulen > 0 && ulen < n_col)
+    {
+	inew = (Int *) UMF_realloc (Numeric->Upattern, ulen+1, sizeof (Int)) ;
+	if (inew)
+	{
+	    Numeric->Upattern = inew ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* reduce Numeric->Memory to hold just the LU factors at the head */
+    /* ---------------------------------------------------------------------- */
+
+    /* (7) The variable-sized block (Numeric->Memory) is reduced to hold just L
+     * and U, via a call to UMF_realloc, since the frontal matrices are no
+     * longer needed.
+     */
+
+    newsize = Numeric->ihead ;
+    if (newsize < Numeric->size)
+    {
+	mnew = (Unit *) UMF_realloc (Numeric->Memory, newsize, sizeof (Unit)) ;
+	if (mnew)
+	{
+	    /* realloc succeeded (how can it fail since the size is reduced?) */
+	    Numeric->Memory = mnew ;
+	    Numeric->size = newsize ;
+	}
+    }
+    Numeric->ihead = Numeric->size ;
+    Numeric->itail = Numeric->ihead ;
+    Numeric->tail_usage = 0 ;
+    Numeric->ibig = EMPTY ;
+    /* UMF_mem_alloc_tail_block can no longer be called (no tail marker) */
+
+    /* ---------------------------------------------------------------------- */
+    /* report the results and return the Numeric object */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_set_stats (
+	Info,
+	Symbolic,
+	(double) Numeric->max_usage,	/* actual peak Numeric->Memory */
+	(double) Numeric->size,		/* actual final Numeric->Memory */
+	Numeric->flops,			/* actual "true flops" */
+	(double) Numeric->lnz + n_inner,		/* actual nz in L */
+	(double) Numeric->unz + Numeric->nnzpiv,	/* actual nz in U */
+	(double) Numeric->maxfrsize,	/* actual largest front size */
+	(double) ulen,			/* actual Numeric->Upattern size */
+	(double) npiv,			/* actual # pivots found */
+	(double) Numeric->maxnrows,	/* actual largest #rows in front */
+	(double) Numeric->maxncols,	/* actual largest #cols in front */
+	scale != UMFPACK_SCALE_NONE,
+	Symbolic->prefer_diagonal,
+	ACTUAL) ;
+
+    Info [UMFPACK_ALLOC_INIT_USED] = Numeric->alloc_init ;
+    Info [UMFPACK_NUMERIC_DEFRAG] = Numeric->ngarbage ;
+    Info [UMFPACK_NUMERIC_REALLOC] = Numeric->nrealloc ;
+    Info [UMFPACK_NUMERIC_COSTLY_REALLOC] = Numeric->ncostly ;
+    Info [UMFPACK_COMPRESSED_PATTERN] = Numeric->isize ;
+    Info [UMFPACK_LU_ENTRIES] = Numeric->nLentries + Numeric->nUentries +
+	    Numeric->npiv ;
+    Info [UMFPACK_UDIAG_NZ] = Numeric->nnzpiv ;
+    Info [UMFPACK_RSMIN] = Numeric->rsmin ;
+    Info [UMFPACK_RSMAX] = Numeric->rsmax ;
+    Info [UMFPACK_WAS_SCALED] = Numeric->scale ;
+
+    /* nz in L and U with no dropping of small entries */
+    Info [UMFPACK_ALL_LNZ] = Numeric->all_lnz + n_inner ;
+    Info [UMFPACK_ALL_UNZ] = Numeric->all_unz + Numeric->nnzpiv ;
+    Info [UMFPACK_NZDROPPED] =
+	  (Numeric->all_lnz - Numeric->lnz)
+	+ (Numeric->all_unz - Numeric->unz) ;
+
+    /* estimate of the reciprocal of the condition number. */
+    if (SCALAR_IS_ZERO (Numeric->min_udiag)
+     || SCALAR_IS_ZERO (Numeric->max_udiag)
+     ||	SCALAR_IS_NAN (Numeric->min_udiag)
+     ||	SCALAR_IS_NAN (Numeric->max_udiag))
+    {
+	/* rcond is zero if there is any zero or NaN on the diagonal */
+	Numeric->rcond = 0.0 ;
+    }
+    else
+    {
+	/* estimate of the recipricol of the condition number. */
+	/* This is NaN if diagonal is zero-free, but has one or more NaN's. */
+	Numeric->rcond = Numeric->min_udiag / Numeric->max_udiag ;
+    }
+    Info [UMFPACK_UMIN]  = Numeric->min_udiag ;
+    Info [UMFPACK_UMAX]  = Numeric->max_udiag ;
+    Info [UMFPACK_RCOND] = Numeric->rcond ;
+
+    if (Numeric->nnzpiv < n_inner
+    || SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond))
+    {
+	/* there are zeros and/or NaN's on the diagonal of U */
+	DEBUG0 (("Warning, matrix is singular in umfpack_numeric\n")) ;
+	DEBUG0 (("nnzpiv "ID" n_inner "ID" rcond %g\n", Numeric->nnzpiv,
+	    n_inner, Numeric->rcond)) ;
+	status = UMFPACK_WARNING_singular_matrix ;
+	Info [UMFPACK_STATUS] = status ;
+    }
+
+    Numeric->valid = NUMERIC_VALID ;
+    *NumericHandle = (void *) Numeric ;
+
+    /* Numeric has 11 to 13 objects */
+    ASSERT (UMF_malloc_count == init_count + 11 +
+	+ (ulen > 0)			    /* Numeric->Upattern */
+	+ (scale != UMFPACK_SCALE_NONE)) ;  /* Numeric->Rs */
+
+    /* ---------------------------------------------------------------------- */
+    /* get the time used by UMFPACK_numeric */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (stats) ;
+    Info [UMFPACK_NUMERIC_WALLTIME] = stats [0] ;
+    Info [UMFPACK_NUMERIC_TIME] = stats [1] ;
+
+    /* return UMFPACK_OK or UMFPACK_WARNING_singular_matrix */
+    return (status) ;
+
+}
+
+
+/* ========================================================================== */
+/* === numeric_alloc ======================================================== */
+/* ========================================================================== */
+
+/* Allocate the Numeric object */
+
+PRIVATE Int numeric_alloc
+(
+    NumericType **NumericHandle,
+    SymbolicType *Symbolic,
+    double alloc_init,
+    Int scale
+)
+{
+    double nsize, bsize ;
+    Int n_row, n_col, n_inner, min_usage, trying ;
+    NumericType *Numeric ;
+
+    DEBUG0 (("numeric alloc:\n")) ;
+
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+    n_inner = MIN (n_row, n_col) ;
+    *NumericHandle = (NumericType *) NULL ;
+
+    /* 1 allocation:  accounted for in UMF_set_stats (num_On_size1),
+     * free'd in umfpack_free_numeric */
+    Numeric = (NumericType *) UMF_malloc (1, sizeof (NumericType)) ;
+
+    if (!Numeric)
+    {
+	return (FALSE) ;	/* out of memory */
+    }
+    Numeric->valid = 0 ;
+    *NumericHandle = Numeric ;
+
+    /* 9 allocations:  accounted for in UMF_set_stats (num_On_size1),
+     * free'd in umfpack_free_numeric */
+    Numeric->D = (Entry *) UMF_malloc (n_inner+1, sizeof (Entry)) ;
+    Numeric->Rperm = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    Numeric->Cperm = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Numeric->Lpos = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    Numeric->Lilen = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Numeric->Lip = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Numeric->Upos = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Numeric->Uilen = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    Numeric->Uip = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+
+    /* 1 allocation if scaling:  in UMF_set_stats (num_On_size1),
+     * free'd in umfpack_free_numeric */
+    if (scale != UMFPACK_SCALE_NONE)
+    {
+	DEBUG0 (("Allocating scale factors\n")) ;
+	Numeric->Rs = (double *) UMF_malloc (n_row, sizeof (double)) ;
+    }
+    else
+    {
+	DEBUG0 (("No scale factors allocated (R = I)\n")) ;
+	Numeric->Rs = (double *) NULL ;
+    }
+
+    Numeric->Memory = (Unit *) NULL ;
+
+    /* Upattern has already been allocated as part of the Work object.  If
+     * the matrix is singular or rectangular, and there are off-diagonal
+     * nonzeros in the last pivot row, then Work->Upattern is not free'd.
+     * Instead it is transfered to Numeric->Upattern.  If it exists,
+     * Numeric->Upattern is free'd in umfpack_free_numeric. */
+    Numeric->Upattern = (Int *) NULL ;	/* used for singular matrices only */
+
+    if (!Numeric->D || !Numeric->Rperm || !Numeric->Cperm || !Numeric->Upos ||
+	!Numeric->Lpos || !Numeric->Lilen || !Numeric->Uilen || !Numeric->Lip ||
+	!Numeric->Uip || (scale != UMFPACK_SCALE_NONE && !Numeric->Rs))
+    {
+	return (FALSE) ;	/* out of memory */
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate initial Numeric->Memory for LU factors and elements */
+    /* ---------------------------------------------------------------------- */
+
+    if (alloc_init < 0)
+    {
+	/* -alloc_init is the exact size to initially allocate */
+	nsize = -alloc_init ;
+    }
+    else
+    {
+	/* alloc_init is a ratio of the upper bound memory usage */
+	nsize = (alloc_init * Symbolic->num_mem_usage_est) + 1 ;
+    }
+    min_usage = Symbolic->num_mem_init_usage ;
+
+    /* Numeric->Memory must be large enough for UMF_kernel_init */
+    nsize = MAX (min_usage, nsize) ;
+
+    /* Numeric->Memory cannot be larger in size than Int_MAX / sizeof(Unit) */
+    /* For ILP32 mode:  2GB (nsize cannot be bigger than 256 Mwords) */
+    bsize = ((double) Int_MAX) / sizeof (Unit) - 1 ;
+    DEBUG0 (("bsize %g\n", bsize)) ;
+    nsize = MIN (nsize, bsize) ;
+
+    Numeric->size = (Int) nsize ;
+
+    DEBUG0 (("Num init %g usage_est %g numsize "ID" minusage "ID"\n",
+	alloc_init, Symbolic->num_mem_usage_est, Numeric->size, min_usage)) ;
+
+    /* allocates 1 object: */
+    /* keep trying until successful, or memory request is too small */
+    trying = TRUE ;
+    while (trying)
+    {
+	Numeric->Memory = (Unit *) UMF_malloc (Numeric->size, sizeof (Unit)) ;
+	if (Numeric->Memory)
+	{
+	    DEBUG0 (("Successful Numeric->size: "ID"\n", Numeric->size)) ;
+	    return (TRUE) ;
+	}
+	/* too much, reduce the request (but not below the minimum) */
+	/* and try again */
+	trying = Numeric->size > min_usage ;
+	Numeric->size = (Int)
+	    (UMF_REALLOC_REDUCTION * ((double) Numeric->size)) ;
+	Numeric->size = MAX (min_usage, Numeric->size) ;
+    }
+
+    return (FALSE) ;	/* we failed to allocate Numeric->Memory */
+}
+
+
+/* ========================================================================== */
+/* === work_alloc =========================================================== */
+/* ========================================================================== */
+
+/* Allocate the Work object.  Return TRUE if successful. */
+
+PRIVATE Int work_alloc
+(
+    WorkType *Work,
+    SymbolicType *Symbolic
+)
+{
+    Int n_row, n_col, nn, maxnrows, maxncols, nfr, ok, maxnrc, n1 ;
+
+    n_row = Work->n_row ;
+    n_col = Work->n_col ;
+    nn = MAX (n_row, n_col) ;
+    nfr = Work->nfr ;
+    n1 = Symbolic->n1 ;
+    ASSERT (n1 <= n_row && n1 <= n_col) ;
+
+    maxnrows = Symbolic->maxnrows + Symbolic->nb ;
+    maxnrows = MIN (n_row, maxnrows) ;
+    maxncols = Symbolic->maxncols + Symbolic->nb ;
+    maxncols = MIN (n_col, maxncols) ;
+    maxnrc = MAX (maxnrows, maxncols) ;
+
+    DEBUG0 (("work alloc:  maxnrows+nb "ID" maxncols+nb "ID"\n",
+	maxnrows, maxncols)) ;
+
+    /* 15 allocations, freed in free_work: */
+    /* accounted for in UMF_set_stats (work_usage) */
+    Work->Wx = (Entry *) UMF_malloc (maxnrows + 1, sizeof (Entry)) ;
+    Work->Wy = (Entry *) UMF_malloc (maxnrows + 1, sizeof (Entry)) ;
+    Work->Frpos    = (Int *) UMF_malloc (n_row + 1, sizeof (Int)) ;
+    Work->Lpattern = (Int *) UMF_malloc (n_row + 1, sizeof (Int)) ;
+    Work->Fcpos = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ;
+    Work->Wp = (Int *) UMF_malloc (nn + 1, sizeof (Int)) ;
+    Work->Wrp = (Int *) UMF_malloc (MAX (n_col,maxnrows) + 1, sizeof (Int)) ;
+    Work->Frows = (Int *) UMF_malloc (maxnrows + 1, sizeof (Int)) ;
+    Work->Wm    = (Int *) UMF_malloc (maxnrows + 1, sizeof (Int)) ;
+    Work->Fcols = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ;
+    Work->Wio   = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ;
+    Work->Woi   = (Int *) UMF_malloc (maxncols + 1, sizeof (Int)) ;
+    Work->Woo = (Int *) UMF_malloc (maxnrc + 1, sizeof (Int));
+    Work->elen = (n_col - n1) + (n_row - n1) + MIN (n_col-n1, n_row-n1) + 1 ;
+    Work->E = (Int *) UMF_malloc (Work->elen, sizeof (Int)) ;
+    Work->Front_new1strow = (Int *) UMF_malloc (nfr + 1, sizeof (Int)) ;
+
+    ok = (Work->Frpos && Work->Fcpos && Work->Lpattern
+	&& Work->Wp && Work->Wrp && Work->Frows && Work->Fcols
+	&& Work->Wio && Work->Woi && Work->Woo && Work->Wm
+	&& Work->E && Work->Front_new1strow && Work->Wx && Work->Wy) ;
+
+    /* 2 allocations: accounted for in UMF_set_stats (work_usage) */
+    if (Symbolic->prefer_diagonal)
+    {
+	Work->Diagonal_map  = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+	Work->Diagonal_imap = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+	ok = ok && Work->Diagonal_map && Work->Diagonal_imap ;
+    }
+    else
+    {
+	/* no diagonal map needed for rectangular matrices */
+	Work->Diagonal_map = (Int *) NULL ;
+	Work->Diagonal_imap = (Int *) NULL ;
+    }
+
+    /* 1 allocation, may become part of Numeric (if singular or rectangular): */
+    Work->Upattern = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ;
+    ok = ok && Work->Upattern ;
+
+    /* current frontal matrix does not yet exist */
+    Work->Flublock = (Entry *) NULL ;
+    Work->Flblock  = (Entry *) NULL ;
+    Work->Fublock  = (Entry *) NULL ;
+    Work->Fcblock  = (Entry *) NULL ;
+
+    DEBUG0 (("work alloc done.\n")) ;
+    return (ok) ;
+}
+
+
+/* ========================================================================== */
+/* === free_work ============================================================ */
+/* ========================================================================== */
+
+PRIVATE void free_work
+(
+    WorkType *Work
+)
+{
+    DEBUG0 (("work free:\n")) ;
+    if (Work)
+    {
+	/* these 16 objects do exist */
+	Work->Wx = (Entry *) UMF_free ((void *) Work->Wx) ;
+	Work->Wy = (Entry *) UMF_free ((void *) Work->Wy) ;
+	Work->Frpos = (Int *) UMF_free ((void *) Work->Frpos) ;
+	Work->Fcpos = (Int *) UMF_free ((void *) Work->Fcpos) ;
+	Work->Lpattern = (Int *) UMF_free ((void *) Work->Lpattern) ;
+	Work->Upattern = (Int *) UMF_free ((void *) Work->Upattern) ;
+	Work->Wp = (Int *) UMF_free ((void *) Work->Wp) ;
+	Work->Wrp = (Int *) UMF_free ((void *) Work->Wrp) ;
+	Work->Frows = (Int *) UMF_free ((void *) Work->Frows) ;
+	Work->Fcols = (Int *) UMF_free ((void *) Work->Fcols) ;
+	Work->Wio = (Int *) UMF_free ((void *) Work->Wio) ;
+	Work->Woi = (Int *) UMF_free ((void *) Work->Woi) ;
+	Work->Woo = (Int *) UMF_free ((void *) Work->Woo) ;
+	Work->Wm = (Int *) UMF_free ((void *) Work->Wm) ;
+	Work->E = (Int *) UMF_free ((void *) Work->E) ;
+	Work->Front_new1strow =
+	    (Int *) UMF_free ((void *) Work->Front_new1strow) ;
+
+	/* these objects might not exist */
+	Work->Diagonal_map = (Int *) UMF_free ((void *) Work->Diagonal_map) ;
+	Work->Diagonal_imap = (Int *) UMF_free ((void *) Work->Diagonal_imap) ;
+    }
+    DEBUG0 (("work free done.\n")) ;
+}
+
+
+/* ========================================================================== */
+/* === error ================================================================ */
+/* ========================================================================== */
+
+/* Error return from UMFPACK_numeric.  Free all allocated memory. */
+
+PRIVATE void error
+(
+    NumericType **Numeric,
+    WorkType *Work
+)
+{
+    free_work (Work) ;
+    UMFPACK_free_numeric ((void **) Numeric) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_qsymbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,2415 @@
+/* ========================================================================== */
+/* === UMFPACK_qsymbolic ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Performs a symbolic factorization.
+    See umfpack_qsymbolic.h and umfpack_symbolic.h for details.
+
+    Dynamic memory usage:  about (3.4nz + 8n + n) integers and n double's as
+    workspace (via UMF_malloc, for a square matrix).  All of it is free'd via
+    UMF_free if an error occurs.  If successful, the Symbolic object contains
+    12 to 14 objects allocated by UMF_malloc, with a total size of no more
+    than about 13*n integers.
+*/
+
+#include "umf_internal.h"
+#include "umf_symbolic_usage.h"
+#include "umf_colamd.h"
+#include "umf_set_stats.h"
+#include "umf_analyze.h"
+#include "umf_transpose.h"
+#include "umf_is_permutation.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+#include "umf_2by2.h"
+#include "umf_singletons.h"
+
+typedef struct	/* SWType */
+{
+    Int *Front_npivcol ;    /* size n_col + 1 */
+    Int *Front_nrows ;	    /* size n_col */
+    Int *Front_ncols ;	    /* size n_col */
+    Int *Front_parent ;	    /* size n_col */
+    Int *Front_cols ;	    /* size n_col */
+    Int *InFront ;	    /* size n_row */
+    Int *Ci ;		    /* size Clen */
+    Int *Cperm1 ;	    /* size n_col */
+    Int *Rperm1 ;	    /* size n_row */
+    Int *InvRperm1 ;	    /* size n_row */
+    Int *Si ;		    /* size nz */
+    Int *Sp ;		    /* size n_col + 1 */
+    double *Rs ;	    /* size n_row */
+    Int *Rperm_2by2 ;	    /* size n_row */
+
+} SWType ;
+
+PRIVATE void free_work
+(
+    SWType *SW
+) ;
+
+PRIVATE void error
+(
+    SymbolicType **Symbolic,
+    SWType *SW
+) ;
+
+/* worst-case usage for SW object */
+#define SYM_WORK_USAGE(n_col,n_row,Clen) \
+    (DUNITS (Int, Clen) + \
+     DUNITS (Int, nz) + \
+     4 * DUNITS (Int, n_row) + \
+     4 * DUNITS (Int, n_col) + \
+     2 * DUNITS (Int, n_col + 1) + \
+     DUNITS (double, n_row))
+
+/* required size of Ci for code that calls UMF_transpose and UMF_analyze below*/
+#define UMF_ANALYZE_CLEN(nz,n_row,n_col,nn) \
+    ((n_col) + MAX ((nz),(n_col)) + 3*(nn)+1 + (n_col))
+
+/* size of an element (in Units), including tuples */
+#define ELEMENT_SIZE(r,c) \
+    (DGET_ELEMENT_SIZE (r, c) + 1 + (r + c) * UNITS (Tuple, 1))
+
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+
+/* ========================================================================== */
+/* === do_amd =============================================================== */
+/* ========================================================================== */
+
+PRIVATE void do_amd
+(
+    Int n,
+    const Int Ap [ ],		/* size n+1 */
+    const Int Ai [ ],		/* size nz = Ap [n] */
+    Int Q [ ],			/* output permutation, j = Q [k] */
+    Int Qinv [ ],		/* output inverse permutation, Qinv [j] = k */
+    Int Sdeg [ ],		/* degree of A+A', from AMD_aat */
+    Int Clen,			/* size of Ci */
+    Int Ci [ ],			/* size Ci workspace */
+    double amd_Control [ ],	/* AMD control parameters */
+    double amd_Info [ ],	/* AMD info */
+    SymbolicType *Symbolic,	/* Symbolic object */
+    double Info [ ]		/* UMFPACK info */
+)
+{
+
+    if (n == 0)
+    {
+	Symbolic->amd_dmax = 0 ;
+	Symbolic->amd_lunz = 0 ;
+	Info [UMFPACK_SYMMETRIC_LUNZ] = 0 ;
+	Info [UMFPACK_SYMMETRIC_FLOPS] = 0 ;
+	Info [UMFPACK_SYMMETRIC_DMAX] = 0 ;
+	Info [UMFPACK_SYMMETRIC_NDENSE] = 0 ;
+    }
+    else
+    {
+	AMD_1 (n, Ap, Ai, Q, Qinv, Sdeg, Clen, Ci, amd_Control, amd_Info) ;
+
+	/* return estimates computed from AMD on PA+PA' */
+	Symbolic->amd_dmax = amd_Info [AMD_DMAX] ;
+	Symbolic->amd_lunz = 2 * amd_Info [AMD_LNZ] + n ;
+	Info [UMFPACK_SYMMETRIC_LUNZ] = Symbolic->amd_lunz ;
+	Info [UMFPACK_SYMMETRIC_FLOPS] = DIV_FLOPS * amd_Info [AMD_NDIV] +
+	    MULTSUB_FLOPS * amd_Info [AMD_NMULTSUBS_LU] ;
+	Info [UMFPACK_SYMMETRIC_DMAX] = Symbolic->amd_dmax ;
+	Info [UMFPACK_SYMMETRIC_NDENSE] = amd_Info [AMD_NDENSE] ;
+	Info [UMFPACK_SYMBOLIC_DEFRAG] += amd_Info [AMD_NCMPA] ;
+    }
+}
+
+/* ========================================================================== */
+/* === prune_singletons ===================================================== */
+/* ========================================================================== */
+
+/* Create the submatrix after removing the n1 singletons.  The matrix has
+ * row and column indices in the range 0 to n_row-n1 and 0 to n_col-n1,
+ * respectively.  */
+
+PRIVATE Int prune_singletons
+(
+    Int n1,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    Int Cperm1 [ ],
+    Int InvRperm1 [ ],
+    Int Si [ ],
+    Int Sp [ ]
+#ifndef NDEBUG
+    , Int Rperm1 [ ]
+    , Int n_row
+#endif
+)
+{
+    Int row, k, pp, p, oldcol, newcol, newrow, nzdiag, do_nzdiag ;
+#ifdef COMPLEX
+    Int split = SPLIT (Az) ;
+#endif
+
+    nzdiag = 0 ;
+    do_nzdiag = (Ax != (double *) NULL) ;
+
+#ifndef NDEBUG
+    DEBUGm4 (("Prune : S = A (Cperm1 (n1+1:end), Rperm1 (n1+1:end))\n")) ;
+    for (k = 0 ; k < n_row ; k++)
+    {
+	ASSERT (Rperm1 [k] >= 0 && Rperm1 [k] < n_row) ;
+	ASSERT (InvRperm1 [Rperm1 [k]] == k) ;
+    }
+#endif
+
+    /* create the submatrix after removing singletons */
+
+    pp = 0 ;
+    for (k = n1 ; k < n_col ; k++)
+    {
+	oldcol = Cperm1 [k] ;
+	newcol = k - n1 ;
+	DEBUG5 (("Prune singletons k "ID" oldcol "ID" newcol "ID": "ID"\n",
+	    k, oldcol, newcol, pp)) ;
+	Sp [newcol] = pp ;  /* load column pointers */
+	for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++)
+	{
+	    row = Ai [p] ;
+	    DEBUG5 (("  "ID":  row "ID, pp, row)) ;
+	    ASSERT (row >= 0 && row < n_row) ;
+	    newrow = InvRperm1 [row] - n1 ;
+	    ASSERT (newrow < n_row - n1) ;
+	    if (newrow >= 0)
+	    {
+		DEBUG5 (("  newrow "ID, newrow)) ;
+		Si [pp++] = newrow ;
+		if (do_nzdiag)
+		{
+		    /* count the number of truly nonzero entries on the
+		     * diagonal of S, excluding entries that are present,
+		     * but numerically zero */
+		    if (newrow == newcol)
+		    {
+			/* this is the diagonal entry */
+#ifdef COMPLEX
+		        if (split)
+			{
+			    if (SCALAR_IS_NONZERO (Ax [p]) ||
+				SCALAR_IS_NONZERO (Az [p]))
+			    {
+				nzdiag++ ;
+			    }
+			}
+			else
+			{
+			    if (SCALAR_IS_NONZERO (Ax [2*p  ]) ||
+				SCALAR_IS_NONZERO (Ax [2*p+1]))
+			    {
+				nzdiag++ ;
+			    }
+			}
+#else
+			if (SCALAR_IS_NONZERO (Ax [p]))
+			{
+			    nzdiag++ ;
+			}
+#endif
+		    }
+		}
+	    }
+	    DEBUG5 (("\n")) ;
+	}
+    }
+    Sp [n_col - n1] = pp ;
+
+    return (nzdiag) ;
+}
+
+/* ========================================================================== */
+/* === combine_ordering ===================================================== */
+/* ========================================================================== */
+
+PRIVATE void combine_ordering
+(
+    Int n1,
+    Int nempty_col,
+    Int n_col,
+    Int Cperm_init [ ],	    /* output permutation */
+    Int Cperm1 [ ],	    /* singleton and empty column ordering */
+    Int Qinv [ ]	    /* Qinv from AMD or COLAMD */
+)
+{
+    Int k, oldcol, newcol, knew ;
+
+    /* combine the singleton ordering with Qinv */
+#ifndef NDEBUG
+    for (k = 0 ; k < n_col ; k++)
+    {
+	Cperm_init [k] = EMPTY ;
+    }
+#endif
+    for (k = 0 ; k < n1 ; k++)
+    {
+	DEBUG1 ((ID" Initial singleton: "ID"\n", k, Cperm1 [k])) ;
+	Cperm_init [k] = Cperm1 [k] ;
+    }
+    for (k = n1 ; k < n_col - nempty_col ; k++)
+    {
+	/* this is a non-singleton column */
+	oldcol = Cperm1 [k] ;	/* user's name for this column */
+	newcol = k - n1 ;	/* Qinv's name for this column */
+	knew = Qinv [newcol] ;	/* Qinv's ordering for this column */
+	knew += n1 ;		/* shift order, after singletons */
+	DEBUG1 ((" k "ID" oldcol "ID" newcol "ID" knew "ID"\n",
+	    k, oldcol, newcol, knew)) ;
+	ASSERT (knew >= 0 && knew < n_col - nempty_col) ;
+	ASSERT (Cperm_init [knew] == EMPTY) ;
+	Cperm_init [knew] = oldcol ;
+    }
+    for (k = n_col - nempty_col ; k < n_col ; k++)
+    {
+	Cperm_init [k] = Cperm1 [k] ;
+    }
+#ifndef NDEBUG
+    {
+	Int *W = (Int *) malloc ((n_col + 1) * sizeof (Int)) ;
+	ASSERT (UMF_is_permutation (Cperm_init, W, n_col, n_col)) ;
+	free (W) ;
+    }
+#endif
+
+}
+
+/* ========================================================================== */
+/* === UMFPACK_qsymbolic ==================================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_qsymbolic
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    const Int Quser [ ],
+    void **SymbolicHandle,
+    const double Control [UMFPACK_CONTROL],
+    double User_Info [UMFPACK_INFO]
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double knobs [COLAMD_KNOBS], flops, f, r, c, force_fixQ,
+	Info2 [UMFPACK_INFO], drow, dcol, dtail_usage, dlf, duf, dmax_usage,
+	dhead_usage, dlnz, dunz, dmaxfrsize, dClen, dClen_analyze, sym,
+	amd_Info [AMD_INFO], dClen_amd, dr, dc, cr, cc, cp,
+	amd_Control [AMD_CONTROL], stats [2], tol ;
+    double *Info ;
+    Int i, nz, j, newj, status, f1, f2, maxnrows, maxncols, nfr, col,
+	nchains, maxrows, maxcols, p, nb, nn, *Chain_start, *Chain_maxrows,
+	*Chain_maxcols, *Front_npivcol, *Ci, Clen, colamd_stats [COLAMD_STATS],
+	fpiv, n_inner, child, parent, *Link, row, *Front_parent,
+	analyze_compactions, k, chain, is_sym, *Si, *Sp, n2, do_UMF_analyze,
+	fpivcol, fallrows, fallcols, *InFront, *F1, snz, *Front_1strow, f1rows,
+	kk, *Cperm_init, *Rperm_init, newrow, *InvRperm1, *Front_leftmostdesc,
+	Clen_analyze, strategy, Clen_amd, fixQ, prefer_diagonal, nzdiag, nzaat,
+	*Wq, *Sdeg, *Fr_npivcol, nempty, *Fr_nrows, *Fr_ncols, *Fr_parent,
+	*Fr_cols, nempty_row, nempty_col, user_auto_strategy, fail, max_rdeg,
+	head_usage, tail_usage, lnz, unz, esize, *Esize, rdeg, *Cdeg, *Rdeg,
+	*Cperm1, *Rperm1, n1, oldcol, newcol, n1c, n1r, *Rperm_2by2, oldrow,
+	dense_row_threshold, tlen, aggressive, scale, *Rp, *Ri ;
+
+    SymbolicType *Symbolic ;
+    SWType SWspace, *SW ;
+
+#ifndef NDEBUG
+    UMF_dump_start ( ) ;
+    init_count = UMF_malloc_count ;
+    PRINTF ((
+"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n"
+	)) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get the amount of time used by the process so far */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (stats) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get control settings and check input parameters */
+    /* ---------------------------------------------------------------------- */
+
+    drow = GET_CONTROL (UMFPACK_DENSE_ROW, UMFPACK_DEFAULT_DENSE_ROW) ;
+    dcol = GET_CONTROL (UMFPACK_DENSE_COL, UMFPACK_DEFAULT_DENSE_COL) ;
+    nb = GET_CONTROL (UMFPACK_BLOCK_SIZE, UMFPACK_DEFAULT_BLOCK_SIZE) ;
+    strategy = GET_CONTROL (UMFPACK_STRATEGY, UMFPACK_DEFAULT_STRATEGY) ;
+    tol = GET_CONTROL (UMFPACK_2BY2_TOLERANCE, UMFPACK_DEFAULT_2BY2_TOLERANCE) ;
+    scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ;
+    force_fixQ = GET_CONTROL (UMFPACK_FIXQ, UMFPACK_DEFAULT_FIXQ) ;
+    AMD_defaults (amd_Control) ;
+    amd_Control [AMD_DENSE] =
+	GET_CONTROL (UMFPACK_AMD_DENSE, UMFPACK_DEFAULT_AMD_DENSE) ;
+    aggressive =
+	(GET_CONTROL (UMFPACK_AGGRESSIVE, UMFPACK_DEFAULT_AGGRESSIVE) != 0) ;
+    amd_Control [AMD_AGGRESSIVE] = aggressive ;
+
+    nb = MAX (2, nb) ;
+    nb = MIN (nb, MAXNB) ;
+    ASSERT (nb >= 0) ;
+    if (nb % 2 == 1) nb++ ;	/* make sure nb is even */
+    DEBUG0 (("UMFPACK_qsymbolic: nb = "ID" aggressive = "ID"\n", nb,
+	aggressive)) ;
+
+    tol = MAX (0.0, MIN (tol,  1.0)) ;
+    if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX)
+    {
+	scale = UMFPACK_DEFAULT_SCALE ;
+    }
+
+    if (User_Info != (double *) NULL)
+    {
+	/* return Info in user's array */
+	Info = User_Info ;
+    }
+    else
+    {
+	/* no Info array passed - use local one instead */
+	Info = Info2 ;
+    }
+    /* clear all of Info */
+    for (i = 0 ; i < UMFPACK_INFO ; i++)
+    {
+	Info [i] = EMPTY ;
+    }
+
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+
+    Info [UMFPACK_STATUS] = UMFPACK_OK ;
+    Info [UMFPACK_NROW] = n_row ;
+    Info [UMFPACK_NCOL] = n_col ;
+    Info [UMFPACK_SIZE_OF_UNIT] = (double) (sizeof (Unit)) ;
+    Info [UMFPACK_SIZE_OF_INT] = (double) (sizeof (int)) ;
+    Info [UMFPACK_SIZE_OF_LONG] = (double) (sizeof (long)) ;
+    Info [UMFPACK_SIZE_OF_POINTER] = (double) (sizeof (void *)) ;
+    Info [UMFPACK_SIZE_OF_ENTRY] = (double) (sizeof (Entry)) ;
+    Info [UMFPACK_SYMBOLIC_DEFRAG] = 0 ;
+
+    if (!Ai || !Ap || !SymbolicHandle)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    *SymbolicHandle = (void *) NULL ;
+
+    if (n_row <= 0 || n_col <= 0)	/* n_row, n_col must be > 0 */
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_n_nonpositive ;
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+
+    nz = Ap [n_col] ;
+    DEBUG0 (("n_row "ID" n_col "ID" nz "ID"\n", n_row, n_col, nz)) ;
+    Info [UMFPACK_NZ] = nz ;
+    if (nz < 0)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_matrix ;
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* get the requested strategy */
+    /* ---------------------------------------------------------------------- */
+
+    if (n_row != n_col)
+    {
+	/* if the matrix is rectangular, the only available strategy is
+	 *  unsymmetric */
+	strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	DEBUGm3 (("Rectangular: forcing unsymmetric strategy\n")) ;
+    }
+
+    if (strategy < UMFPACK_STRATEGY_AUTO
+     || strategy > UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	/* unrecognized strategy */
+	strategy = UMFPACK_STRATEGY_AUTO ;
+    }
+
+    if (Quser != (Int *) NULL)
+    {
+	/* when the user provides Q, only symmetric and unsymmetric strategies
+	 * are available */
+	if (strategy == UMFPACK_STRATEGY_2BY2)
+	{
+	    strategy = UMFPACK_STRATEGY_SYMMETRIC ;
+	}
+	if (strategy != UMFPACK_STRATEGY_SYMMETRIC)
+	{
+	    strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	}
+    }
+
+    user_auto_strategy = (strategy == UMFPACK_STRATEGY_AUTO) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* determine amount of memory required for UMFPACK_symbolic */
+    /* ---------------------------------------------------------------------- */
+
+    /* The size of Clen required for UMF_colamd is always larger than */
+    /* UMF_analyze, but the max is included here in case that changes in */
+    /* future versions. */
+
+    /* This is about 2.2*nz + 9*n_col + 6*n_row, or nz/5 + 13*n_col + 6*n_row,
+     * whichever is bigger.  For square matrices, it works out to
+     * 2.2nz + 15n, or nz/5 + 19n, whichever is bigger (typically 2.2nz+15n). */
+    dClen = UMF_COLAMD_RECOMMENDED ((double) nz, (double) n_row,
+	(double) n_col) ;
+
+    /* This is defined above, as max (nz,n_col) + 3*nn+1 + 2*n_col, where
+     * nn = max (n_row,n_col).  It is always smaller than the space required
+     * for colamd or amd. */
+    dClen_analyze = UMF_ANALYZE_CLEN ((double) nz, (double) n_row,
+	(double) n_col, (double) nn) ;
+    dClen = MAX (dClen, dClen_analyze) ;
+
+    /* The space for AMD can be larger than what's required for colamd: */
+    dClen_amd = 2.4 * (double) nz + 8 * (double) n_inner ;
+    /* additional space for the 2-by-2 strategy */
+    dClen_amd += (double) MAX (nn, nz) ;
+    dClen = MAX (dClen, dClen_amd) ;
+
+    /* worst case total memory usage for UMFPACK_symbolic (revised below) */
+    Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] =
+	SYM_WORK_USAGE (n_col, n_row, dClen) +
+	UMF_symbolic_usage (n_row, n_col, n_col, n_col, n_col, TRUE) ;
+
+    if (INT_OVERFLOW (dClen * sizeof (Int)))
+    {
+	/* :: int overflow, Clen too large :: */
+	/* Problem is too large for array indexing (Ci [i]) with an Int i. */
+	/* Cannot even analyze the problem to determine upper bounds on */
+	/* memory usage. Need to use the long integer version, umfpack_*l_*. */
+	DEBUGm4 (("out of memory: symbolic int overflow\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    /* repeat the size calculations, in integers */
+    Clen = UMF_COLAMD_RECOMMENDED (nz, n_row, n_col) ;
+    Clen_analyze = UMF_ANALYZE_CLEN (nz, n_row, n_col, nn) ;
+    Clen = MAX (Clen, Clen_analyze) ;
+    Clen_amd = 2.4 * nz + 8 * n_inner ;
+    Clen_amd += MAX (nn, nz) ;			/* for Ri, in UMF_2by2 */
+    Clen = MAX (Clen, Clen_amd) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the first part of the Symbolic object (header and Cperm_init) */
+    /* ---------------------------------------------------------------------- */
+
+    /* (1) Five calls to UMF_malloc are made, for a total space of
+     * 2 * (n_row + n_col) + 4 integers + sizeof (SymbolicType).
+     * sizeof (SymbolicType) is a small constant.  This space is part of the
+     * Symbolic object and is not freed unless an error occurs.  If A is square
+     * then this is about 4*n integers.
+     */
+
+    Symbolic = (SymbolicType *) UMF_malloc (1, sizeof (SymbolicType)) ;
+
+    if (!Symbolic)
+    {
+	/* If we fail here, Symbolic is NULL and thus it won't be */
+	/* dereferenced by UMFPACK_free_symbolic, as called by error ( ). */
+	DEBUGm4 (("out of memory: symbolic object\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Symbolic, (SWType *) NULL) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    /* We now know that Symbolic has been allocated */
+    Symbolic->valid = 0 ;
+    Symbolic->Chain_start = (Int *) NULL ;
+    Symbolic->Chain_maxrows = (Int *) NULL ;
+    Symbolic->Chain_maxcols = (Int *) NULL ;
+    Symbolic->Front_npivcol = (Int *) NULL ;
+    Symbolic->Front_parent = (Int *) NULL ;
+    Symbolic->Front_1strow = (Int *) NULL ;
+    Symbolic->Front_leftmostdesc = (Int *) NULL ;
+    Symbolic->Esize = (Int *) NULL ;
+    Symbolic->esize = 0 ;
+
+    Symbolic->Cperm_init   = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Symbolic->Rperm_init   = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    Symbolic->Cdeg	   = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+    Symbolic->Rdeg	   = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    Symbolic->Diagonal_map = (Int *) NULL ;
+
+    Cperm_init = Symbolic->Cperm_init ;
+    Rperm_init = Symbolic->Rperm_init ;
+    Cdeg = Symbolic->Cdeg ;
+    Rdeg = Symbolic->Rdeg ;
+
+    if (!Cperm_init || !Rperm_init || !Cdeg || !Rdeg)
+    {
+	DEBUGm4 (("out of memory: symbolic perm\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Symbolic, (SWType *) NULL) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    Symbolic->n_row = n_row ;
+    Symbolic->n_col = n_col ;
+    Symbolic->nz = nz ;
+    Symbolic->nb = nb ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check user's input permutation */
+    /* ---------------------------------------------------------------------- */
+
+    if (Quser != (Int *) NULL)
+    {
+	/* use Cperm_init as workspace to check input permutation */
+	if (!UMF_is_permutation (Quser, Cperm_init, n_col, n_col))
+	{
+	    Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_permutation ;
+	    error (&Symbolic, (SWType *) NULL) ;
+	    return (UMFPACK_ERROR_invalid_permutation) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* ---------------------------------------------------------------------- */
+
+    /* (2) Eleven calls to UMF_malloc are made, for workspace of size
+     * Clen + nz + 7*n_col + 2*n_row + 2 integers.  Clen is the larger of
+     *     MAX (2*nz, 4*n_col) + 8*n_col + 6*n_row + n_col + nz/5 and
+     *     2.4*nz + 8 * MIN (n_row, n_col) + MAX (n_row, n_col, nz)
+     * If A is square and non-singular, then Clen is
+     *     MAX (MAX (2*nz, 4*n) + 7*n + nz/5,  3.4*nz) + 8*n
+     * If A has at least 4*n nonzeros then Clen is
+     *     MAX (2.2*nz + 7*n,  3.4*nz) + 8*n
+     * If A has at least (7/1.2)*n nonzeros, (about 5.8*n), then Clen is
+     *     3.4*nz + 8*n
+     * This space will be free'd when this routine finishes.
+     *
+     * Total space thus far is about 3.4nz + 12n integers.
+     * For the double precision, 32-bit integer version, the user's matrix
+     * requires an equivalent space of 3*nz + n integers.  So this space is just
+     * slightly larger than the user's input matrix (including the numerical
+     * values themselves).
+     */
+
+    SW = &SWspace ;	/* used for UMFPACK_symbolic only */
+
+    /* Note that SW->Front_* does not include the dummy placeholder front. */
+    /* This space is accounted for by the SYM_WORK_USAGE macro. */
+
+    /* this is free'd early */
+    SW->Si	      = (Int *) UMF_malloc (nz, sizeof (Int)) ;
+    SW->Sp	      = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ;
+    SW->InvRperm1     = (Int *) UMF_malloc (n_row, sizeof (Int)) ;
+    SW->Cperm1	      = (Int *) UMF_malloc (n_col, sizeof (Int)) ;
+
+    /* this is free'd late */
+    SW->Ci	      = (Int *) UMF_malloc (Clen, sizeof (Int)) ;
+    SW->Front_npivcol = (Int *) UMF_malloc (n_col + 1, sizeof (Int)) ;
+    SW->Front_nrows   = (Int *) UMF_malloc (n_col, sizeof (Int)) ;
+    SW->Front_ncols   = (Int *) UMF_malloc (n_col, sizeof (Int)) ;
+    SW->Front_parent  = (Int *) UMF_malloc (n_col, sizeof (Int)) ;
+    SW->Front_cols    = (Int *) UMF_malloc (n_col, sizeof (Int)) ;
+    SW->Rperm1	      = (Int *) UMF_malloc (n_row, sizeof (Int)) ;
+    SW->InFront	      = (Int *) UMF_malloc (n_row, sizeof (Int)) ;
+
+    /* this is allocated later, and free'd after Cperm1 but before Ci */
+    SW->Rperm_2by2    = (Int *) NULL ;   /* will be nn Int's */
+
+    /* this is allocated last, and free'd first */
+    SW->Rs	      = (double *) NULL ;	/* will be n_row double's */
+
+    Ci	       = SW->Ci ;
+    Fr_npivcol = SW->Front_npivcol ;
+    Fr_nrows   = SW->Front_nrows ;
+    Fr_ncols   = SW->Front_ncols ;
+    Fr_parent  = SW->Front_parent ;
+    Fr_cols    = SW->Front_cols ;
+    Cperm1     = SW->Cperm1 ;
+    Rperm1     = SW->Rperm1 ;
+    Si	       = SW->Si ;
+    Sp	       = SW->Sp ;
+    InvRperm1  = SW->InvRperm1 ;
+    Rperm_2by2 = (Int *) NULL ;
+    InFront    = SW->InFront ;
+
+    if (!Ci || !Fr_npivcol || !Fr_nrows || !Fr_ncols || !Fr_parent || !Fr_cols
+	|| !Cperm1 || !Rperm1 || !Si || !Sp || !InvRperm1 || !InFront)
+    {
+	DEBUGm4 (("out of memory: symbolic work\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Symbolic, SW) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    DEBUG0 (("Symbolic UMF_malloc_count - init_count = "ID"\n",
+	UMF_malloc_count - init_count)) ;
+    ASSERT (UMF_malloc_count == init_count + 17) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* find the row and column singletons */
+    /* ---------------------------------------------------------------------- */
+
+    /* [ use first nz + n_row + MAX (n_row, n_col) entries in Ci as workspace,
+     * and use Rperm_init as workspace */
+    ASSERT (Clen >= nz + n_row + MAX (n_row, n_col)) ;
+
+    status = UMF_singletons (n_row, n_col, Ap, Ai, Quser, strategy,
+	Cdeg, Cperm1, Rdeg,
+	Rperm1, InvRperm1, &n1, &n1c, &n1r, &nempty_col, &nempty_row, &is_sym,
+	&max_rdeg, /* workspace: */ Rperm_init, Ci, Ci + nz, Ci + nz + n_row) ;
+
+    /* ] done using Rperm_init and Ci as workspace */
+
+    /* InvRperm1 is now the inverse of Rperm1 */
+
+    if (status != UMFPACK_OK)
+    {
+	DEBUGm4 (("matrix invalid: UMF_singletons\n")) ;
+	Info [UMFPACK_STATUS] = status ;
+	error (&Symbolic, SW) ;
+	return (status) ;
+    }
+    Info [UMFPACK_NEMPTY_COL] = nempty_col ;
+    Info [UMFPACK_NEMPTY_ROW] = nempty_row ;
+    Info [UMFPACK_NDENSE_COL] = 0 ;	/* # dense rows/cols recomputed below */
+    Info [UMFPACK_NDENSE_ROW] = 0 ;
+    Info [UMFPACK_COL_SINGLETONS] = n1c ;
+    Info [UMFPACK_ROW_SINGLETONS] = n1r ;
+    Info [UMFPACK_S_SYMMETRIC] = is_sym ;
+
+    nempty = MIN (nempty_col, nempty_row) ;
+    Symbolic->nempty_row = nempty_row ;
+    Symbolic->nempty_col = nempty_col ;
+
+    /* UMF_singletons has verified that the user's input matrix is valid */
+    ASSERT (AMD_valid (n_row, n_col, Ap, Ai)) ;
+
+    Symbolic->n1 = n1 ;
+    Symbolic->nempty = nempty ;
+    ASSERT (n1 <= n_inner) ;
+    n2 = nn - n1 - nempty ;
+
+    dense_row_threshold =
+	UMFPACK_DENSE_DEGREE_THRESHOLD (drow, n_col - n1 - nempty_col) ;
+    Symbolic->dense_row_threshold = dense_row_threshold ;
+
+    if (!is_sym)
+    {
+	/* either the pruned submatrix rectangular, or it is square and
+	 * Rperm [n1 .. n-nempty-1] is not the same as Cperm [n1 .. n-nempty-1].
+	 * Switch to the unsymmetric strategy, ignoring user-requested
+	 * strategy. */
+	strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	DEBUGm4 (("Strategy: Unsymmetric singletons\n")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* determine symmetry, nzdiag, and degrees of S+S' */
+    /* ---------------------------------------------------------------------- */
+
+    /* S is the matrix obtained after removing singletons
+     *   = A (Cperm1 [n1..n_col-nempty_col-1], Rperm1 [n1..n_row-nempty_row-1])
+     */
+
+    Wq = Rperm_init ;	    /* use Rperm_init as workspace for Wq [ */
+    Sdeg = Cperm_init ;	    /* use Cperm_init as workspace for Sdeg [ */
+    sym = EMPTY ;
+    nzaat = EMPTY ;
+    nzdiag = EMPTY ;
+    for (i = 0 ; i < AMD_INFO ; i++)
+    {
+	amd_Info [i] = EMPTY ;
+    }
+
+    if (strategy != UMFPACK_STRATEGY_UNSYMMETRIC)
+    {
+	/* This also determines the degree of each node in S+S' (Sdeg), which
+	 * is needed by the 2-by-2 strategy, the symmetry of S, and the number
+	 * of nonzeros on the diagonal of S. */
+	ASSERT (n_row == n_col) ;
+	ASSERT (nempty_row == nempty_col) ;
+
+	/* get the count of nonzeros on the diagonal of S, excluding explicitly
+	 * zero entries.  nzdiag = amd_Info [AMD_NZDIAG] counts the zero entries
+	 * in S. */
+
+	nzdiag = prune_singletons (n1, nn, Ap, Ai, Ax,
+#ifdef COMPLEX
+	    Az,
+#endif
+	    Cperm1, InvRperm1, Si, Sp
+#ifndef NDEBUG
+	    , Rperm1, nn
+#endif
+	    ) ;
+
+	/* use Ci as workspace to sort S into R, if needed [ */
+	if (Quser != (Int *) NULL)
+	{
+	    /* need to sort the columns of S first */
+	    Rp = Ci ;
+	    Ri = Ci + (n_row) + 1 ;
+	    (void) UMF_transpose (n2, n2, Sp, Si, (double *) NULL,
+		(Int *) NULL, (Int *) NULL, 0,
+		Rp, Ri, (double *) NULL, Wq, FALSE
+#ifdef COMPLEX
+		, (double *) NULL, (double *) NULL, FALSE
+#endif
+		) ;
+	}
+	else
+	{
+	    /* S already has sorted columns */
+	    Rp = Sp ;
+	    Ri = Si ;
+	}
+	ASSERT (AMD_valid (n2, n2, Rp, Ri)) ;
+
+	nzaat = AMD_aat (n2, Rp, Ri, Sdeg, Wq, amd_Info) ;
+	sym = amd_Info [AMD_SYMMETRY] ;
+	Info [UMFPACK_N2] = n2 ;
+	/* nzdiag = amd_Info [AMD_NZDIAG] counts the zero entries of S too */
+
+	/* done using Ci as workspace to sort S into R ] */
+
+#ifndef NDEBUG
+	for (k = 0 ; k < n2 ; k++)
+	{
+	    ASSERT (Sdeg [k] >= 0 && Sdeg [k] < n2) ;
+	}
+	ASSERT (Sp [n2] - n2 <= nzaat && nzaat <= 2 * Sp [n2]) ;
+	DEBUG0 (("Explicit zeros: "ID" %g\n", nzdiag, amd_Info [AMD_NZDIAG])) ;
+#endif
+
+    }
+
+    /* get statistics from amd_aat, if computed */
+    Symbolic->sym = sym ;
+    Symbolic->nzaat = nzaat ;
+    Symbolic->nzdiag = nzdiag ;
+    Symbolic->amd_dmax = EMPTY ;
+
+    Info [UMFPACK_PATTERN_SYMMETRY] = sym ;
+    Info [UMFPACK_NZ_A_PLUS_AT] = nzaat ;
+    Info [UMFPACK_NZDIAG] = nzdiag ;
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the initial strategy based on symmetry and nnz (diag (S)) */
+    /* ---------------------------------------------------------------------- */
+
+    if (strategy == UMFPACK_STRATEGY_AUTO)
+    {
+	if (sym < 0.10)
+	{
+	    /* highly unsymmetric: use the unsymmetric strategy */
+	    strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	    DEBUGm4 (("Strategy: select unsymmetric\n")) ;
+	}
+	else if (sym >= 0.7 && nzdiag == n2)
+	{
+	    /* mostly symmetric, zero-free diagonal: use symmetric strategy */
+	    strategy = UMFPACK_STRATEGY_SYMMETRIC ;
+	    DEBUGm4 (("Strategy: select symmetric\n")) ;
+	}
+	else
+	{
+	    /* Evaluate the symmetric 2-by-2 strategy, and select it, or
+	     * the unsymmetric strategy if the 2-by-2 strategy doesn't look
+	     * promising. */
+	    strategy = UMFPACK_STRATEGY_2BY2 ;
+	    DEBUGm4 (("Strategy: try 2-by-2\n")) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* try the 2-by-2 strategy */
+    /* ---------------------------------------------------------------------- */
+
+    /* (3) If the 2-by-2 strategy is attempted, additional workspace of size
+     * nn integers and nn double's is allocated, where nn = n_row = n_col.
+     * The real workspace is immediately free'd.  The integer workspace of
+     * size nn remains until the end of umfpack_qsymbolic. */
+
+    /* If the resulting matrix S (Rperm_2by2, :) is too unsymmetric, then the
+     * unsymmetric strategy will be used instead. */
+
+    if (strategy == UMFPACK_STRATEGY_2BY2)
+    {
+	double sym2 ;
+	Int *Blen, *W, nz_papat, nzd2, nweak, unmatched, Clen3 ;
+
+	/* ------------------------------------------------------------------ */
+	/* get workspace for UMF_2by2 */
+	/* ------------------------------------------------------------------ */
+
+	ASSERT (n_row == n_col && nn == n_row) ;
+
+#ifndef NDEBUG
+	for (k = 0 ; k < n2 ; k++)
+	{
+	    ASSERT (Sdeg [k] >= 0 && Sdeg [k] < n2) ;
+	}
+#endif
+
+	/* allocate Rperm_2by2 */
+	SW->Rperm_2by2 = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+	Rperm_2by2 = SW->Rperm_2by2 ;
+	if (Rperm_2by2 == (Int *) NULL)
+	{
+	    DEBUGm4 (("out of memory: Rperm_2by2\n")) ;
+	    Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	    error (&Symbolic, SW) ;
+	    return (UMFPACK_ERROR_out_of_memory) ;
+	}
+
+	/* allocate Ri from the tail end of Ci [ */
+	Clen3 = Clen - (MAX (nn, nz) + 1) ;
+	Ri = Ci + Clen3 ;
+	ASSERT (Clen3 >= nz) ;	/* space required for UMF_2by2 */
+
+	/* use Fr_* as workspace for Rp, Blen, and W [ */
+	Rp = Fr_npivcol ;
+	Blen = Fr_ncols ;
+	W = Fr_cols ;
+
+	if (scale != UMFPACK_SCALE_NONE)
+	{
+	    SW->Rs = (double *) UMF_malloc (nn, sizeof (double)) ;
+	    if (SW->Rs == (double *) NULL)
+	    {
+		DEBUGm4 (("out of memory: scale factors for 2-by-2\n")) ;
+		Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+		error (&Symbolic, SW) ;
+		return (UMFPACK_ERROR_out_of_memory) ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* find the 2-by-2 row permutation */
+	/* ------------------------------------------------------------------ */
+
+	/* find a row permutation Rperm_2by2 such that S (Rperm_2by2, :)
+	 * has a healthy diagonal */
+
+	UMF_2by2 (nn, Ap, Ai, Ax,
+#ifdef COMPLEX
+		Az,
+#endif
+		tol, scale, Cperm1,
+#ifndef NDEBUG
+		Rperm1,
+#endif
+		InvRperm1, n1, nempty, Sdeg, Rperm_2by2, &nweak, &unmatched,
+		Ri, Rp, SW->Rs, Blen, W, Ci, Wq) ;
+	DEBUGm3 (("2by2: nweak "ID" unmatched "ID"\n", nweak, unmatched)) ;
+	Info [UMFPACK_2BY2_NWEAK] = nweak ;
+	Info [UMFPACK_2BY2_UNMATCHED] = unmatched ;
+
+	SW->Rs = (double *) UMF_free ((void *) SW->Rs) ;
+
+	/* R = S (Rperm_2by2,:)' */
+	(void) UMF_transpose (n2, n2, Sp, Si, (double *) NULL, Rperm_2by2,
+	    (Int *) NULL, 0, Rp, Ri, (double *) NULL, W, FALSE
+#ifdef COMPLEX
+	    , (double *) NULL, (double *) NULL, FALSE
+#endif
+	    ) ;
+	ASSERT (AMD_valid (n2, n2, Rp, Ri)) ;
+
+	/* contents of Si and Sp no longer needed, but the space is
+	 * still needed */
+
+	/* ------------------------------------------------------------------ */
+	/* find symmetry of S (Rperm_2by2, :)', and prepare to order with AMD */
+	/* ------------------------------------------------------------------ */
+
+	for (i = 0 ; i < AMD_INFO ; i++)
+	{
+	    amd_Info [i] = EMPTY ;
+	}
+	nz_papat = AMD_aat (n2, Rp, Ri, Sdeg, Wq, amd_Info) ;
+	sym2 = amd_Info [AMD_SYMMETRY] ;
+	nzd2 = amd_Info [AMD_NZDIAG] ;
+
+	Info [UMFPACK_2BY2_PATTERN_SYMMETRY] = sym2 ;
+	Info [UMFPACK_2BY2_NZ_PA_PLUS_PAT] = nz_papat ;
+	Info [UMFPACK_2BY2_NZDIAG] = nzd2 ;
+
+	DEBUG0 (("2by2: sym2 %g nzd2 "ID" n2 "ID"\n", sym2, nzd2, n2)) ;
+
+	/* ------------------------------------------------------------------ */
+	/* evaluate the 2-by-2 results */
+	/* ------------------------------------------------------------------ */
+
+	if (user_auto_strategy)
+	{
+	    if ((sym2 > 1.1 * sym) && (nzd2 > 0.9 * n2))
+	    {
+		/* 2-by-2 made it much more symmetric */
+		DEBUGm4 (("eval Strategy 2by2: much more symmetric:  2by2\n")) ;
+		strategy = UMFPACK_STRATEGY_2BY2 ;
+	    }
+	    else if (sym2 < 0.7 * sym)
+	    {
+		/* 2-by-2 made it much more unsymmetric */
+		DEBUGm4 (("eval Strategy 2by2: much more UNsymmetric:unsym\n"));
+		strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	    }
+	    else if (sym2 < 0.25)
+	    {
+		DEBUGm4 (("eval Strategy 2by2: is UNsymmetric: unsym\n"));
+		strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	    }
+	    else if (sym2 >= 0.51)
+	    {
+		DEBUGm4 (("eval Strategy 2by2: sym2 >= 0.51: 2by2\n")) ;
+		strategy = UMFPACK_STRATEGY_2BY2 ;
+	    }
+	    else if (sym2 >= 0.999 * sym)
+	    {
+		/* 2-by-2 improved symmetry, or made it only slightly worse */
+		DEBUGm4 (("eval Strategy 2by2: sym2 >= 0.999 sym: 2by2\n")) ;
+		strategy = UMFPACK_STRATEGY_2BY2 ;
+	    }
+	    else
+	    {
+		/* can't decide what to do, so pick the unsymmetric strategy */
+		DEBUGm4 (("eval Strategy 2by2: punt: unsym\n"));
+		strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* if the 2-by-2 strategy is selected: */
+	/* ------------------------------------------------------------------ */
+
+	if (strategy == UMFPACK_STRATEGY_2BY2)
+	{
+	    if (Quser == (Int *) NULL)
+	    {
+		/* 2-by-2 strategy is successful */
+		/* compute amd (S) */
+		Int *Qinv = Fr_npivcol ;
+		ASSERT (Clen3 >= (nz_papat + nz_papat/5 + nn) + 7*nn) ;
+		do_amd (n2, Rp, Ri, Wq, Qinv, Sdeg, Clen3, Ci,
+		    amd_Control, amd_Info, Symbolic, Info) ;
+		/* combine the singleton ordering and the AMD ordering */
+		combine_ordering (n1, nempty, nn, Cperm_init, Cperm1, Qinv) ;
+	    }
+	    /* fix Rperm_2by2 to reflect A, not S */
+	    for (k = 0 ; k < n1 ; k++)
+	    {
+		oldcol = Cperm1 [k] ;
+		i = k ;
+		oldrow = Rperm1 [k] ;
+		W [oldcol] = oldrow ;
+	    }
+	    for (k = n1 ; k < nn - nempty ; k++)
+	    {
+		oldcol = Cperm1 [k] ;
+		i = Rperm_2by2 [k - n1] + n1 ;
+		oldrow = Rperm1 [i] ;
+		W [oldcol] = oldrow ;
+	    }
+	    for (k = nn - nempty ; k < nn ; k++)
+	    {
+		oldcol = Cperm1 [k] ;
+		i = k ;
+		oldrow = Rperm1 [k] ;
+		W [oldcol] = oldrow ;
+	    }
+	    for (k = 0 ; k < nn ; k++)
+	    {
+		Rperm_2by2 [k] = W [k] ;
+	    }
+
+	    /* Now, the "diagonal" entry in oldcol (where oldcol is the user's
+	     * name for a column, is the entry in row oldrow (where oldrow is
+	     * the user's name for a row, and oldrow = Rperm_2by2 [oldcol] */
+	}
+
+	/* Fr_* no longer needed for Rp, Blen, W ] */
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* finalize the strategy, including fixQ and prefer_diagonal */
+    /* ---------------------------------------------------------------------- */
+
+    if (strategy == UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	/* use given Quser or AMD (A+A'), fix Q during factorization,
+	 * prefer diagonal */
+	DEBUG0 (("\nStrategy: symmetric\n")) ;
+	ASSERT (n_row == n_col) ;
+	Symbolic->ordering = UMFPACK_ORDERING_AMD ;
+	fixQ = TRUE ;
+	prefer_diagonal = TRUE ;
+    }
+    else if (strategy == UMFPACK_STRATEGY_2BY2)
+    {
+	/* use Q = given Quser or Q = AMD (PA+PA'), fix Q during factorization,
+	 * prefer diagonal, and factorize PAQ, where P is found by UMF_2by2. */
+	DEBUG0 (("\nStrategy: symmetric 2-by-2\n")) ;
+	ASSERT (n_row == n_col) ;
+	Symbolic->ordering = UMFPACK_ORDERING_AMD ;
+	fixQ = TRUE ;
+	prefer_diagonal = TRUE ;
+    }
+    else
+    {
+	/* use given Quser or COLAMD (A), refine Q during factorization,
+	 * no diagonal preference */
+	ASSERT (strategy == UMFPACK_STRATEGY_UNSYMMETRIC) ;
+	DEBUG0 (("\nStrategy: unsymmetric\n")) ;
+	Symbolic->ordering = UMFPACK_ORDERING_COLAMD ;
+	fixQ = FALSE ;
+	prefer_diagonal = FALSE ;
+    }
+
+    if (Quser != (Int *) NULL)
+    {
+	Symbolic->ordering = UMFPACK_ORDERING_GIVEN ;
+    }
+
+    if (force_fixQ > 0)
+    {
+	fixQ = TRUE ;
+	DEBUG0 (("Force fixQ true\n")) ;
+    }
+    else if (force_fixQ < 0)
+    {
+	fixQ = FALSE ;
+	DEBUG0 (("Force fixQ false\n")) ;
+    }
+
+    DEBUG0 (("Strategy: ordering:   "ID"\n", Symbolic->ordering)) ;
+    DEBUG0 (("Strategy: fixQ:       "ID"\n", fixQ)) ;
+    DEBUG0 (("Strategy: prefer diag "ID"\n", prefer_diagonal)) ;
+
+    /* get statistics from amd_aat, if computed */
+    Symbolic->strategy = strategy ;
+    Symbolic->fixQ = fixQ ;
+    Symbolic->prefer_diagonal = prefer_diagonal ;
+
+    Info [UMFPACK_STRATEGY_USED] = strategy ;
+    Info [UMFPACK_ORDERING_USED] = Symbolic->ordering ;
+    Info [UMFPACK_QFIXED] = fixQ ;
+    Info [UMFPACK_DIAG_PREFERRED] = prefer_diagonal ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get the AMD ordering for the symmetric strategy */
+    /* ---------------------------------------------------------------------- */
+
+    if (strategy == UMFPACK_STRATEGY_SYMMETRIC && Quser == (Int *) NULL)
+    {
+	/* symmetric strategy for a matrix with mostly symmetric pattern */
+	Int *Qinv = Fr_npivcol ;
+	ASSERT (n_row == n_col && nn == n_row) ;
+	ASSERT (Clen >= (nzaat + nzaat/5 + nn) + 7*nn) ;
+	do_amd (n2, Sp, Si, Wq, Qinv, Sdeg, Clen, Ci,
+		amd_Control, amd_Info, Symbolic, Info) ;
+	/* combine the singleton ordering and the AMD ordering */
+	combine_ordering (n1, nempty, nn, Cperm_init, Cperm1, Qinv) ;
+    }
+    /* Sdeg no longer needed ] */
+    /* done using Rperm_init as workspace for Wq ] */
+
+    /* Contents of Si and Sp no longer needed, but the space is still needed */
+
+    /* ---------------------------------------------------------------------- */
+    /* use the user's input column ordering (already in Cperm1) */
+    /* ---------------------------------------------------------------------- */
+
+    if (Quser != (Int *) NULL)
+    {
+	for (k = 0 ; k < n_col ; k++)
+	{
+	    Cperm_init [k] = Cperm1 [k] ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* use COLAMD to order the matrix */
+    /* ---------------------------------------------------------------------- */
+
+    if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC && Quser == (Int *) NULL)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* copy the matrix into colamd workspace (colamd destroys its input) */
+	/* ------------------------------------------------------------------ */
+
+	/* C = A (Cperm1 (n1+1:end), Rperm1 (n1+1:end)), where Ci is used as
+	 * the row indices and Cperm_init (on input) is used as the column
+	 * pointers. */
+
+	(void) prune_singletons (n1, n_col, Ap, Ai,
+	    (double *) NULL,
+#ifdef COMPLEX
+	    (double *) NULL,
+#endif
+	    Cperm1, InvRperm1, Ci, Cperm_init
+#ifndef NDEBUG
+	    , Rperm1, n_row
+#endif
+	    ) ;
+
+	/* ------------------------------------------------------------------ */
+	/* set UMF_colamd defaults */
+	/* ------------------------------------------------------------------ */
+
+	UMF_colamd_set_defaults (knobs) ;
+	knobs [COLAMD_DENSE_ROW] = drow ;
+	knobs [COLAMD_DENSE_COL] = dcol ;
+	knobs [COLAMD_AGGRESSIVE] = aggressive ;
+
+	/* ------------------------------------------------------------------ */
+	/* check input matrix and find the initial column pre-ordering */
+	/* ------------------------------------------------------------------ */
+
+	/* NOTE: umf_colamd is not given any original empty rows or columns.
+	 * Those have already been removed via prune_singletons, above.  The
+	 * umf_colamd routine has been modified to assume that all rows and
+	 * columns have at least one entry in them.  It will break if it is
+	 * given empty rows or columns (an assertion is triggered when running
+	 * in debug mode. */
+
+	(void) UMF_colamd (
+		n_row - n1 - nempty_row,
+		n_col - n1 - nempty_col,
+		Clen, Ci, Cperm_init, knobs, colamd_stats,
+		Fr_npivcol, Fr_nrows, Fr_ncols, Fr_parent, Fr_cols, &nfr,
+		InFront) ;
+	ASSERT (colamd_stats [COLAMD_EMPTY_ROW] == 0) ;
+	ASSERT (colamd_stats [COLAMD_EMPTY_COL] == 0) ;
+
+	/* # of dense rows will be recomputed below */
+	Info [UMFPACK_NDENSE_ROW]  = colamd_stats [COLAMD_DENSE_ROW] ;
+	Info [UMFPACK_NDENSE_COL]  = colamd_stats [COLAMD_DENSE_COL] ;
+	Info [UMFPACK_SYMBOLIC_DEFRAG] = colamd_stats [COLAMD_DEFRAG_COUNT] ;
+
+	/* re-analyze if any "dense" rows or cols ignored by UMF_colamd */
+	do_UMF_analyze =
+	    colamd_stats [COLAMD_DENSE_ROW] > 0 ||
+	    colamd_stats [COLAMD_DENSE_COL] > 0 ;
+
+	/* Combine the singleton and colamd ordering into Cperm_init */
+	/* Note that colamd returns its inverse permutation in Ci */
+	combine_ordering (n1, nempty_col, n_col, Cperm_init, Cperm1, Ci) ;
+
+	/* contents of Ci no longer needed */
+
+#ifndef NDEBUG
+	for (col = 0 ; col < n_col ; col++)
+	{
+	    DEBUG1 (("Cperm_init ["ID"] = "ID"\n", col, Cperm_init[col]));
+	}
+	/* make sure colamd returned a valid permutation */
+	ASSERT (Cperm_init != (Int *) NULL) ;
+	ASSERT (UMF_is_permutation (Cperm_init, Ci, n_col, n_col)) ;
+#endif
+
+    }
+    else
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* do not call colamd - use input Quser or AMD instead */
+	/* ------------------------------------------------------------------ */
+
+	/* The ordering (Quser or Qamd) is already in Cperm_init */
+	do_UMF_analyze = TRUE ;
+
+    }
+
+    Cperm_init [n_col] = EMPTY ;	/* unused in Cperm_init */
+
+    /* ---------------------------------------------------------------------- */
+    /* AMD ordering, if it exists, has been copied into Cperm_init */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    DEBUG3 (("Cperm_init column permutation:\n")) ;
+    ASSERT (UMF_is_permutation (Cperm_init, Ci, n_col, n_col)) ;
+    for (k = 0 ; k < n_col ; k++)
+    {
+	DEBUG3 ((ID"\n", Cperm_init [k])) ;
+    }
+    /* ensure that empty columns have been placed last in A (:,Cperm_init) */
+    for (newj = 0 ; newj < n_col ; newj++)
+    {
+	/* empty columns will be last in A (:, Cperm_init (1:n_col)) */
+	j = Cperm_init [newj] ;
+	ASSERT (IMPLIES (newj >= n_col-nempty_col, Cdeg [j] == 0)) ;
+	ASSERT (IMPLIES (newj <  n_col-nempty_col, Cdeg [j] > 0)) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization (unless colamd has already done it) */
+    /* ---------------------------------------------------------------------- */
+
+    if (do_UMF_analyze)
+    {
+
+	Int *W, *Bp, *Bi, *Cperm2, ok, *P, Clen2, bsize, Clen0 ;
+
+	/* ------------------------------------------------------------------ */
+	/* construct column pre-ordered, pruned submatrix */
+	/* ------------------------------------------------------------------ */
+
+	/* S = column form submatrix after removing singletons and applying
+	 * initial column ordering (includes singleton ordering) */
+	(void) prune_singletons (n1, n_col, Ap, Ai,
+	    (double *) NULL,
+#ifdef COMPLEX
+	    (double *) NULL,
+#endif
+	    Cperm_init, InvRperm1, Si, Sp
+#ifndef NDEBUG
+	    , Rperm1, n_row
+#endif
+	    ) ;
+
+	/* ------------------------------------------------------------------ */
+	/* Ci [0 .. Clen-1] holds the following work arrays:
+
+		first Clen0 entries	empty space, where Clen0 =
+					Clen - (nn+1 + 2*nn + n_col)
+					and Clen0 >= nz + n_col
+		next nn+1 entries	Bp [0..nn]
+		next nn entries		Link [0..nn-1]
+		next nn entries		W [0..nn-1]
+		last n_col entries	Cperm2 [0..n_col-1]
+
+	    We have Clen >= n_col + MAX (nz,n_col) + 3*nn+1 + n_col,
+	    So  Clen0 >= 2*n_col as required for AMD_postorder
+	    and Clen0 >= n_col + nz as required
+	*/
+
+	Clen0 = Clen - (nn+1 + 2*nn + n_col) ;
+	Bp = Ci + Clen0 ;
+	Link = Bp + (nn+1) ;
+	W = Link + nn ;
+	Cperm2 = W + nn ;
+	ASSERT (Cperm2 + n_col == Ci + Clen) ;
+	ASSERT (Clen0 >= nz + n_col) ;
+	ASSERT (Clen0 >= 2*n_col) ;
+
+	/* ------------------------------------------------------------------ */
+	/* P = order that rows will be used in UMF_analyze */
+	/* ------------------------------------------------------------------ */
+
+	/* use W to mark rows, and use Link for row permutation P [ [ */
+	for (row = 0 ; row < n_row - n1 ; row++)
+	{
+	    W [row] = FALSE ;
+	}
+	P = Link ;
+
+	k = 0 ;
+
+	for (col = 0 ; col < n_col - n1 ; col++)
+	{
+	    /* empty columns are last in S */
+	    for (p = Sp [col] ; p < Sp [col+1] ; p++)
+	    {
+		row = Si [p] ;
+		if (!W [row])
+		{
+		    /* this row has just been seen for the first time */
+		    W [row] = TRUE ;
+		    P [k++] = row ;
+		}
+	    }
+	}
+
+	/* If the matrix has truly empty rows, then P will not be */
+	/* complete, and visa versa.  The matrix is structurally singular. */
+	nempty_row = n_row - n1 - k ;
+	if (k < n_row - n1)
+	{
+	    /* complete P by putting empty rows last in their natural order, */
+	    /* rather than declaring an error (the matrix is singular) */
+	    for (row = 0 ; row < n_row - n1 ; row++)
+	    {
+		if (!W [row])
+		{
+		    /* W [row] = TRUE ;  (not required) */
+		    P [k++] = row ;
+		}
+	    }
+	}
+
+	/* contents of W no longer needed ] */
+
+#ifndef NDEBUG
+	DEBUG3 (("Induced row permutation:\n")) ;
+	ASSERT (k == n_row - n1) ;
+	ASSERT (UMF_is_permutation (P, W, n_row - n1, n_row - n1)) ;
+	for (k = 0 ; k < n_row - n1 ; k++)
+	{
+	    DEBUG3 ((ID"\n", P [k])) ;
+	}
+#endif
+
+	/* ------------------------------------------------------------------ */
+	/* B = row-form of the pattern of S (excluding empty columns) */
+	/* ------------------------------------------------------------------ */
+
+	/* Ci [0 .. Clen-1] holds the following work arrays:
+
+		first Clen2 entries	empty space, must be at least >= n_col
+		next max (nz,1)		Bi [0..max (nz,1)-1]
+		next nn+1 entries	Bp [0..nn]
+		next nn entries		Link [0..nn-1]
+		next nn entries		W [0..nn-1]
+		last n_col entries	Cperm2 [0..n_col-1]
+
+		This memory usage is accounted for by the UMF_ANALYZE_CLEN
+		macro.
+	*/
+
+	Clen2 = Clen0 ;
+	snz = Sp [n_col - n1] ;
+	bsize = MAX (snz, 1) ;
+	Clen2 -= bsize ;
+	Bi = Ci + Clen2 ;
+	ASSERT (Clen2 >= n_col) ;
+
+	(void) UMF_transpose (n_row - n1, n_col - n1 - nempty_col,
+	    Sp, Si, (double *) NULL,
+	    P, (Int *) NULL, 0, Bp, Bi, (double *) NULL, W, FALSE
+#ifdef COMPLEX
+	    , (double *) NULL, (double *) NULL, FALSE
+#endif
+	    ) ;
+
+	/* contents of Si and Sp no longer needed */
+
+	/* contents of P (same as Link) and W not needed */
+	/* still need Link and W as work arrays, though ] */
+
+	ASSERT (Bp [0] == 0) ;
+	ASSERT (Bp [n_row - n1] == snz) ;
+
+	/* increment Bp to point into Ci, not Bi */
+	for (i = 0 ; i <= n_row - n1 ; i++)
+	{
+	    Bp [i] += Clen2 ;
+	}
+	ASSERT (Bp [0] == Clen0 - bsize) ;
+	ASSERT (Bp [n_row - n1] <= Clen0) ;
+
+	/* Ci [0 .. Clen-1] holds the following work arrays:
+
+		first Clen0 entries	Ci [0 .. Clen0-1], where the col indices
+					of B are at the tail end of this part,
+					and Bp [0] = Clen2 >= n_col.  Note
+					that Clen0 = Clen2 + max (snz,1).
+		next nn+1 entries	Bp [0..nn]
+		next nn entries		Link [0..nn-1]
+		next nn entries		W [0..nn-1]
+		last n_col entries	Cperm2 [0..n_col-1]
+	*/
+
+	/* ------------------------------------------------------------------ */
+	/* analyze */
+	/* ------------------------------------------------------------------ */
+
+	/* only analyze the non-empty, non-singleton part of the matrix */
+	ok = UMF_analyze (
+		n_row - n1 - nempty_row,
+		n_col - n1 - nempty_col,
+		Ci, Bp, Cperm2, fixQ, W, Link,
+		Fr_ncols, Fr_nrows, Fr_npivcol,
+		Fr_parent, &nfr, &analyze_compactions) ;
+	if (!ok)
+	{
+	    /* :: internal error in umf_analyze :: */
+	    Info [UMFPACK_STATUS] = UMFPACK_ERROR_internal_error ;
+	    error (&Symbolic, SW) ;
+	    return (UMFPACK_ERROR_internal_error) ;
+	}
+	Info [UMFPACK_SYMBOLIC_DEFRAG] += analyze_compactions ;
+
+	/* ------------------------------------------------------------------ */
+	/* combine the input permutation and UMF_analyze's permutation */
+	/* ------------------------------------------------------------------ */
+
+	if (!fixQ)
+	{
+	    /* Cperm2 is the column etree post-ordering */
+	    ASSERT (UMF_is_permutation (Cperm2, W,
+	    n_col-n1-nempty_col, n_col-n1-nempty_col)) ;
+
+	    /* Note that the empty columns remain at the end of Cperm_init */
+	    for (k = 0 ; k < n_col - n1 - nempty_col ; k++)
+	    {
+		W [k] = Cperm_init [n1 + Cperm2 [k]] ;
+	    }
+
+	    for (k = 0 ; k < n_col - n1 - nempty_col ; k++)
+	    {
+		Cperm_init [n1 + k] = W [k] ;
+	    }
+	}
+
+	ASSERT (UMF_is_permutation (Cperm_init, W, n_col, n_col)) ;
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free some of the workspace */
+    /* ---------------------------------------------------------------------- */
+
+    /* (4) The real workspace, Rs, of size n_row doubles has already been
+     * free'd.  An additional workspace of size nz + n_col+1 + n_col integers
+     * is now free'd as well. */
+
+    SW->Si = (Int *) UMF_free ((void *) SW->Si) ;
+    SW->Sp = (Int *) UMF_free ((void *) SW->Sp) ;
+    SW->Cperm1 = (Int *) UMF_free ((void *) SW->Cperm1) ;
+    ASSERT (SW->Rs == (double *) NULL) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the size of the Symbolic object */
+    /* ---------------------------------------------------------------------- */
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the size of the Symbolic object */
+    /* ---------------------------------------------------------------------- */
+
+    nchains = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	if (Fr_parent [i] != i+1)
+	{
+	    nchains++ ;
+	}
+    }
+
+    Symbolic->nchains = nchains ;
+    Symbolic->nfr = nfr ;
+    Symbolic->esize
+	= (max_rdeg > dense_row_threshold) ? (n_col - n1 - nempty_col) : 0 ;
+
+    /* true size of Symbolic object */
+    Info [UMFPACK_SYMBOLIC_SIZE] = UMF_symbolic_usage (n_row, n_col, nchains,
+	    nfr, Symbolic->esize, prefer_diagonal) ;
+
+    /* actual peak memory usage for UMFPACK_symbolic (actual nfr, nchains) */
+    Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] =
+	SYM_WORK_USAGE (n_col, n_row, Clen) + Info [UMFPACK_SYMBOLIC_SIZE] ;
+    Symbolic->peak_sym_usage = Info [UMFPACK_SYMBOLIC_PEAK_MEMORY] ;
+
+    DEBUG0 (("Number of fronts: "ID"\n", nfr)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate the second part of the Symbolic object (Front_*, Chain_*) */
+    /* ---------------------------------------------------------------------- */
+
+    /* (5) UMF_malloc is called 7 or 8 times, for a total space of
+     * (4*(nfr+1) + 3*(nchains+1) + esize) integers, where nfr is the total
+     * number of frontal matrices and nchains is the total number of frontal
+     * matrix chains, and where nchains <= nfr <= n_col.  esize is zero if there
+     * are no dense rows, or n_col-n1-nempty_col otherwise (n1 is the number of
+     * singletons and nempty_col is the number of empty columns).  This space is
+     * part of the Symbolic object and is not free'd unless an error occurs.
+     * This is between 7 and about 8n integers when A is square.
+     */
+
+    /* Note that Symbolic->Front_* does include the dummy placeholder front */
+    Symbolic->Front_npivcol = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ;
+    Symbolic->Front_parent = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ;
+    Symbolic->Front_1strow = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ;
+    Symbolic->Front_leftmostdesc = (Int *) UMF_malloc (nfr+1, sizeof (Int)) ;
+    Symbolic->Chain_start = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ;
+    Symbolic->Chain_maxrows = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ;
+    Symbolic->Chain_maxcols = (Int *) UMF_malloc (nchains+1, sizeof (Int)) ;
+
+    fail = (!Symbolic->Front_npivcol || !Symbolic->Front_parent ||
+	!Symbolic->Front_1strow || !Symbolic->Front_leftmostdesc ||
+	!Symbolic->Chain_start || !Symbolic->Chain_maxrows ||
+	!Symbolic->Chain_maxcols) ;
+
+    if (Symbolic->esize > 0)
+    {
+	Symbolic->Esize = (Int *) UMF_malloc (Symbolic->esize, sizeof (Int)) ;
+	fail = fail || !Symbolic->Esize ;
+    }
+
+    if (fail)
+    {
+	DEBUGm4 (("out of memory: rest of symbolic object\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	error (&Symbolic, SW) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    DEBUG0 (("Symbolic UMF_malloc_count - init_count = "ID"\n",
+	UMF_malloc_count - init_count)) ;
+    ASSERT (UMF_malloc_count == init_count + 21
+	+ (SW->Rperm_2by2 != (Int *) NULL)
+	+ (Symbolic->Esize != (Int *) NULL)) ;
+
+    Front_npivcol = Symbolic->Front_npivcol ;
+    Front_parent = Symbolic->Front_parent ;
+    Front_1strow = Symbolic->Front_1strow ;
+    Front_leftmostdesc = Symbolic->Front_leftmostdesc ;
+
+    Chain_start = Symbolic->Chain_start ;
+    Chain_maxrows = Symbolic->Chain_maxrows ;
+    Chain_maxcols = Symbolic->Chain_maxcols ;
+
+    Esize = Symbolic->Esize ;
+
+    /* ---------------------------------------------------------------------- */
+    /* assign rows to fronts */
+    /* ---------------------------------------------------------------------- */
+
+    /* find InFront, unless colamd has already computed it */
+    if (do_UMF_analyze)
+    {
+
+	DEBUGm4 ((">>>>>>>>>Computing Front_1strow from scratch\n")) ;
+	/* empty rows go to dummy front nfr */
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    InFront [row] = nfr ;
+	}
+	/* assign the singleton pivot rows to the "empty" front */
+	for (k = 0 ; k < n1 ; k++)
+	{
+	    row = Rperm1 [k] ;
+	    InFront [row] = EMPTY ;
+	}
+	DEBUG1 (("Front (EMPTY), singleton nrows "ID" ncols "ID"\n", k, k)) ;
+	newj = n1 ;
+	for (i = 0 ; i < nfr ; i++)
+	{
+	    fpivcol = Fr_npivcol [i] ;
+	    f1rows = 0 ;
+	    /* for all pivot columns in front i */
+	    for (kk = 0 ; kk < fpivcol ; kk++, newj++)
+	    {
+		j = Cperm_init [newj] ;
+		ASSERT (IMPLIES (newj >= n_col-nempty_col,
+				Ap [j+1] - Ap [j] == 0));
+		for (p = Ap [j] ; p < Ap [j+1] ; p++)
+		{
+		    row = Ai [p] ;
+		    if (InFront [row] == nfr)
+		    {
+			/* this row belongs to front i */
+			DEBUG1 (("    Row "ID" in Front "ID"\n", row, i)) ;
+			InFront [row] = i ;
+			f1rows++ ;
+		    }
+		}
+	    }
+	    Front_1strow [i] = f1rows ;
+	    DEBUG1 (("    Front "ID" has 1strows: "ID" pivcols "ID"\n",
+		i, f1rows, fpivcol)) ;
+	}
+
+    }
+    else
+    {
+
+	/* COLAMD has already computed InFront, but it is not yet
+	 * InFront [row] = front i, where row is an original row.  It is
+	 * InFront [k-n1] = i for k in the range n1 to n_row-nempty_row,
+	 * and where row = Rperm1 [k].  Need to permute InFront.  Also compute
+	 * # of original rows assembled into each front.
+	 * [ use Ci as workspace */
+	DEBUGm4 ((">>>>>>>>>Computing Front_1strow from colamd's InFront\n")) ;
+	for (i = 0 ; i <= nfr ; i++)
+	{
+	    Front_1strow [i] = 0 ;
+	}
+	/* assign the singleton pivot rows to "empty" front */
+	for (k = 0 ; k < n1 ; k++)
+	{
+	    row = Rperm1 [k] ;
+	    Ci [row] = EMPTY ;
+	}
+	/* assign the non-empty rows to the front that assembled them */
+	for ( ; k < n_row - nempty_row ; k++)
+	{
+	    row = Rperm1 [k] ;
+	    i = InFront [k - n1] ;
+	    ASSERT (i >= EMPTY && i < nfr) ;
+	    if (i != EMPTY)
+	    {
+		Front_1strow [i]++ ;
+	    }
+	    /* use Ci as permuted version of InFront */
+	    Ci [row] = i ;
+	}
+	/* empty rows go to the "dummy" front */
+	for ( ; k < n_row ; k++)
+	{
+	    row = Rperm1 [k] ;
+	    Ci [row] = nfr ;
+	}
+	/* permute InFront so that InFront [row] = i if the original row is
+	 * in front i */
+	for (row = 0 ; row < n_row ; row++)
+	{
+	    InFront [row] = Ci [row] ;
+	}
+	/* ] no longer need Ci as workspace */
+    }
+
+#ifndef NDEBUG
+    for (row = 0 ; row < n_row ; row++)
+    {
+	if (InFront [row] == nfr)
+	{
+	    DEBUG1 (("    Row "ID" in Dummy Front "ID"\n", row, nfr)) ;
+	}
+	else if (InFront [row] == EMPTY)
+	{
+	    DEBUG1 (("    singleton Row "ID"\n", row)) ;
+	}
+	else
+	{
+	    DEBUG1 (("    Row "ID" in Front "ID"\n", row, nfr)) ;
+	}
+    }
+    for (i = 0 ; i <= nfr ; i++)
+    {
+	DEBUG1 (("Front "ID" has 1strows: "ID" pivcols "ID"\n",
+		i, f1rows, fpivcol)) ;
+    }
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* copy front information into Symbolic object */
+    /* ---------------------------------------------------------------------- */
+
+    k = n1 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fpivcol = Fr_npivcol [i] ;
+	DEBUG1 (("Front "ID" k "ID" npivcol "ID" nrows "ID" ncols "ID"\n",
+	    i, k, fpivcol, Fr_nrows [i], Fr_ncols [i])) ;
+	k += fpivcol ;
+	/* copy Front info into Symbolic object from SW */
+	Front_npivcol [i] = fpivcol ;
+	Front_parent [i] = Fr_parent [i] ;
+    }
+
+    /* assign empty columns to dummy placehold front nfr */
+    DEBUG1 (("Dummy Cols in Front "ID" : "ID"\n", nfr, n_col-k)) ;
+    Front_npivcol [nfr] = n_col - k ;
+    Front_parent [nfr] = EMPTY ;
+
+    /* ---------------------------------------------------------------------- */
+    /* find initial row permutation */
+    /* ---------------------------------------------------------------------- */
+
+    /* order the singleton pivot rows */
+    for (k = 0 ; k < n1 ; k++)
+    {
+	Rperm_init [k] = Rperm1 [k] ;
+    }
+
+    /* determine the first row in each front (in the new row ordering) */
+    for (i = 0 ; i < nfr ; i++)
+    {
+	f1rows = Front_1strow [i] ;
+	DEBUG1 (("Front "ID" : npivcol "ID" parent "ID,
+	    i, Front_npivcol [i], Front_parent [i])) ;
+	DEBUG1 (("    1st rows in Front "ID" : "ID"\n", i, f1rows)) ;
+	Front_1strow [i] = k ;
+	k += f1rows ;
+    }
+
+    /* assign empty rows to dummy placehold front nfr */
+    DEBUG1 (("Rows in Front "ID" (dummy): "ID"\n", nfr, n_row-k)) ;
+    Front_1strow [nfr] = k ;
+    DEBUG1 (("nfr "ID" 1strow[nfr] "ID" nrow "ID"\n", nfr, k, n_row)) ;
+
+    /* Use Ci as temporary workspace for F1 */
+    F1 = Ci ;				/* [ of size nfr+1 */
+    ASSERT (Clen >= 2*n_row + nfr+1) ;
+
+    for (i = 0 ; i <= nfr ; i++)
+    {
+	F1 [i] = Front_1strow [i] ;
+    }
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+	i = InFront [row] ;
+	if (i != EMPTY)
+	{
+	    newrow = F1 [i]++ ;
+	    ASSERT (newrow >= n1) ;
+	    Rperm_init [newrow] = row ;
+	}
+    }
+    Rperm_init [n_row] = EMPTY ;	/* unused */
+
+#ifndef NDEBUG
+    for (k = 0 ; k < n_row ; k++)
+    {
+	DEBUG2 (("Rperm_init ["ID"] = "ID"\n", k, Rperm_init [k])) ;
+    }
+#endif
+
+    /* ] done using F1 */
+
+    /* ---------------------------------------------------------------------- */
+    /* find the diagonal map */
+    /* ---------------------------------------------------------------------- */
+
+    /* Rperm_init [newrow] = row gives the row permutation that is implied
+     * by the column permutation, where "row" is a row index of the original
+     * matrix A.  It is not dependent on the Rperm_2by2 permutation, which
+     * only redefines the "diagonal".   Both are used to construct the
+     * Diagonal_map.  Diagonal_map only needs to be defined for
+     * k = n1 to nn - nempty, but go ahead and define it for all of
+     * k = 0 to nn */
+
+    if (prefer_diagonal)
+    {
+	Int *Diagonal_map ;
+	ASSERT (n_row == n_col && nn == n_row) ;
+	ASSERT (nempty_row == nempty_col && nempty == nempty_row) ;
+
+	/* allocate the Diagonal_map */
+	Symbolic->Diagonal_map = (Int *) UMF_malloc (n_col+1, sizeof (Int)) ;
+	Diagonal_map = Symbolic->Diagonal_map ;
+	if (Diagonal_map == (Int *) NULL)
+	{
+	    /* :: out of memory (diagonal map) :: */
+	    DEBUGm4 (("out of memory: Diagonal map\n")) ;
+	    Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	    error (&Symbolic, SW) ;
+	    return (UMFPACK_ERROR_out_of_memory) ;
+	}
+
+	/* use Ci as workspace to compute the inverse of Rperm_init [ */
+	for (newrow = 0 ; newrow < nn ; newrow++)
+	{
+	    oldrow = Rperm_init [newrow] ;
+	    ASSERT (oldrow >= 0 && oldrow < nn) ;
+	    Ci [oldrow] = newrow ;
+	}
+	if (strategy == UMFPACK_STRATEGY_2BY2)
+	{
+	    ASSERT (Rperm_2by2 != (Int *) NULL) ;
+	    for (newcol = 0 ; newcol < nn ; newcol++)
+	    {
+		oldcol = Cperm_init [newcol] ;
+		/* 2-by-2 pivoting done in S */
+		oldrow = Rperm_2by2 [oldcol] ;
+		newrow = Ci [oldrow] ;
+		Diagonal_map [newcol] = newrow ;
+	    }
+	}
+	else
+	{
+	    for (newcol = 0 ; newcol < nn ; newcol++)
+	    {
+		oldcol = Cperm_init [newcol] ;
+		/* no 2-by-2 pivoting in S */
+		oldrow = oldcol ;
+		newrow = Ci [oldrow] ;
+		Diagonal_map [newcol] = newrow ;
+	    }
+	}
+
+#ifndef NDEBUG
+	DEBUG1 (("\nDiagonal map:\n")) ;
+	for (newcol = 0 ; newcol < nn ; newcol++)
+	{
+	    oldcol = Cperm_init [newcol] ;
+	    DEBUG3 (("oldcol "ID" newcol "ID":\n", oldcol, newcol)) ;
+	    for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++)
+	    {
+		Entry aij ;
+		oldrow = Ai [p] ;
+		newrow = Ci [oldrow] ;
+		if (Ax != (double *) NULL)
+		{
+		    ASSIGN (aij, Ax, Az, p, SPLIT (Az)) ;
+		}
+		if (oldrow == oldcol)
+		{
+		    DEBUG2 (("     old diagonal : oldcol "ID" oldrow "ID" ",
+			    oldcol, oldrow)) ;
+		    EDEBUG2 (aij) ;
+		    DEBUG2 (("\n")) ;
+		}
+		if (newrow == Diagonal_map [newcol])
+		{
+		    DEBUG2 (("     MAP diagonal : newcol "ID" MAProw "ID" ",
+			    newcol, Diagonal_map [newrow])) ;
+		    EDEBUG2 (aij) ;
+		    DEBUG2 (("\n")) ;
+		}
+	    }
+	}
+#endif
+	/* done using Ci as workspace ] */
+
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* find the leftmost descendant of each front */
+    /* ---------------------------------------------------------------------- */
+
+    for (i = 0 ; i <= nfr ; i++)
+    {
+	Front_leftmostdesc [i] = EMPTY ;
+    }
+
+    for (i = 0 ; i < nfr ; i++)
+    {
+	/* start at i and walk up the tree */
+	DEBUG2 (("Walk up front tree from "ID"\n", i)) ;
+	j = i ;
+	while (j != EMPTY && Front_leftmostdesc [j] == EMPTY)
+	{
+	    DEBUG3 (("  Leftmost desc of "ID" is "ID"\n", j, i)) ;
+	    Front_leftmostdesc [j] = i ;
+	    j = Front_parent [j] ;
+	    DEBUG3 (("  go to j = "ID"\n", j)) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* find the frontal matrix chains and max frontal matrix sizes */
+    /* ---------------------------------------------------------------------- */
+
+    maxnrows = 1 ;		/* max # rows in any front */
+    maxncols = 1 ;		/* max # cols in any front */
+    dmaxfrsize = 1 ;		/* max frontal matrix size */
+
+    /* start the first chain */
+    nchains = 0 ;		/* number of chains */
+    Chain_start [0] = 0 ;	/* front 0 starts a new chain */
+    maxrows = 1 ;		/* max # rows for any front in current chain */
+    maxcols = 1 ;		/* max # cols for any front in current chain */
+    DEBUG1 (("Constructing chains:\n")) ;
+
+    for (i = 0 ; i < nfr ; i++)
+    {
+	/* get frontal matrix info */
+	fpivcol  = Front_npivcol [i] ;	    /* # candidate pivot columns */
+	fallrows = Fr_nrows [i] ;	    /* all rows (not just Schur comp) */
+	fallcols = Fr_ncols [i] ;	    /* all cols (not just Schur comp) */
+	parent = Front_parent [i] ;	    /* parent in column etree */
+	fpiv = MIN (fpivcol, fallrows) ;    /* # pivot rows and cols */
+	maxrows = MAX (maxrows, fallrows) ;
+	maxcols = MAX (maxcols, fallcols) ;
+
+	DEBUG1 (("Front: "ID", pivcol "ID", "ID"-by-"ID" parent "ID
+	    ", npiv "ID" Chain: maxrows "ID" maxcols "ID"\n", i, fpivcol,
+	    fallrows, fallcols, parent, fpiv, maxrows, maxcols)) ;
+
+	if (parent != i+1)
+	{
+	    /* this is the end of a chain */
+	    double s ;
+	    DEBUG1 (("\nEnd of chain "ID"\n", nchains)) ;
+
+	    /* make sure maxrows is an odd number */
+	    ASSERT (maxrows >= 0) ;
+	    if (maxrows % 2 == 0) maxrows++ ;
+
+	    DEBUG1 (("Chain maxrows "ID" maxcols "ID"\n", maxrows, maxcols)) ;
+
+	    Chain_maxrows [nchains] = maxrows ;
+	    Chain_maxcols [nchains] = maxcols ;
+
+	    /* keep track of the maximum front size for all chains */
+
+	    /* for Info only: */
+	    s = (double) maxrows * (double) maxcols ;
+	    dmaxfrsize = MAX (dmaxfrsize, s) ;
+
+	    /* for the subsequent numerical factorization */
+	    maxnrows = MAX (maxnrows, maxrows) ;
+	    maxncols = MAX (maxncols, maxcols) ;
+
+	    DEBUG1 (("Chain dmaxfrsize %g\n\n", dmaxfrsize)) ;
+
+	    /* start the next chain */
+	    nchains++ ;
+	    Chain_start [nchains] = i+1 ;
+	    maxrows = 1 ;
+	    maxcols = 1 ;
+	}
+    }
+
+    /* for Info only: */
+    dmaxfrsize = ceil (dmaxfrsize) ;
+    DEBUGm1 (("dmaxfrsize %30.20g Int_MAX "ID"\n", dmaxfrsize, Int_MAX)) ;
+    ASSERT (Symbolic->nchains == nchains) ;
+
+    /* For allocating objects in umfpack_numeric (does not include all possible
+     * pivots, particularly pivots from prior fronts in the chain.  Need to add
+     * nb to these to get the # of columns in the L block, for example.  This
+     * is the largest row dimension and largest column dimension of any frontal
+     * matrix.  maxnrows is always odd. */
+    Symbolic->maxnrows = maxnrows ;
+    Symbolic->maxncols = maxncols ;
+    DEBUGm3 (("maxnrows "ID" maxncols "ID"\n", maxnrows, maxncols)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* find the initial element sizes */
+    /* ---------------------------------------------------------------------- */
+
+    if (max_rdeg > dense_row_threshold)
+    {
+	/* there are one or more dense rows in the input matrix */
+	/* count the number of dense rows in each column */
+	/* use Ci as workspace for inverse of Rperm_init [ */
+	ASSERT (Esize != (Int *) NULL) ;
+	for (newrow = 0 ; newrow < n_row ; newrow++)
+	{
+	    oldrow = Rperm_init [newrow] ;
+	    ASSERT (oldrow >= 0 && oldrow < nn) ;
+	    Ci [oldrow] = newrow ;
+	}
+	for (col = n1 ; col < n_col - nempty_col ; col++)
+	{
+	    oldcol = Cperm_init [col] ;
+	    esize = Cdeg [oldcol] ;
+	    ASSERT (esize > 0) ;
+	    for (p = Ap [oldcol] ; p < Ap [oldcol+1] ; p++)
+	    {
+		oldrow = Ai [p] ;
+		newrow = Ci [oldrow] ;
+		if (newrow >= n1 && Rdeg [oldrow] > dense_row_threshold)
+		{
+		    esize-- ;
+		}
+	    }
+	    ASSERT (esize >= 0) ;
+	    Esize [col - n1] = esize ;
+	}
+	/* done using Ci as workspace ] */
+    }
+
+    /* If there are no dense rows, then Esize [col-n1] is identical to
+     * Cdeg [col], once Cdeg is permuted below */
+
+    /* ---------------------------------------------------------------------- */
+    /* permute Cdeg and Rdeg according to initial column and row permutation */
+    /* ---------------------------------------------------------------------- */
+
+    /* use Ci as workspace [ */
+    for (k = 0 ; k < n_col ; k++)
+    {
+	Ci [k] = Cdeg [Cperm_init [k]] ;
+    }
+    for (k = 0 ; k < n_col ; k++)
+    {
+	Cdeg [k] = Ci [k] ;
+    }
+    for (k = 0 ; k < n_row ; k++)
+    {
+	Ci [k] = Rdeg [Rperm_init [k]] ;
+    }
+    for (k = 0 ; k < n_row ; k++)
+    {
+	Rdeg [k] = Ci [k] ;
+    }
+    /* done using Ci as workspace ] */
+
+    /* ---------------------------------------------------------------------- */
+    /* simulate UMF_kernel_init */
+    /* ---------------------------------------------------------------------- */
+
+    /* count elements and tuples at tail, LU factors of singletons, and
+     * head and tail markers */
+
+    dlnz = n_inner ;	/* upper limit of nz in L (incl diag) */
+    dunz = dlnz ;	/* upper limit of nz in U (incl diag) */
+
+    /* head marker */
+    head_usage  = 1 ;
+    dhead_usage = 1 ;
+
+    /* tail markers: */
+    tail_usage  = 2 ;
+    dtail_usage = 2 ;
+
+    /* allocate the Rpi and Rpx workspace for UMF_kernel_init (incl. headers) */
+    tail_usage  +=  UNITS (Int *, n_row+1) +  UNITS (Entry *, n_row+1) + 2 ;
+    dtail_usage += DUNITS (Int *, n_row+1) + DUNITS (Entry *, n_row+1) + 2 ;
+    DEBUG1 (("Symbolic usage after Rpi/Rpx allocation: head "ID" tail "ID"\n",
+	head_usage, tail_usage)) ;
+
+    /* LU factors for singletons, at the head of memory */
+    for (k = 0 ; k < n1 ; k++)
+    {
+	lnz = Cdeg [k] - 1 ;
+	unz = Rdeg [k] - 1 ;
+	dlnz += lnz ;
+	dunz += unz ;
+	DEBUG1 (("singleton k "ID" pivrow "ID" pivcol "ID" lnz "ID" unz "ID"\n",
+	    k, Rperm_init [k], Cperm_init [k], lnz, unz)) ;
+	head_usage  +=  UNITS (Int, lnz) +  UNITS (Entry, lnz)
+		    +   UNITS (Int, unz) +  UNITS (Entry, unz) ;
+	dhead_usage += DUNITS (Int, lnz) + DUNITS (Entry, lnz)
+		    +  DUNITS (Int, unz) + DUNITS (Entry, unz) ;
+    }
+    DEBUG1 (("Symbolic init head usage: "ID" for LU singletons\n",head_usage)) ;
+
+    /* column elements: */
+    for (k = n1 ; k < n_col - nempty_col; k++)
+    {
+	esize = Esize ? Esize [k-n1] : Cdeg [k] ;
+	DEBUG2 (("   esize: "ID"\n", esize)) ;
+	ASSERT (esize >= 0) ;
+	if (esize > 0)
+	{
+	    tail_usage  +=  GET_ELEMENT_SIZE (esize, 1) + 1 ;
+	    dtail_usage += DGET_ELEMENT_SIZE (esize, 1) + 1 ;
+	}
+    }
+
+    /* dense row elements */
+    if (Esize)
+    {
+	Int nrow_elements = 0 ;
+	for (k = n1 ; k < n_row - nempty_row ; k++)
+	{
+	    rdeg = Rdeg [k] ;
+	    if (rdeg > dense_row_threshold)
+	    {
+		tail_usage  += GET_ELEMENT_SIZE (1, rdeg) + 1 ;
+		dtail_usage += GET_ELEMENT_SIZE (1, rdeg) + 1 ;
+		nrow_elements++ ;
+	    }
+	}
+	Info [UMFPACK_NDENSE_ROW] = nrow_elements ;
+    }
+
+    DEBUG1 (("Symbolic usage: "ID" = head "ID" + tail "ID" after els\n",
+	head_usage + tail_usage, head_usage, tail_usage)) ;
+
+    /* compute the tuple lengths */
+    if (Esize)
+    {
+	/* row tuples */
+	for (row = n1 ; row < n_row ; row++)
+	{
+	    rdeg = Rdeg [row] ;
+	    tlen = (rdeg > dense_row_threshold) ? 1 : rdeg ;
+	    tail_usage  += 1 +  UNITS (Tuple, TUPLES (tlen)) ;
+	    dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ;
+	}
+	/* column tuples */
+	for (col = n1 ; col < n_col - nempty_col ; col++)
+	{
+	    /* tlen is 1 plus the number of dense rows in this column */
+	    esize = Esize [col - n1] ;
+	    tlen = (esize > 0) + (Cdeg [col] - esize) ;
+	    tail_usage  += 1 +  UNITS (Tuple, TUPLES (tlen)) ;
+	    dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ;
+	}
+	for ( ; col < n_col ; col++)
+	{
+	    tail_usage  += 1 +  UNITS (Tuple, TUPLES (0)) ;
+	    dtail_usage += 1 + DUNITS (Tuple, TUPLES (0)) ;
+	}
+    }
+    else
+    {
+	/* row tuples */
+	for (row = n1 ; row < n_row ; row++)
+	{
+	    tlen = Rdeg [row] ;
+	    tail_usage  += 1 +  UNITS (Tuple, TUPLES (tlen)) ;
+	    dtail_usage += 1 + DUNITS (Tuple, TUPLES (tlen)) ;
+	}
+	/* column tuples */
+	for (col = n1 ; col < n_col ; col++)
+	{
+	    tail_usage  += 1 +  UNITS (Tuple, TUPLES (1)) ;
+	    dtail_usage += 1 + DUNITS (Tuple, TUPLES (1)) ;
+	}
+    }
+
+    Symbolic->num_mem_init_usage = head_usage + tail_usage ;
+    DEBUG1 (("Symbolic usage: "ID" = head "ID" + tail "ID" final\n",
+	Symbolic->num_mem_init_usage, head_usage, tail_usage)) ;
+
+    ASSERT (UMF_is_permutation (Rperm_init, Ci, n_row, n_row)) ;
+
+    /* initial head and tail usage in Numeric->Memory */
+    dmax_usage = dhead_usage + dtail_usage ;
+    dmax_usage = MAX (Symbolic->num_mem_init_usage, ceil (dmax_usage)) ;
+    Info [UMFPACK_VARIABLE_INIT_ESTIMATE] = dmax_usage ;
+
+    /* In case Symbolic->num_mem_init_usage overflows, keep as a double, too */
+    Symbolic->dnum_mem_init_usage = dmax_usage ;
+
+    /* free the Rpi and Rpx workspace */
+    tail_usage  -=  UNITS (Int *, n_row+1) +  UNITS (Entry *, n_row+1) ;
+    dtail_usage -= DUNITS (Int *, n_row+1) + DUNITS (Entry *, n_row+1) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* simulate UMF_kernel, assuming unsymmetric pivoting */
+    /* ---------------------------------------------------------------------- */
+
+    /* Use Ci as temporary workspace for link lists [ */
+    Link = Ci ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	Link [i] = EMPTY ;
+    }
+
+    flops = 0 ;			/* flop count upper bound */
+
+    for (chain = 0 ; chain < nchains ; chain++)
+    {
+	double fsize ;
+	f1 = Chain_start [chain] ;
+	f2 = Chain_start [chain+1] - 1 ;
+
+	/* allocate frontal matrix working array (C, L, and U) */
+	dr = Chain_maxrows [chain] ;
+	dc = Chain_maxcols [chain] ;
+	fsize =
+	      nb*nb	    /* LU is nb-by-nb */
+	    + dr*nb	    /* L is dr-by-nb */
+	    + nb*dc	    /* U is nb-by-dc, stored by rows */
+	    + dr*dc ;	    /* C is dr by dc */
+	dtail_usage += DUNITS (Entry, fsize) ;
+	dmax_usage = MAX (dmax_usage, dhead_usage + dtail_usage) ;
+
+	for (i = f1 ; i <= f2 ; i++)
+	{
+
+	    /* get frontal matrix info */
+	    fpivcol  = Front_npivcol [i] ; /* # candidate pivot columns */
+	    fallrows = Fr_nrows [i] ;   /* all rows (not just Schur comp*/
+	    fallcols = Fr_ncols [i] ;   /* all cols (not just Schur comp*/
+	    parent = Front_parent [i] ; /* parent in column etree */
+	    fpiv = MIN (fpivcol, fallrows) ;	/* # pivot rows and cols */
+	    f = (double) fpiv ;
+	    r = fallrows - fpiv ;		/* # rows in Schur comp. */
+	    c = fallcols - fpiv ;		/* # cols in Schur comp. */
+
+	    /* assemble all children of front i in column etree */
+	    for (child = Link [i] ; child != EMPTY ; child = Link [child])
+	    {
+		ASSERT (child >= 0 && child < i) ;
+		ASSERT (Front_parent [child] == i) ;
+		/* free the child element and remove it from tuple lists */
+		cp = MIN (Front_npivcol [child], Fr_nrows [child]) ;
+		cr = Fr_nrows [child] - cp ;
+		cc = Fr_ncols [child] - cp ;
+		ASSERT (cp >= 0 && cr >= 0 && cc >= 0) ;
+		dtail_usage -= ELEMENT_SIZE (cr, cc) ;
+
+	    }
+
+	    /* The flop count computed here is "canonical". */
+
+	    /* factorize the frontal matrix */
+	    flops += DIV_FLOPS * (f*r + (f-1)*f/2)  /* scale pivot columns */
+		/* f outer products: */
+		+ MULTSUB_FLOPS * (f*r*c + (r+c)*(f-1)*f/2 + (f-1)*f*(2*f-1)/6);
+
+	    /* count nonzeros and memory usage in double precision */
+	    dlf = (f*f-f)/2 + f*r ;		/* nz in L below diagonal */
+	    duf = (f*f-f)/2 + f*c ;		/* nz in U above diagonal */
+	    dlnz += dlf ;
+	    dunz += duf ;
+
+	    /* store f columns of L and f rows of U */
+	    dhead_usage +=
+		DUNITS (Entry, dlf + duf)   /* numerical values (excl diag) */
+		+ DUNITS (Int, r + c + f) ; /* indices (compressed) */
+
+	    if (parent != EMPTY)
+	    {
+		/* create new element and place in tuple lists */
+		dtail_usage += ELEMENT_SIZE (r, c) ;
+
+		/* place in link list of parent */
+		Link [i] = Link [parent] ;
+		Link [parent] = i ;
+	    }
+
+	    /* keep track of peak Numeric->Memory usage */
+	    dmax_usage = MAX (dmax_usage, dhead_usage + dtail_usage) ;
+
+	}
+
+	/* free the current frontal matrix */
+	dtail_usage -= DUNITS (Entry, fsize) ;
+    }
+
+    dhead_usage = ceil (dhead_usage) ;
+    dmax_usage = ceil (dmax_usage) ;
+    Symbolic->num_mem_size_est = dhead_usage ;
+    Symbolic->num_mem_usage_est = dmax_usage ;
+    Symbolic->lunz_bound = dlnz + dunz - n_inner ;
+
+    /* ] done using Ci as workspace for Link array */
+
+    /* ---------------------------------------------------------------------- */
+    /* estimate total memory usage in UMFPACK_numeric */
+    /* ---------------------------------------------------------------------- */
+
+    UMF_set_stats (
+	Info,
+	Symbolic,
+	dmax_usage,		/* estimated peak size of Numeric->Memory */
+	dhead_usage,		/* estimated final size of Numeric->Memory */
+	flops,			/* estimated "true flops" */
+	dlnz,			/* estimated nz in L */
+	dunz,			/* estimated nz in U */
+	dmaxfrsize,		/* estimated largest front size */
+	(double) n_col,		/* worst case Numeric->Upattern size */
+	(double) n_inner,	/* max possible pivots to be found */
+	(double) maxnrows,	/* estimated largest #rows in front */
+	(double) maxncols,	/* estimated largest #cols in front */
+	TRUE,			/* assume scaling is to be performed */
+	prefer_diagonal,
+	ESTIMATE) ;
+
+    /* ---------------------------------------------------------------------- */
+
+#ifndef NDEBUG
+    for (i = 0 ; i < nchains ; i++)
+    {
+	DEBUG2 (("Chain "ID" start "ID" end "ID" maxrows "ID" maxcols "ID"\n",
+		i, Chain_start [i], Chain_start [i+1] - 1,
+		Chain_maxrows [i], Chain_maxcols [i])) ;
+	UMF_dump_chain (Chain_start [i], Fr_parent, Fr_npivcol, Fr_nrows,
+	    Fr_ncols, nfr) ;
+    }
+    fpivcol = 0 ;
+    for (i = 0 ; i < nfr ; i++)
+    {
+	fpivcol = MAX (fpivcol, Front_npivcol [i]) ;
+    }
+    DEBUG0 (("Max pivot cols in any front: "ID"\n", fpivcol)) ;
+    DEBUG1 (("Largest front: maxnrows "ID" maxncols "ID" dmaxfrsize %g\n",
+	maxnrows, maxncols, dmaxfrsize)) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* UMFPACK_symbolic was successful, return the object handle */
+    /* ---------------------------------------------------------------------- */
+
+    Symbolic->valid = SYMBOLIC_VALID ;
+    *SymbolicHandle = (void *) Symbolic ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free workspace */
+    /* ---------------------------------------------------------------------- */
+
+    /* (6) The last of the workspace is free'd.  The final Symbolic object
+     * consists of 12 to 14 allocated objects.  Its final total size is lies
+     * roughly between 4*n and 13*n for a square matrix, which is all that is
+     * left of the memory allocated by this routine.  If an error occurs, the
+     * entire Symbolic object is free'd when this routine returns (the error
+     * return routine, below).
+     */
+
+    free_work (SW) ;
+
+    DEBUG0 (("(3)Symbolic UMF_malloc_count - init_count = "ID"\n",
+	UMF_malloc_count - init_count)) ;
+    ASSERT (UMF_malloc_count == init_count + 12
+	+ (Symbolic->Esize != (Int *) NULL)
+	+ (Symbolic->Diagonal_map != (Int *) NULL)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get the time used by UMFPACK_*symbolic */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_toc (stats) ;
+    Info [UMFPACK_SYMBOLIC_WALLTIME] = stats [0] ;
+    Info [UMFPACK_SYMBOLIC_TIME] = stats [1] ;
+
+    return (UMFPACK_OK) ;
+}
+
+
+/* ========================================================================== */
+/* === free_work ============================================================ */
+/* ========================================================================== */
+
+PRIVATE void free_work
+(
+    SWType *SW
+)
+{
+    if (SW)
+    {
+	SW->Rperm_2by2 = (Int *) UMF_free ((void *) SW->Rperm_2by2) ;
+	SW->InvRperm1 = (Int *) UMF_free ((void *) SW->InvRperm1) ;
+	SW->Rs = (double *) UMF_free ((void *) SW->Rs) ;
+	SW->Si = (Int *) UMF_free ((void *) SW->Si) ;
+	SW->Sp = (Int *) UMF_free ((void *) SW->Sp) ;
+	SW->Ci = (Int *) UMF_free ((void *) SW->Ci) ;
+	SW->Front_npivcol = (Int *) UMF_free ((void *) SW->Front_npivcol);
+	SW->Front_nrows = (Int *) UMF_free ((void *) SW->Front_nrows) ;
+	SW->Front_ncols = (Int *) UMF_free ((void *) SW->Front_ncols) ;
+	SW->Front_parent = (Int *) UMF_free ((void *) SW->Front_parent) ;
+	SW->Front_cols = (Int *) UMF_free ((void *) SW->Front_cols) ;
+	SW->Cperm1 = (Int *) UMF_free ((void *) SW->Cperm1) ;
+	SW->Rperm1 = (Int *) UMF_free ((void *) SW->Rperm1) ;
+	SW->InFront = (Int *) UMF_free ((void *) SW->InFront) ;
+    }
+}
+
+
+/* ========================================================================== */
+/* === error ================================================================ */
+/* ========================================================================== */
+
+/* Error return from UMFPACK_symbolic.  Free all allocated memory. */
+
+PRIVATE void error
+(
+    SymbolicType **Symbolic,
+    SWType *SW
+)
+{
+
+    free_work (SW) ;
+    UMFPACK_free_symbolic ((void **) Symbolic) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_control.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,386 @@
+/* ========================================================================== */
+/* === UMFPACK_report_control =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints the control settings.  See umfpack_report_control.h
+    for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL void UMFPACK_report_control
+(
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    double drow, dcol, relpt, relpt2, alloc_init, front_alloc_init, amd_alpha,
+	tol, force_fixQ, droptol, aggr ;
+    Int prl, nb, irstep, strategy, scale, s ;
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl < 2)
+    {
+	/* default is to print nothing */
+	return ;
+    }
+
+    PRINTF (("\n%s, Control:\n\n", UMFPACK_VERSION)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* run-time options */
+    /* ---------------------------------------------------------------------- */
+
+    /* This is a "run-time" option because all four umfpack_* versions */
+    /* compiled into the UMFPACK library. */
+
+#ifdef DINT
+    PRINTF (("    Matrix entry defined as: double\n")) ;
+    PRINTF (("    Int (generic integer) defined as: int\n")) ;
+#endif
+#ifdef DLONG
+    PRINTF (("    Matrix entry defined as: double\n")) ;
+    PRINTF (("    Int (generic integer) defined as: long\n")) ;
+#endif
+#ifdef ZINT
+    PRINTF (("    Matrix entry defined as: double complex\n")) ;
+    PRINTF (("    Int (generic integer) defined as: int\n")) ;
+#endif
+#ifdef ZLONG
+    PRINTF (("    Matrix entry defined as: double complex\n")) ;
+    PRINTF (("    Int (generic integer) defined as: long\n")) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* printing level */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF (("\n    "ID": print level: "ID"\n",
+	(Int) INDEX (UMFPACK_PRL), prl)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* dense row/col parameters */
+    /* ---------------------------------------------------------------------- */
+
+    drow = GET_CONTROL (UMFPACK_DENSE_ROW, UMFPACK_DEFAULT_DENSE_ROW) ;
+    dcol = GET_CONTROL (UMFPACK_DENSE_COL, UMFPACK_DEFAULT_DENSE_COL) ;
+
+    PRINTF (("    "ID": dense row parameter:    %g\n",
+	(Int) INDEX (UMFPACK_DENSE_ROW), drow)) ;
+    PRINTF (("        \"dense\" rows have    > max (16, (%g)*16*sqrt(n_col)"
+	" entries)\n", drow)) ;
+    PRINTF (("    "ID": dense column parameter: %g\n",
+	(Int) INDEX (UMFPACK_DENSE_COL), dcol)) ;
+    PRINTF (("        \"dense\" columns have > max (16, (%g)*16*sqrt(n_row)"
+	" entries)\n", dcol)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* pivot tolerance */
+    /* ---------------------------------------------------------------------- */
+
+    relpt = GET_CONTROL (UMFPACK_PIVOT_TOLERANCE,
+	UMFPACK_DEFAULT_PIVOT_TOLERANCE) ;
+    relpt = MAX (0.0, MIN (relpt, 1.0)) ;
+    PRINTF (("    "ID": pivot tolerance: %g\n",
+	(Int) INDEX (UMFPACK_PIVOT_TOLERANCE), relpt)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* block size */
+    /* ---------------------------------------------------------------------- */
+
+    nb = GET_CONTROL (UMFPACK_BLOCK_SIZE, UMFPACK_DEFAULT_BLOCK_SIZE) ;
+    nb = MAX (1, nb) ;
+    PRINTF (("    "ID": block size for dense matrix kernels: "ID"\n",
+	(Int) INDEX (UMFPACK_BLOCK_SIZE), nb)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* strategy */
+    /* ---------------------------------------------------------------------- */
+
+    strategy = GET_CONTROL (UMFPACK_STRATEGY, UMFPACK_DEFAULT_STRATEGY) ;
+    if (strategy < UMFPACK_STRATEGY_AUTO
+     || strategy > UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	strategy = UMFPACK_STRATEGY_AUTO ;
+    }
+
+    PRINTF (("    "ID": strategy: "ID,
+	(Int) INDEX (UMFPACK_STRATEGY), strategy)) ;
+
+    if (strategy == UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	PRINTF ((" (symmetric)\n"
+	"        Q = AMD (A+A'), Q not refined during numerical\n"
+	"        factorization, and diagonal pivoting (P=Q') attempted.\n")) ;
+    }
+    else if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC)
+    {
+	PRINTF ((" (unsymmetric)\n"
+	"        Q = COLAMD (A), Q refined during numerical\n"
+	"        factorization, and no attempt at diagonal pivoting.\n")) ;
+    }
+    else if (strategy == UMFPACK_STRATEGY_2BY2)
+    {
+	PRINTF ((" (symmetric, with 2-by-2 block pivoting)\n"
+	"        P2 = row permutation that tries to place large entries on\n"
+	"        the diagonal.  Q = AMD (P2*A+(P2*A)'), Q not refined during\n"
+	"        numerical factorization, attempt to select pivots from the\n"
+	"        diagonal of P2*A.\n")) ;
+    }
+    else /* auto strategy */
+    {
+	strategy = UMFPACK_STRATEGY_AUTO ;
+	PRINTF ((" (auto)\n")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* initial allocation parameter */
+    /* ---------------------------------------------------------------------- */
+
+    alloc_init = GET_CONTROL (UMFPACK_ALLOC_INIT, UMFPACK_DEFAULT_ALLOC_INIT) ;
+    if (alloc_init >= 0)
+    {
+	PRINTF (("    "ID": initial allocation ratio: %g\n",
+	(Int) INDEX (UMFPACK_ALLOC_INIT), alloc_init)) ;
+    }
+    else
+    {
+	s = -alloc_init ;
+	s = MAX (1, s) ;
+	PRINTF (("    "ID": initial allocation (in Units): "ID"\n",
+	(Int) INDEX (UMFPACK_ALLOC_INIT), s)) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* maximum iterative refinement steps */
+    /* ---------------------------------------------------------------------- */
+
+    irstep = GET_CONTROL (UMFPACK_IRSTEP, UMFPACK_DEFAULT_IRSTEP) ;
+    irstep = MAX (0, irstep) ;
+    PRINTF (("    "ID": max iterative refinement steps: "ID"\n",
+	(Int) INDEX (UMFPACK_IRSTEP), irstep)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* 2-by-2 pivot tolerance */
+    /* ---------------------------------------------------------------------- */
+
+    tol = GET_CONTROL (UMFPACK_2BY2_TOLERANCE, UMFPACK_DEFAULT_2BY2_TOLERANCE) ;
+    tol = MAX (0.0, MIN (tol, 1.0)) ;
+    PRINTF (("    "ID": 2-by-2 pivot tolerance: %g\n",
+	(Int) INDEX (UMFPACK_2BY2_TOLERANCE), tol)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* force fixQ */
+    /* ---------------------------------------------------------------------- */
+
+    force_fixQ = GET_CONTROL (UMFPACK_FIXQ, UMFPACK_DEFAULT_FIXQ) ;
+    PRINTF (("    "ID": Q fixed during numerical factorization: %g ",
+	(Int) INDEX (UMFPACK_FIXQ), force_fixQ)) ;
+    if (force_fixQ > 0)
+    {
+	PRINTF (("(yes)\n")) ;
+    }
+    else if (force_fixQ < 0)
+    {
+	PRINTF (("(no)\n")) ;
+    }
+    else
+    {
+	PRINTF (("(auto)\n")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* AMD parameters */
+    /* ---------------------------------------------------------------------- */
+
+    amd_alpha = GET_CONTROL (UMFPACK_AMD_DENSE, UMFPACK_DEFAULT_AMD_DENSE) ;
+    PRINTF (("    "ID": AMD dense row/col parameter:    %g\n",
+	(Int) INDEX (UMFPACK_AMD_DENSE), amd_alpha)) ;
+    if (amd_alpha < 0)
+    {
+	PRINTF (("       no \"dense\" rows/columns\n")) ;
+    }
+    else
+    {
+	PRINTF (("       \"dense\" rows/columns have > max (16, (%g)*sqrt(n))"
+	    " entries\n", amd_alpha)) ;
+    }
+    PRINTF (("        Only used if the AMD ordering is used.\n")) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* pivot tolerance for symmetric pivoting */
+    /* ---------------------------------------------------------------------- */
+
+    relpt2 = GET_CONTROL (UMFPACK_SYM_PIVOT_TOLERANCE,
+	UMFPACK_DEFAULT_SYM_PIVOT_TOLERANCE) ;
+    relpt2 = MAX (0.0, MIN (relpt2, 1.0)) ;
+    PRINTF (("    "ID": diagonal pivot tolerance: %g\n"
+	"        Only used if diagonal pivoting is attempted.\n",
+	(Int) INDEX (UMFPACK_SYM_PIVOT_TOLERANCE), relpt2)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* scaling */
+    /* ---------------------------------------------------------------------- */
+
+    scale = GET_CONTROL (UMFPACK_SCALE, UMFPACK_DEFAULT_SCALE) ;
+    if (scale != UMFPACK_SCALE_NONE && scale != UMFPACK_SCALE_MAX)
+    {
+	scale = UMFPACK_DEFAULT_SCALE ;
+    }
+    PRINTF (("    "ID": scaling: "ID, (Int) INDEX (UMFPACK_SCALE), scale)) ;
+    if (scale == UMFPACK_SCALE_NONE)
+    {
+	PRINTF ((" (no)")) ;
+    }
+    else if (scale == UMFPACK_SCALE_SUM)
+    {
+	PRINTF ((" (divide each row by sum of abs. values in each row)")) ;
+    }
+    else if (scale == UMFPACK_SCALE_MAX)
+    {
+	PRINTF ((" (divide each row by max. abs. value in each row)")) ;
+    }
+    PRINTF (("\n")) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* frontal matrix allocation parameter */
+    /* ---------------------------------------------------------------------- */
+
+    front_alloc_init = GET_CONTROL (UMFPACK_FRONT_ALLOC_INIT,
+	UMFPACK_DEFAULT_FRONT_ALLOC_INIT) ;
+    front_alloc_init = MIN (1.0, front_alloc_init) ;
+    if (front_alloc_init >= 0)
+    {
+	PRINTF (("    "ID": frontal matrix allocation ratio: %g\n",
+	(Int) INDEX (UMFPACK_FRONT_ALLOC_INIT), front_alloc_init)) ;
+    }
+    else
+    {
+	s = -front_alloc_init ;
+	s = MAX (1, s) ;
+	PRINTF (("    "ID": initial frontal matrix size (# of Entry's): "ID"\n",
+	(Int) INDEX (UMFPACK_FRONT_ALLOC_INIT), s)) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* drop tolerance */
+    /* ---------------------------------------------------------------------- */
+
+    droptol = GET_CONTROL (UMFPACK_DROPTOL, UMFPACK_DEFAULT_DROPTOL) ;
+    PRINTF (("    "ID": drop tolerance: %g\n",
+	(Int) INDEX (UMFPACK_DROPTOL), droptol)) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* aggressive absorption */
+    /* ---------------------------------------------------------------------- */
+
+    aggr = GET_CONTROL (UMFPACK_AGGRESSIVE, UMFPACK_DEFAULT_AGGRESSIVE) ;
+    PRINTF (("    "ID": AMD and COLAMD aggressive absorption: %g",
+	(Int) INDEX (UMFPACK_AGGRESSIVE), aggr)) ;
+    if (aggr != 0.0)
+    {
+	PRINTF ((" (yes)\n")) ;
+    }
+    else
+    {
+	PRINTF ((" (no)\n")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* compile-time options */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF ((
+	"\n    The following options can only be changed at compile-time:\n")) ;
+
+    PRINTF (("    "ID": BLAS library used:  ",
+	(Int) INDEX (UMFPACK_COMPILED_WITH_BLAS))) ;
+
+#if defined (USE_NO_BLAS)
+    PRINTF (("none.  UMFPACK will be slow.\n")) ;
+#elif defined (USE_C_BLAS)
+    PRINTF (("C-BLAS.\n")) ;
+#elif defined (USE_MATLAB_BLAS)
+    PRINTF (("built-in MATLAB BLAS (ATLAS).\n")) ;
+#elif defined (USE_SUNPERF_BLAS)
+    PRINTF (("Sun Performance Library BLAS.\n")) ;
+#elif defined (USE_SCSL_BLAS)
+    PRINTF (("SGI SCSL BLAS.\n")) ;
+#elif defined (USE_FORTRAN_BLAS)
+    PRINTF (("Fortran BLAS.\n")) ;
+#endif
+
+#ifdef MATLAB_MEX_FILE
+#ifdef NUTIL
+    PRINTF (("    "ID": compiled for MATLAB"
+    " (uses mxMalloc, mxFree, mxRealloc, and mexPrintf)\n",
+	(Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ;
+#else
+    PRINTF (("    "ID": compiled for MATLAB"
+    " (uses utMalloc, utFree, utRealloc, and mexPrintf)\n",
+	(Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ;
+#endif
+#else
+#ifdef MATHWORKS
+    PRINTF (("    "ID": compiled for MATLAB, using internal utility routines\n"
+    "    (uses utMalloc, utFree, utRealloc, and utPrintf)\n",
+	(Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ;
+    PRINTF (("    (complex version uses utDivideComplex, utFdlibm_hypot)\n")) ;
+#else
+    PRINTF (("    "ID": compiled for ANSI C"
+    " (uses malloc, free, realloc, and printf)\n",
+	(Int) INDEX (UMFPACK_COMPILED_FOR_MATLAB))) ;
+#endif
+#endif
+
+#ifdef NO_TIMER
+    PRINTF (("    "ID": no CPU timer \n",
+	(Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ;
+#else
+#ifndef NPOSIX
+    PRINTF (("    "ID": CPU timer is POSIX times ( ) routine.\n",
+	(Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ;
+#else
+#ifdef GETRUSAGE
+    PRINTF (("    "ID": CPU timer is getrusage.\n",
+	(Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ;
+#else
+    PRINTF (("    "ID": CPU timer is ANSI C clock (may wrap around).\n",
+	(Int) INDEX (UMFPACK_COMPILED_WITH_GETRUSAGE))) ;
+#endif
+#endif
+#endif
+
+#ifndef NDEBUG
+    PRINTF ((
+"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n"
+"    "ID": compiled with debugging enabled. ",
+	(Int) INDEX (UMFPACK_COMPILED_IN_DEBUG_MODE))) ;
+#ifdef MATLAB_MEX_FILE
+    PRINTF (("Uses mxAssert.\n")) ;
+#else
+#ifdef MATHWORKS
+    PRINTF (("Uses utAssert.\n")) ;
+#else
+    PRINTF (("Uses ANSI C assert.\n")) ;
+#endif
+#endif
+#else
+    PRINTF (("    "ID": compiled for normal operation (debugging disabled)\n",
+	(Int) INDEX (UMFPACK_COMPILED_IN_DEBUG_MODE))) ;
+#endif
+
+    PRINTF (("    computer/operating system: %s\n", UMFPACK_ARCHITECTURE)) ;
+    PRINTF (("    size of int: %g long: %g Int: %g pointer: %g"
+	" double: %g Entry: %g (in bytes)\n\n", (double) sizeof (int),
+	(double) sizeof (long), (double) sizeof (Int),
+	(double) sizeof (void *), (double) sizeof (double),
+	(double) sizeof (Entry))) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_info.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,615 @@
+/* ========================================================================== */
+/* === UMFPACK_report_info ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints the Info array.  See umfpack_report_info.h for
+    details.
+*/
+
+#include "umf_internal.h"
+
+#define PRINT_INFO(format,x) \
+{ \
+    if (SCALAR_IS_NAN (x) || (!SCALAR_IS_LTZERO (x))) \
+    { \
+	PRINTF ((format, x)) ; \
+    } \
+}
+
+/* RATIO macro uses a double relop, but ignore NaN case: */
+#define RATIO(a,b,c) (((b) == 0) ? (c) : (((double) a)/((double) b)))
+
+/* ========================================================================== */
+/* === print_ratio ========================================================== */
+/* ========================================================================== */
+
+PRIVATE void print_ratio
+(
+    char *what,
+    char *format,
+    double estimate,
+    double actual
+)
+{
+    if (estimate < 0 && actual < 0)	/* double relop, but ignore Nan case */
+    {
+	return ;
+    }
+    PRINTF (("    %-27s", what)) ;
+    if (estimate >= 0)			/* double relop, but ignore Nan case */
+    {
+	PRINTF ((format, estimate)) ;
+    }
+    else
+    {
+	PRINTF (("                    -")) ;
+    }
+    if (actual >= 0)			/* double relop, but ignore Nan case */
+    {
+	PRINTF ((format, actual)) ;
+    }
+    else
+    {
+	PRINTF (("                    -")) ;
+    }
+    if (estimate >= 0 && actual >= 0)	/* double relop, but ignore Nan case */
+    {
+	PRINTF ((" %5.0f%%\n", 100 * RATIO (actual, estimate, 1))) ;
+    }
+    else
+    {
+	PRINTF (("      -\n")) ;
+    }
+}
+
+/* ========================================================================== */
+/* === UMFPACK_report_info ================================================== */
+/* ========================================================================== */
+
+GLOBAL void UMFPACK_report_info
+(
+    const double Control [UMFPACK_CONTROL],
+    const double Info [UMFPACK_INFO]
+)
+{
+
+    double lnz_est, unz_est, lunz_est, lnz, unz, lunz, tsym, tnum, fnum, tsolve,
+	fsolve, ttot, ftot, twsym, twnum, twsolve, twtot, n2 ;
+    Int n_row, n_col, n_inner, prl, is_sym ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get control settings and status to determine what to print */
+    /* ---------------------------------------------------------------------- */
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (!Info || prl < 2)
+    {
+	/* no output generated if Info is (double *) NULL */
+	/* or if prl is less than 2 */
+	return ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* print umfpack version */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF (("\n%s, Info:\n", UMFPACK_VERSION)) ;
+
+#ifndef NDEBUG
+    PRINTF ((
+"**** Debugging enabled (UMFPACK will be exceedingly slow!) *****************\n"
+    )) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* print run-time options */
+    /* ---------------------------------------------------------------------- */
+
+#ifdef DINT
+    PRINTF (("    matrix entry defined as:          double\n")) ;
+    PRINTF (("    Int (generic integer) defined as: int\n")) ;
+#endif
+#ifdef DLONG
+    PRINTF (("    matrix entry defined as:          double\n")) ;
+    PRINTF (("    Int (generic integer) defined as: long\n")) ;
+#endif
+#ifdef ZINT
+    PRINTF (("    matrix entry defined as:          double complex\n")) ;
+    PRINTF (("    Int (generic integer) defined as: int\n")) ;
+#endif
+#ifdef ZLONG
+    PRINTF (("    matrix entry defined as:          double complex\n")) ;
+    PRINTF (("    Int (generic integer) defined as: long\n")) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* print compile-time options */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF (("    BLAS library used:                ")) ;
+
+#if defined (USE_NO_BLAS)
+    PRINTF (("none.  UMFPACK will be slow.\n")) ;
+#elif defined (USE_C_BLAS)
+    PRINTF (("C-BLAS.\n")) ;
+#elif defined (USE_MATLAB_BLAS)
+    PRINTF (("built-in MATLAB BLAS.\n")) ;
+#elif defined (USE_SUNPERF_BLAS)
+    PRINTF (("Sun Performance Library BLAS.\n")) ;
+#elif defined (USE_SCSL_BLAS)
+    PRINTF (("SGI SCSL BLAS.\n")) ;
+#elif defined (USE_FORTRAN_BLAS)
+    PRINTF (("Fortran BLAS.\n")) ;
+#endif
+
+    PRINTF (("    MATLAB:                           ")) ;
+#ifdef MATLAB_MEX_FILE
+    PRINTF (("yes.\n")) ;
+#else
+#ifdef MATHWORKS
+    PRINTF (("yes (using internal ut* routines).\n")) ;
+#else
+    PRINTF (("no.\n")) ;
+#endif
+#endif
+
+    PRINTF (("    CPU timer:                        ")) ;
+#ifdef NO_TIMER
+    PRINTF (("none.\n")) ;
+#else
+#ifndef NPOSIX
+    PRINTF (("POSIX times ( ) routine.\n")) ;
+#else
+#ifdef GETRUSAGE
+    PRINTF (("getrusage ( ) routine.\n")) ;
+#else
+    PRINTF (("ANSI clock ( ) routine.\n")) ;
+#endif
+#endif
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* print n and nz */
+    /* ---------------------------------------------------------------------- */
+
+    n_row = (Int) Info [UMFPACK_NROW] ;
+    n_col = (Int) Info [UMFPACK_NCOL] ;
+    n_inner = MIN (n_row, n_col) ;
+
+    PRINT_INFO ("    number of rows in matrix A:       "ID"\n", n_row) ;
+    PRINT_INFO ("    number of columns in matrix A:    "ID"\n", n_col) ;
+    PRINT_INFO ("    entries in matrix A:              "ID"\n",
+	(Int) Info [UMFPACK_NZ]) ;
+    PRINT_INFO ("    memory usage reported in:         "ID"-byte Units\n",
+	(Int) Info [UMFPACK_SIZE_OF_UNIT]) ;
+
+    PRINT_INFO ("    size of int:                      "ID" bytes\n",
+	(Int) Info [UMFPACK_SIZE_OF_INT]) ;
+    PRINT_INFO ("    size of long:                     "ID" bytes\n",
+	(Int) Info [UMFPACK_SIZE_OF_LONG]) ;
+    PRINT_INFO ("    size of pointer:                  "ID" bytes\n",
+	(Int) Info [UMFPACK_SIZE_OF_POINTER]) ;
+    PRINT_INFO ("    size of numerical entry:          "ID" bytes\n",
+	(Int) Info [UMFPACK_SIZE_OF_ENTRY]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic parameters */
+    /* ---------------------------------------------------------------------- */
+
+    if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_SYMMETRIC)
+    {
+	PRINTF (("\n    strategy used:                    symmetric\n")) ;
+    }
+    else if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_UNSYMMETRIC)
+    {
+	PRINTF (("\n    strategy used:                    unsymmetric\n")) ;
+    }
+    else if (Info [UMFPACK_STRATEGY_USED] == UMFPACK_STRATEGY_2BY2)
+    {
+	PRINTF (("\n    strategy used:                    symmetric 2-by-2\n"));
+    }
+
+    if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_AMD)
+    {
+	PRINTF (("    ordering used:                    amd on A+A'\n")) ;
+    }
+    else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_COLAMD)
+    {
+	PRINTF (("    ordering used:                    colamd on A\n")) ;
+    }
+    else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_GIVEN)
+    {
+	PRINTF (("    ordering used:                    provided by user\n")) ;
+    }
+
+    if (Info [UMFPACK_QFIXED] == 1)
+    {
+	PRINTF (("    modify Q during factorization:    no\n")) ;
+    }
+    else if (Info [UMFPACK_QFIXED] == 0)
+    {
+	PRINTF (("    modify Q during factorization:    yes\n")) ;
+    }
+
+    if (Info [UMFPACK_DIAG_PREFERRED] == 0)
+    {
+	PRINTF (("    prefer diagonal pivoting:         no\n")) ;
+    }
+    else if (Info [UMFPACK_DIAG_PREFERRED] == 1)
+    {
+	PRINTF (("    prefer diagonal pivoting:         yes\n")) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* singleton statistics */
+    /* ---------------------------------------------------------------------- */
+
+    PRINT_INFO ("    pivots with zero Markowitz cost:               %0.f\n",
+	Info [UMFPACK_COL_SINGLETONS] + Info [UMFPACK_ROW_SINGLETONS]) ;
+    PRINT_INFO ("    submatrix S after removing zero-cost pivots:\n"
+		"        number of \"dense\" rows:                    %.0f\n",
+	Info [UMFPACK_NDENSE_ROW]) ;
+    PRINT_INFO ("        number of \"dense\" columns:                 %.0f\n",
+	Info [UMFPACK_NDENSE_COL]) ;
+    PRINT_INFO ("        number of empty rows:                      %.0f\n",
+	Info [UMFPACK_NEMPTY_ROW]) ;
+    PRINT_INFO ("        number of empty columns                    %.0f\n",
+	Info [UMFPACK_NEMPTY_COL]) ;
+    is_sym = Info [UMFPACK_S_SYMMETRIC] ;
+    if (is_sym > 0)
+    {
+	PRINTF (("        submatrix S square and diagonal preserved\n")) ;
+    }
+    else if (is_sym == 0)
+    {
+	PRINTF (("        submatrix S not square or diagonal not preserved\n"));
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* statistics from amd_aat */
+    /* ---------------------------------------------------------------------- */
+
+    n2 = Info [UMFPACK_N2] ;
+    if (n2 >= 0)
+    {
+	PRINTF (("    pattern of square submatrix S:\n")) ;
+    }
+    PRINT_INFO ("        number rows and columns                    %.0f\n",
+	n2) ;
+    PRINT_INFO ("        symmetry of nonzero pattern:               %.6f\n",
+	Info [UMFPACK_PATTERN_SYMMETRY]) ;
+    PRINT_INFO ("        nz in S+S' (excl. diagonal):               %.0f\n",
+	Info [UMFPACK_NZ_A_PLUS_AT]) ;
+    PRINT_INFO ("        nz on diagonal of matrix S:                %.0f\n",
+	Info [UMFPACK_NZDIAG]) ;
+    if (Info [UMFPACK_NZDIAG] >= 0 && n2 > 0)
+    {
+	PRINTF (("        fraction of nz on diagonal:                %.6f\n",
+	Info [UMFPACK_NZDIAG] / n2)) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* statistics from 2-by-2 permutation */
+    /* ---------------------------------------------------------------------- */
+
+    PRINT_INFO ("    2-by-2 pivoting to place large entries on diagonal:\n"
+		"        # of small diagonal entries of S:          %.0f\n",
+	Info [UMFPACK_2BY2_NWEAK]) ;
+    PRINT_INFO ("        # unmatched:                               %.0f\n",
+	Info [UMFPACK_2BY2_UNMATCHED]) ;
+    PRINT_INFO ("        symmetry of P2*S:                          %.6f\n",
+	Info [UMFPACK_2BY2_PATTERN_SYMMETRY]) ;
+    PRINT_INFO ("        nz in P2*S+(P2*S)' (excl. diag.):          %.0f\n",
+	Info [UMFPACK_2BY2_NZ_PA_PLUS_PAT]) ;
+    PRINT_INFO ("        nz on diagonal of P2*S:                    %.0f\n",
+	Info [UMFPACK_2BY2_NZDIAG]) ;
+    if (Info [UMFPACK_2BY2_NZDIAG] >= 0 && n2 > 0)
+    {
+	PRINTF (("        fraction of nz on diag of P2*S:            %.6f\n",
+	Info [UMFPACK_2BY2_NZDIAG] / n2)) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* statistics from AMD */
+    /* ---------------------------------------------------------------------- */
+
+    if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_AMD)
+    {
+	double dmax = Info [UMFPACK_SYMMETRIC_DMAX] ;
+	PRINTF (("    AMD statistics, for strict diagonal pivoting:\n")) ;
+	PRINT_INFO ("        est. flops for LU factorization:           %.5e\n",
+	    Info [UMFPACK_SYMMETRIC_FLOPS]) ;
+	PRINT_INFO ("        est. nz in L+U (incl. diagonal):           %.0f\n",
+	    Info [UMFPACK_SYMMETRIC_LUNZ]) ;
+	PRINT_INFO ("        est. largest front (# entries):            %.0f\n",
+	    dmax*dmax) ;
+	PRINT_INFO ("        est. max nz in any column of L:            %.0f\n",
+	    dmax) ;
+	PRINT_INFO (
+	    "        number of \"dense\" rows/columns in S+S':    %.0f\n",
+	    Info [UMFPACK_SYMMETRIC_NDENSE]) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* symbolic factorization */
+    /* ---------------------------------------------------------------------- */
+
+    tsym = Info [UMFPACK_SYMBOLIC_TIME] ;
+    twsym = Info [UMFPACK_SYMBOLIC_WALLTIME] ;
+
+    PRINT_INFO ("    symbolic factorization defragmentations:       %.0f\n",
+	Info [UMFPACK_SYMBOLIC_DEFRAG]) ;
+    PRINT_INFO ("    symbolic memory usage (Units):                 %.0f\n",
+	Info [UMFPACK_SYMBOLIC_PEAK_MEMORY]) ;
+    PRINT_INFO ("    symbolic memory usage (MBytes):                %.1f\n",
+	MBYTES (Info [UMFPACK_SYMBOLIC_PEAK_MEMORY])) ;
+    PRINT_INFO ("    Symbolic size (Units):                         %.0f\n",
+	Info [UMFPACK_SYMBOLIC_SIZE]) ;
+    PRINT_INFO ("    Symbolic size (MBytes):                        %.0f\n",
+	MBYTES (Info [UMFPACK_SYMBOLIC_SIZE])) ;
+    PRINT_INFO ("    symbolic factorization CPU time (sec):         %.2f\n",
+	tsym) ;
+    PRINT_INFO ("    symbolic factorization wallclock time(sec):    %.2f\n",
+	twsym) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* scaling, from numerical factorization */
+    /* ---------------------------------------------------------------------- */
+
+    if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_NONE)
+    {
+	PRINTF (("\n    matrix scaled: no\n")) ;
+    }
+    else if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_SUM)
+    {
+	PRINTF (("\n    matrix scaled: yes ")) ;
+	PRINTF (("(divided each row by sum of abs values in each row)\n")) ;
+	PRINTF (("    minimum sum (abs (rows of A)):              %.5e\n",
+	    Info [UMFPACK_RSMIN])) ;
+	PRINTF (("    maximum sum (abs (rows of A)):              %.5e\n",
+	    Info [UMFPACK_RSMAX])) ;
+    }
+    else if (Info [UMFPACK_WAS_SCALED] == UMFPACK_SCALE_MAX)
+    {
+	PRINTF (("\n    matrix scaled: yes ")) ;
+	PRINTF (("(divided each row by max abs value in each row)\n")) ;
+	PRINTF (("    minimum max (abs (rows of A)):              %.5e\n",
+	    Info [UMFPACK_RSMIN])) ;
+	PRINTF (("    maximum max (abs (rows of A)):              %.5e\n",
+	    Info [UMFPACK_RSMAX])) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* estimate/actual in symbolic/numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    /* double relop, but ignore NaN case: */
+    if (Info [UMFPACK_SYMBOLIC_DEFRAG] >= 0	/* UMFPACK_*symbolic called */
+    ||  Info [UMFPACK_NUMERIC_DEFRAG] >= 0)	/* UMFPACK_numeric called */
+    {
+	PRINTF (("\n    symbolic/numeric factorization:      upper bound")) ;
+	PRINTF (("               actual      %%\n")) ;
+	PRINTF (("    variable-sized part of Numeric object:\n")) ;
+    }
+    print_ratio ("    initial size (Units)", " %20.0f",
+	Info [UMFPACK_VARIABLE_INIT_ESTIMATE], Info [UMFPACK_VARIABLE_INIT]) ;
+    print_ratio ("    peak size (Units)", " %20.0f",
+	Info [UMFPACK_VARIABLE_PEAK_ESTIMATE], Info [UMFPACK_VARIABLE_PEAK]) ;
+    print_ratio ("    final size (Units)", " %20.0f",
+	Info [UMFPACK_VARIABLE_FINAL_ESTIMATE], Info [UMFPACK_VARIABLE_FINAL]) ;
+    print_ratio ("Numeric final size (Units)", " %20.0f",
+	Info [UMFPACK_NUMERIC_SIZE_ESTIMATE], Info [UMFPACK_NUMERIC_SIZE]) ;
+    print_ratio ("Numeric final size (MBytes)", " %20.1f",
+	MBYTES (Info [UMFPACK_NUMERIC_SIZE_ESTIMATE]),
+	MBYTES (Info [UMFPACK_NUMERIC_SIZE])) ;
+    print_ratio ("peak memory usage (Units)", " %20.0f",
+	Info [UMFPACK_PEAK_MEMORY_ESTIMATE], Info [UMFPACK_PEAK_MEMORY]) ;
+    print_ratio ("peak memory usage (MBytes)", " %20.1f",
+	MBYTES (Info [UMFPACK_PEAK_MEMORY_ESTIMATE]),
+	MBYTES (Info [UMFPACK_PEAK_MEMORY])) ;
+    print_ratio ("numeric factorization flops", " %20.5e",
+	Info [UMFPACK_FLOPS_ESTIMATE], Info [UMFPACK_FLOPS]) ;
+
+    lnz_est = Info [UMFPACK_LNZ_ESTIMATE] ;
+    unz_est = Info [UMFPACK_UNZ_ESTIMATE] ;
+    if (lnz_est >= 0 && unz_est >= 0)	/* double relop, but ignore NaN case */
+    {
+	lunz_est = lnz_est + unz_est - n_inner ;
+    }
+    else
+    {
+	lunz_est = EMPTY ;
+    }
+    lnz = Info [UMFPACK_LNZ] ;
+    unz = Info [UMFPACK_UNZ] ;
+    if (lnz >= 0 && unz >= 0)		/* double relop, but ignore NaN case */
+    {
+	lunz = lnz + unz - n_inner ;
+    }
+    else
+    {
+	lunz = EMPTY ;
+    }
+    print_ratio ("nz in L (incl diagonal)", " %20.0f", lnz_est, lnz) ;
+    print_ratio ("nz in U (incl diagonal)", " %20.0f", unz_est, unz) ;
+    print_ratio ("nz in L+U (incl diagonal)", " %20.0f", lunz_est, lunz) ;
+
+    print_ratio ("largest front (# entries)", " %20.0f",
+	Info [UMFPACK_MAX_FRONT_SIZE_ESTIMATE], Info [UMFPACK_MAX_FRONT_SIZE]) ;
+    print_ratio ("largest # rows in front", " %20.0f",
+	Info [UMFPACK_MAX_FRONT_NROWS_ESTIMATE],
+	Info [UMFPACK_MAX_FRONT_NROWS]) ;
+    print_ratio ("largest # columns in front", " %20.0f",
+	Info [UMFPACK_MAX_FRONT_NCOLS_ESTIMATE],
+	Info [UMFPACK_MAX_FRONT_NCOLS]) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* numeric factorization */
+    /* ---------------------------------------------------------------------- */
+
+    tnum = Info [UMFPACK_NUMERIC_TIME] ;
+    twnum = Info [UMFPACK_NUMERIC_WALLTIME] ;
+    fnum = Info [UMFPACK_FLOPS] ;
+
+    PRINT_INFO ("\n    initial allocation ratio used:                 %0.3g\n",
+	Info [UMFPACK_ALLOC_INIT_USED]) ;
+    PRINT_INFO ("    # of forced updates due to frontal growth:     %.0f\n",
+	Info [UMFPACK_FORCED_UPDATES]) ;
+    PRINT_INFO ("    number of off-diagonal pivots:                 %.0f\n",
+	Info [UMFPACK_NOFF_DIAG]) ;
+    PRINT_INFO ("    nz in L (incl diagonal), if none dropped       %.0f\n",
+	Info [UMFPACK_ALL_LNZ]) ;
+    PRINT_INFO ("    nz in U (incl diagonal), if none dropped       %.0f\n",
+	Info [UMFPACK_ALL_UNZ]) ;
+    PRINT_INFO ("    number of small entries dropped                %.0f\n",
+	Info [UMFPACK_NZDROPPED]) ;
+    PRINT_INFO ("    nonzeros on diagonal of U:                     %.0f\n",
+	Info [UMFPACK_UDIAG_NZ]) ;
+    PRINT_INFO ("    min abs. value on diagonal of U:               %.2e\n",
+	Info [UMFPACK_UMIN]) ;
+    PRINT_INFO ("    max abs. value on diagonal of U:               %.2e\n",
+	Info [UMFPACK_UMAX]) ;
+    PRINT_INFO ("    estimate of reciprocal of condition number:    %.2e\n",
+	Info [UMFPACK_RCOND]) ;
+    PRINT_INFO ("    indices in compressed pattern:                 %.0f\n",
+	Info [UMFPACK_COMPRESSED_PATTERN]) ;
+    PRINT_INFO ("    numerical values stored in Numeric object:     %.0f\n",
+	Info [UMFPACK_LU_ENTRIES]) ;
+    PRINT_INFO ("    numeric factorization defragmentations:        %.0f\n",
+	Info [UMFPACK_NUMERIC_DEFRAG]) ;
+    PRINT_INFO ("    numeric factorization reallocations:           %.0f\n",
+	Info [UMFPACK_NUMERIC_REALLOC]) ;
+    PRINT_INFO ("    costly numeric factorization reallocations:    %.0f\n",
+	Info [UMFPACK_NUMERIC_COSTLY_REALLOC]) ;
+    PRINT_INFO ("    numeric factorization CPU time (sec):          %.2f\n",
+	tnum) ;
+    PRINT_INFO ("    numeric factorization wallclock time (sec):    %.2f\n",
+	twnum) ;
+
+    if (tnum > 0 && fnum > 0)
+    {
+	PRINT_INFO (
+	   "    numeric factorization mflops (CPU time):       %.2f\n",
+	   1e-6 * fnum / tnum) ;
+    }
+    if (twnum > 0 && fnum > 0)
+    {
+	PRINT_INFO (
+	   "    numeric factorization mflops (wallclock):      %.2f\n",
+	   1e-6 * fnum / twnum) ;
+    }
+
+    ttot = EMPTY ;
+    ftot = fnum ;
+    if (tsym >= 0 && tnum >= 0)
+    {
+	ttot = tsym + tnum ;
+	PRINT_INFO ("    symbolic + numeric CPU time (sec):             %.2f\n",
+	    ttot) ;
+	if (ftot > 0 && ttot > 0)
+	{
+	    PRINT_INFO (
+		"    symbolic + numeric mflops (CPU time):          %.2f\n",
+		1e-6 * ftot / ttot) ;
+	}
+    }
+
+    twtot = EMPTY ;
+    if (twsym >= 0 && twnum >= 0)
+    {
+	twtot = twsym + twnum ;
+	PRINT_INFO ("    symbolic + numeric wall clock time (sec):      %.2f\n",
+	    twtot) ;
+	if (ftot > 0 && twtot > 0)
+	{
+	    PRINT_INFO (
+		"    symbolic + numeric mflops (wall clock):        %.2f\n",
+		1e-6 * ftot / twtot) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* solve */
+    /* ---------------------------------------------------------------------- */
+
+    tsolve = Info [UMFPACK_SOLVE_TIME] ;
+    twsolve = Info [UMFPACK_SOLVE_WALLTIME] ;
+    fsolve = Info [UMFPACK_SOLVE_FLOPS] ;
+
+    PRINT_INFO ("\n    solve flops:                                   %.5e\n",
+	fsolve) ;
+    PRINT_INFO ("    iterative refinement steps taken:              %.0f\n",
+	Info [UMFPACK_IR_TAKEN]) ;
+    PRINT_INFO ("    iterative refinement steps attempted:          %.0f\n",
+	Info [UMFPACK_IR_ATTEMPTED]) ;
+    PRINT_INFO ("    sparse backward error omega1:                  %.2e\n",
+	Info [UMFPACK_OMEGA1]) ;
+    PRINT_INFO ("    sparse backward error omega2:                  %.2e\n",
+	Info [UMFPACK_OMEGA2]) ;
+    PRINT_INFO ("    solve CPU time (sec):                          %.2f\n",
+	tsolve) ;
+    PRINT_INFO ("    solve wall clock time (sec):                   %.2f\n",
+	twsolve) ;
+    if (fsolve > 0 && tsolve > 0)
+    {
+	PRINT_INFO (
+	    "    solve mflops (CPU time):                       %.2f\n",
+	    1e-6 * fsolve / tsolve) ;
+    }
+    if (fsolve > 0 && twsolve > 0)
+    {
+	PRINT_INFO (
+	    "    solve mflops (wall clock time):                %.2f\n",
+	    1e-6 * fsolve / twsolve) ;
+    }
+
+    if (ftot >= 0 && fsolve >= 0)
+    {
+	ftot += fsolve ;
+	PRINT_INFO (
+	"\n    total symbolic + numeric + solve flops:        %.5e\n", ftot) ;
+    }
+
+    if (tsolve >= 0)
+    {
+	if (ttot >= 0 && ftot >= 0)
+	{
+	    ttot += tsolve ;
+	    PRINT_INFO (
+		"    total symbolic + numeric + solve CPU time:     %.2f\n",
+		ttot) ;
+	    if (ftot > 0 && ttot > 0)
+	    {
+		PRINT_INFO (
+		"    total symbolic + numeric + solve mflops (CPU): %.2f\n",
+		1e-6 * ftot / ttot) ;
+	    }
+	}
+    }
+
+    if (twsolve >= 0)
+    {
+	if (twtot >= 0 && ftot >= 0)
+	{
+	    twtot += tsolve ;
+	    PRINT_INFO (
+		"    total symbolic+numeric+solve wall clock time:  %.2f\n",
+		twtot) ;
+	    if (ftot > 0 && twtot > 0)
+	    {
+		PRINT_INFO (
+		"    total symbolic+numeric+solve mflops(wallclock) %.2f\n",
+		1e-6 * ftot / twtot) ;
+	    }
+	}
+    }
+    PRINTF (("\n")) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_matrix.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,201 @@
+/* ========================================================================== */
+/* === UMFPACK_report_matrix ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints a column or row-oriented matrix.  See
+    umfpack_report_matrix.h for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL Int UMFPACK_report_matrix
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    Int col_form,		/* 1: column form, 0: row form */
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Entry a ;
+    Int prl, i, k, length, ilast, p, nz, prl1, p1, p2, n, n_i, do_values ;
+    char *vector, *index ;
+#ifdef COMPLEX
+    Int split = SPLIT (Az) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* determine the form, and check if inputs exist */
+    /* ---------------------------------------------------------------------- */
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    if (col_form)
+    {
+	vector = "column" ;	/* column vectors */
+	index = "row" ;		/* with row indices */
+	n = n_col ;
+	n_i = n_row ;
+    }
+    else
+    {
+	vector = "row" ;	/* row vectors */
+	index = "column" ;	/* with column indices */
+	n = n_row ;
+	n_i = n_col ;
+    }
+
+    PRINTF (("%s-form matrix, n_row "ID" n_col "ID", ", vector, n_row, n_col)) ;
+
+    if (n_row <= 0 || n_col <= 0)
+    {
+	PRINTF (("ERROR: n_row <= 0 or n_col <= 0\n\n")) ;
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+
+    if (!Ap)
+    {
+	PRINTF (("ERROR: Ap missing\n\n")) ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    nz = Ap [n] ;
+    PRINTF (("nz = "ID". ", nz)) ;
+    if (nz < 0)
+    {
+	PRINTF (("ERROR: number of entries < 0\n\n")) ;
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    if (Ap [0] != 0)
+    {
+	PRINTF (("ERROR: Ap ["ID"] = "ID" must be "ID"\n\n",
+	    (Int) INDEX (0), INDEX (Ap [0]), (Int) INDEX (0))) ;
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    if (!Ai)
+    {
+	PRINTF (("ERROR: Ai missing\n\n")) ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    do_values = Ax != (double *) NULL ;
+
+    PRINTF4 (("\n")) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* check the row/column pointers, Ap */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n ; k++)
+    {
+	if (Ap [k] < 0)
+	{
+	    PRINTF (("ERROR: Ap ["ID"] < 0\n\n", INDEX (k))) ;
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+	if (Ap [k] > nz)
+	{
+	    PRINTF (("ERROR: Ap ["ID"] > size of Ai\n\n", INDEX (k))) ;
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+    }
+
+    for (k = 0 ; k < n ; k++)
+    {
+	length = Ap [k+1] - Ap [k] ;
+	if (length < 0)
+	{
+	    PRINTF (("ERROR: # entries in %s "ID" is < 0\n\n",
+		vector, INDEX (k))) ;
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* print each vector */
+    /* ---------------------------------------------------------------------- */
+
+    prl1 = prl ;
+
+    for (k = 0 ; k < n ; k++)
+    {
+	/* if prl is 4, print the first 10 entries of the first 10 vectors */
+	if (k < 10)
+	{
+	    prl = prl1 ;
+	}
+	/* get the vector pointers */
+	p1 = Ap [k] ;
+	p2 = Ap [k+1] ;
+	length = p2 - p1 ;
+	PRINTF4 (("\n    %s "ID": start: "ID" end: "ID" entries: "ID"\n",
+	    vector, INDEX (k), p1, p2-1, length)) ;
+	ilast = EMPTY ;
+	for (p = p1 ; p < p2 ; p++)
+	{
+	    i = Ai [p] ;
+	    PRINTF4 (("\t%s "ID" ", index, INDEX (i))) ;
+	    if (do_values && prl >= 4)
+	    {
+		PRINTF ((":")) ;
+		ASSIGN (a, Ax, Az, p, split) ;
+		PRINT_ENTRY (a) ;
+	    }
+	    if (i < 0 || i >= n_i)
+	    {
+		PRINTF ((" ERROR: %s index "ID" out of range in %s "ID"\n\n",
+		    index, INDEX (i), vector, INDEX (k))) ;
+		return (UMFPACK_ERROR_invalid_matrix) ;
+	    }
+	    if (i <= ilast)
+	    {
+		PRINTF ((" ERROR: %s index "ID" out of order (or duplicate) in "
+		    "%s "ID"\n\n", index, INDEX (i), vector, INDEX (k))) ;
+		return (UMFPACK_ERROR_invalid_matrix) ;
+	    }
+	    PRINTF4 (("\n")) ;
+	    /* truncate printout, but continue to check matrix */
+	    if (prl == 4 && (p - p1) == 9 && length > 10)
+	    {
+		PRINTF4 (("\t...\n")) ;
+		prl-- ;
+	    }
+	    ilast = i ;
+	}
+	/* truncate printout, but continue to check matrix */
+	if (prl == 4 && k == 9 && n > 10)
+	{
+	    PRINTF4 (("\n    ...\n")) ;
+	    prl-- ;
+	}
+    }
+    prl = prl1 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* return the status of the matrix */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF4 (("    %s-form matrix ", vector)) ;
+    PRINTF (("OK\n\n")) ;
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,663 @@
+/* ========================================================================== */
+/* === UMFPACK_report_numeric =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints the Numeric object.
+    See umfpack_report_numeric.h for details.
+
+    Dynamic memory usage:  Allocates a size n*sizeof(Int) workspace via a single
+    call to UMF_malloc and then frees all of it via UMF_free on return.  The
+    workspace is not allocated if an early error return occurs before the
+    workspace is needed.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+#include "umf_report_perm.h"
+#include "umf_report_vector.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+
+PRIVATE Int report_L
+(
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int prl
+) ;
+
+
+PRIVATE Int report_U
+(
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int prl
+) ;
+
+/* ========================================================================== */
+/* === UMFPACK_report_numeric =============================================== */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_report_numeric
+(
+    void *NumericHandle,
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Int prl, *W, nn, n_row, n_col, n_inner, num_fixed_size, numeric_size,
+	npiv ;
+    NumericType *Numeric ;
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    PRINTF (("Numeric object:  ")) ;
+
+    Numeric = (NumericType *) NumericHandle ;
+    if (!UMF_valid_numeric (Numeric))
+    {
+	PRINTF (("ERROR: LU factors invalid\n\n")) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    n_row = Numeric->n_row ;
+    n_col = Numeric->n_col ;
+    nn = MAX (n_row, n_col) ;
+    n_inner = MIN (n_row, n_col) ;
+    npiv = Numeric->npiv ;
+
+    DEBUG1 (("n_row "ID" n_col "ID" nn "ID" n_inner "ID" npiv "ID"\n",
+	n_row, n_col, nn, n_inner, npiv)) ;
+
+    /* size of Numeric object, except Numeric->Memory and Numeric->Upattern */
+    /* see also UMF_set_stats */
+    num_fixed_size =
+	UNITS (NumericType, 1)		/* Numeric structure */
+	+ UNITS (Entry, n_inner+1)	/* D */
+	+ UNITS (Int, n_row+1)		/* Rperm */
+	+ UNITS (Int, n_col+1)		/* Cperm */
+	+ 6 * UNITS (Int, npiv+1)	/* Lpos, Uilen, Uip, Upos, Lilen, Lip */
+	+ ((Numeric->scale != UMFPACK_SCALE_NONE) ?
+		UNITS (Entry, n_row) : 0) ; /* Rs */
+
+    DEBUG1 (("num fixed size: "ID"\n", num_fixed_size)) ;
+    DEBUG1 (("Numeric->size "ID"\n", Numeric->size)) ;
+    DEBUG1 (("ulen units "ID"\n", UNITS (Int, Numeric->ulen))) ;
+
+    /* size of Numeric->Memory is Numeric->size */
+    /* size of Numeric->Upattern is Numeric->ulen */
+    numeric_size = num_fixed_size + Numeric->size
+	+ UNITS (Int, Numeric->ulen) ;
+
+    DEBUG1 (("numeric total size "ID"\n", numeric_size)) ;
+
+    if (prl >= 4)
+    {
+	PRINTF (("\n    n_row: "ID"  n_col: "ID"\n", n_row, n_col)) ;
+
+	PRINTF (("    relative pivot tolerance used:              %g\n",
+	    Numeric->relpt)) ;
+	PRINTF (("    relative symmetric pivot tolerance used:    %g\n",
+	    Numeric->relpt2)) ;
+
+	PRINTF (("    matrix scaled: ")) ;
+	if (Numeric->scale == UMFPACK_SCALE_NONE)
+	{
+	    PRINTF (("no")) ;
+	}
+	else if (Numeric->scale == UMFPACK_SCALE_SUM)
+	{
+	    PRINTF (("yes (divided each row by sum abs value in each row)\n")) ;
+	    PRINTF (("    minimum sum (abs (rows of A)):              %.5e\n",
+		Numeric->rsmin)) ;
+	    PRINTF (("    maximum sum (abs (rows of A)):              %.5e",
+		Numeric->rsmax)) ;
+	}
+	else if (Numeric->scale == UMFPACK_SCALE_MAX)
+	{
+	    PRINTF (("yes (divided each row by max abs value in each row)\n")) ;
+	    PRINTF (("    minimum max (abs (rows of A)):              %.5e\n",
+		Numeric->rsmin)) ;
+	    PRINTF (("    maximum max (abs (rows of A)):              %.5e",
+		Numeric->rsmax)) ;
+	}
+	PRINTF (("\n")) ;
+
+	PRINTF (("    initial allocation parameter used:          %g\n",
+	    Numeric->alloc_init)) ;
+	PRINTF (("    frontal matrix allocation parameter used:   %g\n",
+	    Numeric->front_alloc_init)) ;
+	PRINTF (("    final total size of Numeric object (Units): "ID"\n",
+	    numeric_size)) ;
+	PRINTF (("    final total size of Numeric object (MBytes): %.1f\n",
+	    MBYTES (numeric_size))) ;
+	PRINTF (("    peak size of variable-size part (Units):    "ID"\n",
+	    Numeric->max_usage)) ;
+	PRINTF (("    peak size of variable-size part (MBytes):   %.1f\n",
+	    MBYTES (Numeric->max_usage))) ;
+	PRINTF (("    largest actual frontal matrix size:         "ID"\n",
+	    Numeric->maxfrsize)) ;
+	PRINTF (("    memory defragmentations:                    "ID"\n",
+	    Numeric->ngarbage)) ;
+	PRINTF (("    memory reallocations:                       "ID"\n",
+	    Numeric->nrealloc)) ;
+	PRINTF (("    costly memory reallocations:                "ID"\n",
+	    Numeric->ncostly)) ;
+	PRINTF (("    entries in compressed pattern (L and U):    "ID"\n",
+	    Numeric->isize)) ;
+	PRINTF (("    number of nonzeros in L (excl diag):        "ID"\n",
+	    Numeric->lnz)) ;
+	PRINTF (("    number of entries stored in L (excl diag):  "ID"\n",
+	    Numeric->nLentries)) ;
+	PRINTF (("    number of nonzeros in U (excl diag):        "ID"\n",
+	    Numeric->unz)) ;
+	PRINTF (("    number of entries stored in U (excl diag):  "ID"\n",
+	    Numeric->nUentries)) ;
+	PRINTF (("    factorization floating-point operations:    %g\n",
+	    Numeric->flops)) ;
+	PRINTF (("    number of nonzeros on diagonal of U:        "ID"\n",
+	    Numeric->nnzpiv)) ;
+	PRINTF (("    min abs. value on diagonal of U:            %.5e\n",
+	    Numeric->min_udiag)) ;
+	PRINTF (("    max abs. value on diagonal of U:            %.5e\n",
+	    Numeric->max_udiag)) ;
+	PRINTF (("    reciprocal condition number estimate:       %.2e\n",
+	    Numeric->rcond)) ;
+    }
+
+    W = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+    if (!W)
+    {
+	PRINTF ((" ERROR: out of memory to check Numeric object\n\n")) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    if (Numeric->Rs)
+    {
+#ifndef NRECIPROCAL
+	if (Numeric->do_recip)
+	{
+	    PRINTF4 (("\nScale factors applied via multiplication\n")) ;
+	}
+	else
+#endif
+	{
+	    PRINTF4 (("\nScale factors applied via division\n")) ;
+	}
+	PRINTF4 (("Scale factors, Rs: ")) ;
+	(void) UMF_report_vector (n_row, Numeric->Rs, (double *) NULL,
+	    prl, FALSE, TRUE) ;
+    }
+    else
+    {
+	PRINTF4 (("Scale factors, Rs: (not present)\n")) ;
+    }
+
+    PRINTF4 (("\nP: row ")) ;
+    if (UMF_report_perm (n_row, Numeric->Rperm, W, prl, 0) != UMFPACK_OK)
+    {
+	(void) UMF_free ((void *) W) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    PRINTF4 (("\nQ: column ")) ;
+    if (UMF_report_perm (n_col, Numeric->Cperm, W, prl, 0) != UMFPACK_OK)
+    {
+	(void) UMF_free ((void *) W) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    if (!report_L (Numeric, W, prl))
+    {
+	(void) UMF_free ((void *) W) ;
+	PRINTF ((" ERROR: L factor invalid\n\n")) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    if (!report_U (Numeric, W, prl))
+    {
+	(void) UMF_free ((void *) W) ;
+	PRINTF ((" ERROR: U factor invalid\n\n")) ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    /* The diagonal of U is in "merged" (Entry) form, not "split" form. */
+    PRINTF4 (("\ndiagonal of U: ")) ;
+    (void) UMF_report_vector (n_inner, (double *) Numeric->D, (double *) NULL,
+	prl, FALSE, FALSE) ;
+
+    (void) UMF_free ((void *) W) ;
+
+    PRINTF4 (("    Numeric object:  ")) ;
+    PRINTF (("OK\n\n")) ;
+    return (UMFPACK_OK) ;
+}
+
+
+/* ========================================================================== */
+/* === report_L ============================================================= */
+/* ========================================================================== */
+
+PRIVATE Int report_L
+(
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int prl
+)
+{
+    Int k, deg, *ip, j, row, n_row, *Lpos, *Lilen, valid, k1,
+	*Lip, newLchain, llen, prl1, pos, lp, p, npiv, n1, *Li ;
+    Entry *xp, *Lval ;
+
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (prl >= 3) ;
+
+    n_row = Numeric->n_row ;
+    npiv = Numeric->npiv ;
+    n1 = Numeric->n1 ;
+    Lpos = Numeric->Lpos ;
+    Lilen = Numeric->Lilen ;
+    Lip = Numeric->Lip ;
+    prl1 = prl ;
+    deg = 0 ;
+
+    PRINTF4 ((
+    "\nL in Numeric object, in column-oriented compressed-pattern form:\n"
+    "    Diagonal entries are all equal to 1.0 (not stored)\n")) ;
+
+    ASSERT (Pattern != (Int *) NULL) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print L */
+    /* ---------------------------------------------------------------------- */
+
+    k1 = 12 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the singleton columns of L */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = 0 ; k < n1 ; k++)
+    {
+	if (k1 > 0)
+	{
+	    prl = prl1 ;
+	}
+	lp = Lip [k] ;
+	deg = Lilen [k] ;
+	Li = (Int *) (Numeric->Memory + lp) ;
+	lp += UNITS (Int, deg) ;
+	Lval = (Entry *) (Numeric->Memory + lp) ;
+	if (k1-- > 0)
+	{
+	    prl = prl1 ;
+	}
+	else if (prl == 4)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+	PRINTF4 (("\n    column "ID":", INDEX (k))) ;
+	PRINTF4 (("  length "ID".\n", deg)) ;
+	for (j = 0 ; j < deg ; j++)
+	{
+	    row = Li [j] ;
+	    PRINTF4 (("\trow "ID" : ", INDEX (row))) ;
+	    if (prl >= 4) PRINT_ENTRY (Lval [j]) ;
+	    if (row <= k || row >= n_row)
+	    {
+		return (FALSE) ;
+	    }
+	    PRINTF4 (("\n")) ;
+	    /* truncate printout, but continue to check L */
+	    if (prl == 4 && j == 9 && deg > 10)
+	    {
+		PRINTF (("\t...\n")) ;
+		prl-- ;
+	    }
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* print the regular columns of L */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = n1 ; k < npiv ; k++)
+    {
+	/* if prl is 4, print the first 10 entries of the first 10 columns */
+	if (k1 > 0)
+	{
+	    prl = prl1 ;
+	}
+
+	lp = Lip [k] ;
+	newLchain = (lp < 0) ;
+	if (newLchain)
+	{
+	    lp = -lp ;
+	    deg = 0 ;
+	}
+
+	if (k1-- > 0)
+	{
+	    prl = prl1 ;
+	}
+	else if (prl == 4)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+
+	PRINTF4 (("\n    column "ID":", INDEX (k))) ;
+
+	/* ------------------------------------------------------------------ */
+	/* make column of L in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	/* remove pivot row */
+	pos = Lpos [k] ;
+	if (pos != EMPTY)
+	{
+	    PRINTF4 (("  remove row "ID" at position "ID".",
+		INDEX (Pattern [pos]), INDEX (pos))) ;
+	    valid = (!newLchain) && (deg > 0) && (pos < deg) && (pos >= 0)
+		&& (Pattern [pos] == k) ;
+	    if (!valid)
+	    {
+		return (FALSE) ;
+	    }
+	    Pattern [pos] = Pattern [--deg] ;
+	}
+
+	/* concatenate the pattern */
+	llen = Lilen [k] ;
+	if (llen < 0)
+	{
+	    return (FALSE) ;
+	}
+	p = lp + UNITS (Int, llen) ;
+	xp = (Entry *) (Numeric->Memory + p) ;
+	if ((llen > 0 || deg > 0)
+	    && (p + (Int) UNITS (Entry, deg) > Numeric->size))
+	{
+	    return (FALSE) ;
+	}
+	if (llen > 0)
+	{
+	    PRINTF4 (("  add "ID" entries.", llen)) ;
+	    ip = (Int *) (Numeric->Memory + lp) ;
+	    for (j = 0 ; j < llen ; j++)
+	    {
+		Pattern [deg++] = *ip++ ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* print column k of L */
+	/* ------------------------------------------------------------------ */
+
+	PRINTF4 (("  length "ID".", deg)) ;
+	if (newLchain)
+	{
+	    PRINTF4 (("  Start of Lchain.")) ;
+	}
+	PRINTF4 (("\n")) ;
+
+	for (j = 0 ; j < deg ; j++)
+	{
+	    row = Pattern [j] ;
+	    PRINTF4 (("\trow "ID" : ", INDEX (row))) ;
+	    if (prl >= 4) PRINT_ENTRY (*xp) ;
+	    if (row <= k || row >= n_row)
+	    {
+		return (FALSE) ;
+	    }
+	    PRINTF4 (("\n")) ;
+	    xp++ ;
+	    /* truncate printout, but continue to check L */
+	    if (prl == 4 && j == 9 && deg > 10)
+	    {
+		PRINTF (("\t...\n")) ;
+		prl-- ;
+	    }
+	}
+    }
+
+    PRINTF4 (("\n")) ;
+    return (TRUE) ;
+}
+
+
+/* ========================================================================== */
+/* === report_U ============================================================= */
+/* ========================================================================== */
+
+PRIVATE Int report_U
+(
+    NumericType *Numeric,
+    Int Pattern [ ],
+    Int prl
+)
+{
+    /* ---------------------------------------------------------------------- */
+
+    Int k, deg, j, *ip, col, *Upos, *Uilen, k1, prl1, pos,
+	*Uip, n_col, ulen, p, newUchain, up, npiv, n1, *Ui ;
+    Entry *xp, *Uval ;
+
+    /* ---------------------------------------------------------------------- */
+
+    ASSERT (prl >= 3) ;
+
+    n_col = Numeric->n_col ;
+    npiv = Numeric->npiv ;
+    n1 = Numeric->n1 ;
+    Upos = Numeric->Upos ;
+    Uilen = Numeric->Uilen ;
+    Uip = Numeric->Uip ;
+    prl1 = prl ;
+
+    PRINTF4 ((
+    "\nU in Numeric object, in row-oriented compressed-pattern form:\n"
+    "    Diagonal is stored separately.\n")) ;
+
+    ASSERT (Pattern != (Int *) NULL) ;
+
+    k1 = 12 ;
+
+    /* ---------------------------------------------------------------------- */
+    /* print the sparse part of U */
+    /* ---------------------------------------------------------------------- */
+
+    deg = Numeric->ulen ;
+    if (deg > 0)
+    {
+	/* make last pivot row of U (singular matrices only) */
+	for (j = 0 ; j < deg ; j++)
+	{
+	    Pattern [j] = Numeric->Upattern [j] ;
+	}
+    }
+
+    PRINTF4 (("\n    row "ID":  length "ID".  End of Uchain.\n", INDEX (npiv-1),
+	deg)) ;
+
+    for (k = npiv-1 ; k >= n1 ; k--)
+    {
+
+	/* ------------------------------------------------------------------ */
+	/* print row k of U */
+	/* ------------------------------------------------------------------ */
+
+	/* if prl is 3, print the first 10 entries of the first 10 columns */
+	if (k1 > 0)
+	{
+	    prl = prl1 ;
+	}
+
+	up = Uip [k] ;
+	ulen = Uilen [k] ;
+	if (ulen < 0)
+	{
+	    return (FALSE) ;
+	}
+	newUchain = (up < 0) ;
+	if (newUchain)
+	{
+	    up = -up ;
+	    p = up + UNITS (Int, ulen) ;
+	}
+	else
+	{
+	    p = up ;
+	}
+	xp = (Entry *) (Numeric->Memory + p) ;
+	if (deg > 0 && (p + (Int) UNITS (Entry, deg) > Numeric->size))
+	{
+	    return (FALSE) ;
+	}
+	for (j = 0 ; j < deg ; j++)
+	{
+	    col = Pattern [j] ;
+	    PRINTF4 (("\tcol "ID" :", INDEX (col))) ;
+	    if (prl >= 4) PRINT_ENTRY (*xp) ;
+	    if (col <= k || col >= n_col)
+	    {
+		return (FALSE) ;
+	    }
+	    PRINTF4 (("\n")) ;
+	    xp++ ;
+	    /* truncate printout, but continue to check U */
+	    if (prl == 4 && j == 9 && deg > 10)
+	    {
+		PRINTF (("\t...\n")) ;
+		prl-- ;
+	    }
+	}
+
+	/* ------------------------------------------------------------------ */
+	/* make row k-1 of U in Pattern [0..deg-1] */
+	/* ------------------------------------------------------------------ */
+
+	if (k1-- > 0)
+	{
+	    prl = prl1 ;
+	}
+	else if (prl == 4)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+
+	if (k > 0)
+	{
+	    PRINTF4 (("\n    row "ID":  ", INDEX (k-1))) ;
+	}
+
+	if (newUchain)
+	{
+	    /* next row is a new Uchain */
+	    if (k > 0)
+	    {
+		deg = ulen ;
+		PRINTF4 (("length "ID".  End of Uchain.\n", deg)) ;
+		if (up + (Int) UNITS (Int, ulen) > Numeric->size)
+		{
+		    return (FALSE) ;
+		}
+		ip = (Int *) (Numeric->Memory + up) ;
+		for (j = 0 ; j < deg ; j++)
+		{
+		    Pattern [j] = *ip++ ;
+		}
+	    }
+	}
+	else
+	{
+	    if (ulen > 0)
+	    {
+		PRINTF4 (("remove "ID" entries.  ", ulen)) ;
+	    }
+	    deg -= ulen ;
+	    if (deg < 0)
+	    {
+		return (FALSE) ;
+	    }
+	    pos = Upos [k] ;
+	    if (pos != EMPTY)
+	    {
+		/* add the pivot column */
+		PRINTF4 (("add column "ID" at position "ID".  ",
+		    INDEX (k), INDEX (pos))) ;
+		if (pos < 0 || pos > deg)
+		{
+		    return (FALSE) ;
+		}
+		Pattern [deg++] = Pattern [pos] ;
+		Pattern [pos] = k ;
+	    }
+	    PRINTF4 (("length "ID".\n", deg)) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* print the singleton rows of U */
+    /* ---------------------------------------------------------------------- */
+
+    for (k = n1 - 1 ; k >= 0 ; k--)
+    {
+	if (k1 > 0)
+	{
+	    prl = prl1 ;
+	}
+	up = Uip [k] ;
+	deg = Uilen [k] ;
+	Ui = (Int *) (Numeric->Memory + up) ;
+	up += UNITS (Int, deg) ;
+	Uval = (Entry *) (Numeric->Memory + up) ;
+	if (k1-- > 0)
+	{
+	    prl = prl1 ;
+	}
+	else if (prl == 4)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+	PRINTF4 (("\n    row "ID":", INDEX (k))) ;
+	PRINTF4 (("  length "ID".\n", deg)) ;
+	for (j = 0 ; j < deg ; j++)
+	{
+	    col = Ui [j] ;
+	    PRINTF4 (("\tcol "ID" : ", INDEX (col))) ;
+	    if (prl >= 4) PRINT_ENTRY (Uval [j]) ;
+	    if (col <= k || col >= n_col)
+	    {
+		return (FALSE) ;
+	    }
+	    PRINTF4 (("\n")) ;
+	    /* truncate printout, but continue to check U */
+	    if (prl == 4 && j == 9 && deg > 10)
+	    {
+		PRINTF (("\t...\n")) ;
+		prl-- ;
+	    }
+	}
+    }
+
+    prl = prl1 ;
+    PRINTF4 (("\n")) ;
+    return (TRUE) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_perm.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,44 @@
+/* ========================================================================== */
+/* === UMFPACK_report_perm ================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints a permutation vector.  See umfpack_report_perm.h
+    for details.
+
+    Dynamic memory usage:  Allocates a size max(np,1)*sizeof(Int) workspace via
+    a single call to UMF_malloc and then frees all of it via UMF_free on return.
+*/
+
+#include "umf_internal.h"
+#include "umf_report_perm.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+GLOBAL Int UMFPACK_report_perm
+(
+    Int np,
+    const Int Perm [ ],
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Int prl, *W, status ;
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    W = (Int *) UMF_malloc (MAX (np,1), sizeof (Int)) ;
+    status = UMF_report_perm (np, Perm, W, prl, 1) ;
+    (void) UMF_free ((void *) W) ;
+    return (status) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_status.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,118 @@
+/* ========================================================================== */
+/* === UMFPACK_report_status ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints the return value from other UMFPACK_* routines.
+    See umfpack_report_status.h for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL void UMFPACK_report_status
+(
+    const double Control [UMFPACK_CONTROL],
+    Int status
+)
+{
+    Int prl ;
+
+    /* ---------------------------------------------------------------------- */
+    /* get control settings and status to determine what to print */
+    /* ---------------------------------------------------------------------- */
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl < 1)
+    {
+	/* no output generated if prl is less than 1 */
+	return ;
+    }
+
+    if (status == UMFPACK_OK && prl <= 1)
+    {
+	/* no output generated if prl is 1 or less and no error occurred. */
+	/* note that the default printing level is 1. */
+	return ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* print umfpack license, copyright, version, and status condition */
+    /* ---------------------------------------------------------------------- */
+
+    PRINTF  (("\n")) ;
+    PRINTF4 (("%s\n", UMFPACK_COPYRIGHT)) ;
+    PRINTF6 (("%s", UMFPACK_LICENSE_PART1)) ;
+    PRINTF6 (("%s", UMFPACK_LICENSE_PART2)) ;
+    PRINTF6 (("%s", UMFPACK_LICENSE_PART3)) ;
+    PRINTF  (("%s: ", UMFPACK_VERSION)) ;
+
+    switch (status)
+    {
+	case UMFPACK_OK:
+	    PRINTF (("OK\n")) ;
+	    break ;
+
+	case UMFPACK_WARNING_singular_matrix:
+	    PRINTF (("WARNING: matrix is singular\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_out_of_memory:
+	    PRINTF (("ERROR: out of memory\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_invalid_Numeric_object:
+	    PRINTF (("ERROR: Numeric object is invalid\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_invalid_Symbolic_object:
+	    PRINTF (("ERROR: Symbolic object is invalid\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_argument_missing:
+	    PRINTF (("ERROR: required argument(s) missing\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_n_nonpositive:
+	    PRINTF (("ERROR: dimension (n_row or n_col) must be > 0\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_invalid_matrix:
+	    PRINTF (("ERROR: input matrix is invalid\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_invalid_system:
+	    PRINTF (("ERROR: system argument invalid\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_invalid_permutation:
+	    PRINTF (("ERROR: invalid permutation\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_different_pattern:
+	    PRINTF (("ERROR: pattern of matrix (Ap and/or Ai) has changed\n")) ;
+	    break ;
+
+	case UMFPACK_ERROR_internal_error:
+	    PRINTF (("INTERNAL ERROR!\n"
+	    "Input arguments might be corrupted or aliased, or an internal\n"
+	    "error has occurred.  Check your input arguments with the\n"
+	    "umfpack_*_report_* routines before calling the umfpack_*\n"
+	    "computational routines.  Recompile UMFPACK with debugging\n"
+	    "enabled, and look for failed assertions.  If all else fails\n"
+	    "please report this error to Tim Davis (davis@cise.ufl.edu).\n"
+	    )) ;
+	    break ;
+
+	default:
+	    PRINTF (("ERROR: Unrecognized error code: "ID"\n", status)) ;
+
+    }
+    PRINTF  (("\n")) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,228 @@
+/* ========================================================================== */
+/* === UMFPACK_report_symbolic ============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints the Symbolic object. See umfpack_report_symbolic.h
+    for details.  Does not print new Cdeg, Rdeg, Esize, and the Diagonal_map.
+
+    Dynamic memory usage:  Allocates a size MAX (n_row,n_col)*sizeof(Int)
+    workspace via a single call to UMF_malloc and then frees all of it via
+    UMF_free on return.  The workspace is not allocated if an early error
+    return occurs before the workspace is needed.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_symbolic.h"
+#include "umf_report_perm.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+GLOBAL Int UMFPACK_report_symbolic
+(
+    void *SymbolicHandle,
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Int n_row, n_col, nz, nchains, nfr, maxnrows, maxncols, prl,
+	k, chain, frontid, frontid1, frontid2, kk, *Chain_start, *W,
+	*Chain_maxrows, *Chain_maxcols, *Front_npivcol, *Front_1strow,
+	*Front_leftmostdesc, *Front_parent, done, status1, status2 ;
+    SymbolicType *Symbolic ;
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    PRINTF (("Symbolic object: ")) ;
+
+    Symbolic = (SymbolicType *) SymbolicHandle ;
+    if (!UMF_valid_symbolic (Symbolic))
+    {
+	PRINTF (("ERROR: invalid\n")) ;
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    n_row = Symbolic->n_row ;
+    n_col = Symbolic->n_col ;
+
+    nz = Symbolic->nz ;
+
+    nchains = Symbolic->nchains ;
+    nfr = Symbolic->nfr ;
+    maxnrows = Symbolic->maxnrows ;
+    maxncols = Symbolic->maxncols ;
+
+    Chain_start = Symbolic->Chain_start ;
+    Chain_maxrows = Symbolic->Chain_maxrows ;
+    Chain_maxcols = Symbolic->Chain_maxcols ;
+    Front_npivcol = Symbolic->Front_npivcol ;
+    Front_1strow = Symbolic->Front_1strow ;
+    Front_leftmostdesc = Symbolic->Front_leftmostdesc ;
+    Front_parent = Symbolic->Front_parent ;
+
+    if (prl >= 4)
+    {
+
+	PRINTF (("\n    matrix to be factorized:\n")) ;
+	PRINTF (("\tn_row: "ID" n_col: "ID"\n", n_row, n_col)) ;
+	PRINTF (("\tnumber of entries: "ID"\n", nz)) ;
+	PRINTF (("    block size used for dense matrix kernels:   "ID"\n",
+	Symbolic->nb)) ;
+
+	PRINTF (("    strategy used:                              ")) ;
+	/* strategy cannot be auto */
+	if (Symbolic->strategy == UMFPACK_STRATEGY_SYMMETRIC)
+	{
+	    PRINTF (("symmetric")) ;
+	}
+	else if (Symbolic->strategy == UMFPACK_STRATEGY_UNSYMMETRIC)
+	{
+	    PRINTF (("unsymmetric")) ;
+	}
+	else if (Symbolic->strategy == UMFPACK_STRATEGY_2BY2)
+	{
+	    PRINTF (("symmetric 2-by-2")) ;
+	}
+	PRINTF (("\n")) ;
+
+	PRINTF (("    ordering used:                              ")) ;
+	if (Symbolic->ordering == UMFPACK_ORDERING_COLAMD)
+	{
+	    PRINTF (("colamd on A\n")) ;
+	}
+	else if (Symbolic->ordering == UMFPACK_ORDERING_AMD)
+	{
+	    PRINTF (("amd on A+A'\n")) ;
+	}
+	else if (Symbolic->ordering == UMFPACK_ORDERING_GIVEN)
+	{
+	    PRINTF (("provided by user")) ;
+	}
+	PRINTF (("\n")) ;
+
+	PRINTF (("    performn column etree postorder:            ")) ;
+	if (Symbolic->fixQ)
+	{
+	    PRINTF (("no\n")) ;
+	}
+	else
+	{
+	    PRINTF (("yes\n")) ;
+	}
+
+	PRINTF (("    prefer diagonal pivoting (attempt P=Q):     ")) ;
+	if (Symbolic->prefer_diagonal)
+	{
+	    PRINTF (("yes\n")) ;
+	}
+	else
+	{
+	    PRINTF (("no\n")) ;
+	}
+
+	PRINTF (("    variable-size part of Numeric object:\n")) ;
+	PRINTF (("\tminimum initial size (Units): %.20g  (MBytes): %.1f\n",
+	    Symbolic->dnum_mem_init_usage,
+	    MBYTES (Symbolic->dnum_mem_init_usage))) ;
+	PRINTF (("\testimated peak size (Units):  %.20g  (MBytes): %.1f\n",
+	    Symbolic->num_mem_usage_est,
+	    MBYTES (Symbolic->num_mem_usage_est))) ;
+	PRINTF (("\testimated final size (Units): %.20g  (MBytes): %.1f\n",
+	    Symbolic->num_mem_size_est,
+	    MBYTES (Symbolic->num_mem_size_est))) ;
+	PRINTF (("    symbolic factorization memory usage (Units):"
+	    " %.20g  (MBytes): %.1f\n",
+	    Symbolic->peak_sym_usage,
+	    MBYTES (Symbolic->peak_sym_usage))) ;
+	PRINTF (("    frontal matrices / supercolumns:\n")) ;
+	PRINTF (("\tnumber of frontal chains: "ID"\n", nchains)) ;
+	PRINTF (("\tnumber of frontal matrices: "ID"\n", nfr)) ;
+	PRINTF (("\tlargest frontal matrix row dimension: "ID"\n", maxnrows)) ;
+	PRINTF (("\tlargest frontal matrix column dimension: "ID"\n",maxncols));
+    }
+
+    k = 0 ;
+    done = FALSE ;
+
+    for (chain = 0 ; chain < nchains ; chain++)
+    {
+	frontid1 = Chain_start [chain] ;
+	frontid2 = Chain_start [chain+1] - 1 ;
+	PRINTF4 (("\n    Frontal chain: "ID".  Frontal matrices "ID" to "ID"\n",
+	    INDEX (chain), INDEX (frontid1), INDEX (frontid2))) ;
+	PRINTF4 (("\tLargest frontal matrix in Frontal chain: "ID"-by-"ID"\n",
+	    Chain_maxrows [chain], Chain_maxcols [chain])) ;
+	for (frontid = frontid1 ; frontid <= frontid2 ; frontid++)
+	{
+	    kk = Front_npivcol [frontid] ;
+	    PRINTF4 (("\tFront: "ID"  pivot cols: "ID" (pivot columns "ID" to "
+		ID")\n", INDEX (frontid), kk, INDEX (k), INDEX (k+kk-1))) ;
+	    PRINTF4 (("\t    pivot row candidates: "ID" to "ID"\n",
+		INDEX (Front_1strow [Front_leftmostdesc [frontid]]),
+		INDEX (Front_1strow [frontid+1]-1))) ;
+	    PRINTF4 (("\t    leftmost descendant: "ID"\n",
+		INDEX (Front_leftmostdesc [frontid]))) ;
+	    PRINTF4 (("\t    1st new candidate row : "ID"\n",
+		INDEX (Front_1strow [frontid]))) ;
+	    PRINTF4 (("\t    parent:")) ;
+	    if (Front_parent [frontid] == EMPTY)
+	    {
+		PRINTF4 ((" (none)\n")) ;
+	    }
+	    else
+	    {
+		PRINTF4 ((" "ID"\n", INDEX (Front_parent [frontid]))) ;
+	    }
+	    done = (frontid == 20 && frontid < nfr-1 && prl == 4) ;
+	    if (done)
+	    {
+		PRINTF4 (("\t...\n")) ;
+		break ;
+	    }
+	    k += kk ;
+	}
+	if (Front_npivcol [nfr] != 0)
+	{
+	    PRINTF4 (("\tFront: "ID" placeholder for "ID" empty columns\n",
+		INDEX (nfr), Front_npivcol [nfr])) ;
+	}
+	if (done)
+	{
+	    break ;
+	}
+    }
+
+    W = (Int *) UMF_malloc (MAX (n_row, n_col), sizeof (Int)) ;
+    if (!W)
+    {
+	PRINTF (("ERROR: out of memory to check Symbolic object\n\n")) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    PRINTF4 (("\nInitial column permutation, Q1: ")) ;
+    status1 = UMF_report_perm (n_col, Symbolic->Cperm_init, W, prl, 0) ;
+
+    PRINTF4 (("\nInitial row permutation, P1: ")) ;
+    status2 = UMF_report_perm (n_row, Symbolic->Rperm_init, W, prl, 0) ;
+
+    (void) UMF_free ((void *) W) ;
+
+    if (status1 != UMFPACK_OK || status2 != UMFPACK_OK)
+    {
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    PRINTF4 (("    Symbolic object:  ")) ;
+    PRINTF (("OK\n\n")) ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_triplet.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,99 @@
+/* ========================================================================== */
+/* === UMFPACK_report_triplet =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints a matrix in triplet form.  See
+    umfpack_report_triplet.h for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL Int UMFPACK_report_triplet
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],
+    const Int Tj [ ],
+    const double Tx [ ],
+#ifdef COMPLEX
+    const double Tz [ ],
+#endif
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Entry t ;
+    Int prl, prl1, k, i, j, do_values ;
+#ifdef COMPLEX
+    Int split = SPLIT (Tz) ;
+#endif
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    PRINTF (("triplet-form matrix, n_row = "ID", n_col = "ID" nz = "ID". ",
+	n_row, n_col, nz)) ;
+
+    if (!Ti || !Tj)
+    {
+	PRINTF (("ERROR: indices not present\n\n")) ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    if (n_row <= 0 || n_col <= 0)
+    {
+	PRINTF (("ERROR: n_row or n_col is <= 0\n\n")) ;
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+
+    if (nz < 0)
+    {
+	PRINTF (("ERROR: nz is < 0\n\n")) ;
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    PRINTF4 (("\n")) ;
+
+    do_values = Tx != (double *) NULL ;
+
+    prl1 = prl ;
+    for (k = 0 ; k < nz ; k++)
+    {
+	i = Ti [k] ;
+	j = Tj [k] ;
+	PRINTF4 (("    "ID" : "ID" "ID" ", INDEX (k), INDEX (i), INDEX (j))) ;
+	if (do_values && prl >= 4)
+	{
+	    ASSIGN (t, Tx, Tz, k, split) ;
+	    PRINT_ENTRY (t) ;
+	}
+	PRINTF4 (("\n")) ;
+	if (i < 0 || i >= n_row || j < 0 || j >= n_col)
+	{
+	    /* invalid triplet */
+	    PRINTF (("ERROR: invalid triplet\n\n")) ;
+	    return (UMFPACK_ERROR_invalid_matrix) ;
+	}
+	if (prl == 4 && k == 9 && nz > 10)
+	{
+	    PRINTF (("    ...\n")) ;
+	    prl-- ;
+	}
+    }
+    prl = prl1 ;
+
+    PRINTF4 (("    triplet-form matrix ")) ;
+    PRINTF (("OK\n\n")) ;
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_report_vector.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,43 @@
+/* ========================================================================== */
+/* === UMFPACK_report_vector ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Prints a real or complex vector.
+    See umfpack_report_vector.h for details.
+*/
+
+#include "umf_internal.h"
+#include "umf_report_vector.h"
+
+GLOBAL Int UMFPACK_report_vector
+(
+    Int n,
+    const double Xx [ ],
+#ifdef COMPLEX
+    const double Xz [ ],
+#endif
+    const double Control [UMFPACK_CONTROL]
+)
+{
+    Int prl ;
+
+#ifndef COMPLEX
+    double *Xz = (double *) NULL ;
+#endif
+
+    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
+
+    if (prl <= 2)
+    {
+	return (UMFPACK_OK) ;
+    }
+
+    return (UMF_report_vector (n, Xx, Xz, prl, TRUE, FALSE)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_save_numeric.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,92 @@
+/* ========================================================================== */
+/* === UMFPACK_save_numeric ================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Saves a Numeric object to a file.  It can later be read back
+    in via a call to umfpack_*_load_numeric.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+
+#define WRITE(object,type,n) \
+{ \
+    ASSERT (object != (type *) NULL) ; \
+    if (fwrite (object, sizeof (type), n, f) != n) \
+    { \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+}
+
+/* ========================================================================== */
+/* === UMFPACK_save_numeric ================================================= */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_save_numeric
+(
+    void *NumericHandle,
+    char *user_filename
+)
+{
+    NumericType *Numeric ;
+    char *filename ;
+    FILE *f ;
+
+    /* get the Numeric object */
+    Numeric = (NumericType *) NumericHandle ;
+
+    /* make sure the Numeric object is valid */
+    if (!UMF_valid_numeric (Numeric))
+    {
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    /* get the filename, or use the default name if filename is NULL */
+    if (user_filename == (char *) NULL)
+    {
+	filename = "numeric.umf" ;
+    }
+    else
+    {
+	filename = user_filename ;
+    }
+    f = fopen (filename, "wb") ;
+    if (!f)
+    {
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    /* write the Numeric object to the file, in binary */
+    WRITE (Numeric,        NumericType, 1) ;
+    WRITE (Numeric->D,     Entry, MIN (Numeric->n_row, Numeric->n_col)+1) ;
+    WRITE (Numeric->Rperm, Int,   Numeric->n_row+1) ;
+    WRITE (Numeric->Cperm, Int,   Numeric->n_col+1) ;
+    WRITE (Numeric->Lpos,  Int,   Numeric->npiv+1) ;
+    WRITE (Numeric->Lilen, Int,   Numeric->npiv+1) ;
+    WRITE (Numeric->Lip,   Int,   Numeric->npiv+1) ;
+    WRITE (Numeric->Upos,  Int,   Numeric->npiv+1) ;
+    WRITE (Numeric->Uilen, Int,   Numeric->npiv+1) ;
+    WRITE (Numeric->Uip,   Int,   Numeric->npiv+1) ;
+    if (Numeric->scale != UMFPACK_SCALE_NONE)
+    {
+	WRITE (Numeric->Rs, double, Numeric->n_row) ;
+    }
+    if (Numeric->ulen > 0)
+    {
+	WRITE (Numeric->Upattern, Int, Numeric->ulen+1) ;
+    }
+    WRITE (Numeric->Memory, Unit, Numeric->size) ;
+
+    /* close the file */
+    fclose (f) ;
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_save_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,95 @@
+/* ========================================================================== */
+/* === UMFPACK_save_symbolic ================================================ */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Saves a Symbolic object to a file.  It can later be read
+    back in via a call to umfpack_*_load_symbolic.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_symbolic.h"
+
+#define WRITE(object,type,n) \
+{ \
+    ASSERT (object != (type *) NULL) ; \
+    if (fwrite (object, sizeof (type), n, f) != n) \
+    { \
+	fclose (f) ; \
+	return (UMFPACK_ERROR_file_IO) ; \
+    } \
+}
+
+/* ========================================================================== */
+/* === UMFPACK_save_symbolic ================================================ */
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_save_symbolic
+(
+    void *SymbolicHandle,
+    char *user_filename
+)
+{
+    SymbolicType *Symbolic ;
+    char *filename ;
+    FILE *f ;
+
+    /* get the Symbolic object */
+    Symbolic = (SymbolicType *) SymbolicHandle ;
+
+    /* make sure the Symbolic object is valid */
+    if (!UMF_valid_symbolic (Symbolic))
+    {
+	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
+    }
+
+    /* get the filename, or use the default name if filename is NULL */
+    if (user_filename == (char *) NULL)
+    {
+	filename = "symbolic.umf" ;
+    }
+    else
+    {
+	filename = user_filename ;
+    }
+    f = fopen (filename, "wb") ;
+    if (!f)
+    {
+	return (UMFPACK_ERROR_file_IO) ;
+    }
+
+    /* write the Symbolic object to the file, in binary */
+    WRITE (Symbolic,                     SymbolicType, 1) ;
+    WRITE (Symbolic->Cperm_init,         Int, Symbolic->n_col+1) ;
+    WRITE (Symbolic->Rperm_init,         Int, Symbolic->n_row+1) ;
+    WRITE (Symbolic->Front_npivcol,      Int, Symbolic->nfr+1) ;
+    WRITE (Symbolic->Front_parent,       Int, Symbolic->nfr+1) ;
+    WRITE (Symbolic->Front_1strow,       Int, Symbolic->nfr+1) ;
+    WRITE (Symbolic->Front_leftmostdesc, Int, Symbolic->nfr+1) ;
+    WRITE (Symbolic->Chain_start,        Int, Symbolic->nchains+1) ;
+    WRITE (Symbolic->Chain_maxrows,      Int, Symbolic->nchains+1) ;
+    WRITE (Symbolic->Chain_maxcols,      Int, Symbolic->nchains+1) ;
+    WRITE (Symbolic->Cdeg,               Int, Symbolic->n_col+1) ;
+    WRITE (Symbolic->Rdeg,               Int, Symbolic->n_row+1) ;
+    if (Symbolic->esize > 0)
+    {
+	/* only when dense rows are present */
+	WRITE (Symbolic->Esize, Int, Symbolic->esize) ;
+    }
+    if (Symbolic->prefer_diagonal)
+    {
+	/* only when diagonal pivoting is prefered */
+	WRITE (Symbolic->Diagonal_map, Int, Symbolic->n_col+1) ;
+    }
+
+    /* close the file */
+    fclose (f) ;
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_scale.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,158 @@
+/* ========================================================================== */
+/* === UMFPACK_scale ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Applies the scale factors computed during numerical
+    factorization to a vector. See umfpack_scale.h for more details.
+
+    The LU factorization is L*U = P*R*A*Q, where P and Q are permutation
+    matrices, and R is diagonal.  This routine computes X = R * B using the
+    matrix R stored in the Numeric object.
+
+    Returns FALSE if any argument is invalid, TRUE otherwise.
+
+    If R not present in the Numeric object, then R = I and no floating-point
+    work is done.  B is simply copied into X.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+
+GLOBAL Int UMFPACK_scale
+(
+    double Xx [ ],
+#ifdef COMPLEX
+    double Xz [ ],
+#endif
+    const double Bx [ ],
+#ifdef COMPLEX
+    const double Bz [ ],
+#endif
+    void *NumericHandle
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    NumericType *Numeric ;
+    Int n, i ;
+    double *Rs ;
+#ifdef COMPLEX
+    Int split = SPLIT (Xz) && SPLIT (Bz) ;
+#endif
+
+    Numeric = (NumericType *) NumericHandle ;
+    if (!UMF_valid_numeric (Numeric))
+    {
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    n = Numeric->n_row ;
+    Rs = Numeric->Rs ;
+
+    if (!Xx || !Bx)
+    {
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* X = R*B or R\B */
+    /* ---------------------------------------------------------------------- */
+
+    if (Rs != (double *) NULL)
+    {
+#ifndef NRECIPROCAL
+	if (Numeric->do_recip)
+	{
+	    /* multiply by the scale factors */
+#ifdef COMPLEX
+	    if (split)
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    Xx [i] = Bx [i] * Rs [i] ;
+		    Xz [i] = Bz [i] * Rs [i] ;
+		}
+	    }
+	    else
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    Xx [2*i  ] = Bx [2*i  ] * Rs [i] ;
+		    Xx [2*i+1] = Bx [2*i+1] * Rs [i] ;
+		}
+	    }
+#else
+	    for (i = 0 ; i < n ; i++)
+	    {
+		Xx [i] = Bx [i] * Rs [i] ;
+	    }
+#endif
+	}
+	else
+#endif
+	{
+	    /* divide by the scale factors */
+#ifdef COMPLEX
+	    if (split)
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    Xx [i] = Bx [i] / Rs [i] ;
+		    Xz [i] = Bz [i] / Rs [i] ;
+		}
+	    }
+	    else
+	    {
+		for (i = 0 ; i < n ; i++)
+		{
+		    Xx [2*i  ] = Bx [2*i  ] / Rs [i] ;
+		    Xx [2*i+1] = Bx [2*i+1] / Rs [i] ;
+		}
+	    }
+#else
+	    for (i = 0 ; i < n ; i++)
+	    {
+		Xx [i] = Bx [i] / Rs [i] ;
+	    }
+#endif
+	}
+    }
+    else
+    {
+	/* no scale factors, just copy B into X */
+#ifdef COMPLEX
+        if (split)
+	{
+	    for (i = 0 ; i < n ; i++)
+	    {
+		Xx [i] = Bx [i] ;
+		Xz [i] = Bz [i] ;
+	    }
+	}
+	else
+	{
+	    for (i = 0 ; i < n ; i++)
+	    {
+		Xx [2*i  ] = Bx [2*i  ] ;
+		Xx [2*i+1] = Bx [2*i+1] ;
+	    }
+	}
+#else
+	for (i = 0 ; i < n ; i++)
+	{
+	    Xx [i] = Bx [i] ;
+	}
+#endif
+    }
+
+    return (UMFPACK_OK) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_solve.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,245 @@
+/* ========================================================================== */
+/* === UMFPACK_solve ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Solves a linear system using the numerical factorization
+    computed by UMFPACK_numeric.  See umfpack_solve.h for more details.
+
+    For umfpack_*_solve:
+	Dynamic memory usage:  UMFPACK_solve calls UMF_malloc twice, for
+	workspace of size c*n*sizeof(double) + n*sizeof(Int), where c is
+	defined below.  On return, all of this workspace is free'd via UMF_free.
+
+    For umfpack_*_wsolve:
+	No dynamic memory usage.  Input arrays are used for workspace instead.
+	Pattern is a workspace of size n Integers.  The double array W must be
+	at least of size c*n, where c is defined below.
+
+    If iterative refinement is requested, and Ax=b, A'x=b or A.'x=b is being
+    solved, and the matrix A is not singular, then c is 5 for the real version
+    and 10 for the complex version.  Otherwise, c is 1 for the real version and
+    4 for the complex version.
+*/
+
+#include "umf_internal.h"
+#include "umf_valid_numeric.h"
+#include "umf_solve.h"
+
+#ifndef WSOLVE
+#include "umf_malloc.h"
+#include "umf_free.h"
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+#endif
+
+GLOBAL Int
+#ifdef WSOLVE
+UMFPACK_wsolve
+#else
+UMFPACK_solve
+#endif
+(
+    Int sys,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    double Xx [ ],
+#ifdef COMPLEX
+    double Xz [ ],
+#endif
+    const double Bx [ ],
+#ifdef COMPLEX
+    const double Bz [ ],
+#endif
+    void *NumericHandle,
+    const double Control [UMFPACK_CONTROL],
+    double User_Info [UMFPACK_INFO]
+#ifdef WSOLVE
+    , Int Pattern [ ],
+    double W [ ]
+#endif
+)
+{
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    double Info2 [UMFPACK_INFO], stats [2] ;
+    double *Info ;
+    NumericType *Numeric ;
+    Int n, i, irstep, status ;
+#ifndef WSOLVE
+    Int *Pattern, wsize ;
+    double *W ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get the amount of time used by the process so far */
+    /* ---------------------------------------------------------------------- */
+
+    umfpack_tic (stats) ;
+
+#ifndef WSOLVE
+#ifndef NDEBUG
+    init_count = UMF_malloc_count ;
+#endif
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get parameters */
+    /* ---------------------------------------------------------------------- */
+
+    irstep = GET_CONTROL (UMFPACK_IRSTEP, UMFPACK_DEFAULT_IRSTEP) ;
+
+    if (User_Info != (double *) NULL)
+    {
+	/* return Info in user's array */
+	Info = User_Info ;
+	/* clear the parts of Info that are set by UMFPACK_solve */
+	for (i = UMFPACK_IR_TAKEN ; i <= UMFPACK_SOLVE_TIME ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+    }
+    else
+    {
+	/* no Info array passed - use local one instead */
+	Info = Info2 ;
+	for (i = 0 ; i < UMFPACK_INFO ; i++)
+	{
+	    Info [i] = EMPTY ;
+	}
+    }
+
+    Info [UMFPACK_STATUS] = UMFPACK_OK ;
+    Info [UMFPACK_SOLVE_FLOPS] = 0 ;
+
+    Numeric = (NumericType *) NumericHandle ;
+    if (!UMF_valid_numeric (Numeric))
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_Numeric_object ;
+	return (UMFPACK_ERROR_invalid_Numeric_object) ;
+    }
+
+    Info [UMFPACK_NROW] = Numeric->n_row ;
+    Info [UMFPACK_NCOL] = Numeric->n_col ;
+
+    if (Numeric->n_row != Numeric->n_col)
+    {
+	/* only square systems can be handled */
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_invalid_system ;
+	return (UMFPACK_ERROR_invalid_system) ;
+    }
+    n = Numeric->n_row ;
+    if (Numeric->nnzpiv < n
+	|| SCALAR_IS_ZERO (Numeric->rcond) || SCALAR_IS_NAN (Numeric->rcond))
+    {
+	/* turn off iterative refinement if A is singular */
+	/* or if U has NaN's on the diagonal. */
+	irstep = 0 ;
+    }
+
+    if (!Xx || !Bx)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    if (sys >= UMFPACK_Pt_L)
+    {
+	/* no iterative refinement except for nonsingular Ax=b, A'x=b, A.'x=b */
+	irstep = 0 ;
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate or check the workspace */
+    /* ---------------------------------------------------------------------- */
+
+#ifdef WSOLVE
+
+    if (!W || !Pattern)
+    {
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+#else
+
+#ifdef COMPLEX
+    if (irstep > 0)
+    {
+	wsize = 10*n ;		/* W, X, Z, S, Y, B2 */
+    }
+    else
+    {
+	wsize = 4*n ;		/* W, X */
+    }
+#else
+    if (irstep > 0)
+    {
+	wsize = 5*n ;		/* W, Z, S, Y, B2 */
+    }
+    else
+    {
+	wsize = n ;		/* W */
+    }
+#endif
+
+    Pattern = (Int *) UMF_malloc (n, sizeof (Int)) ;
+    W = (double *) UMF_malloc (wsize, sizeof (double)) ;
+    if (!W || !Pattern)
+    {
+	DEBUGm4 (("out of memory: solve work\n")) ;
+	Info [UMFPACK_STATUS] = UMFPACK_ERROR_out_of_memory ;
+	(void) UMF_free ((void *) W) ;
+	(void) UMF_free ((void *) Pattern) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+#endif	/* WSOLVE */
+
+    /* ---------------------------------------------------------------------- */
+    /* solve the system */
+    /* ---------------------------------------------------------------------- */
+
+    status = UMF_solve (sys, Ap, Ai, Ax, Xx, Bx,
+#ifdef COMPLEX
+	Az, Xz, Bz,
+#endif
+	Numeric, irstep, Info, Pattern, W) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the workspace (if allocated) */
+    /* ---------------------------------------------------------------------- */
+
+#ifndef WSOLVE
+    (void) UMF_free ((void *) W) ;
+    (void) UMF_free ((void *) Pattern) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* get the time used by UMFPACK_*solve */
+    /* ---------------------------------------------------------------------- */
+
+    Info [UMFPACK_STATUS] = status ;
+    if (status >= 0)
+    {
+	umfpack_toc (stats) ;
+	Info [UMFPACK_SOLVE_WALLTIME] = stats [0] ;
+	Info [UMFPACK_SOLVE_TIME] = stats [1] ;
+    }
+
+    return (status) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_symbolic.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,39 @@
+/* ========================================================================== */
+/* === UMFPACK_symbolic ===================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Performs a symbolic factorization.
+    See umfpack_symbolic.h for details.
+*/
+
+#include "umf_internal.h"
+
+GLOBAL Int UMFPACK_symbolic
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],
+    const Int Ai [ ],
+    const double Ax [ ],
+#ifdef COMPLEX
+    const double Az [ ],
+#endif
+    void **SymbolicHandle,
+    const double Control [UMFPACK_CONTROL],
+    double Info [UMFPACK_INFO]
+)
+{
+    Int *Qinit = (Int *) NULL ;
+    return (UMFPACK_qsymbolic (n_row, n_col, Ap, Ai, Ax,
+#ifdef COMPLEX
+	Az,
+#endif
+	Qinit, SymbolicHandle, Control, Info)) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_tictoc.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,106 @@
+/* ========================================================================== */
+/* === umfpack_tictoc ======================================================= */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Returns the time in seconds used by the process, and
+    the current wall clock time.  BE CAREFUL:  if you compare the run time of
+    UMFPACK with other sparse matrix packages, be sure to use the same timer.
+    See umfpack_tictoc.h for details.
+
+    These routines conform to the POSIX standard.  See umf_config.h for
+    more details.
+*/
+
+#include "umf_internal.h"
+
+#ifdef NO_TIMER
+
+/* -------------------------------------------------------------------------- */
+/* no timer used if -DNO_TIMER is defined at compile time */
+/* -------------------------------------------------------------------------- */
+
+void umfpack_tic (double stats [2])
+{
+    stats [0] = 0 ;
+    stats [1] = 0 ;
+}
+
+void umfpack_toc (double stats [2])
+{
+    stats [0] = 0 ;
+    stats [1] = 0 ;
+}
+
+#else
+
+/* -------------------------------------------------------------------------- */
+/* timer routines, using either times() or clock() */
+/* -------------------------------------------------------------------------- */
+
+#define TINY_TIME 1e-4
+
+#ifndef NPOSIX
+
+#include <unistd.h>
+#include <sys/times.h>
+
+void umfpack_tic (double stats [2])
+{
+    /* Return the current time */
+    /* stats [0]: current wallclock time, in seconds */
+    /* stats [1]: user + system time for the process, in seconds */
+
+    double ticks ;
+    struct tms t ;
+
+    ticks = (double) sysconf (_SC_CLK_TCK) ;
+    stats [0] = (double) times (&t) / ticks ;
+    stats [1] = (double) (t.tms_utime + t.tms_stime) / ticks ;
+
+    /* if time is tiny, just return zero */
+    if (stats [0] < TINY_TIME) stats [0] = 0 ;
+    if (stats [1] < TINY_TIME) stats [1] = 0 ;
+}
+
+#else
+
+/* Generic ANSI C: use the ANSI clock function.  No wallclock time. */
+
+#include <time.h>
+
+void umfpack_tic (double stats [2])
+{
+    stats [0] = 0 ;
+    stats [1] = ((double) (clock ( ))) / ((double) (CLOCKS_PER_SEC)) ;
+    if (stats [1] < TINY_TIME) stats [1] = 0 ;
+}
+
+#endif
+
+/* -------------------------------------------------------------------------- */
+
+void umfpack_toc (double stats [2])
+{
+    /* Return the current time since the last call to umfpack_tic. */
+    /* On input, stats holds the values returned by umfpack_tic. */
+    /* On ouput, stats holds the time since the last umfpack_tic. */
+
+    double done [2] ;
+    umfpack_tic (done) ;
+
+    stats [0] = done [0] - stats [0] ;
+    stats [1] = done [1] - stats [1] ;
+
+    if (stats [0] < 0) stats [0] = 0 ;
+    if (stats [1] < 0) stats [1] = 0 ;
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_timer.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,83 @@
+/* ========================================================================== */
+/* === umfpack_timer ======================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User-callable.  Returns the time in seconds used by the process.  BE
+    CAREFUL:  if you compare the run time of UMFPACK with other sparse matrix
+    packages, be sure to use the same timer.  See umfpack_timer.h for details.
+    See umfpack_tictoc.h, which is the timer used internally by UMFPACK.
+*/
+
+#ifdef NO_TIMER
+
+/* -------------------------------------------------------------------------- */
+/* no timer used if -DNO_TIMER is defined at compile time */
+/* -------------------------------------------------------------------------- */
+
+double umfpack_timer ( void )
+{
+    return (0) ;
+}
+
+#else
+
+#ifdef GETRUSAGE
+
+/* -------------------------------------------------------------------------- */
+/* use getrusage for accurate process times (and no overflow) */
+/* -------------------------------------------------------------------------- */
+
+/*
+    This works under Solaris, SGI Irix, Linux, IBM RS 6000 (AIX), and Compaq
+    Alpha.  It might work on other Unix systems, too.  Includes both the "user
+    time" and the "system time".  The system time is the time spent by the
+    operating system on behalf of the process, and thus should be charged to
+    the process.
+*/
+
+#include <sys/time.h>
+#include <sys/resource.h>
+
+double umfpack_timer ( void )
+{
+    struct rusage ru ;
+    double user_time, sys_time ;
+
+    (void) getrusage (RUSAGE_SELF, &ru) ;
+
+    user_time =
+    ru.ru_utime.tv_sec			/* user time (seconds) */
+    + 1e-6 * ru.ru_utime.tv_usec ;	/* user time (microseconds) */
+
+    sys_time =
+    ru.ru_stime.tv_sec			/* system time (seconds) */
+    + 1e-6 * ru.ru_stime.tv_usec ;	/* system time (microseconds) */
+
+    return (user_time + sys_time) ;
+}
+
+#else
+
+/* -------------------------------------------------------------------------- */
+/* Generic ANSI C: use the ANSI clock function */
+/* -------------------------------------------------------------------------- */
+
+/* This is portable, but may overflow.  On Sun Solaris, when compiling in */
+/* 32-bit mode, the overflow occurs in only 2147 seconds (about 36 minutes). */
+
+#include <time.h>
+
+double umfpack_timer ( void )
+{
+    return (((double) (clock ( ))) / ((double) (CLOCKS_PER_SEC))) ;
+}
+
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_transpose.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,108 @@
+/* ========================================================================== */
+/* === UMFPACK_transpose ==================================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User callable.  Computes a permuted transpose, R = (A (P,Q))' in MATLAB
+    notation.  See umfpack_transpose.h for details.  A and R can be rectangular.
+    The matrix A may be singular.
+    The complex version can do transpose (') or array transpose (.').
+
+    Dynamic memory usage: A single call to UMF_malloc is made, for a workspace
+    of size max (n_row,n_col,1) * sizeof(Int).  This is then free'd on return,
+    via UMF_free.
+*/
+
+#include "umf_internal.h"
+#include "umf_transpose.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_transpose
+(
+    Int n_row,
+    Int n_col,
+    const Int Ap [ ],	/* size n_col+1 */
+    const Int Ai [ ],	/* size nz = Ap [n_col] */
+    const double Ax [ ], /* size nz, if present */
+#ifdef COMPLEX
+    const double Az [ ], /* size nz, if present */
+#endif
+
+    const Int P [ ],	/* P [k] = i means original row i is kth row in A(P,Q)*/
+			/* P is identity if not present */
+			/* size n_row, if present */
+
+    const Int Q [ ],	/* Q [k] = j means original col j is kth col in A(P,Q)*/
+			/* Q is identity if not present */
+			/* size n_col, if present */
+
+    Int Rp [ ],		/* size n_row+1 */
+    Int Ri [ ],		/* size nz */
+    double Rx [ ]	/* size nz, if present */
+#ifdef COMPLEX
+    , double Rz [ ]	/* size nz, if present */
+    , Int do_conjugate	/* if true, then to conjugate transpose */
+			/* otherwise, do array transpose */
+#endif
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int status, *W, nn ;
+
+#ifndef NDEBUG
+    init_count = UMF_malloc_count ;
+    UMF_dump_start ( ) ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* ---------------------------------------------------------------------- */
+
+    nn = MAX (n_row, n_col) ;
+    nn = MAX (nn, 1) ;
+    W = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+    if (!W)
+    {
+	DEBUGm4 (("out of memory: transpose work\n")) ;
+	ASSERT (UMF_malloc_count == init_count) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    ASSERT (UMF_malloc_count == init_count + 1) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* C = (A (P,Q))' or (A (P,Q)).' */
+    /* ---------------------------------------------------------------------- */
+
+    status = UMF_transpose (n_row, n_col, Ap, Ai, Ax, P, Q, n_col, Rp, Ri, Rx,
+	W, TRUE
+#ifdef COMPLEX
+	, Az, Rz, do_conjugate
+#endif
+	) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* free the workspace */
+    /* ---------------------------------------------------------------------- */
+
+    (void) UMF_free ((void *) W) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+
+    return (status) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/UMFPACK/UMFPACK/Source/umfpack_triplet_to_col.c	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,225 @@
+/* ========================================================================== */
+/* === UMFPACK_triplet_to_col =============================================== */
+/* ========================================================================== */
+
+/* -------------------------------------------------------------------------- */
+/* UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE Dept,   */
+/* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
+/* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
+/* -------------------------------------------------------------------------- */
+
+/*
+    User callable.  Converts triplet input to column-oriented form.  Duplicate
+    entries may exist (they are summed in the output).  The columns of the
+    column-oriented form are in sorted order.  The input is not modified.
+    Returns 1 if OK, 0 if an error occurred.  See umfpack_triplet_to_col.h for
+    details.
+
+    If Map is present (a non-NULL pointer to an Int array of size nz), then on
+    output it holds the position of the triplets in the column-form matrix.
+    That is, suppose p = Map [k], and the k-th triplet is i=Ti[k], j=Tj[k], and
+    aij=Tx[k].  Then i=Ai[p], and aij will have been summed into Ax[p].  Also,
+    Ap[j] <= p < Ap[j+1].  The Map array is not computed if it is (Int *) NULL.
+
+    Dynamic memory usage:
+
+	If numerical values are present, then one (two for complex version)
+	workspace of size (nz+1)*sizeof(double) is allocated via UMF_malloc.
+	Next, 4 calls to UMF_malloc are made to obtain workspace of size
+	((nz+1) + (n_row+1) + n_row + MAX (n_row,n_col)) * sizeof(Int).  All of
+	this workspace (4 to 6 objects) are free'd via UMF_free on return.
+
+	For the complex version, additional space is allocated.
+
+	An extra array of size nz*sizeof(Int) is allocated if Map is present.
+*/
+
+#include "umf_internal.h"
+#include "umf_malloc.h"
+#include "umf_free.h"
+#include "umf_triplet.h"
+
+#ifndef NDEBUG
+PRIVATE Int init_count ;
+#endif
+
+/* ========================================================================== */
+
+GLOBAL Int UMFPACK_triplet_to_col
+(
+    Int n_row,
+    Int n_col,
+    Int nz,
+    const Int Ti [ ],		/* size nz */
+    const Int Tj [ ],		/* size nz */
+    const double Tx [ ],	/* size nz */
+#ifdef COMPLEX
+    const double Tz [ ],	/* size nz */
+#endif
+    Int Ap [ ],			/* size n_col + 1 */
+    Int Ai [ ],			/* size nz */
+    double Ax [ ]		/* size nz */
+#ifdef COMPLEX
+    , double Az [ ]		/* size nz */
+#endif
+    , Int Map [ ]		/* size nz */
+)
+{
+
+    /* ---------------------------------------------------------------------- */
+    /* local variables */
+    /* ---------------------------------------------------------------------- */
+
+    Int *RowCount, *Rp, *Rj, *W, nn, do_values, do_map, *Map2, status ;
+    double *Rx ;
+#ifdef COMPLEX
+    double *Rz ;
+    Int split ;
+#endif
+
+#ifndef NDEBUG
+    UMF_dump_start ( ) ;
+    init_count = UMF_malloc_count ;
+#endif
+
+    /* ---------------------------------------------------------------------- */
+    /* check inputs */
+    /* ---------------------------------------------------------------------- */
+
+    if (!Ai || !Ap || !Ti || !Tj)
+    {
+	return (UMFPACK_ERROR_argument_missing) ;
+    }
+
+    if (n_row <= 0 || n_col <= 0)		/* must be > 0 */
+    {
+	return (UMFPACK_ERROR_n_nonpositive) ;
+    }
+
+    if (nz < 0)		/* nz must be >= 0 (singular matrices are OK) */
+    {
+	return (UMFPACK_ERROR_invalid_matrix) ;
+    }
+
+    nn = MAX (n_row, n_col) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* allocate workspace */
+    /* ---------------------------------------------------------------------- */
+
+    Rx = (double *) NULL ;
+
+    do_values = Ax && Tx ;
+
+    if (do_values)
+    {
+#ifdef COMPLEX
+	Rx = (double *) UMF_malloc (2*nz+2, sizeof (double)) ;
+	split = SPLIT (Tz) && SPLIT (Az) ;
+	if (split)
+	{
+	    Rz = Rx + nz ;
+	}
+	else
+	{
+	    Rz = (double *) NULL ;
+	}
+#else
+	Rx = (double *) UMF_malloc (nz+1, sizeof (double)) ;
+#endif
+	if (!Rx)
+	{
+	    DEBUGm4 (("out of memory: triplet work \n")) ;
+	    ASSERT (UMF_malloc_count == init_count) ;
+	    return (UMFPACK_ERROR_out_of_memory) ;
+	}
+    }
+
+    do_map = (Map != (Int *) NULL) ;
+    Map2 = (Int *) NULL ;
+    if (do_map)
+    {
+	DEBUG0 (("Do map:\n")) ;
+	Map2 = (Int *) UMF_malloc (nz+1, sizeof (Int)) ;
+	if (!Map2)
+	{
+	    DEBUGm4 (("out of memory: triplet map\n")) ;
+	    (void) UMF_free ((void *) Rx) ;
+	    ASSERT (UMF_malloc_count == init_count) ;
+	    return (UMFPACK_ERROR_out_of_memory) ;
+	}
+    }
+
+    Rj = (Int *) UMF_malloc (nz+1, sizeof (Int)) ;
+    Rp = (Int *) UMF_malloc (n_row+1, sizeof (Int)) ;
+    RowCount = (Int *) UMF_malloc (n_row, sizeof (Int)) ;
+    W = (Int *) UMF_malloc (nn, sizeof (Int)) ;
+    if (!Rj || !Rp || !RowCount || !W)
+    {
+	DEBUGm4 (("out of memory: triplet work (int)\n")) ;
+	(void) UMF_free ((void *) Rx) ;
+	(void) UMF_free ((void *) Map2) ;
+	(void) UMF_free ((void *) Rp) ;
+	(void) UMF_free ((void *) Rj) ;
+	(void) UMF_free ((void *) RowCount) ;
+	(void) UMF_free ((void *) W) ;
+	ASSERT (UMF_malloc_count == init_count) ;
+	return (UMFPACK_ERROR_out_of_memory) ;
+    }
+
+    ASSERT (UMF_malloc_count == init_count + 4 +
+	(Rx != (double *) NULL) + do_map) ;
+
+    /* ---------------------------------------------------------------------- */
+    /* convert from triplet to column form */
+    /* ---------------------------------------------------------------------- */
+
+    if (do_map)
+    {
+	if (do_values)
+	{
+	    status = UMF_triplet_map_x (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp,
+		Rj, W, RowCount, Tx, Ax, Rx
+#ifdef COMPLEX
+		, Tz, Az, Rz
+#endif
+		, Map, Map2) ;
+	}
+	else
+	{
+	    status = UMF_triplet_map_nox (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp,
+		Rj, W, RowCount, Map, Map2) ;
+	}
+    }
+    else
+    {
+	if (do_values)
+	{
+	    status = UMF_triplet_nomap_x (n_row, n_col, nz, Ti, Tj, Ap, Ai, Rp,
+		Rj, W, RowCount , Tx, Ax, Rx
+#ifdef COMPLEX
+		, Tz, Az, Rz
+#endif
+		) ;
+	}
+	else
+	{
+	    status = UMF_triplet_nomap_nox (n_row, n_col, nz, Ti, Tj, Ap, Ai,
+		Rp, Rj, W, RowCount) ;
+	}
+    }
+
+    /* ---------------------------------------------------------------------- */
+    /* free the workspace */
+    /* ---------------------------------------------------------------------- */
+
+    (void) UMF_free ((void *) Rx) ;
+    (void) UMF_free ((void *) Map2) ;
+    (void) UMF_free ((void *) Rp) ;
+    (void) UMF_free ((void *) Rj) ;
+    (void) UMF_free ((void *) RowCount) ;
+    (void) UMF_free ((void *) W) ;
+    ASSERT (UMF_malloc_count == init_count) ;
+
+    return (status) ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/boolSparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,268 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+#include <vector>
+
+#include "config.h"
+#include "quit.h"
+#include "lo-ieee.h"
+#include "lo-mappers.h"
+
+#include "boolSparse.h"
+
+// SparseBoolMatrix class.
+
+bool
+SparseBoolMatrix::operator == (const SparseBoolMatrix& a) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  int nr_a = a.rows ();
+  int nc_a = a.cols ();
+  int nz_a = a.nnz ();
+
+  if (nr != nr_a || nc != nc_a || nz != nz_a)
+    return false;
+
+  for (int i = 0; i < nc + 1; i++)
+    if (cidx(i) != a.cidx(i))
+	return false;
+
+  for (int i = 0; i < nz; i++)
+    if (data(i) != a.data(i) || ridx(i) != a.ridx(i))
+      return false;
+
+  return true;
+}
+
+bool
+SparseBoolMatrix::operator != (const SparseBoolMatrix& a) const
+{
+  return !(*this == a);
+}
+
+SparseBoolMatrix&
+SparseBoolMatrix::insert (const SparseBoolMatrix& a, int r, int c)
+{
+  Sparse<bool>::insert (a, r, c);
+  return *this;
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::concat (const SparseBoolMatrix& rb, const Array<int>& ra_idx)
+{
+  // Don't use numel to avoid all possiblity of an overflow
+  if (rb.rows () > 0 && rb.cols () > 0)
+    insert (rb, ra_idx(0), ra_idx(1));
+  return *this;
+}
+
+// unary operations
+
+SparseBoolMatrix
+SparseBoolMatrix::operator ! (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz1 = nnz ();
+  int nz2 = nr*nc - nz1;
+   
+  SparseBoolMatrix r (nr, nc, nz2);
+   
+  int ii = 0;
+  int jj = 0;
+  for (int i = 0; i < nc; i++)
+    {
+      for (int j = 0; j < nr; j++)
+	{
+	  if (jj < cidx(i+1) && ridx(jj) == j)
+	    jj++;
+	  else
+	    {
+	      r.data(ii) = true;
+	      r.ridx(ii++) = j;
+	    }
+	}
+      r.cidx (i) = ii;
+    }
+
+  return r;
+}
+
+// other operations
+
+// XXX FIXME XXX Do these really belong here?  Maybe they should be
+// in a base class?
+
+SparseBoolMatrix
+SparseBoolMatrix::all (int dim) const
+{
+  SPARSE_ALL_OP (dim);
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::any (int dim) const
+{
+  SPARSE_ANY_OP (dim);
+}
+
+boolMatrix
+SparseBoolMatrix::matrix_value (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+
+  boolMatrix retval (nr, nc, false);
+  for (int j = 0; j < nc; j++)
+    for (int i = cidx(j); i < cidx(j+1); i++)
+      retval.elem (ridx(i), j) = data (i);
+
+  return retval;
+}
+
+std::ostream&
+operator << (std::ostream& os, const SparseBoolMatrix& a)
+{
+  int nc = a.cols ();
+
+   // add one to the printed indices to go from
+   //  zero-based to one-based arrays
+   for (int j = 0; j < nc; j++)  
+     {
+       OCTAVE_QUIT;
+       for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+	 os << a.ridx(i) + 1 << " "  << j + 1 << " " << a.data(i) << "\n";
+     }
+   
+  return os;
+}
+
+std::istream&
+operator >> (std::istream& is, SparseBoolMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+
+  if (nr < 1 || nc < 1)
+    is.clear (std::ios::badbit);
+  else
+    {
+      int itmp, jtmp, jold = 0;
+      bool tmp;
+      int ii = 0;
+       
+      a.cidx (0) = 0;
+      for (int i = 0; i < nz; i++)
+	{
+	  is >> itmp;
+	  itmp--;
+	  is >> jtmp;
+	  jtmp--;
+	  is >> tmp;
+	  if (is)
+	    {
+	      if (jold != jtmp)
+		{
+		  for (int j = jold; j < jtmp; j++)
+		    a.cidx(j+1) = ii;
+		  
+		  jold = jtmp;
+		}
+	      a.data (ii) = tmp;
+	      a.ridx (ii++) = itmp;
+	    }
+	  else
+	    goto done;
+	}
+
+      for (int j = jold; j < nc; j++)
+	a.cidx(j+1) = ii;
+    }
+
+ done:
+
+  return is;
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::squeeze (void) const 
+{ 
+  return Sparse<bool>::squeeze (); 
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::index (idx_vector& i, int resize_ok) const 
+{ 
+  return Sparse<bool>::index (i, resize_ok); 
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const 
+{ 
+  return Sparse<bool>::index (i, j, resize_ok); 
+}
+  
+SparseBoolMatrix
+SparseBoolMatrix::index (Array<idx_vector>& ra_idx, int resize_ok) const 
+{ 
+  return Sparse<bool>::index (ra_idx, resize_ok); 
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::reshape (const dim_vector& new_dims) const
+{
+  return Sparse<bool>::reshape (new_dims);
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::permute (const Array<int>& vec, bool inv) const
+{
+  return Sparse<bool>::permute (vec, inv);
+}
+
+SparseBoolMatrix
+SparseBoolMatrix::ipermute (const Array<int>& vec) const
+{
+  return Sparse<bool>::ipermute (vec);
+}
+
+SPARSE_SMS_EQNE_OPS (SparseBoolMatrix, false, , bool, false, )
+SPARSE_SMS_BOOL_OPS (SparseBoolMatrix, bool, false)
+
+SPARSE_SSM_EQNE_OPS (bool, false, , SparseBoolMatrix, false, )
+SPARSE_SSM_BOOL_OPS (bool, SparseBoolMatrix, false)
+
+SPARSE_SMSM_EQNE_OPS (SparseBoolMatrix, false, , SparseBoolMatrix, false, )
+SPARSE_SMSM_BOOL_OPS (SparseBoolMatrix, SparseBoolMatrix, false)
+
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/boolSparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,129 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_boolSparse_h)
+#define octave_boolSparse_h 1
+
+#include "Sparse.h"
+#include "MSparse-defs.h"
+#include "Sparse-op-defs.h"
+
+class
+SparseBoolMatrix : public Sparse<bool>
+{
+public:
+
+  SparseBoolMatrix (void) : Sparse<bool> () { }
+
+  SparseBoolMatrix (int r, int c) : Sparse<bool> (r, c) { }
+
+  explicit SparseBoolMatrix (int r, int c, bool val) 
+    : Sparse<bool> (r, c, val) { }
+
+  SparseBoolMatrix (const Sparse<bool>& a) : Sparse<bool> (a) { }
+
+  SparseBoolMatrix (const SparseBoolMatrix& a) : Sparse<bool> (a) { }
+
+  SparseBoolMatrix (const SparseBoolMatrix& a, const dim_vector& dv) 
+    : Sparse<bool> (a, dv) { }
+
+  explicit SparseBoolMatrix (const boolMatrix& a) : Sparse<bool> (a) { }
+
+  explicit SparseBoolMatrix (const boolNDArray& a) : Sparse<bool> (a) { }
+
+  explicit SparseBoolMatrix (const Array<bool> a, const Array<int>& r, 
+			     const Array<int>& c, int nr = -1, 
+			     int nc = -1, bool sum_terms = true)
+    : Sparse<bool> (a, r, c, nr, nc, sum_terms) { }
+
+  explicit SparseBoolMatrix (const Array<bool> a, const Array<double>& r, 
+			     const Array<double>& c, int nr = -1, 
+			     int nc = -1, bool sum_terms = true)
+    : Sparse<bool> (a, r, c, nr, nc, sum_terms) { }
+
+  SparseBoolMatrix (int r, int c, int num_nz) : Sparse<bool> (r, c, num_nz) { }
+
+  SparseBoolMatrix& operator = (const SparseBoolMatrix& a)
+    {
+      Sparse<bool>::operator = (a);
+      return *this;
+    }
+
+  bool operator == (const SparseBoolMatrix& a) const;
+  bool operator != (const SparseBoolMatrix& a) const;
+
+  SparseBoolMatrix transpose (void) const 
+    { return Sparse<bool>::transpose (); }
+
+  // destructive insert/delete/reorder operations
+
+  SparseBoolMatrix& insert (const SparseBoolMatrix& a, int r, int c);
+
+  SparseBoolMatrix concat (const SparseBoolMatrix& rb, 
+			   const Array<int>& ra_idx);
+
+  boolMatrix matrix_value (void) const;
+
+  SparseBoolMatrix squeeze (void) const;
+
+  SparseBoolMatrix index (idx_vector& i, int resize_ok) const;
+
+  SparseBoolMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const;
+  
+  SparseBoolMatrix index (Array<idx_vector>& ra_idx, int resize_ok) const;
+
+  SparseBoolMatrix reshape (const dim_vector& new_dims) const;
+
+  SparseBoolMatrix permute (const Array<int>& vec, bool inv = false) const;
+
+  SparseBoolMatrix ipermute (const Array<int>& vec) const;
+
+  // unary operations
+
+  SparseBoolMatrix operator ! (void) const;
+
+  // other operations
+
+  SparseBoolMatrix all (int dim = -1) const;
+  SparseBoolMatrix any (int dim = -1) const;
+
+  // i/o
+
+  friend std::ostream& operator << (std::ostream& os, const SparseBoolMatrix& a);
+  friend std::istream& operator >> (std::istream& is, SparseBoolMatrix& a);
+};
+
+SPARSE_SMS_EQNE_OP_DECLS (SparseBoolMatrix, bool)
+SPARSE_SMS_BOOL_OP_DECLS (SparseBoolMatrix, bool)
+
+SPARSE_SSM_EQNE_OP_DECLS (bool, SparseBoolMatrix)
+SPARSE_SSM_BOOL_OP_DECLS (bool, SparseBoolMatrix)
+
+SPARSE_SMSM_EQNE_OP_DECLS (SparseBoolMatrix, SparseBoolMatrix)
+SPARSE_SMSM_BOOL_OP_DECLS (SparseBoolMatrix, SparseBoolMatrix)
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/liboctave/dNDArray.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/dNDArray.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -26,6 +26,7 @@
 #endif
 
 #include <cfloat>
+
 #include <vector>
 
 #include "Array-util.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/dSparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,6713 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cfloat>
+
+#include <iostream>
+#include <vector>
+
+#include "quit.h"
+#include "lo-ieee.h"
+#include "lo-mappers.h"
+#include "f77-fcn.h"
+#include "dRowVector.h"
+
+#include "CSparse.h"
+#include "boolSparse.h"
+#include "dSparse.h"
+#include "oct-spparms.h"
+#include "SparsedbleLU.h"
+#include "SparseType.h"
+
+// External UMFPACK functions in C
+extern "C" {
+#include "umfpack.h"
+}
+
+// Fortran functions we call.
+extern "C"
+{
+  F77_RET_T
+  F77_FUNC (dgbtrf, DGBTRF) (const int&, const int&, const int&, 
+			     const int&, double*, const int&, int*, int&);
+
+  F77_RET_T
+  F77_FUNC (dgbtrs, DGBTRS) (F77_CONST_CHAR_ARG_DECL, const int&,
+			     const int&, const int&, const int&, 
+			     const double*, const int&,
+			     const int*, double*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (dgbcon, DGBCON) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, const int&, double*, 
+			     const int&, const int*, const double&, 
+			     double&, double*, int*, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (dpbtrf, DPBTRF) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, double*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (dpbtrs, DPBTRS) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, const int&, double*, const int&, 
+			     double*, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (dpbcon, DPBCON) (F77_CONST_CHAR_ARG_DECL, const int&, 
+			     const int&, double*, const int&, 
+			     const double&, double&, double*, int*, int&
+			     F77_CHAR_ARG_LEN_DECL);
+  F77_RET_T
+  F77_FUNC (dptsv, DPTSV) (const int&, const int&, double*, double*,
+			   double*, const int&, int&);
+
+  F77_RET_T
+  F77_FUNC (dgtsv, DGTSV) (const int&, const int&, double*, double*,
+			   double*, double*, const int&, int&);
+
+  F77_RET_T
+  F77_FUNC (dgttrf, DGTTRF) (const int&, double*, double*, double*, double*,
+			     int*, int&);
+
+  F77_RET_T
+  F77_FUNC (dgttrs, DGTTRS) (F77_CONST_CHAR_ARG_DECL, const int&,
+			     const int&, const double*, const double*,
+			     const double*, const double*, const int*,
+			     double *, const int&, int&
+			     F77_CHAR_ARG_LEN_DECL);
+
+  F77_RET_T
+  F77_FUNC (zptsv, ZPTSV) (const int&, const int&, Complex*, Complex*,
+			   Complex*, const int&, int&);
+
+  F77_RET_T
+  F77_FUNC (zgtsv, ZGTSV) (const int&, const int&, Complex*, Complex*,
+			   Complex*, Complex*, const int&, int&);
+
+}
+
+SparseMatrix::SparseMatrix (const SparseBoolMatrix &a)
+  : MSparse<double> (a.rows (), a.cols (), a.nnz ())
+{
+  int nc = cols ();
+  int nz = nnz ();
+
+  for (int i = 0; i < nc + 1; i++)
+    cidx (i) = a.cidx (i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      data (i) = a.data (i);
+      ridx (i) = a.ridx (i);
+    }
+}
+
+bool
+SparseMatrix::operator == (const SparseMatrix& a) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  int nr_a = a.rows ();
+  int nc_a = a.cols ();
+  int nz_a = a.nnz ();
+
+  if (nr != nr_a || nc != nc_a || nz != nz_a)
+    return false;
+
+  for (int i = 0; i < nc + 1; i++)
+    if (cidx(i) != a.cidx(i))
+	return false;
+
+  for (int i = 0; i < nz; i++)
+    if (data(i) != a.data(i) || ridx(i) != a.ridx(i))
+      return false;
+
+  return true;
+}
+
+bool
+SparseMatrix::operator != (const SparseMatrix& a) const
+{
+  return !(*this == a);
+}
+
+bool
+SparseMatrix::is_symmetric (void) const
+{
+  if (is_square () && rows () > 0)
+    {
+      for (int i = 0; i < rows (); i++)
+	for (int j = i+1; j < cols (); j++)
+	  if (elem (i, j) != elem (j, i))
+	    return false;
+
+      return true;
+    }
+
+  return false;
+}
+
+SparseMatrix&
+SparseMatrix::insert (const SparseMatrix& a, int r, int c)
+{
+  MSparse<double>::insert (a, r, c);
+  return *this;
+}
+
+SparseMatrix
+SparseMatrix::max (int dim) const
+{
+  Array2<int> dummy_idx;
+  return max (dummy_idx, dim);
+}
+
+SparseMatrix
+SparseMatrix::max (Array2<int>& idx_arg, int dim) const
+{
+  SparseMatrix result;
+  dim_vector dv = dims ();
+
+  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
+    return result;
+ 
+  int nr = dv(0);
+  int nc = dv(1);
+
+  if (dim == 0)
+    {
+      idx_arg.resize (1, nc);
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  double tmp_max = octave_NaN;
+	  int idx_j = 0;
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      if (ridx(i) != idx_j)
+		break;
+	      else
+		idx_j++;
+	    }
+
+	  if (idx_j != nr)
+	    tmp_max = 0.;
+
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      double tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (octave_is_NaN_or_NA (tmp_max) || tmp > tmp_max)
+		{
+		  idx_j = ridx (i);
+		  tmp_max = tmp;
+		}
+
+	    }
+
+ 	  idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_max) ? 0 : idx_j;
+	  if (tmp_max != 0.)
+	    nel++;
+	}
+
+      result = SparseMatrix (1, nc, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  double tmp = elem (idx_arg(j), j);
+	  if (tmp != 0.)
+	    {
+	      result.xdata (ii) = tmp;
+	      result.xridx (ii++) = 0;
+	    }
+	  result.xcidx (j+1) = ii;
+
+	}
+    }
+  else
+    {
+      idx_arg.resize (nr, 1, 0);
+
+      for (int i = cidx(0); i < cidx(1); i++)
+	idx_arg.elem(ridx(i)) = -1;
+
+      for (int j = 0; j < nc; j++)
+	for (int i = 0; i < nr; i++)
+	  {
+	    if (idx_arg.elem(i) != -1)
+	      continue;
+	    bool found = false;
+	    for (int k = cidx(j); k < cidx(j+1); k++)
+	      if (ridx(k) == i)
+		{
+		  found = true;
+		  break;
+		}
+	    
+	    if (!found)
+	      idx_arg.elem(i) = j;
+
+	  }
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      int ir = ridx (i);
+	      int ix = idx_arg.elem (ir);
+	      double tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (ix == -1 || tmp > elem (ir, ix))
+		idx_arg.elem (ir) = j;
+	    }
+	}
+
+      int nel = 0;
+      for (int j = 0; j < nr; j++)
+	if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.)
+	  nel++;
+
+      result = SparseMatrix (nr, 1, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      result.xcidx (1) = nel;
+      for (int j = 0; j < nr; j++)
+	{
+	  if (idx_arg(j) == -1)
+	    {
+	      idx_arg(j) = 0;
+	      result.xdata (ii) = octave_NaN;
+	      result.xridx (ii++) = j;
+	    }
+	  else
+	    {
+	      double tmp = elem (j, idx_arg(j));
+	      if (tmp != 0.)
+		{
+		  result.xdata (ii) = tmp;
+		  result.xridx (ii++) = j;
+		}
+	    }
+	}
+    }
+
+  return result;
+}
+
+SparseMatrix
+SparseMatrix::min (int dim) const
+{
+  Array2<int> dummy_idx;
+  return min (dummy_idx, dim);
+}
+
+SparseMatrix
+SparseMatrix::min (Array2<int>& idx_arg, int dim) const
+{
+  SparseMatrix result;
+  dim_vector dv = dims ();
+
+  if (dv.numel () == 0 || dim > dv.length () || dim < 0)
+    return result;
+ 
+  int nr = dv(0);
+  int nc = dv(1);
+
+  if (dim == 0)
+    {
+      idx_arg.resize (1, nc);
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  double tmp_min = octave_NaN;
+	  int idx_j = 0;
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      if (ridx(i) != idx_j)
+		break;
+	      else
+		idx_j++;
+	    }
+
+	  if (idx_j != nr)
+	    tmp_min = 0.;
+
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      double tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (octave_is_NaN_or_NA (tmp_min) || tmp < tmp_min)
+		{
+		  idx_j = ridx (i);
+		  tmp_min = tmp;
+		}
+
+	    }
+
+ 	  idx_arg.elem (j) = octave_is_NaN_or_NA (tmp_min) ? 0 : idx_j;
+	  if (tmp_min != 0.)
+	    nel++;
+	}
+
+      result = SparseMatrix (1, nc, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  double tmp = elem (idx_arg(j), j);
+	  if (tmp != 0.)
+	    {
+	      result.xdata (ii) = tmp;
+	      result.xridx (ii++) = 0;
+	    }
+	  result.xcidx (j+1) = ii;
+
+	}
+    }
+  else
+    {
+      idx_arg.resize (nr, 1, 0);
+
+      for (int i = cidx(0); i < cidx(1); i++)
+	idx_arg.elem(ridx(i)) = -1;
+
+      for (int j = 0; j < nc; j++)
+	for (int i = 0; i < nr; i++)
+	  {
+	    if (idx_arg.elem(i) != -1)
+	      continue;
+	    bool found = false;
+	    for (int k = cidx(j); k < cidx(j+1); k++)
+	      if (ridx(k) == i)
+		{
+		  found = true;
+		  break;
+		}
+	    
+	    if (!found)
+	      idx_arg.elem(i) = j;
+
+	  }
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      int ir = ridx (i);
+	      int ix = idx_arg.elem (ir);
+	      double tmp = data (i);
+
+	      if (octave_is_NaN_or_NA (tmp))
+		continue;
+	      else if (ix == -1 || tmp < elem (ir, ix))
+		idx_arg.elem (ir) = j;
+	    }
+	}
+
+      int nel = 0;
+      for (int j = 0; j < nr; j++)
+	if (idx_arg.elem(j) == -1 || elem (j, idx_arg.elem (j)) != 0.)
+	  nel++;
+
+      result = SparseMatrix (nr, 1, nel);
+
+      int ii = 0;
+      result.xcidx (0) = 0;
+      result.xcidx (1) = nel;
+      for (int j = 0; j < nr; j++)
+	{
+	  if (idx_arg(j) == -1)
+	    {
+	      idx_arg(j) = 0;
+	      result.xdata (ii) = octave_NaN;
+	      result.xridx (ii++) = j;
+	    }
+	  else
+	    {
+	      double tmp = elem (j, idx_arg(j));
+	      if (tmp != 0.)
+		{
+		  result.xdata (ii) = tmp;
+		  result.xridx (ii++) = j;
+		}
+	    }
+	}
+    }
+
+  return result;
+}
+
+SparseMatrix
+SparseMatrix::concat (const SparseMatrix& rb, const Array<int>& ra_idx)
+{
+  // Don't use numel to avoid all possiblity of an overflow
+  if (rb.rows () > 0 && rb.cols () > 0)
+    insert (rb, ra_idx(0), ra_idx(1));
+  return *this;
+}
+
+SparseComplexMatrix
+SparseMatrix::concat (const SparseComplexMatrix& rb, const Array<int>& ra_idx)
+{
+  SparseComplexMatrix retval (*this);
+  if (rb.rows () > 0 && rb.cols () > 0)
+    retval.insert (rb, ra_idx(0), ra_idx(1));
+  return retval;
+}
+
+SparseMatrix
+real (const SparseComplexMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+  SparseMatrix r (nr, nc, nz);
+
+  for (int i = 0; i < nc +1; i++)
+    r.cidx(i) = a.cidx(i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      r.data(i) = real (a.data(i));
+      r.ridx(i) = a.ridx(i);
+    }
+
+  return r;
+}
+
+SparseMatrix
+imag (const SparseComplexMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+  SparseMatrix r (nr, nc, nz);
+
+  for (int i = 0; i < nc +1; i++)
+    r.cidx(i) = a.cidx(i);
+
+  for (int i = 0; i < nz; i++)
+    {
+      r.data(i) = imag (a.data(i));
+      r.ridx(i) = a.ridx(i);
+    }
+
+  return r;
+}
+
+SparseMatrix 
+atan2 (const double& x, const SparseMatrix& y)
+{
+  int nr = y.rows ();
+  int nc = y.cols ();
+
+  if (x == 0.)
+    return SparseMatrix (nr, nc);
+  else
+    {
+      // Its going to be basically full, so this is probably the
+      // best way to handle it.
+      Matrix tmp (nr, nc, atan2 (x, 0.));
+
+      for (int j = 0; j < nc; j++)
+	for (int i = y.cidx (j); i < y.cidx (j+1); i++)
+	  tmp.elem (y.ridx(i), j) = atan2 (x, y.data(i));
+
+      return SparseMatrix (tmp);
+    }
+}
+
+SparseMatrix 
+atan2 (const SparseMatrix& x, const double& y)
+{
+  int nr = x.rows ();
+  int nc = x.cols ();
+  int nz = x.nnz ();
+
+  SparseMatrix retval (nr, nc, nz);
+
+  int ii = 0;
+  retval.xcidx(0) = 0;
+  for (int i = 0; i < nc; i++)
+    {
+      for (int j = x.cidx(i); j < x.cidx(i+1); j++)
+	{
+	  double tmp = atan2 (x.data(j), y);
+	  if (tmp != 0.)
+	    {
+	      retval.xdata (ii) = tmp;
+	      retval.xridx (ii++) = x.ridx (j);
+	    }
+	}
+      retval.xcidx (i+1) = ii;
+    }
+
+  if (ii != nz)
+    {
+      SparseMatrix retval2 (nr, nc, ii);
+      for (int i = 0; i < nc+1; i++)
+	retval2.xcidx (i) = retval.cidx (i);
+      for (int i = 0; i < ii; i++)
+	{
+	  retval2.xdata (i) = retval.data (i);
+	  retval2.xridx (i) = retval.ridx (i);
+	}
+      return retval2;
+    }
+  else
+    return retval;
+}
+
+SparseMatrix 
+atan2 (const SparseMatrix& x, const SparseMatrix& y)
+{
+  SparseMatrix r;
+
+  if ((x.rows() == y.rows()) && (x.cols() == y.cols())) 
+    {
+      int x_nr = x.rows ();
+      int x_nc = x.cols ();
+
+      int y_nr = y.rows ();
+      int y_nc = y.cols ();
+
+      if (x_nr != y_nr || x_nc != y_nc)
+	gripe_nonconformant ("atan2", x_nr, x_nc, y_nr, y_nc);
+      else
+	{
+	  r = SparseMatrix (x_nr, x_nc, (x.nnz () + y.nnz ()));
+       
+	  int jx = 0;
+	  r.cidx (0) = 0;
+	  for (int i = 0 ; i < x_nc ; i++)
+	    {
+	      int  ja = x.cidx(i);
+	      int  ja_max = x.cidx(i+1);
+	      bool ja_lt_max= ja < ja_max;
+           
+	      int  jb = y.cidx(i);
+	      int  jb_max = y.cidx(i+1);
+	      bool jb_lt_max = jb < jb_max;
+           
+	      while (ja_lt_max || jb_lt_max )
+		{
+		  OCTAVE_QUIT;
+		  if ((! jb_lt_max) ||
+                      (ja_lt_max && (x.ridx(ja) < y.ridx(jb))))
+		    {
+		      r.ridx(jx) = x.ridx(ja);
+		      r.data(jx) = atan2 (x.data(ja), 0.);
+		      jx++;
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		    }
+		  else if (( !ja_lt_max ) ||
+			   (jb_lt_max && (y.ridx(jb) < x.ridx(ja)) ) )
+		    {
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		  else
+		    {
+		      double tmp = atan2 (x.data(ja), y.data(jb));
+		      if (tmp != 0.)
+			{
+                          r.data(jx) = tmp;
+                          r.ridx(jx) = x.ridx(ja);
+                          jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		}
+	      r.cidx(i+1) = jx;
+	    }
+	  
+	  r.maybe_compress ();
+	}
+    }
+  else
+    (*current_liboctave_error_handler) ("matrix size mismatch");
+
+  return r;
+}
+
+SparseMatrix
+SparseMatrix::inverse (void) const
+{
+  int info;
+  double rcond;
+  return inverse (info, rcond, 0, 0);
+}
+
+SparseMatrix
+SparseMatrix::inverse (int& info) const
+{
+  double rcond;
+  return inverse (info, rcond, 0, 0);
+}
+
+SparseMatrix
+SparseMatrix::inverse (int& info, double& rcond, int force, int calc_cond) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseMatrix::inverse not implemented yet");
+  return SparseMatrix ();
+}
+
+DET
+SparseMatrix::determinant (void) const
+{
+  int info;
+  double rcond;
+  return determinant (info, rcond, 0);
+}
+
+DET
+SparseMatrix::determinant (int& info) const
+{
+  double rcond;
+  return determinant (info, rcond, 0);
+}
+
+DET
+SparseMatrix::determinant (int& err, double& rcond, int) const
+{
+  DET retval;
+
+  int nr = rows ();
+  int nc = cols ();
+
+  if (nr == 0 || nc == 0 || nr != nc)
+    {
+      double d[2];
+      d[0] = 1.0;
+      d[1] = 0.0;
+      retval = DET (d);
+    }
+  else
+    {
+      err = 0;
+
+      // Setup the control parameters
+      Matrix Control (UMFPACK_CONTROL, 1);
+      double *control = Control.fortran_vec ();
+      umfpack_di_defaults (control);
+
+      double tmp = Voctave_sparse_controls.get_key ("spumoni");
+      if (!xisnan (tmp))
+	Control (UMFPACK_PRL) = tmp;
+
+      tmp = Voctave_sparse_controls.get_key ("piv_tol");
+      if (!xisnan (tmp))
+	{
+	  Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+	  Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+	}
+
+      // Set whether we are allowed to modify Q or not
+      tmp = Voctave_sparse_controls.get_key ("autoamd");
+      if (!xisnan (tmp))
+	Control (UMFPACK_FIXQ) = tmp;
+
+      // Turn-off UMFPACK scaling for LU 
+      Control (UMFPACK_SCALE) = UMFPACK_SCALE_NONE;
+
+      umfpack_di_report_control (control);
+
+      const int *Ap = cidx ();
+      const int *Ai = ridx ();
+      const double *Ax = data ();
+
+      umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control);
+
+      void *Symbolic;
+      Matrix Info (1, UMFPACK_INFO);
+      double *info = Info.fortran_vec ();
+      int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL,
+					 &Symbolic, control, info);
+
+      if (status < 0)
+	{
+	  (*current_liboctave_error_handler) 
+	    ("SparseMatrix::determinant symbolic factorization failed");
+
+	  umfpack_di_report_status (control, status);
+	  umfpack_di_report_info (control, info);
+
+	  umfpack_di_free_symbolic (&Symbolic) ;
+	}
+      else
+	{
+	  umfpack_di_report_symbolic (Symbolic, control);
+
+	  void *Numeric;
+	  status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+				       control, info) ;
+	  umfpack_di_free_symbolic (&Symbolic) ;
+
+	  rcond = Info (UMFPACK_RCOND);
+
+	  if (status < 0)
+	    {
+	      (*current_liboctave_error_handler) 
+		("SparseMatrix::determinant numeric factorization failed");
+
+	      umfpack_di_report_status (control, status);
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	  else
+	    {
+	      umfpack_di_report_numeric (Numeric, control);
+
+	      double d[2];
+
+	      status = umfpack_di_get_determinant (&d[0], &d[1], Numeric,
+						   info);
+
+	      if (status < 0)
+		{
+		  (*current_liboctave_error_handler) 
+		    ("SparseMatrix::determinant error calculating determinant");
+		  
+		  umfpack_di_report_status (control, status);
+		  umfpack_di_report_info (control, info);
+
+		  umfpack_di_free_numeric (&Numeric);
+		}
+	      else
+		retval = DET (d);
+	    }
+	}
+    }
+
+  return retval;
+}
+
+Matrix
+SparseMatrix::dsolve (SparseType &mattype, const Matrix& b, int& err, 
+		      double& rcond, solve_singularity_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  retval.resize (b.rows (), b.cols());
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(i,j) / data (i);
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(ridx(i),j) / data (i);
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = fabs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::dsolve (SparseType &mattype, const SparseMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseMatrix (b_nr, b_nc, b_nz);
+
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		  {
+		    retval.xridx (ii) = b.ridx(i);
+		    retval.xdata (ii++) = b.data(i) / data (b.ridx (i));
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = 0; i < nr; i++)
+		  {
+		    bool found = false;
+		    int k;
+		    for (k = b.cidx(j); k < b.cidx(j+1); k++)
+		      if (ridx(i) == b.ridx(k))
+			{
+			  found = true;
+			  break;
+			}
+		    if (found)
+		      {
+			retval.xridx (ii) = i;
+			retval.xdata (ii++) = b.data(k) / data (i);
+		      }
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = fabs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::dsolve (SparseType &mattype, const ComplexMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  retval.resize (b.rows (), b.cols());
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(i,j) / data (i);
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      for (int i = 0; i < nr; i++)
+		retval(i,j) = b(ridx(i),j) / data (i);
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = fabs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::dsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Diagonal ||
+	  typ == SparseType::Permuted_Diagonal)
+	{
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  if (typ == SparseType::Diagonal)
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		  {
+		    retval.xridx (ii) = b.ridx(i);
+		    retval.xdata (ii++) = b.data(i) / data (b.ridx (i));
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	  else
+	    for (int j = 0; j < b.cols(); j++)
+	      {
+		for (int i = 0; i < nr; i++)
+		  {
+		    bool found = false;
+		    int k;
+		    for (k = b.cidx(j); k < b.cidx(j+1); k++)
+		      if (ridx(i) == b.ridx(k))
+			{
+			  found = true;
+			  break;
+			}
+		    if (found)
+		      {
+			retval.xridx (ii) = i;
+			retval.xdata (ii++) = b.data(k) / data (i);
+		      }
+		  }
+		retval.xcidx(j+1) = ii;
+	      }
+	    
+	  double dmax = 0., dmin = octave_Inf; 
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = fabs(data(i));
+	      if (tmp > dmax)
+		dmax = tmp;
+	      if (tmp < dmin)
+		dmin = tmp;
+	    }
+	  rcond = dmin / dmax;
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+Matrix
+SparseMatrix::utsolve (SparseType &mattype, const Matrix& b, int& err, 
+		       double& rcond,
+		       solve_singularity_handler sing_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_cols = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+		(*current_liboctave_warning_handler)
+		  ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      double *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = x_vec[k+offset] / 
+			    data(cidx(k+1)-1);
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::utsolve (SparseType &mattype, const SparseMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::utsolve (SparseType &mattype, const ComplexMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_nc = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work2[iidx] != 0.)
+			{
+			  double tmp = work2[iidx] / data(cidx(iidx+1)-1);
+			  work2[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work2[idx2] = work2[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k+1)-1);
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::utsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Upper ||
+	  typ == SparseType::Upper)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Upper)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx+1)-1) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[q_perm[j]] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work2[iidx] != 0.)
+			{
+			  double tmp = work2[iidx] / data(cidx(iidx+1)-1);
+			  work2[iidx] = tmp;
+			  for (int i = cidx(iidx); i < cidx(iidx+1)-1; i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work2[idx2] = work2[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = nr-1; k >= 0; k--)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k+1)-1) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k+1)-1);
+			  work[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[j] = 1.;
+
+		  for (int k = j; k >= 0; k--)
+		    {
+		      if (work2[k] != 0.)
+			{
+			  double tmp = work2[k] / data(cidx(k+1)-1);
+			  work2[k] = tmp;
+			  for (int i = cidx(k); i < cidx(k+1)-1; i++)
+			    {
+			      int iidx = ridx(i);
+			      work2[iidx] = work2[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+Matrix
+SparseMatrix::ltsolve (SparseType &mattype, const Matrix& b, int& err, 
+		       double& rcond,
+		       solve_singularity_handler sing_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_cols = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+		(*current_liboctave_warning_handler)
+		  ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      double *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_cols; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = x_vec[k+offset] / 
+			    data(cidx(k));
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::ltsolve (SparseType &mattype, const SparseMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+		(*current_liboctave_warning_handler)
+		  ("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work[iidx] != 0.)
+			{
+			  double tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  double tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::ltsolve (SparseType &mattype, const ComplexMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  int b_nc = b.cols ();
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      retval.resize (b.rows (), b.cols ());
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = b(i,j);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    retval (i, j) = work[p_perm[i]];
+
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work2[iidx] != 0.)
+			{
+			  double tmp = work2[iidx] / data(cidx(iidx+1)-1);
+			  work2[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work2[idx2] = work2[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      retval = b;
+	      Complex *x_vec = retval.fortran_vec ();
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  int offset = j * nr;
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (x_vec[k+offset] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = x_vec[k+offset] / 
+			    data(cidx(k));
+			  x_vec[k+offset] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      x_vec[iidx+offset] = 
+				x_vec[iidx+offset] - tmp * data(i);
+			    }
+			}
+		    }
+		}
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work, nr);
+	      for (int i = 0; i < nr; i++)
+		work[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work[k] != 0.)
+			{
+			  double tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += fabs(work[i]);
+		      work[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::ltsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Permuted_Lower ||
+	  typ == SparseType::Lower)
+	{
+	  double anorm = 0.;
+	  double ainvnorm = 0.;
+	  rcond = 0.;
+
+	  // Calculate the 1-norm of matrix for rcond calculation
+	  for (int j = 0; j < nr; j++)
+	    {
+	      double atmp = 0.;
+	      for (int i = cidx(j); i < cidx(j+1); i++)
+		atmp += fabs(data(i));
+	      if (atmp > anorm)
+		anorm = atmp;
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols ();
+	  int b_nz = b.nnz ();
+	  retval = SparseComplexMatrix (b_nr, b_nc, b_nz);
+	  retval.xcidx(0) = 0;
+	  int ii = 0;
+	  int x_nz = b_nz;
+
+	  if (typ == SparseType::Permuted_Lower)
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+	      int *p_perm = mattype.triangular_row_perm ();
+	      int *q_perm = mattype.triangular_col_perm ();
+
+	      (*current_liboctave_warning_handler)
+		("SparseMatrix::solve XXX FIXME XXX permuted triangular code not tested");
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+		      if (work[iidx] != 0.)
+			{
+			  if (ridx(cidx(iidx)) != iidx)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[iidx] / data(cidx(iidx+1)-1);
+			  work[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work[idx2] = 
+				work[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[p_perm[i]] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[p_perm[i]];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[q_perm[j]] = 1.;
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      int iidx = q_perm[k];
+
+		      if (work2[iidx] != 0.)
+			{
+			  double tmp = work2[iidx] / data(cidx(iidx+1)-1);
+			  work2[iidx] = tmp;
+			  for (int i = cidx(iidx)+1; i < cidx(iidx+1); i++)
+			    {
+			      int idx2 = q_perm[ridx(i)];
+			      work2[idx2] = work2[idx2] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = 0; i < j+1; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+	    }
+	  else
+	    {
+	      OCTAVE_LOCAL_BUFFER (Complex, work, nr);
+
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < nr; i++)
+		    work[i] = 0.;
+		  for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+		    work[b.ridx(i)] = b.data(i);
+
+		  for (int k = 0; k < nr; k++)
+		    {
+		      if (work[k] != 0.)
+			{
+			  if (ridx(cidx(k)) != k)
+			    {
+			      err = -2;
+			      goto triangular_error;
+			    }			    
+
+			  Complex tmp = work[k] / data(cidx(k));
+			  work[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work[iidx] = work[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+
+		  // Count non-zeros in work vector and adjust space in
+		  // retval if needed
+		  int new_nnz = 0;
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      new_nnz++;
+
+		  if (ii + new_nnz > x_nz)
+		    {
+		      // Resize the sparse matrix
+		      int sz = new_nnz * (b_nc - j) + x_nz;
+		      retval.change_capacity (sz);
+		      x_nz = sz;
+		    }
+
+		  for (int i = 0; i < nr; i++)
+		    if (work[i] != 0.)
+		      {
+			retval.xridx(ii) = i;
+			retval.xdata(ii++) = work[i];
+		      }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+	      // Calculation of 1-norm of inv(*this)
+	      OCTAVE_LOCAL_BUFFER (double, work2, nr);
+	      for (int i = 0; i < nr; i++)
+		work2[i] = 0.;
+
+	      for (int j = 0; j < nr; j++)
+		{
+		  work2[j] = 1.;
+
+		  for (int k = j; k < nr; k++)
+		    {
+
+		      if (work2[k] != 0.)
+			{
+			  double tmp = work2[k] / data(cidx(k));
+			  work2[k] = tmp;
+			  for (int i = cidx(k)+1; i < cidx(k+1); i++)
+			    {
+			      int iidx = ridx(i);
+			      work2[iidx] = work2[iidx] - tmp * data(i);
+			    }
+			}
+		    }
+		  double atmp = 0;
+		  for (int i = j; i < nr; i++)
+		    {
+		      atmp += fabs(work2[i]);
+		      work2[i] = 0.;
+		    }
+		  if (atmp > ainvnorm)
+		    ainvnorm = atmp;
+		}
+
+	    }
+
+	  rcond = 1. / ainvnorm / anorm;
+
+	triangular_error:
+	  if (err != 0)
+	    {
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+
+	  volatile double rcond_plus_one = rcond + 1.0;
+
+	  if (rcond_plus_one == 1.0 || xisnan (rcond))
+	    {
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision, rcond = %g",
+		   rcond);
+	    }
+	}
+      else
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+Matrix
+SparseMatrix::trisolve (SparseType &mattype, const Matrix& b, int& err, 
+		       double& rcond,
+		       solve_singularity_handler sing_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+      
+      if (typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (double, D, nr);
+	  OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii);
+		  ii += 2;
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		  }
+	    }
+	      
+	  int b_nc = b.cols();
+	  retval = b;
+	  double *result = retval.fortran_vec ();
+
+	  F77_XFCN (dptsv, DPTSV, (nr, b_nc, D, DL, result, 
+				   b.rows(), err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dptsv");
+	  else if (err != 0)
+	    {
+	      err = 0;
+	      mattype.mark_as_unsymmetric ();
+	      typ = SparseType::Tridiagonal;
+	    }
+	  else 
+	    rcond = 1.;
+	}
+
+      if (typ == SparseType::Tridiagonal)
+	{
+	  OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (double, D, nr);
+	  OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  int b_nc = b.cols();
+	  retval = b;
+	  double *result = retval.fortran_vec ();
+
+	  F77_XFCN (dgtsv, DGTSV, (nr, b_nc, DL, D, DU, result, 
+				   b.rows(), err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgtsv");
+	  else if (err != 0)
+	    {
+	      rcond = 0.;
+	      err = -2;
+
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision");
+
+	    } 
+	  else 
+	    rcond = 1.;
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	       (*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::trisolve (SparseType &mattype, const SparseMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal ||
+	  typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (double, DU2, nr - 2);
+	  OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (double, D, nr);
+	  OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgttrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (double, work, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			work[i] = 0.;
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			work[b.ridx(i)] = b.data(i);
+
+		      F77_XFCN (dgttrs, DGTTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, 1, DL, D, DU, DU2, pipvt, 
+				 work, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgttrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = work[i];
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::trisolve (SparseType &mattype, const ComplexMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii);
+		  ii += 2;
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		  }
+	    }
+
+	  int b_nr = b.rows ();
+	  int b_nc = b.cols();
+	  rcond = 1.;
+
+	  retval = b;
+	  Complex *result = retval.fortran_vec ();
+		  
+	  F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, 
+				   b_nr, err));
+
+	  if (f77_exception_encountered)
+	    {
+	      (*current_liboctave_error_handler) 
+		("unrecoverable error in zptsv");
+	      err = -1;
+	    }
+	  else if (err != 0)
+	    {
+	      err = 0;
+	      mattype.mark_as_unsymmetric ();
+	      typ = SparseType::Tridiagonal;
+	    }
+	}
+
+      if (typ == SparseType::Tridiagonal)
+	{
+	  OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (Complex, D, nr);
+	  OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  int b_nr = b.rows();
+	  int b_nc = b.cols();
+	  rcond = 1.;
+
+	  retval = b;
+	  Complex *result = retval.fortran_vec ();
+	      
+	  F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, 
+				   b_nr, err));
+
+	  if (f77_exception_encountered)
+	    {
+	      (*current_liboctave_error_handler) 
+		("unrecoverable error in zgtsv");
+	      err = -1;
+	    }
+	  else if (err != 0)
+	    {
+	      rcond = 0.;
+	      err = -2;
+		      
+	      if (sing_handler)
+		sing_handler (rcond);
+	      else
+		(*current_liboctave_error_handler)
+		  ("matrix singular to machine precision");
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::trisolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+      
+      // Note can't treat symmetric case as there is no dpttrf function
+      if (typ == SparseType::Tridiagonal ||
+	  typ == SparseType::Tridiagonal_Hermitian)
+	{
+	  OCTAVE_LOCAL_BUFFER (double, DU2, nr - 2);
+	  OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
+	  OCTAVE_LOCAL_BUFFER (double, D, nr);
+	  OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  if (mattype.is_dense ())
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < nc-1; j++)
+		{
+		  D[j] = data(ii++);
+		  DL[j] = data(ii++);
+		  DU[j] = data(ii++);
+		}
+	      D[nc-1] = data(ii);
+	    }
+	  else
+	    {
+	      D[0] = 0.;
+	      for (int i = 0; i < nr - 1; i++)
+		{
+		  D[i+1] = 0.;
+		  DL[i] = 0.;
+		  DU[i] = 0.;
+		}
+
+	      for (int j = 0; j < nc; j++)
+		for (int i = cidx(j); i < cidx(j+1); i++)
+		  {
+		    if (ridx(i) == j)
+		      D[j] = data(i);
+		    else if (ridx(i) == j + 1)
+		      DL[j] = data(i);
+		    else if (ridx(i) == j - 1)
+		      DU[j] = data(i);
+		  }
+	    }
+
+	  F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgttrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+		} 
+	      else 
+		{	
+		  rcond = 1.;
+		  char job = 'N';
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+		  OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+
+		      for (int i = 0; i < b_nr; i++)
+			{
+			  Complex c = b (i,j);
+			  Bx[i] = ::real (c);
+			  Bz[i] = ::imag (c);
+			}
+
+
+		      F77_XFCN (dgttrs, DGTTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, 1, DL, D, DU, DU2, pipvt, 
+				 Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgttrs");
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler)
+			    ("SparseMatrix::solve solve failed");
+
+			  err = -1;
+			  break;
+			}
+
+		      F77_XFCN (dgttrs, DGTTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, 1, DL, D, DU, DU2, pipvt, 
+				 Bz, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgttrs");
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler)
+			    ("SparseMatrix::solve solve failed");
+
+			  err = -1;
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  new_nnz++;
+		      
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+			  
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = 
+			      Complex (Bx[i], Bz[i]);
+			  }
+
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Tridiagonal_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+Matrix
+SparseMatrix::bsolve (SparseType &mattype, const Matrix& b, int& err, 
+		       double& rcond,
+		       solve_singularity_handler sing_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  // Calculate the norm of the matrix, for later use.
+	  // double anorm = m_band.abs().sum().row(0).max();
+
+	  char job = 'L';
+	  F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  // Unfortunately, the time to calculate the condition
+		  // number is dominant for narrow banded matrices and
+		  // so we rely on the "err" flag from xPBTRF to flag
+		  // singularity. The commented code below is left here
+		  // for reference
+
+		  //Array<double> z (3 * nr);
+		  //double *pz = z.fortran_vec ();
+		  //Array<int> iz (nr);
+		  //int *piz = iz.fortran_vec ();
+		  //
+		  //F77_XFCN (dpbcon, DGBCON, 
+		  //	(F77_CONST_CHAR_ARG2 (&job, 1),
+		  //	 nr, n_lower, tmp_data, ldm,
+		  //	 anorm, rcond, pz, piz, err
+		  //	 F77_CHAR_ARG_LEN (1)));
+		  //
+		  //
+		  //if (f77_exception_encountered)
+		  //	(*current_liboctave_error_handler) 
+		  //	  ("unrecoverable error in dpbcon");
+		  //
+		  //if (err != 0) 
+		  //	err = -2;
+		  //
+		  //volatile double rcond_plus_one = rcond + 1.0;
+		  //
+		  //if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  //  {
+		  //    err = -2;
+		  //
+		  //    if (sing_handler)
+		  //      sing_handler (rcond);
+		  //    else
+		  //      (*current_liboctave_error_handler)
+		  //        ("matrix singular to machine precision, rcond = %g",
+		  //         rcond);
+		  //  }
+		  //else
+		  //    REST OF CODE, EXCEPT rcond=1
+
+		  rcond = 1.;
+		  retval = b;
+		  double *result = retval.fortran_vec ();
+
+		  int b_nc = b.cols ();
+
+		  F77_XFCN (dpbtrs, DPBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, b_nc, tmp_data,
+			     ldm, result, b.rows(), err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    (*current_liboctave_error_handler)
+		      ("unrecoverable error in dpbtrs");
+
+		  if (err != 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+		      err = -1;
+		    }
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgbtrf");
+	  else
+	    {
+	      // Throw-away extra info LAPACK gives so as to not 
+	      // change output.
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = '1';
+
+		  // Unfortunately, the time to calculate the condition
+		  // number is dominant for narrow banded matrices and
+		  // so we rely on the "err" flag from xPBTRF to flag
+		  // singularity. The commented code below is left here
+		  // for reference
+
+		  //F77_XFCN (dgbcon, DGBCON, 
+		  //	(F77_CONST_CHAR_ARG2 (&job, 1),
+		  //	 nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+		  //	 anorm, rcond, pz, piz, err
+		  //	 F77_CHAR_ARG_LEN (1)));
+		  //
+		  //if (f77_exception_encountered)
+		  //  (*current_liboctave_error_handler) 
+		  //    ("unrecoverable error in dgbcon");
+		  //
+		  // if (err != 0) 
+		  //  err = -2;
+		  //
+		  //volatile double rcond_plus_one = rcond + 1.0;
+		  //
+		  //if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  //  {
+		  //    err = -2;
+		  //
+		  //    if (sing_handler)
+		  //      sing_handler (rcond);
+		  //    else
+		  //      (*current_liboctave_error_handler)
+		  //        ("matrix singular to machine precision, rcond = %g",
+		  //         rcond);
+		  //  }
+		  //else
+		  //  REST OF CODE, EXCEPT rcond=1
+
+		  rcond = 1.;
+		  retval = b;
+		  double *result = retval.fortran_vec ();
+
+		  int b_nc = b.cols ();
+
+		  job = 'N';
+		  F77_XFCN (dgbtrs, DGBTRS, 
+			    (F77_CONST_CHAR_ARG2 (&job, 1),
+			     nr, n_lower, n_upper, b_nc, tmp_data,
+			     ldm, pipvt, result, b.rows(), err
+			     F77_CHAR_ARG_LEN (1)));
+		    
+		  if (f77_exception_encountered)
+		    (*current_liboctave_error_handler)
+		      ("unrecoverable error in dgbtrs");
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::bsolve (SparseType &mattype, const SparseMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < b_nr; i++)
+			Bx[i] = b.elem (i, j);
+
+		      F77_XFCN (dpbtrs, DPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+		      for (int i = 0; i < b_nr; i++)
+			{
+			  double tmp = Bx[i];
+			  if (tmp != 0.0)
+			    {
+			      if (ii == x_nz)
+				{
+				  // Resize the sparse matrix
+				  int sz = x_nz * (b_nc - j) / b_nc;
+				  sz = (sz > 10 ? sz : 10) + x_nz;
+				  retval.change_capacity (sz);
+				  x_nz = sz;
+				}
+			      retval.xdata(ii) = tmp;
+			      retval.xridx(ii++) = i;
+			    }
+			}
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (double, work, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			work[i] = 0.;
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			work[b.ridx(i)] = b.data(i);
+
+		      F77_XFCN (dgbtrs, DGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, work, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (work[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = work[i];
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::bsolve (SparseType &mattype, const ComplexMatrix& b, int& err, 
+		     double& rcond, solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+
+		  OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+		  OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+
+		  retval.resize (b_nr, b_nc);
+	      
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < b_nr; i++)
+			{
+			  Complex c = b (i,j);
+			  Bx[i] = ::real (c);
+			  Bz[i] = ::imag (c);
+			}
+			  
+		      F77_XFCN (dpbtrs, DPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+		      F77_XFCN (dpbtrs, DPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bz, b.rows(), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+		      for (int i = 0; i < b_nr; i++)
+			retval (i, j) = Complex (Bx[i], Bz[i]);
+		    }
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  int b_nc = b.cols ();
+		  retval.resize (nr,b_nc);
+
+		  OCTAVE_LOCAL_BUFFER (double, Bz, nr);
+		  OCTAVE_LOCAL_BUFFER (double, Bx, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			{
+			  Complex c = b (i, j);
+			  Bx[i] = ::real (c);
+			  Bz[i] = ::imag  (c);
+			}
+
+		      F77_XFCN (dgbtrs, DGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, Bx, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      F77_XFCN (dgbtrs, DGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, Bz, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			retval (i, j) = Complex (Bx[i], Bz[i]);
+		    }
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::bsolve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      volatile int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Banded_Hermitian)
+	{
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      {
+		int ri = ridx (i);
+		if (ri >= j)
+		  m_band(ri - j, j) = data(i);
+	      }
+
+	  char job = 'L';
+	  F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
+				     nr, n_lower, tmp_data, ldm, err
+				     F77_CHAR_ARG_LEN (1)));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dpbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  // Matrix is not positive definite!! Fall through to
+		  // unsymmetric banded solver.
+		  mattype.mark_as_unsymmetric ();
+		  typ = SparseType::Banded;
+
+		  err = 0;
+		} 
+	      else 
+		{
+		  rcond = 1.;
+		  int b_nr = b.rows ();
+		  int b_nc = b.cols ();
+		  OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+		  OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+
+		  // Take a first guess that the number of non-zero terms
+		  // will be as many as in b
+		  volatile int x_nz = b.nnz ();
+		  volatile int ii = 0;
+		  retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+		  retval.xcidx(0) = 0;
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+
+		      for (int i = 0; i < b_nr; i++)
+			{
+			  Complex c = b (i,j);
+			  Bx[i] = ::real (c);
+			  Bz[i] = ::imag (c);
+			}
+
+		      F77_XFCN (dpbtrs, DPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bx, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler) 
+			    ("SparseMatrix::solve solve failed");
+			  err = -1;
+			  break;
+			}
+
+		      F77_XFCN (dpbtrs, DPBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, 1, tmp_data,
+				 ldm, Bz, b_nr, err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dpbtrs");
+			  err = -1;
+			  break;
+			}
+
+		      if (err != 0)
+			{
+			  (*current_liboctave_error_handler)
+			    ("SparseMatrix::solve solve failed");
+
+			  err = -1;
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  new_nnz++;
+			  
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+			  
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = 
+			      Complex (Bx[i], Bz[i]);
+			  }
+
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+
+      if (typ == SparseType::Banded)
+	{
+	  // Create the storage for the banded form of the sparse matrix
+	  int n_upper = mattype.nupper ();
+	  int n_lower = mattype.nlower ();
+	  int ldm = n_upper + 2 * n_lower + 1;
+
+	  Matrix m_band (ldm, nc);
+	  double *tmp_data = m_band.fortran_vec ();
+	      
+	  if (! mattype.is_dense ()) 
+	    {
+	      int ii = 0;
+
+	      for (int j = 0; j < ldm; j++)
+		for (int i = 0; i < nc; i++)
+		  tmp_data[ii++] = 0.;
+	    }
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = cidx(j); i < cidx(j+1); i++)
+	      m_band(ridx(i) - j + n_lower + n_upper, j) = data(i);
+
+	  Array<int> ipvt (nr);
+	  int *pipvt = ipvt.fortran_vec ();
+
+	  F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data, 
+				     ldm, pipvt, err));
+	    
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler) 
+	      ("unrecoverable error in dgbtrf");
+	  else
+	    {
+	      rcond = 0.0;
+	      if (err != 0) 
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("matrix singular to machine precision");
+
+		} 
+	      else 
+		{
+		  char job = 'N';
+		  volatile int x_nz = b.nnz ();
+		  int b_nc = b.cols ();
+		  retval = SparseComplexMatrix (nr, b_nc, x_nz);
+		  retval.xcidx(0) = 0;
+		  volatile int ii = 0;
+
+		  OCTAVE_LOCAL_BUFFER (double, Bx, nr);
+		  OCTAVE_LOCAL_BUFFER (double, Bz, nr);
+
+		  for (volatile int j = 0; j < b_nc; j++)
+		    {
+		      for (int i = 0; i < nr; i++)
+			{
+			  Bx[i] = 0.;
+			  Bz[i] = 0.;
+			}
+		      for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+			{
+			  Complex c = b.data(i);
+			  Bx[b.ridx(i)] = ::real (c);
+			  Bz[b.ridx(i)] = ::imag (c);
+			}
+
+		      F77_XFCN (dgbtrs, DGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, Bx, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      F77_XFCN (dgbtrs, DGBTRS, 
+				(F77_CONST_CHAR_ARG2 (&job, 1),
+				 nr, n_lower, n_upper, 1, tmp_data,
+				 ldm, pipvt, Bz, b.rows (), err
+				 F77_CHAR_ARG_LEN (1)));
+		    
+		      if (f77_exception_encountered)
+			{
+			  (*current_liboctave_error_handler)
+			    ("unrecoverable error in dgbtrs");
+			  break;
+			}
+
+		      // Count non-zeros in work vector and adjust 
+		      // space in retval if needed
+		      int new_nnz = 0;
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  new_nnz++;
+
+		      if (ii + new_nnz > x_nz)
+			{
+			  // Resize the sparse matrix
+			  int sz = new_nnz * (b_nc - j) + x_nz;
+			  retval.change_capacity (sz);
+			  x_nz = sz;
+			}
+
+		      for (int i = 0; i < nr; i++)
+			if (Bx[i] != 0. || Bz[i] != 0.)
+			  {
+			    retval.xridx(ii) = i;
+			    retval.xdata(ii++) = 
+			      Complex (Bx[i], Bz[i]);
+			  }
+		      retval.xcidx(j+1) = ii;
+		    }
+
+		  retval.maybe_compress ();
+		}
+	    }
+	}
+      else if (typ != SparseType::Banded_Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+void *
+SparseMatrix::factorize (int& err, double &rcond, Matrix &Control, Matrix &Info,
+			 solve_singularity_handler sing_handler) const
+{
+  // The return values
+  void *Numeric;
+  err = 0;
+
+  // Setup the control parameters
+  Control = Matrix (UMFPACK_CONTROL, 1);
+  double *control = Control.fortran_vec ();
+  umfpack_di_defaults (control);
+
+  double tmp = Voctave_sparse_controls.get_key ("spumoni");
+  if (!xisnan (tmp))
+    Control (UMFPACK_PRL) = tmp;
+  tmp = Voctave_sparse_controls.get_key ("piv_tol");
+  if (!xisnan (tmp))
+    {
+      Control (UMFPACK_SYM_PIVOT_TOLERANCE) = tmp;
+      Control (UMFPACK_PIVOT_TOLERANCE) = tmp;
+    }
+
+  // Set whether we are allowed to modify Q or not
+  tmp = Voctave_sparse_controls.get_key ("autoamd");
+  if (!xisnan (tmp))
+    Control (UMFPACK_FIXQ) = tmp;
+
+  umfpack_di_report_control (control);
+
+  const int *Ap = cidx ();
+  const int *Ai = ridx ();
+  const double *Ax = data ();
+  int nr = rows ();
+  int nc = cols ();
+
+  umfpack_di_report_matrix (nr, nc, Ap, Ai, Ax, 1, control);
+
+  void *Symbolic;
+  Info = Matrix (1, UMFPACK_INFO);
+  double *info = Info.fortran_vec ();
+  int status = umfpack_di_qsymbolic (nr, nc, Ap, Ai, Ax, NULL,
+				     &Symbolic, control, info);
+
+  if (status < 0)
+    {
+      (*current_liboctave_error_handler) 
+	("SparseMatrix::solve symbolic factorization failed");
+      err = -1;
+
+      umfpack_di_report_status (control, status);
+      umfpack_di_report_info (control, info);
+
+      umfpack_di_free_symbolic (&Symbolic) ;
+    }
+  else
+    {
+      umfpack_di_report_symbolic (Symbolic, control);
+
+      status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric,
+				   control, info) ;
+      umfpack_di_free_symbolic (&Symbolic) ;
+
+#ifdef HAVE_LSSOLVE
+      rcond = Info (UMFPACK_RCOND);
+      volatile double rcond_plus_one = rcond + 1.0;
+
+      if (status == UMFPACK_WARNING_singular_matrix || 
+	  rcond_plus_one == 1.0 || xisnan (rcond))
+	{
+	  umfpack_di_report_numeric (Numeric, control);
+
+	  err = -2;
+
+	  if (sing_handler)
+	    sing_handler (rcond);
+	  else
+	    (*current_liboctave_error_handler)
+	      ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+	       rcond);
+
+	}
+      else
+#endif 
+	if (status < 0)
+	  {
+	    (*current_liboctave_error_handler) 
+	      ("SparseMatrix::solve numeric factorization failed");
+
+	    umfpack_di_report_status (control, status);
+	    umfpack_di_report_info (control, info);
+	      
+	    err = -1;
+	  }
+	else
+	  {
+	    umfpack_di_report_numeric (Numeric, control);
+	  }
+    }
+
+  if (err != 0)
+    umfpack_di_free_numeric (&Numeric);
+
+  return Numeric;
+}
+
+Matrix
+SparseMatrix::fsolve (SparseType &mattype, const Matrix& b, int& err, 
+		     double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  Matrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = 
+	    factorize (err, rcond, Control, Info, sing_handler);
+
+	  if (err == 0)
+	    {
+	      const double *Bx = b.fortran_vec ();
+	      retval.resize (b.rows (), b.cols());
+	      double *result = retval.fortran_vec ();
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const double *Ax = data ();
+
+	      for (int j = 0, iidx = 0; j < b_nc; j++, iidx += b_nr)
+		{
+		  status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, 
+					     &result[iidx], &Bx[iidx],
+					     Numeric, control, info);
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+
+		      umfpack_di_report_status (control, status);
+		      
+		      err = -1;
+		  
+		      break;
+		    }
+		}
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+	      
+		}
+#endif
+		
+	      umfpack_di_report_info (control, info);
+		
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::fsolve (SparseType &mattype, const SparseMatrix& b, int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  SparseMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, 
+				     sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const double *Ax = data ();
+
+	      OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Xx, b_nr);
+
+	      // Take a first guess that the number of non-zero terms
+	      // will be as many as in b
+	      int x_nz = b.nnz ();
+	      int ii = 0;
+	      retval = SparseMatrix (b_nr, b_nc, x_nz);
+
+	      retval.xcidx(0) = 0;
+	      for (int j = 0; j < b_nc; j++)
+		{
+
+		  for (int i = 0; i < b_nr; i++)
+		    Bx[i] = b.elem (i, j);
+
+		  status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, Xx,
+					     Bx, Numeric, control, 
+					     info);
+		  if (status < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+
+		      umfpack_di_report_status (control, status);
+		  
+		      err = -1;
+
+		      break;
+		    }
+	      
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      double tmp = Xx[i];
+		      if (tmp != 0.0)
+			{
+			  if (ii == x_nz)
+			    {
+			      // Resize the sparse matrix
+			      int sz = x_nz * (b_nc - j) / b_nc;
+			      sz = (sz > 10 ? sz : 10) + x_nz;
+			      retval.change_capacity (sz);
+			      x_nz = sz;
+			    }
+			  retval.xdata(ii) = tmp;
+			  retval.xridx(ii++) = i;
+			}
+		    }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+	      
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+ComplexMatrix
+SparseMatrix::fsolve (SparseType &mattype, const ComplexMatrix& b, int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, 
+				     sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const double *Ax = data ();
+
+	      OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+
+	      retval.resize (b_nr, b_nc);
+
+	      OCTAVE_LOCAL_BUFFER (double, Xx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Xz, b_nr);
+	      
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      Complex c = b (i,j);
+		      Bx[i] = ::real (c);
+		      Bz[i] = ::imag (c);
+		    }
+
+		  status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, 
+					     Xx, Bx, Numeric, control, 
+					     info);
+		  int status2 = umfpack_di_solve (UMFPACK_A, Ap, Ai, 
+						  Ax, Xz, Bz, Numeric, 
+						  control, info) ;
+
+		  if (status < 0 || status2 < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+
+		      umfpack_di_report_status (control, status);
+		      
+		      err = -1;
+
+		      break;
+		    }
+
+		  for (int i = 0; i < b_nr; i++)
+		    retval (i, j) = Complex (Xx[i], Xz[i]);
+		}
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+SparseComplexMatrix
+SparseMatrix::fsolve (SparseType &mattype, const SparseComplexMatrix& b, 
+		      int& err, double& rcond,
+		      solve_singularity_handler sing_handler) const
+{
+  SparseComplexMatrix retval;
+
+  int nr = rows ();
+  int nc = cols ();
+  err = 0;
+
+  if (nr == 0 || nc == 0 || nr != nc || nr != b.rows ())
+    (*current_liboctave_error_handler)
+      ("matrix dimension mismatch solution of linear equations");
+  else
+    {
+      // Print spparms("spumoni") info if requested
+      int typ = mattype.type ();
+      mattype.info ();
+
+      if (typ == SparseType::Hermitian)
+	{
+	  // XXX FIXME XXX Write the cholesky solver and only fall
+	  // through if cholesky factorization fails
+
+	  (*current_liboctave_warning_handler)
+	    ("SparseMatrix::solve XXX FIXME XXX Cholesky code not done");
+
+	  mattype.mark_as_unsymmetric ();
+	  typ = SparseType::Full;
+	}
+
+      if (typ == SparseType::Full)
+	{
+	  Matrix Control, Info;
+	  void *Numeric = factorize (err, rcond, Control, Info, 
+				     sing_handler);
+
+	  if (err == 0)
+	    {
+	      int b_nr = b.rows ();
+	      int b_nc = b.cols ();
+	      int status = 0;
+	      double *control = Control.fortran_vec ();
+	      double *info = Info.fortran_vec ();
+	      const int *Ap = cidx ();
+	      const int *Ai = ridx ();
+	      const double *Ax = data ();
+
+	      OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
+
+	      // Take a first guess that the number of non-zero terms
+	      // will be as many as in b
+	      int x_nz = b.nnz ();
+	      int ii = 0;
+	      retval = SparseComplexMatrix (b_nr, b_nc, x_nz);
+
+	      OCTAVE_LOCAL_BUFFER (double, Xx, b_nr);
+	      OCTAVE_LOCAL_BUFFER (double, Xz, b_nr);
+	      
+	      retval.xcidx(0) = 0;
+	      for (int j = 0; j < b_nc; j++)
+		{
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      Complex c = b (i,j);
+		      Bx[i] = ::real (c);
+		      Bz[i] = ::imag (c);
+		    }
+
+		  status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, Xx,
+					     Bx, Numeric, control, 
+					     info);
+		  int status2 = umfpack_di_solve (UMFPACK_A, Ap, Ai, 
+						  Ax, Xz, Bz, Numeric, 
+						  control, info) ;
+
+		  if (status < 0 || status2 < 0)
+		    {
+		      (*current_liboctave_error_handler) 
+			("SparseMatrix::solve solve failed");
+
+		      umfpack_di_report_status (control, status);
+		      
+		      err = -1;
+
+		      break;
+		    }
+
+		  for (int i = 0; i < b_nr; i++)
+		    {
+		      Complex tmp = Complex (Xx[i], Xz[i]);
+		      if (tmp != 0.0)
+			{
+			  if (ii == x_nz)
+			    {
+			      // Resize the sparse matrix
+			      int sz = x_nz * (b_nc - j) / b_nc;
+			      sz = (sz > 10 ? sz : 10) + x_nz;
+			      retval.change_capacity (sz);
+			      x_nz = sz;
+			    }
+			  retval.xdata(ii) = tmp;
+			  retval.xridx(ii++) = i;
+			}
+		    }
+		  retval.xcidx(j+1) = ii;
+		}
+
+	      retval.maybe_compress ();
+
+#ifndef HAVE_LSSOLVE
+	      rcond = Info (UMFPACK_RCOND);
+	      volatile double rcond_plus_one = rcond + 1.0;
+
+	      if (status == UMFPACK_WARNING_singular_matrix || 
+		  rcond_plus_one == 1.0 || xisnan (rcond))
+		{
+		  err = -2;
+
+		  if (sing_handler)
+		    sing_handler (rcond);
+		  else
+		    (*current_liboctave_error_handler)
+		      ("SparseMatrix::solve matrix singular to machine precision, rcond = %g",
+		       rcond);
+
+		}
+#endif
+
+	      umfpack_di_report_info (control, info);
+
+	      umfpack_di_free_numeric (&Numeric);
+	    }
+	}
+      else if (typ != SparseType::Hermitian)
+	(*current_liboctave_error_handler) ("incorrect matrix type");
+    }
+  
+  return retval;
+}
+
+Matrix
+SparseMatrix::solve (SparseType &mattype, const Matrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& info, 
+		     double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (SparseType &mattype, const Matrix& b, int& err, 
+		     double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return Matrix ();
+    }
+}
+
+SparseMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return SparseMatrix ();
+    }
+}
+
+ComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const ComplexMatrix& b, 
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return ComplexMatrix ();
+    }
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (SparseType &mattype, const SparseComplexMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  int typ = mattype.type ();
+
+  if (typ == SparseType::Unknown)
+    typ = mattype.type (*this);
+
+  if (typ == SparseType::Diagonal || typ == SparseType::Permuted_Diagonal)
+    return dsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Upper || typ == SparseType::Permuted_Upper)
+    return utsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Lower || typ == SparseType::Permuted_Lower)
+    return ltsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Banded || typ == SparseType::Banded_Hermitian)
+    return bsolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Tridiagonal || 
+	   typ == SparseType::Tridiagonal_Hermitian)
+    return trisolve (mattype, b, err, rcond, sing_handler);
+  else if (typ == SparseType::Full || typ == SparseType::Hermitian)
+    return fsolve (mattype, b, err, rcond, sing_handler);
+  else
+    {
+      (*current_liboctave_error_handler) 
+	("matrix dimension mismatch solution of linear equations");
+      return SparseComplexMatrix ();
+    }
+}
+
+ColumnVector
+SparseMatrix::solve (SparseType &mattype, const ColumnVector& b) const
+{
+  int info; double rcond;
+  return solve (mattype, b, info, rcond);
+}
+
+ColumnVector
+SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond);
+}
+
+ColumnVector
+SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info, double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ColumnVector
+SparseMatrix::solve (SparseType &mattype, const ColumnVector& b, int& info, double& rcond,
+	       solve_singularity_handler sing_handler) const
+{
+  Matrix tmp (b);
+  return solve (mattype, tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b) const
+{
+  int info;
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info, 
+		     double& rcond) const
+{
+  return solve (mattype, b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (SparseType &mattype, const ComplexColumnVector& b, int& info, double& rcond,
+	       solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix tmp (b);
+  return solve (mattype, tmp, info, rcond, sing_handler).column (0);
+}
+
+Matrix
+SparseMatrix::solve (const Matrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (const Matrix& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (const Matrix& b, int& info, 
+		     double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+Matrix
+SparseMatrix::solve (const Matrix& b, int& err, 
+		     double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+SparseMatrix
+SparseMatrix::solve (const SparseMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (const SparseMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (const SparseMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+SparseMatrix
+SparseMatrix::solve (const SparseMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+ComplexMatrix
+SparseMatrix::solve (const ComplexMatrix& b, 
+			    int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseMatrix::solve (const ComplexMatrix& b, 
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexMatrix
+SparseMatrix::solve (const ComplexMatrix& b, 
+		     int& err, double& rcond, 
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (const SparseComplexMatrix& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (const SparseComplexMatrix& b, 
+		     int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (const SparseComplexMatrix& b,
+		     int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+SparseComplexMatrix
+SparseMatrix::solve (const SparseComplexMatrix& b, 
+		     int& err, double& rcond,
+		     solve_singularity_handler sing_handler) const
+{
+  SparseType mattype (*this);
+  return solve (mattype, b, err, rcond, sing_handler);
+}
+
+ColumnVector
+SparseMatrix::solve (const ColumnVector& b) const
+{
+  int info; double rcond;
+  return solve (b, info, rcond);
+}
+
+ColumnVector
+SparseMatrix::solve (const ColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond);
+}
+
+ColumnVector
+SparseMatrix::solve (const ColumnVector& b, int& info, double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ColumnVector
+SparseMatrix::solve (const ColumnVector& b, int& info, double& rcond,
+	       solve_singularity_handler sing_handler) const
+{
+  Matrix tmp (b);
+  return solve (tmp, info, rcond, sing_handler).column (0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (const ComplexColumnVector& b) const
+{
+  int info;
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (const ComplexColumnVector& b, int& info) const
+{
+  double rcond;
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (const ComplexColumnVector& b, int& info, 
+		     double& rcond) const
+{
+  return solve (b, info, rcond, 0);
+}
+
+ComplexColumnVector
+SparseMatrix::solve (const ComplexColumnVector& b, int& info, double& rcond,
+	       solve_singularity_handler sing_handler) const
+{
+  ComplexMatrix tmp (b);
+  return solve (tmp, info, rcond, sing_handler).column (0);
+}
+
+Matrix
+SparseMatrix::lssolve (const Matrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+Matrix
+SparseMatrix::lssolve (const Matrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+Matrix
+SparseMatrix::lssolve (const Matrix& b, int& info, int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseMatrix::lssolve not implemented yet");
+  return Matrix ();
+}
+
+SparseMatrix
+SparseMatrix::lssolve (const SparseMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseMatrix
+SparseMatrix::lssolve (const SparseMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseMatrix
+SparseMatrix::lssolve (const SparseMatrix& b, int& info, int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseMatrix::lssolve not implemented yet");
+  return SparseMatrix ();
+}
+
+ComplexMatrix
+SparseMatrix::lssolve (const ComplexMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseMatrix::lssolve (const ComplexMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexMatrix
+SparseMatrix::lssolve (const ComplexMatrix& b, int& info, int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseMatrix::lssolve not implemented yet");
+  return ComplexMatrix ();
+}
+
+SparseComplexMatrix
+SparseMatrix::lssolve (const SparseComplexMatrix& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseMatrix::lssolve (const SparseComplexMatrix& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+SparseComplexMatrix
+SparseMatrix::lssolve (const SparseComplexMatrix& b, int& info, 
+		       int& rank) const
+{
+  info = -1;
+  (*current_liboctave_error_handler) 
+    ("SparseMatrix::lssolve not implemented yet");
+  return SparseComplexMatrix ();
+}
+
+ColumnVector
+SparseMatrix::lssolve (const ColumnVector& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ColumnVector
+SparseMatrix::lssolve (const ColumnVector& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ColumnVector
+SparseMatrix::lssolve (const ColumnVector& b, int& info, int& rank) const
+{
+  Matrix tmp (b);
+  return lssolve (tmp, info, rank).column (0);
+}
+
+ComplexColumnVector
+SparseMatrix::lssolve (const ComplexColumnVector& b) const
+{
+  int info;
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseMatrix::lssolve (const ComplexColumnVector& b, int& info) const
+{
+  int rank;
+  return lssolve (b, info, rank);
+}
+
+ComplexColumnVector
+SparseMatrix::lssolve (const ComplexColumnVector& b, int& info, 
+		       int& rank) const
+{
+  ComplexMatrix tmp (b);
+  return lssolve (tmp, info, rank).column (0);
+}
+
+// other operations.
+
+SparseMatrix
+SparseMatrix::map (d_d_Mapper f) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  bool f_zero = (f(0.0) == 0.0);
+
+  // Count number of non-zero elements
+  int nel = (f_zero ? 0 : nr*nc - nz);
+  for (int i = 0; i < nz; i++)
+    if (f (data(i)) != 0.0)
+      nel++;
+
+  SparseMatrix retval (nr, nc, nel);
+
+  if (f_zero)
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      double tmp = f (elem (i, j));
+	      if (tmp != 0.0)
+		{
+		  retval.data(ii) = tmp;
+		  retval.ridx(ii++) = i;
+		}
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+  else
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      retval.data(ii) = f (elem(i));
+	      retval.ridx(ii++) = ridx(i);
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+
+  return retval;
+}
+
+SparseBoolMatrix
+SparseMatrix::map (b_d_Mapper f) const
+{
+  int nr = rows ();
+  int nc = cols ();
+  int nz = nnz ();
+  bool f_zero = f(0.0);
+
+  // Count number of non-zero elements
+  int nel = (f_zero ? 0 : nr*nc - nz);
+  for (int i = 0; i < nz; i++)
+    if (f (data(i)) != 0.0)
+      nel++;
+
+  SparseBoolMatrix retval (nr, nc, nel);
+
+  if (f_zero)
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      bool tmp = f (elem (i, j));
+	      if (tmp)
+		{
+		  retval.data(ii) = tmp;
+		  retval.ridx(ii++) = i;
+		}
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+  else
+    {
+      int ii = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = cidx(j); i < cidx(j+1); i++)
+	    {
+	      retval.data(ii) = f (elem(i));
+	      retval.ridx(ii++) = ridx(i);
+	    }
+	  retval.cidx(j+1) = ii;
+	}
+    }
+
+  return retval;
+}
+
+SparseMatrix&
+SparseMatrix::apply (d_d_Mapper f)
+{
+  *this = map (f);
+  return *this;
+}
+
+bool
+SparseMatrix::any_element_is_negative (bool neg_zero) const
+{
+  int nel = nnz ();
+
+  if (neg_zero)
+    {
+      for (int i = 0; i < nel; i++)
+	if (lo_ieee_signbit (data (i)))
+	  return true;
+    }
+  else
+    {
+      for (int i = 0; i < nel; i++)
+	if (data (i) < 0)
+	  return true;
+    }
+
+  return false;
+}
+
+bool
+SparseMatrix::any_element_is_inf_or_nan (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = data (i);
+      if (xisinf (val) || xisnan (val))
+	return true;
+    }
+
+  return false;
+}
+
+bool
+SparseMatrix::all_elements_are_int_or_inf_or_nan (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = data (i);
+      if (xisnan (val) || D_NINT (val) == val)
+	continue;
+      else
+	return false;
+    }
+
+  return true;
+}
+
+// Return nonzero if any element of M is not an integer.  Also extract
+// the largest and smallest values and return them in MAX_VAL and MIN_VAL.
+
+bool
+SparseMatrix::all_integers (double& max_val, double& min_val) const
+{
+  int nel = nnz ();
+
+  if (nel == 0)
+    return false;
+
+  max_val = data (0);
+  min_val = data (0);
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = data (i);
+
+      if (val > max_val)
+	max_val = val;
+
+      if (val < min_val)
+	min_val = val;
+
+      if (D_NINT (val) != val)
+	return false;
+    }
+
+  return true;
+}
+
+bool
+SparseMatrix::too_large_for_float (void) const
+{
+  int nel = nnz ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double val = data (i);
+
+      if (val > FLT_MAX || val < FLT_MIN)
+	return true;
+    }
+
+  return false;
+}
+
+SparseBoolMatrix 
+SparseMatrix::operator ! (void) const 
+{ 
+  int nr = rows ();
+  int nc = cols ();
+  int nz1 = nnz ();
+  int nz2 = nr*nc - nz1;
+   
+  SparseBoolMatrix r (nr, nc, nz2);
+   
+  int ii = 0;
+  int jj = 0;
+  r.cidx (0) = 0;
+  for (int i = 0; i < nc; i++)
+    {
+      for (int j = 0; j < nr; j++)
+	{
+	  if (jj < cidx(i+1) && ridx(jj) == j)
+	    jj++;
+	  else
+	    {
+	      r.data(ii) = true;
+	      r.ridx(ii++) = j;
+	    }
+	}
+      r.cidx (i+1) = ii;
+    }
+
+  return r;
+}
+
+// XXX FIXME XXX Do these really belong here?  Maybe they should be
+// in a base class?
+
+SparseBoolMatrix
+SparseMatrix::all (int dim) const
+{
+  SPARSE_ALL_OP (dim);
+}
+
+SparseBoolMatrix
+SparseMatrix::any (int dim) const
+{
+  SPARSE_ANY_OP (dim);
+}
+
+SparseMatrix
+SparseMatrix::cumprod (int dim) const
+{
+  SPARSE_CUMPROD (SparseMatrix, double, cumprod);
+}
+
+SparseMatrix
+SparseMatrix::cumsum (int dim) const
+{
+  SPARSE_CUMSUM (SparseMatrix, double, cumsum);
+}
+
+SparseMatrix
+SparseMatrix::prod (int dim) const
+{
+  SPARSE_REDUCTION_OP (SparseMatrix, double, *=, 1.0, 1.0);
+}
+
+SparseMatrix
+SparseMatrix::sum (int dim) const
+{
+  SPARSE_REDUCTION_OP (SparseMatrix, double, +=, 0.0, 0.0);
+}
+
+SparseMatrix
+SparseMatrix::sumsq (int dim) const
+{
+#define ROW_EXPR \
+  double d = elem (i, j); \
+  tmp[i] += d * d
+
+#define COL_EXPR \
+  double d = elem (i, j); \
+  tmp[j] += d * d
+
+  SPARSE_BASE_REDUCTION_OP (SparseMatrix, double, ROW_EXPR, COL_EXPR, 
+			    0.0, 0.0);
+
+#undef ROW_EXPR
+#undef COL_EXPR
+}
+
+SparseMatrix
+SparseMatrix::abs (void) const
+{
+  int nz = nnz ();
+
+  SparseMatrix retval (*this);
+
+  for (int i = 0; i < nz; i++)
+    retval.data(i) = fabs(retval.data(i));
+
+  return retval;
+}
+
+SparseMatrix
+SparseMatrix::diag (int k) const
+{
+  int nnr = rows ();
+  int nnc = cols ();
+
+  if (k > 0)
+    nnc -= k;
+  else if (k < 0)
+    nnr += k;
+
+  SparseMatrix d;
+
+  if (nnr > 0 && nnc > 0)
+    {
+      int ndiag = (nnr < nnc) ? nnr : nnc;
+
+      // Count the number of non-zero elements
+      int nel = 0;
+      if (k > 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i, i+k) != 0.)
+	      nel++;
+	}
+      else if ( k < 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i-k, i) != 0.)
+	      nel++;
+	}
+      else
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    if (elem (i, i) != 0.)
+	      nel++;
+	}
+      
+      d = SparseMatrix (ndiag, 1, nel);
+      d.xcidx (0) = 0;
+      d.xcidx (1) = nel;
+
+      int ii = 0;
+      if (k > 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      double tmp = elem (i, i+k);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else if ( k < 0)
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      double tmp = elem (i-k, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+      else
+	{
+	  for (int i = 0; i < ndiag; i++)
+	    {
+	      double tmp = elem (i, i);
+	      if (tmp != 0.)
+		{
+		  d.xdata (ii) = tmp;
+		  d.xridx (ii++) = i;
+		}
+	    }
+	}
+    }
+  else
+    (*current_liboctave_error_handler) 
+      ("diag: requested diagonal out of range");
+
+  return d;
+}
+
+Matrix
+SparseMatrix::matrix_value (void) const
+{
+  int nr = rows ();
+  int nc = cols ();
+
+  Matrix retval (nr, nc, 0.0);
+  for (int j = 0; j < nc; j++)
+    for (int i = cidx(j); i < cidx(j+1); i++)
+      retval.elem (ridx(i), j) = data (i);
+
+  return retval;
+}
+
+std::ostream&
+operator << (std::ostream& os, const SparseMatrix& a)
+{
+  int nc = a.cols ();
+
+   // add one to the printed indices to go from
+   //  zero-based to one-based arrays
+   for (int j = 0; j < nc; j++)  {
+      OCTAVE_QUIT;
+      for (int i = a.cidx(j); i < a.cidx(j+1); i++) {
+	os << a.ridx(i) + 1 << " "  << j + 1 << " ";
+	octave_write_double (os, a.data(i));
+	os << "\n";
+      }
+   }
+
+  return os;
+}
+
+std::istream&
+operator >> (std::istream& is, SparseMatrix& a)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+  int nz = a.nnz ();
+
+  if (nr < 1 || nc < 1)
+    is.clear (std::ios::badbit);
+  else
+    {
+      int itmp, jtmp, jold = 0;
+      double tmp;
+      int ii = 0;
+       
+      a.cidx (0) = 0;
+      for (int i = 0; i < nz; i++)
+	{
+	  is >> itmp;
+	  itmp--;
+	  is >> jtmp;
+	  jtmp--;
+	  tmp = octave_read_double (is);
+	  
+	  if (is)
+	    {
+	      if (jold != jtmp)
+		{
+		  for (int j = jold; j < jtmp; j++)
+		    a.cidx(j+1) = ii;
+		  
+		  jold = jtmp;
+		}
+	      a.data (ii) = tmp;
+	      a.ridx (ii++) = itmp;
+	    }
+	  else
+	    goto done;
+	}
+
+      for (int j = jold; j < nc; j++)
+	a.cidx(j+1) = ii;
+    }
+  
+ done:
+
+  return is;
+}
+
+SparseMatrix
+SparseMatrix::squeeze (void) const 
+{ 
+  return MSparse<double>::squeeze (); 
+}
+
+SparseMatrix
+SparseMatrix::index (idx_vector& i, int resize_ok) const 
+{ 
+  return MSparse<double>::index (i, resize_ok); 
+}
+
+SparseMatrix
+SparseMatrix::index (idx_vector& i, idx_vector& j, int resize_ok) const 
+{ 
+  return MSparse<double>::index (i, j, resize_ok); 
+}
+  
+SparseMatrix
+SparseMatrix::index (Array<idx_vector>& ra_idx, int resize_ok) const 
+{ 
+  return MSparse<double>::index (ra_idx, resize_ok); 
+}
+
+SparseMatrix
+SparseMatrix::reshape (const dim_vector& new_dims) const
+{
+  return MSparse<double>::reshape (new_dims);
+}
+
+SparseMatrix
+SparseMatrix::permute (const Array<int>& vec, bool inv) const
+{
+  return MSparse<double>::permute (vec, inv);
+}
+
+SparseMatrix
+SparseMatrix::ipermute (const Array<int>& vec) const
+{
+  return MSparse<double>::ipermute (vec);
+}
+
+// matrix by matrix -> matrix operations
+
+SparseMatrix
+operator * (const SparseMatrix& m, const SparseMatrix& a)
+{
+#ifdef HAVE_SPARSE_BLAS
+  // XXX FIXME XXX Isn't there a sparse BLAS ??
+#else
+  // Use Andy's sparse matrix multiply function
+  SPARSE_SPARSE_MUL (SparseMatrix, double);
+#endif
+}
+
+// XXX FIXME XXX -- it would be nice to share code among the min/max
+// functions below.
+
+#define EMPTY_RETURN_CHECK(T) \
+  if (nr == 0 || nc == 0) \
+    return T (nr, nc);
+
+SparseMatrix
+min (double d, const SparseMatrix& m)
+{
+  SparseMatrix result;
+
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  EMPTY_RETURN_CHECK (SparseMatrix);
+
+  // Count the number of non-zero elements
+  if (d < 0.)
+    {
+      result = SparseMatrix (nr, nc, d);
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  {
+	    double tmp = xmin (d, m.data (i));
+	    if (tmp != 0.)
+	      {
+		int idx = m.ridx(i) + j * nr;
+		result.xdata(idx) = tmp;
+		result.xridx(idx) = m.ridx(i);
+	      }
+	  }
+    }
+  else
+    {
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  if (xmin (d, m.data (i)) != 0.)
+	    nel++;
+
+      result = SparseMatrix (nr, nc, nel);
+
+      int ii = 0;
+      result.xcidx(0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	    {
+	      double tmp = xmin (d, m.data (i));
+
+	      if (tmp != 0.)
+		{
+		  result.xdata(ii) = tmp;
+		  result.xridx(ii++) = m.ridx(i);
+		}
+	    }
+	  result.xcidx(j+1) = ii;
+	}
+    }
+
+  return result;
+}
+
+SparseMatrix
+min (const SparseMatrix& m, double d)
+{
+  return min (d, m);
+}
+
+SparseMatrix
+min (const SparseMatrix& a, const SparseMatrix& b)
+{
+  SparseMatrix r;
+
+  if ((a.rows() == b.rows()) && (a.cols() == b.cols())) 
+    {
+      int a_nr = a.rows ();
+      int a_nc = a.cols ();
+
+      int b_nr = b.rows ();
+      int b_nc = b.cols ();
+
+      if (a_nr != b_nr || a_nc != b_nc)
+	gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc);
+      else
+	{
+	  r = SparseMatrix (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+	  int jx = 0;
+	  r.cidx (0) = 0;
+	  for (int i = 0 ; i < a_nc ; i++)
+	    {
+	      int  ja = a.cidx(i);
+	      int  ja_max = a.cidx(i+1);
+	      bool ja_lt_max= ja < ja_max;
+           
+	      int  jb = b.cidx(i);
+	      int  jb_max = b.cidx(i+1);
+	      bool jb_lt_max = jb < jb_max;
+           
+	      while (ja_lt_max || jb_lt_max )
+		{
+		  OCTAVE_QUIT;
+		  if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+		    {
+		      double tmp = xmin (a.data(ja), 0.);
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = a.ridx(ja);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		    }
+		  else if (( !ja_lt_max ) ||
+			   (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+		    {
+		      double tmp = xmin (0., b.data(jb));
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = b.ridx(jb);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		  else
+		    {
+		      double tmp = xmin (a.data(ja), b.data(jb));
+		      if (tmp != 0.)
+			{
+                          r.data(jx) = tmp;
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		}
+	      r.cidx(i+1) = jx;
+	    }
+	  
+	  r.maybe_compress ();
+	}
+    }
+  else
+    (*current_liboctave_error_handler) ("matrix size mismatch");
+
+  return r;
+}
+
+SparseMatrix
+max (double d, const SparseMatrix& m)
+{
+  SparseMatrix result;
+
+  int nr = m.rows ();
+  int nc = m.columns ();
+
+  EMPTY_RETURN_CHECK (SparseMatrix);
+
+  // Count the number of non-zero elements
+  if (d > 0.)
+    {
+      result = SparseMatrix (nr, nc, d);
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  {
+	    double tmp = xmax (d, m.data (i));
+
+	    if (tmp != 0.)
+	      {
+		int idx = m.ridx(i) + j * nr;
+		result.xdata(idx) = tmp;
+		result.xridx(idx) = m.ridx(i);
+	      }
+	  }
+    }
+  else
+    {
+      int nel = 0;
+      for (int j = 0; j < nc; j++)
+	for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	  if (xmax (d, m.data (i)) != 0.)
+	    nel++;
+
+      result = SparseMatrix (nr, nc, nel);
+
+      int ii = 0;
+      result.xcidx(0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+	    {
+	      double tmp = xmax (d, m.data (i));
+	      if (tmp != 0.)
+		{
+		  result.xdata(ii) = tmp;
+		  result.xridx(ii++) = m.ridx(i);
+		}
+	    }
+	  result.xcidx(j+1) = ii;
+	}
+    }
+
+  return result;
+}
+
+SparseMatrix
+max (const SparseMatrix& m, double d)
+{
+  return max (d, m);
+}
+
+SparseMatrix
+max (const SparseMatrix& a, const SparseMatrix& b)
+{
+  SparseMatrix r;
+
+  if ((a.rows() == b.rows()) && (a.cols() == b.cols())) 
+    {
+      int a_nr = a.rows ();
+      int a_nc = a.cols ();
+
+      int b_nr = b.rows ();
+      int b_nc = b.cols ();
+
+      if (a_nr != b_nr || a_nc != b_nc)
+	gripe_nonconformant ("min", a_nr, a_nc, b_nr, b_nc);
+      else
+	{
+	  r = SparseMatrix (a_nr, a_nc, (a.nnz () + b.nnz ()));
+       
+	  int jx = 0;
+	  r.cidx (0) = 0;
+	  for (int i = 0 ; i < a_nc ; i++)
+	    {
+	      int  ja = a.cidx(i);
+	      int  ja_max = a.cidx(i+1);
+	      bool ja_lt_max= ja < ja_max;
+           
+	      int  jb = b.cidx(i);
+	      int  jb_max = b.cidx(i+1);
+	      bool jb_lt_max = jb < jb_max;
+           
+	      while (ja_lt_max || jb_lt_max )
+		{
+		  OCTAVE_QUIT;
+		  if ((! jb_lt_max) ||
+                      (ja_lt_max && (a.ridx(ja) < b.ridx(jb))))
+		    {
+		      double tmp = xmax (a.data(ja), 0.);
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = a.ridx(ja);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		    }
+		  else if (( !ja_lt_max ) ||
+			   (jb_lt_max && (b.ridx(jb) < a.ridx(ja)) ) )
+		    {
+		      double tmp = xmax (0., b.data(jb));
+		      if (tmp != 0.)
+			{
+			  r.ridx(jx) = b.ridx(jb);
+			  r.data(jx) = tmp;
+			  jx++;
+			}
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		  else
+		    {
+		      double tmp = xmax (a.data(ja), b.data(jb));
+		      if (tmp != 0.)
+			{
+                          r.data(jx) = tmp;
+                          r.ridx(jx) = a.ridx(ja);
+                          jx++;
+			}
+		      ja++;
+		      ja_lt_max= ja < ja_max;
+		      jb++;
+		      jb_lt_max= jb < jb_max;
+		    }
+		}
+	      r.cidx(i+1) = jx;
+	    }
+	  
+	  r.maybe_compress ();
+	}
+    }
+  else
+    (*current_liboctave_error_handler) ("matrix size mismatch");
+
+  return r;
+}
+
+SPARSE_SMS_CMP_OPS (SparseMatrix, 0.0, , double, 0.0, )
+SPARSE_SMS_BOOL_OPS (SparseMatrix, double, 0.0)
+
+SPARSE_SSM_CMP_OPS (double, 0.0, , SparseMatrix, 0.0, )
+SPARSE_SSM_BOOL_OPS (double, SparseMatrix, 0.0)
+
+SPARSE_SMSM_CMP_OPS (SparseMatrix, 0.0, , SparseMatrix, 0.0, )
+SPARSE_SMSM_BOOL_OPS (SparseMatrix, SparseMatrix, 0.0)
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/dSparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,412 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_dSparse_h)
+#define octave_dSparse_h 1
+
+#include "dMatrix.h"
+#include "dNDArray.h"
+#include "CMatrix.h"
+#include "dColVector.h"
+#include "CColVector.h"
+
+#include "dbleDET.h"
+#include "MSparse.h"
+#include "MSparse-defs.h"
+#include "Sparse-op-defs.h"
+#include "SparseType.h"
+
+class SparseComplexMatrix;
+class SparseBoolMatrix;
+
+class
+SparseMatrix : public MSparse<double>
+{
+ public:
+
+  typedef void (*solve_singularity_handler) (double rcond);
+
+  SparseMatrix (void) : MSparse<double> () { }
+
+  SparseMatrix (int r, int c) : MSparse<double> (r, c) { }
+
+  explicit SparseMatrix (int r, int c, double val) 
+    : MSparse<double> (r, c, val) { }
+
+  SparseMatrix (const SparseMatrix& a) : MSparse<double> (a) { }
+
+  SparseMatrix (const SparseMatrix& a, const dim_vector& dv) 
+    : MSparse<double> (a, dv) { }
+
+  SparseMatrix (const MSparse<double>& a) : MSparse<double> (a) { }
+
+  explicit SparseMatrix (const SparseBoolMatrix& a);
+
+  explicit SparseMatrix (const Matrix& a) : MSparse<double> (a) { }
+
+  explicit SparseMatrix (const NDArray& a) : MSparse<double> (a) { }
+
+  explicit SparseMatrix (const Array<double> a, const Array<int>& r, 
+			 const Array<int>& c, int nr = -1, 
+			 int nc = -1, bool sum_terms = true)
+    : MSparse<double> (a, r, c, nr, nc, sum_terms) { }
+
+  explicit SparseMatrix (const Array<double> a, const Array<double>& r, 
+			 const Array<double>& c, int nr = -1, 
+			 int nc = -1, bool sum_terms = true)
+    : MSparse<double> (a, r, c, nr, nc, sum_terms) { }
+
+  SparseMatrix (int r, int c, int num_nz) : MSparse<double> (r, c, num_nz) { }
+
+  SparseMatrix& operator = (const SparseMatrix& a)
+    {
+      MSparse<double>::operator = (a);
+      return *this;
+    }
+
+  bool operator == (const SparseMatrix& a) const;
+  bool operator != (const SparseMatrix& a) const;
+
+  bool is_symmetric (void) const;
+
+  SparseMatrix max (int dim = 0) const;
+  SparseMatrix max (Array2<int>& index, int dim = 0) const;
+  SparseMatrix min (int dim = 0) const;
+  SparseMatrix min (Array2<int>& index, int dim = 0) const;
+  
+  // destructive insert/delete/reorder operations
+
+  SparseMatrix& insert (const SparseMatrix& a, int r, int c);
+
+  SparseMatrix concat (const SparseMatrix& rb, const Array<int>& ra_idx);
+  SparseComplexMatrix concat (const SparseComplexMatrix& rb,
+			      const Array<int>& ra_idx);
+
+  friend SparseMatrix real (const SparseComplexMatrix& a);
+  friend SparseMatrix imag (const SparseComplexMatrix& a);
+
+  friend SparseMatrix atan2 (const double& x, const SparseMatrix& y);
+  friend SparseMatrix atan2 (const SparseMatrix& x, const double& y);
+  friend SparseMatrix atan2 (const SparseMatrix& x, const SparseMatrix& y);
+
+  SparseMatrix transpose (void) const 
+    { 
+      return MSparse<double>::transpose (); 
+    }
+
+  SparseMatrix inverse (void) const;
+  SparseMatrix inverse (int& info) const;
+  SparseMatrix inverse (int& info, double& rcond, int force = 0, 
+		        int calc_cond = 1) const;
+
+  DET determinant (void) const;
+  DET determinant (int& info) const;
+  DET determinant (int& info, double& rcond, int calc_cond = 1) const;
+
+private:
+  // Diagonal matrix solvers
+  Matrix dsolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix dsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix dsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix dsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Upper triangular matrix solvers
+  Matrix utsolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix utsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix utsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix utsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Lower triangular matrix solvers
+  Matrix ltsolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix ltsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix ltsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix ltsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Tridiagonal matrix solvers
+  Matrix trisolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix trisolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix trisolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix trisolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Banded matrix solvers (umfpack/cholesky)
+  Matrix bsolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix bsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix bsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix bsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond, 
+		solve_singularity_handler sing_handler) const;
+
+  // Full matrix solvers (umfpack/cholesky)
+  void * factorize (int& err, double &rcond, Matrix &Control, Matrix &Info,
+		    solve_singularity_handler sing_handler) const;
+
+  Matrix fsolve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix fsolve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix fsolve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix fsolve (SparseType &typ, const SparseComplexMatrix& b,
+		int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+public:
+  // Generic interface to solver with no probing of type
+  Matrix solve (SparseType &typ, const Matrix& b) const;
+  Matrix solve (SparseType &typ, const Matrix& b, int& info) const;
+  Matrix solve (SparseType &typ, const Matrix& b, int& info, 
+		double& rcond) const;
+  Matrix solve (SparseType &typ, const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, 
+		       int& info) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		       double& rcond) const;
+  ComplexMatrix solve (SparseType &typ, const ComplexMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseMatrix solve (SparseType &typ, const SparseMatrix& b) const;
+  SparseMatrix solve (SparseType &typ, const SparseMatrix& b, 
+		      int& info) const;
+  SparseMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, 
+		      double& rcond) const;
+  SparseMatrix solve (SparseType &typ, const SparseMatrix& b, int& info, 
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (SparseType &typ, 
+			     const SparseComplexMatrix& b) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, 
+			     int& info) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, 
+			     int& info, double& rcond) const;
+  SparseComplexMatrix solve (SparseType &typ, const SparseComplexMatrix& b, int& info, 
+	       double& rcond, solve_singularity_handler sing_handler) const;
+
+  ColumnVector solve (SparseType &typ, const ColumnVector& b) const;
+  ColumnVector solve (SparseType &typ, const ColumnVector& b, 
+		      int& info) const;
+  ColumnVector solve (SparseType &typ, const ColumnVector& b, 
+		      int& info, double& rcond) const;
+  ColumnVector solve (SparseType &typ, const ColumnVector& b, int& info,
+		double& rcond, solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (SparseType &typ, 
+			     const ComplexColumnVector& b) const;
+  ComplexColumnVector solve (SparseType &typ, 
+			     const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b,
+			     int& info, double& rcond) const;
+  ComplexColumnVector solve (SparseType &typ, const ComplexColumnVector& b,
+			     int& info, double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  // Generic interface to solver with probing of type
+  Matrix solve (const Matrix& b) const;
+  Matrix solve (const Matrix& b, int& info) const;
+  Matrix solve (const Matrix& b, int& info, double& rcond) const;
+  Matrix solve (const Matrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  ComplexMatrix solve (const ComplexMatrix& b) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info, 
+		       double& rcond) const;
+  ComplexMatrix solve (const ComplexMatrix& b, int& info, double& rcond,
+		       solve_singularity_handler sing_handler) const;
+
+  SparseMatrix solve (const SparseMatrix& b) const;
+  SparseMatrix solve (const SparseMatrix& b, int& info) const;
+  SparseMatrix solve (const SparseMatrix& b, int& info, 
+		      double& rcond) const;
+  SparseMatrix solve (const SparseMatrix& b, int& info, double& rcond,
+		solve_singularity_handler sing_handler) const;
+
+  SparseComplexMatrix solve (const SparseComplexMatrix& b) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, 
+			     double& rcond) const;
+  SparseComplexMatrix solve (const SparseComplexMatrix& b, int& info, 
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  ColumnVector solve (const ColumnVector& b) const;
+  ColumnVector solve (const ColumnVector& b, int& info) const;
+  ColumnVector solve (const ColumnVector& b, int& info, double& rcond) const;
+  ColumnVector solve (const ColumnVector& b, int& info, double& rcond,
+		      solve_singularity_handler sing_handler) const;
+
+  ComplexColumnVector solve (const ComplexColumnVector& b) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info,
+			     double& rcond) const;
+  ComplexColumnVector solve (const ComplexColumnVector& b, int& info,
+			     double& rcond,
+			     solve_singularity_handler sing_handler) const;
+
+  // Minimum-norm solvers
+  Matrix lssolve (const Matrix& b) const;
+  Matrix lssolve (const Matrix& b, int& info) const;
+  Matrix lssolve (const Matrix& b, int& info, int& rank) const;
+
+  ComplexMatrix lssolve (const ComplexMatrix& b) const;
+  ComplexMatrix lssolve (const ComplexMatrix& b, int& info) const;
+  ComplexMatrix lssolve (const ComplexMatrix& b, int& info,
+			 int& rank) const;
+
+  SparseMatrix lssolve (const SparseMatrix& b) const;
+  SparseMatrix lssolve (const SparseMatrix& b, int& info) const;
+  SparseMatrix lssolve (const SparseMatrix& b, int& info, int& rank) const;
+
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b) const;
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b, 
+			       int& info) const;
+  SparseComplexMatrix lssolve (const SparseComplexMatrix& b, int& info,
+			       int& rank) const;
+
+  ColumnVector lssolve (const ColumnVector& b) const;
+  ColumnVector lssolve (const ColumnVector& b, int& info) const;
+  ColumnVector lssolve (const ColumnVector& b, int& info, int& rank) const;
+
+  ComplexColumnVector lssolve (const ComplexColumnVector& b) const;
+  ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info) const;
+  ComplexColumnVector lssolve (const ComplexColumnVector& b, int& info,
+			       int& rank) const;
+
+  // other operations
+  SparseMatrix map (d_d_Mapper f) const;
+  SparseBoolMatrix map (b_d_Mapper f) const;
+
+  SparseMatrix& apply (d_d_Mapper f);
+
+  bool any_element_is_negative (bool = false) const;
+  bool any_element_is_inf_or_nan (void) const;
+  bool all_elements_are_int_or_inf_or_nan (void) const;
+  bool all_integers (double& max_val, double& min_val) const;
+  bool too_large_for_float (void) const;
+ 
+  SparseBoolMatrix operator ! (void) const;
+
+  SparseBoolMatrix all (int dim = -1) const;
+  SparseBoolMatrix any (int dim = -1) const;
+
+  SparseMatrix cumprod (int dim = -1) const;
+  SparseMatrix cumsum (int dim = -1) const;
+  SparseMatrix prod (int dim = -1) const;
+  SparseMatrix sum (int dim = -1) const;
+  SparseMatrix sumsq (int dim = -1) const;
+  SparseMatrix abs (void) const;
+
+  SparseMatrix diag (int k = 0) const;
+
+  Matrix matrix_value (void) const;
+
+  SparseMatrix squeeze (void) const;
+
+  SparseMatrix index (idx_vector& i, int resize_ok) const;
+
+  SparseMatrix index (idx_vector& i, idx_vector& j, int resize_ok) const;
+  
+  SparseMatrix index (Array<idx_vector>& ra_idx, int resize_ok) const;
+
+  SparseMatrix reshape (const dim_vector& new_dims) const;
+
+  SparseMatrix permute (const Array<int>& vec, bool inv = false) const;
+
+  SparseMatrix ipermute (const Array<int>& vec) const;
+
+  // i/o
+
+  friend std::ostream& operator << (std::ostream& os, const SparseMatrix& a);
+  friend std::istream& operator >> (std::istream& is, SparseMatrix& a);
+};
+
+extern SparseMatrix operator * (const SparseMatrix& a, 
+				const SparseMatrix& b);
+
+extern SparseMatrix min (double d, const SparseMatrix& m);
+extern SparseMatrix min (const SparseMatrix& m, double d);
+extern SparseMatrix min (const SparseMatrix& a, const SparseMatrix& b);
+
+extern SparseMatrix max (double d, const SparseMatrix& m);
+extern SparseMatrix max (const SparseMatrix& m, double d);
+extern SparseMatrix max (const SparseMatrix& a, const SparseMatrix& b);
+
+SPARSE_SMS_CMP_OP_DECLS (SparseMatrix, double)
+SPARSE_SMS_BOOL_OP_DECLS (SparseMatrix, double)
+
+SPARSE_SSM_CMP_OP_DECLS (double, SparseMatrix)
+SPARSE_SSM_BOOL_OP_DECLS (double, SparseMatrix)
+
+SPARSE_SMSM_CMP_OP_DECLS (SparseMatrix, SparseMatrix)
+SPARSE_SMSM_BOOL_OP_DECLS (SparseMatrix, SparseMatrix)
+
+SPARSE_FORWARD_DEFS (MSparse, SparseMatrix, Matrix, double)
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/liboctave/dbleDET.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/dbleDET.h	Fri Feb 25 19:55:28 2005 +0000
@@ -29,6 +29,7 @@
 DET
 {
 friend class Matrix;
+friend class SparseMatrix;
 
 public:
 
--- a/liboctave/mx-base.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/liboctave/mx-base.h	Fri Feb 25 19:55:28 2005 +0000
@@ -45,6 +45,12 @@
 #include "dDiagMatrix.h"
 #include "CDiagMatrix.h"
 
+// Sparse Matrix classes.
+
+#include "boolSparse.h"
+#include "dSparse.h"
+#include "CSparse.h"
+
 // N-d Array classes.
 
 #include "boolNDArray.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/oct-spparms.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,122 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#include "config.h"
+#include "lo-ieee.h"
+
+#include "oct-spparms.h"
+
+SparseParams Voctave_sparse_controls;
+
+void
+SparseParams::defaults (void)
+{
+  Voctave_sparse_controls (0) = 0;    // spumoni
+  Voctave_sparse_controls (1) = 1;    // ths_rel
+  Voctave_sparse_controls (2) = 1;    // ths_abs
+  Voctave_sparse_controls (3) = 0;    // exact_d
+  Voctave_sparse_controls (4) = 3;    // supernd
+  Voctave_sparse_controls (5) = 3;    // rreduce
+  Voctave_sparse_controls (6) = 0.5;  // wh_frac
+  Voctave_sparse_controls (7) = 1;    // autommd
+  Voctave_sparse_controls (8) = 1;    // autoamd
+  Voctave_sparse_controls (9) = 0.1;  // piv_tol
+  Voctave_sparse_controls (10) = 0.5; // bandden
+  Voctave_sparse_controls (11) = 1;   // umfpack
+}
+
+void
+SparseParams::tight (void)
+{
+  Voctave_sparse_controls (0) = 0;    // spumoni
+  Voctave_sparse_controls (1) = 1;    // ths_rel
+  Voctave_sparse_controls (2) = 0;    // ths_abs
+  Voctave_sparse_controls (3) = 1;    // exact_d
+  Voctave_sparse_controls (4) = 1;    // supernd
+  Voctave_sparse_controls (5) = 1;    // rreduce
+  Voctave_sparse_controls (6) = 0.5;  // wh_frac
+  Voctave_sparse_controls (7) = 1;    // autommd
+  Voctave_sparse_controls (8) = 1;    // autoamd
+  Voctave_sparse_controls (9) = 0.1;  // piv_tol
+  Voctave_sparse_controls (10) = 0.5; // bandden
+  Voctave_sparse_controls (11) = 1;   // umfpack
+}
+  
+void
+SparseParams::init_keys (void)
+{
+  keys (0) = "spumoni";
+  keys (1) = "ths_rel";
+  keys (2) = "ths_abs";
+  keys (3) = "exact_d";
+  keys (4) = "supernd";
+  keys (5) = "rreduce";
+  keys (6) = "wh_frac";
+  keys (7) = "autommd";
+  keys (8) = "autoamd";
+  keys (9) = "piv_tol";
+  keys (10) = "bandden";
+  keys (11) = "umfpack";
+}
+
+SparseParams& 
+SparseParams::operator = (const SparseParams& a)
+{
+  for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
+    params (i) = a.params (i);
+
+  return *this;
+}
+
+bool
+SparseParams::set_key (const std::string key, const double& val)
+{
+  for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
+    if (keys (i) == key)
+      {
+	params(i) = val;
+	return true;
+      }
+  return false;
+}
+
+double
+SparseParams::get_key (const std::string key)
+{
+  for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
+    if (keys (i) == key)
+	return params(i);
+
+  return octave_NaN;
+}
+
+void
+SparseParams::print_info (std::ostream& os, const std::string& prefix) const
+{
+  for (int i = 0; i < OCTAVE_SPARSE_CONTROLS_SIZE; i++)
+    os << prefix << keys(i) << ": " << params(i) << "\n";
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/oct-spparms.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,78 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_oct_spparms_h)
+#define octave_oct_spparms_h 1
+
+#include <cassert>
+#include <cstddef>
+
+#include <iostream>
+
+#include "str-vec.h"
+#include "dColVector.h"
+
+#define OCTAVE_SPARSE_CONTROLS_SIZE 12
+
+class
+SparseParams
+{
+ public:
+  SparseParams (void) : params (ColumnVector (OCTAVE_SPARSE_CONTROLS_SIZE)), 
+    keys (string_vector (OCTAVE_SPARSE_CONTROLS_SIZE)) 
+    { defaults (); init_keys (); }
+  
+  void defaults (void);
+
+  void tight (void);
+  
+  SparseParams& operator = (const SparseParams& a);
+  
+  double& operator () (int n) { return params (n); }
+  double operator () (int n) const { return params (n); }
+
+  string_vector get_keys (void) const { return keys; }
+
+  ColumnVector get_vals (void) const { return params; }
+
+  bool set_key (const std::string key, const double& val);
+
+  double get_key (const std::string key);
+
+  void print_info (std::ostream& os, const std::string& prefix) const;
+  
+ private:
+  void init_keys (void);
+
+  ColumnVector params;
+
+  string_vector keys;
+};
+
+extern SparseParams Voctave_sparse_controls;
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-base-lu.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,70 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "sparse-base-lu.h"
+
+template <class lu_type, class lu_elt_type, class p_type, class p_elt_type>
+p_type
+sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pr (void) const
+{
+  int nr = Lfact.rows ();
+
+  p_type Pout (nr, nr, nr);
+
+  for (int i = 0; i < nr; i++)
+    {
+      Pout.cidx (i) = i;
+      Pout.ridx (P (i)) = i;
+      Pout.data (i) = 1;
+    }
+  Pout.cidx (nr) = nr;
+
+  return Pout;
+}
+
+template <class lu_type, class lu_elt_type, class p_type, class p_elt_type>
+p_type
+sparse_base_lu <lu_type, lu_elt_type, p_type, p_elt_type> :: Pc (void) const
+{
+  int nc = Ufact.cols ();
+
+  p_type Pout (nc, nc, nc);
+
+  for (int i = 0; i < nc; i++)
+    {
+      Pout.cidx (i) = i;
+      Pout.ridx (i) = Q (i);
+      Pout.data (i) = 1;
+    }
+  Pout.cidx (nc) = nc;
+
+  return Pout;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-base-lu.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,85 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+
+#if !defined (octave_sparse_base_lu_h)
+#define octave_sparse_base_lu_h 1
+
+#include "MArray.h"
+
+template <class lu_type, class lu_elt_type, class p_type, class p_elt_type>
+class
+sparse_base_lu
+{
+public:
+
+  sparse_base_lu (void) { }
+
+  sparse_base_lu (const sparse_base_lu& a) 
+    : Lfact (a.Lfact), Ufact (a.Ufact), cond (a.cond), P (a.P), Q (a.Q) { }
+
+  sparse_base_lu& operator = (const sparse_base_lu& a)
+    {
+      if (this != &a)
+	{
+	  Lfact = a.Lfact;
+	  Ufact = a.Ufact;
+	  cond = a.cond;
+	  P = a.P;
+	  Q = a.Q;
+	}
+      return *this;
+    }
+
+  ~sparse_base_lu (void) { }
+
+  lu_type L (void) const { return Lfact; }
+
+  lu_type U (void) const { return Ufact; }
+
+  p_type Pc (void) const;
+
+  p_type Pr (void) const;
+
+  MArray<int> row_perm (void) const { return P; }
+
+  MArray<int> col_perm (void) const { return Q; }
+
+  double rcond (void) const { return cond; }
+
+protected:
+
+  lu_type Lfact;
+  lu_type Ufact;
+
+  double cond;
+
+  MArray<int> P;
+  MArray<int> Q;
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-mk-ops.awk	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,239 @@
+BEGIN {
+  declare_types = 0;
+  generate_ops = 0;
+  ntypes = 0;
+} {
+  if (NR == 1 && make_inclusive_header)
+    {
+      print "// DO NOT EDIT -- generated by sparse-mk-ops";
+      tmp = make_inclusive_header;
+      gsub (/[\.-]/, "_", tmp);
+      printf ("#if !defined (octave_%s)\n", tmp);
+      printf ("#define octave_%s 1\n", tmp);
+    }
+}
+/^#/ {
+  if ($2 == "types")
+    declare_types = 1;
+  else if ($2 == "ops")
+    {
+      generate_ops = 1;
+      declare_types = 0;
+    }
+  next;
+} {
+  if (declare_types)
+    {
+      ntypes++;
+
+      if (NF == 6)
+        {
+          scalar_zero_val[ntypes] = $6;
+          fwd_decl_ok[ntypes] = $5 == "YES";
+          header[ntypes] = $4 == "NONE" ? "" : $4;
+          class[ntypes] = $3;
+          type[ntypes] = $2;
+          tag[ntypes] = $1;
+          rev_tag[$1] = ntypes;
+        }
+      else
+        printf ("skipping line %d: %s\n", NR, $0); 
+    }
+  else if (generate_ops)
+    {
+      if (NF >= 5)
+        {
+          result_tag_1 = $1;
+          result_tag_2 = $2;
+          lhs_tag = $3;
+          rhs_tag = $4;
+	  op_type = $5;
+
+	  bin_ops = index (op_type, "B") != 0;
+	  cmp_ops = index (op_type, "C") != 0;
+	  eqne_ops = index (op_type, "E") != 0;
+	  bool_ops = index (op_type, "L") != 0;
+
+          n = 5;
+
+          lhs_conv = cmp_ops ? $(++n) : "";
+          rhs_conv = cmp_ops ? $(++n) : "";
+
+	  if (lhs_conv == "NONE")
+	    lhs_conv = "";
+
+	  if (rhs_conv == "NONE")
+	    rhs_conv = "";
+
+	  k = 0
+	  while (NF > n)
+	    bool_headers[k++] = $(++n);
+
+	  cc_file = sprintf ("%s-%s-%s.cc", prefix, lhs_tag, rhs_tag);
+	  h_file = sprintf ("%s-%s-%s.h", prefix, lhs_tag, rhs_tag);
+
+	  if (list_cc_files)
+	    {
+	      print cc_file;
+	      next;
+	    }
+
+	  if (list_h_files)
+	    {
+	      print h_file;
+	      next;
+	    }
+
+	  if (make_inclusive_header)
+	    {
+              printf ("#include \"%s\"\n", h_file);
+              next;
+            }
+
+	  h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag);
+
+	  result_num_1 = rev_tag[result_tag_1];
+	  result_num_2 = rev_tag[result_tag_2];
+	  lhs_num = rev_tag[lhs_tag];
+	  rhs_num = rev_tag[rhs_tag];
+
+	  result_type_1 = type[result_num_1];
+	  result_type_2 = type[result_num_2];
+	  lhs_type = type[lhs_num];
+          rhs_type = type[rhs_num];
+
+	  result_scalar_zero_val_1 = scalar_zero_val[result_num_1];
+	  result_scalar_zero_val_2 = scalar_zero_val[result_num_2];
+          lhs_scalar_zero_val = scalar_zero_val[lhs_num];
+          rhs_scalar_zero_val = scalar_zero_val[rhs_num];
+
+	  result_header_1 = header[result_num_1];
+	  result_header_2 = header[result_num_2];
+	  lhs_header = header[lhs_num];
+          rhs_header = header[rhs_num];
+
+	  lhs_class = class[lhs_num];
+	  rhs_class = class[rhs_num];
+
+	  print "// DO NOT EDIT -- generated by sparse-mk-ops" > h_file;
+
+	  printf ("#if !defined (%s)\n", h_guard) >> h_file;
+	  printf ("#define %s 1\n", h_guard) >> h_file;
+
+          if (result_header_1)
+	    {
+	      if (result_fwd_decl_ok)
+	        printf ("class %s\n", result_type_1) >> h_file;
+	      else
+	        printf ("#include \"%s\"\n", result_header_1) >> h_file;
+	    }
+
+          if (result_header_2 && ! (result_header_2 == result_header_1))
+	    {
+	      if (result_fwd_decl_ok)
+	        printf ("class %s\n", result_type_2) >> h_file;
+	      else
+	        printf ("#include \"%s\"\n", result_header_2) >> h_file;
+	    }
+
+          if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
+	    {
+	      if (result_fwd_decl_ok)
+	        printf ("class %s\n", lhs_type) >> h_file;
+	      else
+	        printf ("#include \"%s\"\n", lhs_header) >> h_file;
+	    }
+
+          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2))
+	    {
+	      if (result_fwd_decl_ok)
+	        printf ("class %s\n", rhs_type) >> h_file;
+	      else
+	        printf ("#include \"%s\"\n", rhs_header) >> h_file;
+	    }
+
+          printf ("#include \"Sparse-op-defs.h\"\n") >> h_file;
+
+          if (bin_ops)
+            printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s)\n", lhs_class,
+		    rhs_class, result_type_1, result_type_2, lhs_type, 
+		    rhs_type) >> h_file
+
+          if (cmp_ops)
+            printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s)\n", lhs_class,
+		    rhs_class, lhs_type, rhs_type) >> h_file
+
+          if (eqne_ops)
+            printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s)\n", lhs_class,
+		    rhs_class, lhs_type, rhs_type) >> h_file
+
+          if (bool_ops)
+            printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s)\n", lhs_class,
+		    rhs_class, lhs_type, rhs_type) >> h_file
+
+
+          print "#endif" >> h_file;
+
+	  close (h_file);
+
+
+	  print "// DO NOT EDIT -- generated by sparse-mk-ops" > cc_file;
+
+	  ## print "#ifdef HAVE_CONFIG_H" >> cc_file;
+	  print "#include <config.h>" >> cc_file;
+	  ## print "#endif" >> cc_file;
+
+	  print "#include \"Array-util.h\"" >> cc_file;
+	  print "#include \"quit.h\"" >> cc_file;
+
+	  printf ("#include \"%s\"\n", h_file) >> cc_file;
+
+	  for (i in bool_headers)
+	    {
+	      printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file;
+	      delete bool_headers[i];
+	    }
+
+          if (result_header_1)
+	    printf ("#include \"%s\"\n", result_header_1) >> cc_file;
+
+          if (result_header_2 && ! (result_header_2 == result_header_1))
+	    printf ("#include \"%s\"\n", result_header_2) >> cc_file;
+
+          if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2))
+	    printf ("#include \"%s\"\n", lhs_header) >> cc_file;
+
+          if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2))
+	    printf ("#include \"%s\"\n", rhs_header) >> cc_file;
+
+	  if (bin_ops)
+            printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", lhs_class, 
+		    rhs_class, result_type_1, result_type_2, lhs_type, 
+		    rhs_type) >> cc_file
+
+          if (cmp_ops)
+            printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n", 
+		    lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val,
+		    lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file
+
+          if (eqne_ops)
+            printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n", 
+		    lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val,
+		    lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file
+
+          if (bool_ops)
+            printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", lhs_class, 
+		    rhs_class, lhs_type, rhs_type, lhs_scalar_zero_val,
+	            rhs_scalar_zero_val) >> cc_file
+
+
+          close (cc_file);
+        }
+      else
+        printf ("skipping line %d: %s\n", NR, $0); 
+    }
+}
+END {
+  if (make_inclusive_header)
+    print "#endif";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-mx-ops	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,45 @@
+# types
+#
+# key typename object-type header fwd-decl-ok scalar-zero
+#
+#   S:  scalar
+#   M:  matrix
+#   DM: diagonal matrix
+#   ND: N-d array
+#   SM: sparse matrix
+#
+sm SparseMatrix SM dSparse.h YES 0.0
+scm SparseComplexMatrix SM CSparse.h YES 0.0
+sbm SparseBoolMatrix SM boolSparse.h YES false
+b bool S NONE NO false
+bm boolMatrix M boolMatrix.h YES false
+s double S NONE NO 0.0
+cs Complex S oct-cmplx.h NO 0.0
+m Matrix M dMatrix.h YES 0.0
+cm ComplexMatrix M CMatrix.h YES 0.0
+# ops
+# result_t_1 result_t_2 lhs_t rhs_t op-type lhs_conv rhs_conv headers ...
+#
+# op-type is one of
+#
+#  B: binary ops, + - * /
+#  C: comparison ops, < <= == != >= >
+#  E: == != (Only one of C or E can be used!!)
+#  L: logical ops, & |
+#
+cm scm sm cs BCL NONE real boolSparse.h
+cm scm cs sm BCL real NONE boolSparse.h
+cm scm scm s BCL real NONE boolSparse.h
+cm scm s scm BCL NONE real boolSparse.h
+scm scm scm sm BCL real NONE boolSparse.h
+scm scm sm scm BCL NONE real boolSparse.h
+m sm m sm BCL NONE NONE boolSparse.h
+cm scm m scm BCL NONE real boolSparse.h
+cm scm cm sm BCL real NONE boolSparse.h
+cm scm cm scm BCL real real boolSparse.h
+m sm sm m BCL NONE NONE boolSparse.h
+cm scm scm m BCL real NONE boolSparse.h
+cm scm sm cm BCL NONE real boolSparse.h
+cm scm scm cm BCL real real boolSparse.h
+bm sbm bm sbm EL
+bm sbm sbm bm EL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-sort.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,56 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cassert>
+
+#include "oct-sort.cc"
+#include "quit.h"
+
+#include "sparse-sort.h"
+
+// A simple class and instantiation of the octave merge sort class
+// to sort sparse data before matrix creation. This is significantly
+// faster than using octave_qsort.
+
+bool
+octave_sparse_sidxl_comp (octave_sparse_sort_idxl* i, 
+			  octave_sparse_sort_idxl* j)
+{
+  int tmp = i->c - j->c;
+  if (tmp < 0)
+    return true;
+  else if (tmp > 0)
+    return false;
+  return  (i->r < j->r);
+}
+
+// Instantiate the sparse sorting class
+template class octave_sort<octave_sparse_sort_idxl *>;
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/sparse-sort.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,45 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_sort_h)
+#define octave_sparse_sort_h
+
+#include "oct-sort.h"
+
+class
+octave_sparse_sort_idxl
+{
+ public:
+  unsigned int r;
+  unsigned int c;
+  unsigned int idx; 
+};
+
+bool octave_sparse_sidxl_comp (octave_sparse_sort_idxl* i,
+			       octave_sparse_sort_idxl* j);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/scripts/ChangeLog	Fri Feb 25 17:42:55 2005 +0000
+++ b/scripts/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -1,3 +1,42 @@
+2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	Sparse merge.
+
+	2005-01-23  David Bateman  <dbateman@free.fr>
+
+	* sparse/randperm.m: Delete duplicate randperm.m.
+
+	2005-01-10  John W. Eaton  <jwe@octave.org>
+
+	* sparse/Makefile.in: New file.
+	* configure.in (AC_CONFIG_FILES): Add sparse/Makefile to the list.
+
+	2005-01-07  David Bateman  <dbateman@free.fr>
+
+	* set/unique.m: import file from octave-forge.
+
+	2005-01-05  David Bateman  <dbateman@free.fr>
+
+	* Makefile.in: include sparse directory in SUBDIRS.
+	
+	2004-12-30  John W. Eaton  <jwe@octave.org>
+
+	* sparse/nzmax.m: Delete (there is an nzmax function in
+	src/DLD-FUNCTIONS/sparse.cc).
+
+	2004-12-28  John W. Eaton  <jwe@octave.org>
+
+	Merge of sparse code from David Bateman <dbateman@free.fr> and 
+	Andy Adler <adler@site.uottawa.ca>.
+
+	* sparse/colperm.m, sparse/nonzeros.m, sparse/nzmax.m,
+	sparse/randperm.m, sparse/spalloc.m, sparse/spconvert.m,
+	sparse/spdiags.m, sparse/speye.m, sparse/spfun.m, sparse/sphcat.m,
+	sparse/spones.m, sparse/sprand.m, sparse/sprandn.m,
+	sparse/spstats.m, sparse/spvcat.m, sparse/spy.m: New files.
+
+	* sparse: New directory.
+
 2005-02-22  John W. Eaton  <jwe@octave.org>
 
 	* polynomial/residue.m: Force prepad to always create row vectors.
--- a/scripts/Makefile.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/scripts/Makefile.in	Fri Feb 25 19:55:28 2005 +0000
@@ -31,8 +31,8 @@
 
 SUBDIRS = audio control deprecated elfun finance general image io \
 	linear-algebra miscellaneous plot polynomial quaternion \
-	set signal specfun special-matrix startup statistics \
-	strings time
+	set signal sparse specfun special-matrix startup \
+	statistics strings time
 
 DISTSUBDIRS = $(SUBDIRS)
 
--- a/scripts/configure.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/scripts/configure.in	Fri Feb 25 19:55:28 2005 +0000
@@ -34,8 +34,9 @@
 	  finance/Makefile general/Makefile image/Makefile io/Makefile \
 	  linear-algebra/Makefile miscellaneous/Makefile plot/Makefile \
 	  polynomial/Makefile quaternion/Makefile set/Makefile \
-	  signal/Makefile specfun/Makefile special-matrix/Makefile \
-	  startup/Makefile statistics/Makefile statistics/base/Makefile \
-	  statistics/distributions/Makefile statistics/models/Makefile \
-	  statistics/tests/Makefile strings/Makefile time/Makefile])
+	  signal/Makefile sparse/Makefile specfun/Makefile \
+	  special-matrix/Makefile startup/Makefile statistics/Makefile \
+	  statistics/base/Makefile statistics/distributions/Makefile \
+	  statistics/models/Makefile statistics/tests/Makefile \
+	  strings/Makefile time/Makefile])
 AC_OUTPUT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/Makefile.in	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,69 @@
+#
+# Makefile for octave's scripts/sparse directory
+#
+# John W. Eaton
+# jwe@bevo.che.wisc.edu
+# University of Wisconsin-Madison
+# Department of Chemical Engineering
+
+TOPDIR = ../..
+
+script_sub_dir = sparse
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+include $(TOPDIR)/Makeconf
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+SOURCES = *.m
+
+DISTFILES = Makefile.in $(SOURCES)
+
+FCN_FILES = $(wildcard $(srcdir)/*.m)
+FCN_FILES_NO_DIR = $(notdir $(FCN_FILES))
+
+BINDISTFILES = $(FCN_FILES)
+
+all:
+.PHONY: all
+
+install install-strip:
+	$(do-script-install)
+.PHONY: install install-strip
+
+uninstall:
+	$(do-script-uninstall)
+.PHONY: uninstall
+
+clean:
+.PHONY: clean
+
+tags: $(SOURCES)
+	ctags $(SOURCES)
+
+TAGS: $(SOURCES)
+	etags $(SOURCES)
+
+mostlyclean: clean
+.PHONY: mostlyclean
+
+distclean: clean
+	rm -f Makefile
+.PHONY: distclean
+
+maintainer-clean: distclean
+	rm -f tags TAGS
+.PHONY: maintainer-clean
+
+dist:
+	ln $(DISTFILES) ../../`cat ../../.fname`/scripts/sparse
+.PHONY: dist
+
+bin-dist:
+	ln $(BINDISTFILES) ../../`cat ../../.fname`/scripts/sparse
+.PHONY: bin-dist
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/colperm.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,30 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{p} =} colperm (@var{s})
+## Returns the column permutations such that the columns of
+## @code{@var{s} (:, @var{p})} are ordered in terms of increase number
+## of non-zero elements. If @var{s} is symmetric, then @var{p} is chosen
+## such that @code{@var{s} (@var{p}, @var{p})} orders the rows and
+## columns with increasing number of non zeros elements.
+## @end deftypefn
+
+function p = colperm (s)
+  [i, j] = spfind (s);
+  idx = find (diff ([j; Inf]) != 0);
+  [dummy, p] = sort (idx - [0; idx(1:(end-1))]);
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/nonzeros.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,19 @@
+## Copyright (C) 2004 Paul Kienzle
+##
+## This program is free software and is in the public domain
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} nonzeros (@var{s})
+## Returns a vector of the non-zero values of the sparse matrix @var{s}.
+## @end deftypefn
+
+function t = nonzeros(s)
+  if issparse(s)
+    [i,j,t] = spfind(s);
+  else
+    [i,j,t] = find(s);
+  endif
+endfunction
+
+%!assert(nonzeros([1,2;3,0]),[1;3;2])
+%!assert(nonzeros(sparse([1,2;3,0])),[1;3;2])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spalloc.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,43 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{s} =} spalloc (@var{r}, @var{c}, @var{nz})
+## Returns an empty sparse matrix of size @var{r}-by-@var{c}. As Octave
+## resizes sparse matrices at the first opportunity, so that no additional 
+## space is needed, the argument @var{nz} is ignored. This function is 
+## provided only for compatiability reasons.
+##
+## It should be noted that this means that code like
+##
+## @example
+## k = 5;
+## nz = r * k;
+## s = spalloc (r, c, nz)
+## for j = 1:c
+##   idx = randperm (r);
+##   s (:, j) = [zeros(r - k, 1); rand(k, 1)] (idx);
+## endfor
+## @end example
+##
+## will reallocate memory at each step. It is therefore vitally important
+## that code like this is vectorized as much as possible.
+## @end deftypefn
+## @seealso{sparse, nzmax}
+
+function s = spalloc (r, c, nz)
+  s = sparse (r, c);
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spconvert.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,43 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{x} =} spconvert (@var{m})
+## This function converts for a simple sparse matrix format easily
+## produced by other programs into Octave's internal sparse format. The
+## input @var{x} is either a 3 or 4 column real matrix, containing
+## the row, column, real and imaginary parts of the elements of the
+## sparse matrix. An element with a zero real and imaginay part can
+## be used to force a particular matrix size.
+## @end deftypefn
+
+function s = spconvert (m)
+
+  if issparse(m)
+    s = m;
+  else
+    sz = size(m);
+    if (nargin != 1 || !ismatrix(m) || !isreal(m) || length(sz) != 2 || 
+	(sz(2) != 3 && sz(2) != 4))
+      error ("spconvert: input matrix must be either sparse or a three or four column");
+      error ("           real matrix");
+    elseif (sz(2) == 3)
+      s = sparse (m(:,1), m(:,2), m(:,3));
+    else
+      s = sparse (m(:,1), m(:,2), m(:,3) + 1i*m(:,4));
+    endif
+  endif
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spdiags.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,92 @@
+## Copyright (C) 2000-2001 Paul Kienzle
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {function File} {[@var{b}, @var{c}]} = spdiags (@var{a})
+## @deftypefnx {function File} {@var{b}} = spdiags (@var{a}, @var{c})
+## @deftypefnx {function File} {@var{b}} = spdiags (@var{v}, @var{c}, @var{a})
+## @deftypefnx {function File} {@var{b}} = spdiags (@var{v}, @var{c}, @var{m}, @var{n})
+## A generalization of the function @code{spdiag}. Called with a single
+## input argument, the non-zero diagonals @var{c} of @var{A} are extracted.
+## With two arguments the diagonals to extract are given by the vector 
+## @var{c}.
+##
+## The other two forms of @code{spdiags} modify the input matrix by
+## replacing the diagonals. They use the columns of @var{v} to replace
+## the columns represented by the vector @var{c}. If the sparse matrix
+## @var{a} is defined then the diagonals of this matrix are replaced.
+## Otherwise a matrix of @var{m} by @var{n} is created with the
+## diagonals given by @var{v}.
+##
+## Negative values of @var{c} representive diagonals below the main
+## diagonal, and positive values of @var{c} diagonals above the main
+## diagonal.
+##
+## For example
+##
+## @example
+## @group
+## spdiags (reshape (1:12, 4, 3), [-1 0 1], 5, 4)
+## @result{}    5 10  0  0
+##       1  6 11  0
+##       0  2  7 12
+##       0  0  3  8
+##       0  0  0  4
+## @end group
+## @end example
+##
+## @end deftypefn
+
+function [A, c] = spdiags(v,c,m,n)
+
+  wfi = warn_fortran_indexing;
+  unwind_protect
+    warn_fortran_indexing = 0;
+    
+    if nargin == 1 || nargin == 2
+      ## extract nonzero diagonals of v into A,c
+      [i,j,v,nr,nc] = spfind(v);
+      if nargin == 1
+        c = unique(j-i);  # c contains the active diagonals
+      endif
+      ## FIXME: we can do this without a loop if we are clever
+      offset = max(min(c,nc-nr),0);
+      A = zeros(min(nr,nc),length(c));
+      for k=1:length(c)
+	idx = find(j-i == c(k));
+	A(j(idx)-offset(k),k) = v(idx);
+      end
+    elseif nargin == 3
+      ## Replace specific diagonals c of m with v,c
+      [nr,nc] = size(m);
+      B = spdiags(m,c);
+      A = m - spdiags(B,c,nr,nc) + spdiags(v,c,nr,nc);
+    else
+      ## Create new matrix of size mxn using v,c
+      [j,i,v] = find(v);
+      offset = max(min(c(:),n-m),0);
+      j+=offset(i);
+      i=j-c(:)(i);
+      idx = i>0 & i<=m & j>0 & j<=n;
+      A = sparse(i(idx),j(idx),v(idx),m,n);
+      
+    endif
+    
+  unwind_protect_cleanup
+    warn_fortran_indexing = wfi;
+  end_unwind_protect
+
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/speye.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,55 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{y} =} speye (@var{m})
+## @deftypefnx {Function File} {@var{y} =} speye (@var{m}, @var{n})
+## @deftypefnx {Function File} {@var{y} =} speye (@var{sz})
+## Returns a sparse identity matrix. This is significantly more
+## efficient than @code{sparse (eye (@var{m}))} as the full matrix
+## is not constructed.
+##
+## Called with a single argument a square matrix of size @var{m} by
+## @var{m} is created. Otherwise a matrix of @var{m} by @var{n} is
+## created. If called with a single vector argument, this argument 
+## is taken to be the size of the matrix to create.
+## @end deftypefn
+
+function s = speye(m,n)
+  if (nargin == 1)
+    if (isvector (m) && length(m) == 2)
+      n = m(2);
+      m = m(1);
+    elseif (isscalar (m))
+      n = m;
+    else
+      error ("speye: invalid matrix dimension");
+    endif
+  else
+    if (!isscalar (m) || !isscalar (n))
+      error ("speye: invalid matrix dimension");
+    endif
+  endif
+
+  lo = min([m,n]);
+  s = sparse(1:lo,1:lo,1,m,n);
+endfunction
+
+%!assert(issparse(speye(4)))
+%!assert(speye(4),sparse(1:4,1:4,1))
+%!assert(speye(2,4),sparse(1:2,1:2,1,2,4))
+%!assert(speye(4,2),sparse(1:2,1:2,1,4,2))
+%!assert(speye([4,2]),sparse(1:2,1:2,1,4,2))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spfun.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,49 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{y} =} spfun (@var{f},@var{x})
+## Compute @code{f(@var{x})} for the non-zero values of @var{x}.
+## This results in a sparse matrix with the same structure as 
+## @var{x}. The function @var{f} can be passed as a string, a
+## function handle or an inline function.
+## @end deftypefn
+
+function t = spfun(f,s)
+  if (nargin != 2)
+    usage ("spfun(f,s)")
+  endif
+
+  if issparse(s)
+    [i,j,v,m,n] = spfind(s);
+  else
+    [i,j,v] = find(s);
+    [m,n] = size(s);
+  end
+
+  if (isa (f, "function handle") || isa (f, "inline function"))
+    t = sparse(i,j,f(v),m,n);
+  else
+    t = sparse(i,j,feval(f,v),m,n);
+  endif
+
+endfunction
+
+%!assert(spfun('exp',[1,2;3,0]),sparse([exp(1),exp(2);exp(3),0]))
+%!assert(spfun('exp',sparse([1,2;3,0])),sparse([exp(1),exp(2);exp(3),0]))
+%!assert(spfun(@exp,[1,2;3,0]),sparse([exp(1),exp(2);exp(3),0]))
+%!assert(spfun(@exp,sparse([1,2;3,0])),sparse([exp(1),exp(2);exp(3),0]))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/sphcat.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,34 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{y} =} sphcat (@var{a1}, @var{a2}, @dots{}, @var{aN})
+## Return the horizontal concatenation of sparse matrices. This function
+## is obselete and @code{horzcat} should be used
+## @end deftypefn
+## @seealso {spvcat, vertcat, horzcat, cat}
+
+function y = sphcat (varargin)
+
+  persistent sphcat_warned = false;
+
+  if (!sphcat_warned)
+    sphcat_warned = true;
+    warning ("sphcat: This function is depreciated. Use horzcat instead");
+  endif
+
+  y = horzcat (varargin{:});
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spones.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,35 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{y} =} spones (@var{x})
+## Replace the non-zero entries of @var{x} with ones. This creates a
+## sparse matrix with the same structure as @var{x}.
+## @end deftypefn
+
+function s = spones(s)
+  if issparse(s)
+    [i,j,v,m,n] = spfind(s);
+  else
+    [i,j,v] = find(s);
+    [m,n] = size(s);
+  end
+  s = sparse(i,j,1,m,n);
+endfunction
+
+%!assert(issparse(spones([1,2;3,0])))
+%!assert(spones([1,2;3,0]),sparse([1,1;1,0]))
+%!assert(spones(sparse([1,2;3,0])),sparse([1,1;1,0]))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/sprand.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,58 @@
+## Copyright (C) 2004 Paul Kienzle
+##
+## This program is free software and is in the public domain
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} sprand (@var{m}, @var{n}, @var{d})
+## @deftypefnx {Function File} {} sprand (@var{s})
+## Generate a random sparse matrix. The size of the matrix will be
+## @var{m} by @var{n}, with a density of values given by @var{d}.
+## @var{d} should be between 0 and 1. Values will be normally
+## distributed with mean of zero and variance 1.
+##
+## Note: sometimes the actual density  may be a bit smaller than @var{d}. 
+## This is unlikely to happen for large really sparse matrices.
+##
+## If called with a single matrix argument, a random sparse matrix is
+## generated wherever the matrix @var{S} is non-zero.
+## @end deftypefn
+## @seealso{sprandn}
+
+
+## This program is public domain
+## Author: Paul Kienzle <pkienzle@users.sf.net>
+##
+## Changelog:
+##
+## Piotr Krzyzanowski <przykry2004@users.sf.net>
+## 	2004-09-27	use Paul's hint to allow larger random matrices
+##			at the price of sometimes lower density than desired
+## David Bateman 
+##      2004-10-20      Texinfo help and copyright message 
+
+function S = sprand (m, n, d)
+  if nargin == 1
+    [i,j,v,nr,nc] = spfind(m);
+    S = sparse (i,j,rand(size(v)),nr,nc);
+  elseif nargin == 3
+    mn = n*m;
+    k = round(d*mn); # how many entries in S would be satisfactory?
+    idx=unique(fix(rand(min(k*1.01,k+10),1)*mn))+1; 
+                # idx contains random numbers in [1,mn]
+  		# generate 1% or 10 more random values than necessary
+		# in order to reduce the probability that there are less than k
+		# distinct values;
+    		# maybe a better strategy could be used
+     		# but I don't think it's worth the price
+    k = min(length(idx),k);  # actual number of entries in S
+    j = floor((idx(1:k)-1)/m);
+    i = idx(1:k) - j*m;
+    if isempty(i)
+      S = sparse(m,n);
+    else
+      S = sparse(i,j+1,rand(k,1),m,n);
+    endif
+  else
+    usage("sprand(m,n,density) OR sprand(S)");
+  endif
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/sprandn.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,49 @@
+## Copyright (C) 2004 Paul Kienzle
+##
+## This program is free software and is in the public domain
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} sprand (@var{m}, @var{n}, @var{d})
+## @deftypefnx {Function File} {} sprand (@var{s})
+## Generate a random sparse matrix. The size of the matrix will be
+## @var{m} by @var{n}, with a density of values given by @var{d}.
+## @var{d} should be between 0 and 1. Values will be normally
+## distributed with mean of zero and variance 1.
+##
+## Note: sometimes the actual density  may be a bit smaller than @var{d}. 
+## This is unlikely to happen for large really sparse matrices.
+##
+## If called with a single matrix argument, a random sparse matrix is
+## generated wherever the matrix @var{S} is non-zero.
+## @end deftypefn
+## @seealso{sprandn}
+
+## This program is public domain
+## Author: Paul Kienzle <pkienzle@users.sf.net>
+
+function S = sprandn(m,n,d)
+  if nargin == 1
+    [i,j,v,nr,nc] = spfind(m);
+    S = sparse(i,j,randn(size(v)),nr,nc);
+  elseif nargin == 3
+    mn = m*n;
+    k = round(d*mn);
+    idx=unique(fix(rand(min(k*1.01,k+10),1)*mn))+1; 
+                # idx contains random numbers in [1,mn]
+  		# generate 1% or 10 more random values than necessary
+		# in order to reduce the probability that there are less than k
+		# distinct values;
+    		# maybe a better strategy could be used
+     		# but I don't think it's worth the price
+    k = min(length(idx),k);  # actual number of entries in S
+    j = floor((idx(1:k)-1)/m);
+    i = idx(1:k) - j*m;
+    if isempty(i)
+      S = sparse(m,n);
+    else
+      S = sparse(i,j+1,randn(k,1),m,n);
+    endif
+  else
+    usage("sprandn(m,n,density) OR sprandn(S)");
+  endif
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spstats.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,48 @@
+## Copyright (C) 2004 Paul Kienzle
+##
+## This program is free software and is in the public domain
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {[@var{count}, @var{mean}, @var{var}]} = spstats (@var{s})
+## @deftypefnx {Function File} {[@var{count}, @var{mean}, @var{var}]} = spstats (@var{s}, @var{j})
+## Return the stats for the non-zero elements of the sparse matrix @var{s}.
+## @var{count} is the number of non-zeros in each column, @var{mean}
+## is the mean of the non-zeros in each column, and @var{var} is the  
+## variance of the non-zeros in each column.
+##
+## Called with two output arguments, if @var{s} is the data and @var{j}
+## is the bin number for the data, compute the stats for each bin.  In 
+## this case, bins can contain data values of zero, whereas with 
+## @code{spstats (@var{s})} the zeros may disappear.
+## @end deftypefn
+
+function [count,mean,var] = spstats(S,j)
+  if nargin < 1 || nargin > 2
+    usage("[count, mean, var] = spstats(S)  OR  spstats(x,j)");
+  endif
+
+  [n, m] = size (S);
+  if nargin == 1
+    [i,j,v] = spfind (S);
+  else
+    v = S;    
+    i = 1:length (v);
+    S = sparse (i, j, v);
+  endif 
+
+  count = spsum (sparse (i, j, 1, n, m));
+  if (nargout > 1) 
+    mean = spsum(S) ./ count; 
+  end
+  if (nargout > 2) 
+    ## XXX FIXME XXX Variance with count = 0 or 1?
+    diff = S - sparse (i, j, mean(j), n, m); 
+    var = spsum (diff .* diff) ./ (count - 1);
+  end
+endfunction
+
+%!test
+%! [n,m,v] = spstats([1 2 1 2 3 4],[2 2 1 1 1 1]);
+%! assert(n,[4,2]);
+%! assert(m,[10/4,3/2],10*eps);
+%! assert(v,[5/3,1/2],10*eps);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spvcat.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,34 @@
+## Copyright (C) 2004 David Bateman & Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{y} =} spvcat (@var{a1}, @var{a2}, @dots{}, @var{aN})
+## Return the vertical concatenation of sparse matrices. This function
+## is obselete and @code{vertcat} should be used
+## @end deftypefn
+## @seealso {sphcat, vertcat, horzcat, cat}
+
+function y = spvcat (varargin)
+
+  persistent spvcat_warned = false;
+
+  if (!spvcat_warned)
+    spvcat_warned = true;
+    warning ("spvcat: This function is depreciated. Use vertcat instead");
+  endif
+
+  y = vertcat (varargin{:});
+endfunction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/sparse/spy.m	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,50 @@
+## Copyright (C) 1998-2004 Andy Adler
+##
+## 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 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} spy (@var{x})
+## Plot the sparsity pattern of the sparse matrix @var{x}.
+## @end deftypefn
+
+function spy(S) 
+  if issparse(S)
+    [i,j,s,m,n]= spfind(S);
+  else
+    [i,j,s] = find(S);
+    [m,n] = size(S);
+  endif
+
+  arp = automatic_replot;
+  unwind_protect
+    automatic_replot = 0;
+
+    eval(sprintf('gset nokey'))
+    eval(sprintf('gset yrange [0:%d] reverse',m+1))
+    eval(sprintf('gset xrange [0:%d] noreverse',n+1))
+
+    if (length(i)<1000)
+      plot(j,i,'*');
+    else
+      plot(j,i,'.');
+    endif
+
+    #TODO: we should store the reverse state so we don't undo it
+    gset yrange [0:1] noreverse
+    axis;
+  unwind_protect_cleanup
+    automatic_replot = arp;
+  end_unwind_protect
+endfunction
--- a/src/ChangeLog	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ChangeLog	Fri Feb 25 19:55:28 2005 +0000
@@ -1,3 +1,282 @@
+2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	Sparse merge.
+
+	2005-02-25  John W. Eaton  <jwe@octave.org>
+
+	* DLD-SRC/rand.cc (Frand): Accept "state" as an alias for "seed".
+
+	* DLD-SRC/dispatch.cc: New file.
+	* Makefile.in (DLD_XSRC): Add it to the list.
+
+	2005-02-13  David Bateman  <dbateman@free.fr>
+
+	* ov-fcn-inline.h, DLD-FUNCTIONS/spparms.cc, DLD-FUNCTIONS/gcd.cc:
+	Remove additional licensing clause, with authors permission
+
+	* ov-base-sparse.h: New constructor to cache SparseType, not yet
+	used
+	* ov-re-sparse.h: likewise
+	* ov-cx-sparse.h: likewise
+	* ov.h: Likewise
+
+	* sparse-xdiv.cc: Remove spparms umfpack flag
+
+	* DLD-FUNCTIONS/spparms.cc: Warning that umfpack flag is ignored.
+	
+	2005-01-16  David Bateman  <dbateman@free.fr>
+
+	* ls-mat5.cc (read_mat5_integer_data): Change "T &m" to "T *m" and
+	instantiate with values like octave_int8 rather than int8NDArray.
+	Modify function to fit
+	(read_mat5_binary_element): Use new form of read_mat_integer_data
+	to read data directly into sparse matrix
+	(write_mat5_integer_data): Change "const T &m" to "T *m", etc. New
+	instantiation with int.
+	(save_mat5_binary_element): Modify to save sparse data
+	
+	2005-01-15  David Bateman  <dbateman@free.fr>
+
+	* data.cc (do_cat): Use first non-empty matrix as base for 
+	concatenation.
+	* pt-mat.cc (tree_matrix::rvalue): ditto.
+	
+	2005-01-14  John W. Eaton  <jwe@octave.org>
+
+	* ov.cc (do_cat_op): When checking for empty args, use
+	all_zero_dims, not numel.
+	* ov.h (octave_value::all_zero_dims): New function.
+
+	* ov-bool-sparse.cc (try_narrowing_conversion): Convert to
+	bool_matrix, not matrix.
+
+	2005-01-13  David Bateman  <dbateman@free.fr>
+
+	* data.cc (make_diag): Use numel not capacity to remove ambiguity.
+	* ov.h (octave_value::capacity): New virtual funtion.
+	* ov-base.h (octave_base_value::capacity): New function calls numel.
+	* data.cc (Freshape): Use arg.numel() rather than arg.dims().numel() 
+	since sparse numel now consistent.
+	* symtab.h (symbol_record::symbol_def::capacity, 
+	symbol_record::capacity): New methods.
+	* symtab.cc (symbol_record::print_symbol_info_line,
+	symbol_table::parse_whos_line_format, symbol_table::maybe_list):
+	used capacity() and not numel() to properly assess size of
+	sparse objects.
+	* ov-base-sparse.h (octave_base_sparse::capacity): New function,
+	(octave_base_sparse::numel): Delete.
+	* ov-re-sparse.cc (octave_sparse_matrix::streamoff_array_value):
+	Only fill from non-zero elements of sparse array.
+	* DLD-FUNCTIONS/splu.cc (Fsplu): Change use of nelem to numel.
+	* ov.cc (do_cat_op): Early return for concatenation with empty
+	objects.
+	
+	2005-01-12  John W. Eaton  <jwe@octave.org>
+
+	* DLD-FUNCTIONS/find.cc (Ffind): Make it work for character strings.
+
+	2005-01-11  John W. Eaton  <jwe@octave.org>
+
+	* OPERATORS/op-double-conv.cc: New conversions for sparse_matrix
+	and sparse_bool_matrix to matrix.
+
+	2005-01-11  David Bateman  <dbateman@free.fr>
+
+	* ov-base-sparse.h (octave_base_sparse::any, 
+	octave_base_sparse::all): Use new constructors, etc as pointed out
+	by JWE.
+
+	2005-01-10  John W. Eaton  <jwe@octave.org>
+
+	* DLD-FUNCTIONS/sparse.cc (MINMAX_BODY, Fspatan2, make_spdiag):
+	Write retval(0) = result instead of retval(0) = octave_value (result).
+	* DLD-FUNCTIONS/splu.cc (Fsplu): Likewise.
+
+	2005-01-08  David Bateman  <dbateman@free.fr>
+
+	* ls-mat5.cc (read_mat5_integer_data): Instantiate for Array<int>
+	(read_mat5_binary_element): Add code to read sparse matrices
+	saved in matlab v5 format
+
+	2005-01-07  David Bateman  <dbateman@free.fr>
+
+	* OPERATORS/op-bm-sbm.cc, OPERATORS/op-b-sbm.cc,
+	OPERATORS/op-cm-scm.cc, OPERATORS/op-cm-sm.cc,
+	OPERATORS/op-cs-scm.cc, OPERATORS/op-cs-sm.cc,
+	OPERATORS/op-m-scm.cc, OPERATORS/op-m-sm.cc,
+	OPERATORS/op-sbm-b.cc, OPERATORS/op-sbm-bm.cc,
+	OPERATORS/op-sbm-sbm.cc, OPERATORS/op-scm-cm.cc,
+	OPERATORS/op-scm-cs.cc, OPERATORS/op-scm-m.cc,
+	OPERATORS/op-scm-s.cc, OPERATORS/op-scm-scm.cc, 
+	OPERATORS/op-scm-sm.cc, OPERATORS/op-sm-cm.cc,
+	OPERATORS/op-sm-cs.cc, OPERATORS/op-sm-m.cc,
+	OPERATORS/op-sm-s.cc, OPERATORS/op-sm-scm.cc,
+	OPERATORS/op-sm-sm.cc, OPERATORS/op-s-scm.cc,
+	OPERATORS/op-s-sm.cc: New octave_value constructors allow
+	macros from ops.h to be used rather than sparse-ops.h. Remove
+	other explicit uses of maybe_mutate.
+
+	* sparse-ops.h: delete file.
+
+	* colamd.cc (Fcolamd, Fsymamd, Fetree): Remove no longer needed 
+	use of get_rep() and use the sparse matrix conversion functions
+	directly.
+
+	* data.cc (Freshape): Use arg.dims().numel() rather than 
+	arg.numel() due to definition of numel for sparse matrices.
+	
+	* sparse.cc (Ffull, Fspfind, SPARSE_DIM_ARG_BODY, MINMAX_BODY,
+	Fspatan2, make_spdiag): Convert to use new octave_value sparse
+	constructors, sparse matrix conversion functions and remove
+	maybe_mutate calls.
+	(Fspreshape): Delete
+
+	* splu.cc (Fsplu): Remove remaining explicit octave_value
+	construction.
+	
+	* ov-base-sparse.h (do_index_op, resize, reshape, permute, squeeze):
+	Move these methods from the derived classes.
+	* ov-base-spase.cc (do_index_op): Move this method from the derived
+	classes.
+	* ov-bool-sparse.h (do_index_op, resize, reshape, permute, squeeze):
+	delete.
+	* ov-re-spase.cc (do_index_op): delete.
+	* ov-cx-sparse.h (do_index_op, resize, reshape, permute, squeeze):
+	delete.
+	* ov-cx-spase.cc (do_index_op): delete.
+	* ov-bool-spase.cc (do_index_op): delete.
+	* ov-re-sparse.h (do_index_op, resize, reshape, permute, squeeze):
+	delete.
+
+	* DLD-FUNCTIONS/spdet.cc (Fspdet): Remove use of SparseDet and
+	SparseComplexDET classes and use DET and ComplexDET classes.
+	
+ 	* DLD-FUNCTIONS/colamd.cc op-bm-sbm.cc OPERATORS/op-b-sbm.cc
+	OPERATORS/op-cm-scm.cc OPERATORS/op-cm-sm.cc OPERATORS/op-cs-scm.cc 
+	OPERATORS/op-cs-sm.cc OPERATORS/op-fil-sbm.cc OPERATORS/op-fil-scm.cc
+	OPERATORS/op-fil-sm.cc OPERATORS/op-m-scm.cc OPERATORS/op-m-sm.cc 
+	OPERATORS/op-sbm-b.cc OPERATORS/op-sbm-bm.cc OPERATORS/op-sbm-sbm.cc 
+	OPERATORS/op-scm-cm.cc OPERATORS/op-scm-cs.cc OPERATORS/op-scm-m.cc
+	OPERATORS/op-scm-s.cc OPERATORS/op-scm-scm.cc OPERATORS/op-scm-sm.cc 
+	OPERATORS/op-sm-cm.cc OPERATORS/op-sm-cs.cc OPERATORS/op-sm-m.cc 
+	OPERATORS/op-sm-s.cc OPERATORS/op-sm-scm.cc OPERATORS/op-sm-sm.cc 
+	OPERATORS/op-s-scm.cc OPERATORS/op-s-sm.cc ov-base-sparse.cc 
+	ov-base-sparse.h ov-bool-sparse.cc ov-bool-sparse.h ov-cx-sparse.cc 
+	ov-cx-sparse.h ov-re-sparse.cc ov-re-sparse.h sparse-base-lu.cc 
+	sparse-base-lu.h DLD-FUNCTIONS/sparse.cc sparse-xdiv.cc sparse-xdiv.h
+	sparse-xpow.cc sparse-xpow.h DLD-FUNCTIONS/spdet.cc 
+	DLD-FUNCTIONS/splu.cc DLD-FUNCTIONS/spparms.cc: Remove additional 
+	licensing clause with authors permission.
+	
+	2005-01-05  David Bateman  <dbateman@free.fr>
+
+	* DLD-FUNCTIONS/colamd.cc: Rename from colamdoct.cc. Base colamd.h
+	now found in COLAMD/colamd.h.
+	(Fcolamd): Return value is now used.
+	(Fsymamd): ditto.
+	
+	* Makefile.in: include colamd.cc in DLD_XSRC.
+
+	* ov.h (sparse_matrix_value, sparse_complex_matrix_value,
+	sparse_bool_matrix_value): New virtual functions
+
+	* ov-base.cc (octave_base_value::sparse_matrix_value,
+	octave_base_value::sparse_complex_matrix_value,
+	octave_base_value::sparse_bool_matrix_value): New default sparse
+	matrix extraction functions.
+
+	* ov-base.h (sparse_matrix_value, sparse_complex_matrix_value,
+	sparse_bool_matrix_value): Declare them.
+
+	* ov-re-mat.cc (octave_matrix::sparse_matrix_value,
+	octave_matrix::sparse_complex_matrix_value): Conversion functions.
+
+	* ov-re-mat.h (sparse_matrix_value, sparse_complex_matrix_value):
+	Declare them.
+	
+	* ov-cx-mat.cc (octave_complex_matrix::sparse_matrix_value,
+	octave_complex_matrix::sparse_complex_matrix_value): Conversion 
+	functions.
+
+	* ov-cx-mat.h (sparse_matrix_value, sparse_complex_matrix_value):
+	Declare them.
+
+	* ov-bool-mat.h (sparse_matrix_value, sparse_complex_matrix_value,
+	sparse_bool_matrix_value): Conversion functions.
+
+	* DLD_FUNCTIONS/spdet.cc (Fspdet): Use the above constructors
+	and conversion functions.
+	* DLD_FUNCTIONS/splu.cc (Fsplu): ditto.
+	
+	2004-12-30  John W. Eaton  <jwe@octave.org>
+
+	* DLD-FUNCTIONS/splu.cc (Fsplu): Avoid shadow warnings.
+
+	* sparse-xpow.cc (elem_xpow): Delete unsed variables.
+	* sparse-xdiv.cc (x_el_div): Likewise.
+
+	* DLD-FUNCTIONS/det.cc (Fdet): Delete unused argument nargout.
+	* DLD-FUNCTIONS/spdet.cc (Fspdet): Likewise.
+
+	* DLD-FUNCTIONS/sparse.cc (Fnzmax): Return a value.
+
+	* ov.cc, ov.h (octave_value::octave_value (const SparseMatrix&),
+	(octave_value::octave_value (const SparseBoolMatrix&),
+	(octave_value::octave_value (const SparseComplexMatrix&)):
+	New constructors.
+
+	2004-12-29  John W. Eaton  <jwe@octave.org>
+
+	* DLD-FUNCTIONS/sparse.cc (SPARSE_DIM_ARG_BODY): Rename from
+	DEFUN_DLD_SPARSE_DIM_ARG.  Omit HELP arg.  Omit DEFUN_DLD, so the
+	macro only defines the function body.
+	(Fspprod, Fspcumprod, Fspsum, Fspcumsum, Fspsumsq): Define with
+	DEFUN_DLD, not DEFUN_DLD_SPARSE_DIM_ARG.  Use SPARSE_DIM_ARG_BODY
+	to define function body.
+
+	* DLD-FUNCTIONS/sparse.cc (load_sparse_type, sparse_type_loaded):
+	Delete function, variable, and all uses.
+	* ov.cc: Include ov-bool-sparse.h, ov-re-sparse.h, ov-cx-sparse.h.
+	(install_types): Register sparse types.
+
+	Merge of sparse code from David Bateman <dbateman@free.fr> and 
+	Andy Adler <adler@site.uottawa.ca>.
+
+	* sparse-xdiv.cc, sparse-xpow.cc: New files.
+	* Makefile.in (DIST_SRC): Add them to the list.
+
+	* sparse-ops.h sparse-xdiv.h, sparse-xpow.h: New files.
+	* Makefile.in (INCLUDES): Add them to the list.
+
+	* DLD-FUNCTIONS/colamdoct.cc, DLD-FUNCTIONS/sparse.cc,
+	DLD-FUNCTIONS/spdet.cc, DLD-FUNCTIONS/splu.cc,
+	DLD-FUNCTIONS/spparms.cc: New files.
+	* Makefile.in (DLD_XSRC): Add them to the list.
+
+	* ov-base-sparse.cc, ov-base-sparse.h, ov-bool-sparse.cc,
+	ov-bool-sparse.h, ov-cx-sparse.cc, ov-cx-sparse.h,
+	ov-re-sparse.cc, ov-re-sparse.h: New files.
+	* Makefile.in (OV_SPARSE_SRC, OV_SPARSE_INCLUDES): New lists.
+	(OV_SRC): Add $(OV_SPARSE_SRC) to the list.
+	(INCLUDES): Add $(OV_SPARSE_INCLUDES) to the list.
+	
+	* OPERATORS/op-bm-sbm.cc, OPERATORS/op-b-sbm.cc,
+	OPERATORS/op-cm-scm.cc, OPERATORS/op-cm-sm.cc,
+	OPERATORS/op-cs-scm.cc, OPERATORS/op-cs-sm.cc,
+	OPERATORS/op-fil-sbm.cc, OPERATORS/op-fil-scm.cc,
+	OPERATORS/op-fil-sm.cc, OPERATORS/op-m-scm.cc,
+	OPERATORS/op-m-sm.cc, OPERATORS/op-sbm-b.cc,
+	OPERATORS/op-sbm-bm.cc, OPERATORS/op-sbm-sbm.cc,
+	OPERATORS/op-scm-cm.cc, OPERATORS/op-scm-cs.cc,
+	OPERATORS/op-scm-m.cc, OPERATORS/op-scm-s.cc,
+	OPERATORS/op-scm-scm.cc, OPERATORS/op-scm-sm.cc,
+	OPERATORS/op-sm-cm.cc, OPERATORS/op-sm-cs.cc,
+	OPERATORS/op-sm-m.cc, OPERATORS/op-sm-s.cc,
+	OPERATORS/op-sm-scm.cc, OPERATORS/op-sm-sm.cc,
+	OPERATORS/op-s-scm.cc, OPERATORS/op-s-sm.cc: New files.
+	* Makefile.in (SPARSE_OP_XSRC): New list.
+	(OP_XSRC): Add $(SPARSE_OP_XSRC) to the list.
+
 2005-02-23  John W. Eaton  <jwe@octave.org>
 
 	* parse.y (fold (tree_binary_expression*)): Skip constant folding
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/colamd.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,726 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+// This is the octave interface to colamd, which bore the copyright given
+// in the help of the functions.
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cstdlib>
+
+#include <string>
+#include <vector>
+
+#include "ov.h"
+#include "defun-dld.h"
+#include "pager.h"
+#include "ov-re-mat.h"
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// External COLAMD functions in C
+extern "C" {
+#include "COLAMD/colamd.h"
+}
+
+// The symmetric column elimination tree code take from the Davis LDL code. 
+// Copyright given elsewhere in this file.
+static 
+void symetree (const int *ridx, const int *cidx, int *Parent, int *P, int n)
+{
+  OCTAVE_LOCAL_BUFFER (int, Flag, n);
+  OCTAVE_LOCAL_BUFFER (int, Pinv, (P ? n : 0));
+  if (P)
+    // If P is present then compute Pinv, the inverse of P
+    for (int k = 0 ; k < n ; k++)
+      Pinv [P [k]] = k ;
+
+  for (int k = 0 ; k < n ; k++)
+    {
+      // L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k)
+      Parent [k] = n ;	              // parent of k is not yet known 
+      Flag [k] = k ;		      // mark node k as visited 
+      int kk = (P) ? (P [k]) : (k) ;  // kth original, or permuted, column
+      int p2 = cidx [kk+1] ;
+      for (int p = cidx [kk] ; p < p2 ; p++)
+	{
+	  // A (i,k) is nonzero (original or permuted A)
+	  int i = (Pinv) ? (Pinv [ridx [p]]) : (ridx [p]) ;
+	  if (i < k)
+	    {
+	      // follow path from i to root of etree, stop at flagged node 
+	      for ( ; Flag [i] != k ; i = Parent [i])
+		{
+		  // find parent of i if not yet determined
+		  if (Parent [i] == n)
+		    Parent [i] = k ;
+		  Flag [i] = k ;	// mark i as visited
+		}
+	    }
+	}
+    }
+}
+
+// The elimination tree post-ordering code below is taken from SuperLU
+static inline
+int make_set (int i, int *pp)
+{
+  pp[i] = i;
+  return i;
+}
+
+static inline
+int link (int s, int t, int *pp)
+{
+  pp[s] = t;
+  return t;
+}
+
+static inline
+int find (int i, int *pp)
+{
+  register int p, gp;
+    
+  p = pp[i];
+  gp = pp[p];
+  while (gp != p) {
+    pp[i] = gp;
+    i = gp;
+    p = pp[i];
+    gp = pp[p];
+  }
+  return (p);
+}
+
+static
+int etdfs (int v, int *first_kid, int *next_kid, int *post, int postnum)
+{
+  for (int w = first_kid[v]; w != -1; w = next_kid[w]) {
+    postnum = etdfs (w, first_kid, next_kid, post, postnum);
+  }
+  post[postnum++] = v;
+
+  return postnum;
+}
+
+static
+void TreePostorder(int n, int *parent, int *post)
+{
+  // Allocate storage for working arrays and results
+  OCTAVE_LOCAL_BUFFER (int, first_kid, n+1);
+  OCTAVE_LOCAL_BUFFER (int, next_kid, n+1);
+
+  // Set up structure describing children
+  for (int v = 0; v <= n; first_kid[v++] = -1);
+  for (int v = n-1; v >= 0; v--) 
+    {
+      int dad = parent[v];
+      next_kid[v] = first_kid[dad];
+      first_kid[dad] = v;
+    }
+
+  // Depth-first search from dummy root vertex #n
+  etdfs (n, first_kid, next_kid, post, 0);
+}
+
+static 
+void coletree (const int *ridx, const int *colbeg, int *colend, 
+	       int *parent, int nr, int nc)
+{
+  OCTAVE_LOCAL_BUFFER (int, root, nc);
+  OCTAVE_LOCAL_BUFFER (int, pp, nc);
+  OCTAVE_LOCAL_BUFFER (int, firstcol, nr);
+
+  // Compute firstcol[row] = first nonzero column in row
+  for (int row = 0; row < nr; firstcol[row++] = nc);
+  for (int col = 0; col < nc; col++) 
+    for (int p = colbeg[col]; p < colend[col]; p++) 
+      {
+	int row = ridx[p];
+	if (firstcol[row] > col)
+	  firstcol[row] = col;
+      }
+
+  // Compute etree by Liu's algorithm for symmetric matrices,
+  // except use (firstcol[r],c) in place of an edge (r,c) of A.
+  // Thus each row clique in A'*A is replaced by a star
+  // centered at its first vertex, which has the same fill.
+  for (int col = 0; col < nc; col++) 
+    {
+      int cset = make_set (col, pp);
+      root[cset] = col;
+      parent[col] = nc; 
+      for (int p = colbeg[col]; p < colend[col]; p++) 
+	{
+	  int row = firstcol[ridx[p]];
+	  if (row >= col) 
+	    continue;
+	  int rset = find (row, pp);
+	  int rroot = root[rset];
+	  if (rroot != col) 
+	    {
+	      parent[rroot] = col;
+	      cset = link (cset, rset, pp);
+	      root[cset] = col;
+	    }
+	}
+    }
+}
+
+DEFUN_DLD (colamd, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{p} =} colamd (@var{s})\n\
+@deftypefnx {Loadable Function} {@var{p} =} colamd (@var{s}, @var{knobs})\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} colamd (@var{s})\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} colamd (@var{s}, @var{knobs})\n\
+\n\
+Column approximate minimum degree permutation. @code{@var{p} = colamd\n\
+(@var{s})} returns the column approximate minimum degree permutation\n\
+vector for the sparse matrix @var{s}. For a non-symmetric matrix @var{s},\n\
+@code{@var{s} (:,@var{p})} tends to have sparser LU factors than @var{s}.\n\
+The Cholesky factorization of @code{@var{s} (:,@var{p})' * @var{s}\n\
+(:,@var{p})} also tends to be sparser than that of @code{@var{s}' *\n\
+@var{s}}.\n\
+\n\
+@var{knobs} is an optional two-element input vector. If @var{s} is\n\
+m-by-n, then rows with more than @code{(@var{knobs} (1)) * @var{n}}\n\
+entries are ignored.  Columns with more than @code{(@var{knobs} (2)) *\n\
+@var{m}} entries are removed prior to ordering, and ordered last in the\n\
+output permutation @var{p}. If the knobs parameter is not present, then\n\
+0.5 is used instead, for both @code{@var{knobs} (1)} and\n\
+@code{@var{knobs} (2)}. @code{@var{knobs} (3)} controls the printing of\n\
+statistics and error messages.\n\
+\n\
+@var{stats} is an optional 20-element output vector that provides data\n\
+about the ordering and the validity of the input matrix @var{s}. Ordering\n\
+statistics are in @code{@var{stats} (1:3)}. @code{@var{stats} (1)} and\n\
+@code{@var{stats} (2)} are the number of dense or empty rows and columns\n\
+ignored by COLAMD and @code{@var{stats} (3)} is the number of garbage\n\
+collections performed on the internal data structure used by COLAMD\n\
+(roughly of size @code{2.2 * nnz(@var{s}) + 4 * @var{m} + 7 * @var{n}}\n\
+integers).\n\
+\n\
+Octave built-in functions are intended to generate valid sparse matrices,\n\
+with no duplicate entries, with ascending row indices of the nonzeros\n\
+in each column, with a non-negative number of entries in each column (!)\n\
+and so on.  If a matrix is invalid, then COLAMD may or may not be able\n\
+to continue.  If there are duplicate entries (a row index appears two or\n\
+more times in the same column) or if the row indices in a column are out\n\
+of order, then COLAMD can correct these errors by ignoring the duplicate\n\
+entries and sorting each column of its internal copy of the matrix\n\
+@var{s} (the input matrix @var{s} is not repaired, however). If a matrix\n\
+is invalid in other ways then COLAMD cannot continue, an error message is\n\
+printed, and no output arguments (@var{p} or @var{stats}) are returned.\n\
+COLAMD is thus a simple way to check a sparse matrix to see if it's\n\
+valid.\n\
+\n\
+@code{@var{stats} (4:7)} provide information if COLAMD was able to\n\
+continue. The matrix is OK if @code{@var{stats} (4)} is zero, or 1 if\n\
+invalid. @code{@var{stats} (5)} is the rightmost column index that is\n\
+unsorted or contains duplicate entries, or zero if no such column exists.\n\
+@code{@var{stats} (6)} is the last seen duplicate or out-of-order row\n\
+index in the column index given by @code{@var{stats} (5)}, or zero if no\n\
+such row index exists. @code{@var{stats} (7)} is the number of duplicate\n\
+or out-of-order row indices. @code{@var{stats} (8:20)} is always zero in\n\
+the current version of COLAMD (reserved for future use).\n\
+\n\
+The ordering is followed by a column elimination tree post-ordering.\n\
+\n\
+The authors of the code itself are Stefan I. Larimore and Timothy A.\n\
+Davis (davis@@cise.ufl.edu), University of Florida.  The algorithm was\n\
+developed in collaboration with John Gilbert, Xerox PARC, and Esmond\n\
+Ng, Oak Ridge National Laboratory. (see\n\
+@url{http://www.cise.ufl.edu/research/sparse/colamd})\n\
+@end deftypefn\n\
+@seealso{colperm, symamd}")
+{
+  octave_value_list retval;
+  int nargin = args.length ();
+  int spumoni = 0;
+ 
+  if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2)
+    usage ("colamd: incorrect number of input and/or output arguments");
+  else
+    {
+      // Get knobs
+      OCTAVE_LOCAL_BUFFER (double, knobs, COLAMD_KNOBS);
+      colamd_set_defaults (knobs);
+
+      // Check for user-passed knobs
+      if (nargin == 2)
+	{
+	  NDArray User_knobs = args(1).array_value ();
+	  int nel_User_knobs = User_knobs.length ();
+	  
+	  if (nel_User_knobs > 0) 
+	    knobs [COLAMD_DENSE_ROW] = User_knobs (COLAMD_DENSE_ROW);
+	  if (nel_User_knobs > 1) 
+	    knobs [COLAMD_DENSE_COL] = User_knobs (COLAMD_DENSE_COL) ;
+	  if (nel_User_knobs > 2) 
+	    spumoni = (int) User_knobs (2);
+	}
+
+      // print knob settings if spumoni is set
+      if (spumoni > 0)
+	{
+	  octave_stdout << "colamd: dense row fraction: " 
+			<< knobs [COLAMD_DENSE_ROW] << std::endl;
+	  octave_stdout << "colamd: dense col fraction: " 
+			<< knobs [COLAMD_DENSE_COL] << std::endl;
+	}
+      
+      int n_row, n_col, nnz;
+      int *ridx, *cidx;
+      SparseComplexMatrix scm;
+      SparseMatrix sm;
+
+      if (args(0).class_name () == "sparse")
+	{
+	  if (args(0).is_complex_type ())
+	    {
+	      scm = args(0). sparse_complex_matrix_value ();
+	      n_row = scm.rows ();
+	      n_col = scm.cols ();
+	      nnz = scm.nnz ();
+	      ridx = scm.xridx ();
+	      cidx = scm.xcidx ();
+	    }
+	  else
+	    {
+	      sm = args(0).sparse_matrix_value ();
+
+	      n_row = sm.rows ();
+	      n_col = sm.cols ();
+	      nnz = sm.nnz ();
+	      ridx = sm.xridx ();
+	      cidx = sm.xcidx ();
+	    }
+	}
+      else
+	{
+	  if (args(0).is_complex_type ())
+	    sm = SparseMatrix (real (args(0).complex_matrix_value ()));
+	  else
+	    sm = SparseMatrix (args(0).matrix_value ());
+
+	  n_row = sm.rows ();
+	  n_col = sm.cols ();
+	  nnz = sm.nnz ();
+	  ridx = sm.xridx ();
+	  cidx = sm.xcidx ();
+	}
+
+      // Allocate workspace for colamd
+      OCTAVE_LOCAL_BUFFER (int, p, n_col+1);
+      for (int i = 0; i < n_col+1; i++)
+	p[i] = cidx [i];
+
+      int Alen = colamd_recommended (nnz, n_row, n_col);
+      OCTAVE_LOCAL_BUFFER (int, A, Alen);
+      for (int i = 0; i < nnz; i++)
+	A[i] = ridx [i];
+
+      // Order the columns (destroys A)
+      OCTAVE_LOCAL_BUFFER (int, stats, COLAMD_STATS);
+      if (!colamd (n_row, n_col, Alen, A, p, knobs, stats))
+	{
+	  colamd_report (stats) ;
+	  error ("colamd: internal error!");
+	  return retval;
+	}
+
+      // column elimination tree post-ordering (reuse variables)
+      OCTAVE_LOCAL_BUFFER (int, colbeg, n_col + 1);
+      OCTAVE_LOCAL_BUFFER (int, colend, n_col + 1);
+      OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1);
+
+      for (int i = 0; i < n_col; i++)
+	{
+	  colbeg[i] = cidx[p[i]];
+	  colend[i] = cidx[p[i]+1];
+	}
+
+      coletree (ridx, colbeg, colend, etree, n_row, n_col);
+
+      // Calculate the tree post-ordering
+      TreePostorder (n_col, etree, colbeg);
+
+      // return the permutation vector
+      NDArray out_perm (dim_vector (1, n_col));
+      for (int i = 0; i < n_col; i++)
+	out_perm(i) = p [colbeg [i]] + 1;
+
+      retval (0) = out_perm;
+
+      // print stats if spumoni > 0
+      if (spumoni > 0)
+	colamd_report (stats) ;
+
+      // Return the stats vector
+      if (nargout == 2)
+	{
+	  NDArray out_stats (dim_vector (1, COLAMD_STATS));
+	  for (int i = 0 ; i < COLAMD_STATS ; i++)
+	    out_stats (i) = stats [i] ;
+	  retval(1) = out_stats;
+
+	  // fix stats (5) and (6), for 1-based information on 
+	  // jumbled matrix.  note that this correction doesn't 
+	  // occur if symamd returns FALSE
+	  out_stats (COLAMD_INFO1) ++ ; 
+	  out_stats (COLAMD_INFO2) ++ ; 
+	}
+    }
+
+  return retval;
+}
+
+DEFUN_DLD (symamd, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{p} =} symamd (@var{s})\n\
+@deftypefnx {Loadable Function} {@var{p} =} symamd (@var{s}, @var{knobs})\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} symamd (@var{s})\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{stats}] =} symamd (@var{s}, @var{knobs})\n\
+\n\
+For a symmetric positive definite matrix @var{s}, returns the permutation\n\
+vector p such that @code{@var{s} (@var{p}, @var{p})} tends to have a\n\
+sparser Cholesky factor than @var{s}. Sometimes SYMAMD works well for\n\
+symmetric indefinite matrices too. The matrix @var{s} is assumed to be\n\
+symmetric; only the strictly lower triangular part is referenced. @var{s}\n\
+must be square.\n\
+\n\
+@var{knobs} is an optional input argument. If @var{s} is n-by-n, then\n\
+rows and columns with more than @code{@var{knobs} (1) * @var{n}} entries\n\
+are removed prior to ordering, and ordered last in the output permutation\n\
+@var{p}. If the @var{knobs} parameter is not present, then the default of\n\
+0.5 is used instead. @code{@var{knobs} (2)} controls the printing of\n\
+statistics and error messages.\n\
+\n\
+@var{stats} is an optional 20-element output vector that provides data\n\
+about the ordering and the validity of the input matrix @var{s}. Ordering\n\
+statistics are in @code{@var{stats} (1:3)}. @code{@var{stats} (1) =\n\
+@var{stats} (2)} is the number of dense or empty rows and columns\n\
+ignored by SYMAMD and @code{@var{stats} (3)} is the number of garbage\n\
+collections performed on the internal data structure used by SYMAMD\n\
+(roughly of size @code{8.4 * nnz (tril (@var{s}, -1)) + 9 * @var{n}}\n\
+integers).\n\
+\n\
+Octave built-in functions are intended to generate valid sparse matrices,\n\
+with no duplicate entries, with ascending row indices of the nonzeros\n\
+in each column, with a non-negative number of entries in each column (!)\n\
+and so on.  If a matrix is invalid, then SYMAMD may or may not be able\n\
+to continue.  If there are duplicate entries (a row index appears two or\n\
+more times in the same column) or if the row indices in a column are out\n\
+of order, then SYMAMD can correct these errors by ignoring the duplicate\n\
+entries and sorting each column of its internal copy of the matrix S (the\n\
+input matrix S is not repaired, however).  If a matrix is invalid in\n\
+other ways then SYMAMD cannot continue, an error message is printed, and\n\
+no output arguments (@var{p} or @var{stats}) are returned.  SYMAMD is\n\
+thus a simple way to check a sparse matrix to see if it's valid.\n\
+\n\
+@code{@var{stats} (4:7)} provide information if SYMAMD was able to\n\
+continue. The matrix is OK if @code{@var{stats} (4)} is zero, or 1\n\
+if invalid. @code{@var{stats} (5)} is the rightmost column index that\n\
+is unsorted or contains duplicate entries, or zero if no such column\n\
+exists. @code{@var{stats} (6)} is the last seen duplicate or out-of-order\n\
+row index in the column index given by @code{@var{stats} (5)}, or zero\n\
+if no such row index exists. @code{@var{stats} (7)} is the number of\n\
+duplicate or out-of-order row indices. @code{@var{stats} (8:20)} is\n\
+always zero in the current version of SYMAMD (reserved for future use).\n\
+\n\
+The ordering is followed by a column elimination tree post-ordering.\n\
+\n\
+\n\
+The authors of the code itself are Stefan I. Larimore and Timothy A.\n\
+Davis (davis@@cise.ufl.edu), University of Florida.  The algorithm was\n\
+developed in collaboration with John Gilbert, Xerox PARC, and Esmond\n\
+Ng, Oak Ridge National Laboratory. (see\n\
+@url{http://www.cise.ufl.edu/research/sparse/colamd})\n\
+@end deftypefn\n\
+@seealso{colperm, colamd}")
+{
+  octave_value_list retval;
+  int nargin = args.length ();
+  int spumoni = 0;
+ 
+  if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2)
+    usage ("symamd: incorrect number of input and/or output arguments");
+  else
+    {
+      // Get knobs
+      OCTAVE_LOCAL_BUFFER (double, knobs, COLAMD_KNOBS);
+      colamd_set_defaults (knobs);
+
+      // Check for user-passed knobs
+      if (nargin == 2)
+	{
+	  NDArray User_knobs = args(1).array_value ();
+	  int nel_User_knobs = User_knobs.length ();
+	  
+	  if (nel_User_knobs > 0) 
+	    knobs [COLAMD_DENSE_ROW] = User_knobs (COLAMD_DENSE_ROW);
+	  if (nel_User_knobs > 1) 
+	    spumoni = (int) User_knobs (1);
+	}
+
+      // print knob settings if spumoni is set
+      if (spumoni > 0)
+	octave_stdout << "symamd: dense row/col fraction: " 
+		      << knobs [COLAMD_DENSE_ROW] << std::endl;
+      
+      int n_row, n_col, nnz;
+      int *ridx, *cidx;
+      SparseMatrix sm;
+      SparseComplexMatrix scm;
+
+      if (args(0).class_name () == "sparse")
+	{
+	  if (args(0).is_complex_type ())
+	    {
+	      scm = args(0).sparse_complex_matrix_value ();
+	      n_row = scm.rows ();
+	      n_col = scm.cols ();
+	      nnz = scm.nnz ();
+	      ridx = scm.xridx ();
+	      cidx = scm.xcidx ();
+	    }
+	  else
+	    {
+	      sm = args(0).sparse_matrix_value ();
+	      n_row = sm.rows ();
+	      n_col = sm.cols ();
+	      nnz = sm.nnz ();
+	      ridx = sm.xridx ();
+	      cidx = sm.xcidx ();
+	    }
+	}
+      else
+	{
+	  if (args(0).is_complex_type ())
+	    sm = SparseMatrix (real (args(0).complex_matrix_value ()));
+	  else
+	    sm = SparseMatrix (args(0).matrix_value ());
+	  
+	  n_row = sm.rows ();
+	  n_col = sm.cols ();
+	  nnz = sm.nnz ();
+	  ridx = sm.xridx ();
+	  cidx = sm.xcidx ();
+	}
+
+      if (n_row != n_col)
+	{
+	  error ("symamd: matrix must be square");
+	  return retval;
+	}
+
+      // Allocate workspace for symamd
+      OCTAVE_LOCAL_BUFFER (int, perm, n_col+1);
+      OCTAVE_LOCAL_BUFFER (int, stats, COLAMD_STATS);
+      if (!symamd (n_col, ridx, cidx, perm, knobs, stats, &calloc, &free))
+	{
+	  symamd_report (stats) ;
+	  error ("symamd: internal error!") ;
+	  return retval;
+	}
+
+      // column elimination tree post-ordering
+      OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1);
+      symetree (ridx, cidx, etree, perm, n_col);
+
+      // Calculate the tree post-ordering
+      OCTAVE_LOCAL_BUFFER (int, post, n_col + 1);
+      TreePostorder (n_col, etree, post);
+
+      // return the permutation vector
+      NDArray out_perm (dim_vector (1, n_col));
+      for (int i = 0; i < n_col; i++)
+	out_perm(i) = perm [post [i]] + 1;
+
+      retval (0) = out_perm;
+
+      // print stats if spumoni > 0
+      if (spumoni > 0)
+	symamd_report (stats) ;
+
+      // Return the stats vector
+      if (nargout == 2)
+	{
+	  NDArray out_stats (dim_vector (1, COLAMD_STATS));
+	  for (int i = 0 ; i < COLAMD_STATS ; i++)
+	    out_stats (i) = stats [i] ;
+	  retval(1) = out_stats;
+
+	  // fix stats (5) and (6), for 1-based information on 
+	  // jumbled matrix.  note that this correction doesn't 
+	  // occur if symamd returns FALSE
+	  out_stats (COLAMD_INFO1) ++ ; 
+	  out_stats (COLAMD_INFO2) ++ ; 
+	}
+    }
+
+  return retval;
+}
+
+DEFUN_DLD (etree, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{p} =} etree (@var{s})\n\
+@deftypefnx {Loadable Function} {@var{p} =} etree (@var{s}, @var{typ})\n\
+@deftypefnx {Loadable Function} {[@var{p}, @var{q}] =} etree (@var{s}, @var{typ})\n\
+\n\
+Returns the elimination tree for the matrix @var{s}. By default @var{s}\n\
+is assumed to be symmetric and the symmetric elimination tree is\n\
+returned. The argument @var{typ} controls whether a symmetric or\n\
+column elimination tree is returned. Valid values of @var{typ} are\n\
+'sym' or 'col', for symmetric or column elimination tree respectively\n\
+\n\
+Called with a second argument, @dfn{etree} also returns the postorder\n\
+permutations on the tree.\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+  int nargin = args.length ();
+
+  if (nargout < 0 || nargout > 2 || nargin < 0 || nargin > 2)
+    usage ("etree: incorrect number of input and/or output arguments");
+  else
+    {
+      int n_row, n_col, nnz;
+      int *ridx, *cidx;
+      bool is_sym = true;
+      SparseMatrix sm;
+      SparseComplexMatrix scm;
+
+      if (args(0).class_name () == "sparse")
+	{
+	  if (args(0).is_complex_type ())
+	    {
+	      scm = args(0).sparse_complex_matrix_value ();
+	      n_row = scm.rows ();
+	      n_col = scm.cols ();
+	      nnz = scm.nnz ();
+	      ridx = scm.xridx ();
+	      cidx = scm.xcidx ();
+	    }
+	  else
+	    {
+	      sm = args(0).sparse_matrix_value ();
+	      n_row = sm.rows ();
+	      n_col = sm.cols ();
+	      nnz = sm.nnz ();
+	      ridx = sm.xridx ();
+	      cidx = sm.xcidx ();
+	    }
+
+	}
+      else
+	{
+	  error ("etree: must be called with a sparse matrix");
+	  return retval;
+	}
+
+      if (nargin == 2)
+	if (args(1).is_string ())
+	  {
+	    std::string str = args(1).string_value ();
+	    if (str.find("C") == 0 || str.find("c") == 0)
+	      is_sym = false;
+	  }
+	else
+	  {
+	    error ("etree: second argument must be a string");
+	    return retval;
+	  }
+
+      // column elimination tree post-ordering (reuse variables)
+      OCTAVE_LOCAL_BUFFER (int, etree, n_col + 1);
+      
+
+      if (is_sym)
+	{
+	  if (n_row != n_col)
+	    {
+	      error ("etree: matrix is marked as symmetric, but not square");
+	      return retval;
+	    }
+	  symetree (ridx, cidx, etree, NULL, n_col);
+	}
+      else
+	{
+	  OCTAVE_LOCAL_BUFFER (int, colbeg, n_col);
+	  OCTAVE_LOCAL_BUFFER (int, colend, n_col);
+
+	  for (int i = 0; i < n_col; i++)
+	    {
+	      colbeg[i] = cidx[i];
+	      colend[i] = cidx[i+1];
+	    }
+
+	  coletree (ridx, colbeg, colend, etree, n_row, n_col);
+	}
+
+      NDArray tree (dim_vector (1, n_col));
+      for (int i = 0; i < n_col; i++)
+	// We flag a root with n_col while Matlab does it with zero
+	// Convert for matlab compatiable output
+	if (etree[i] == n_col)
+	  tree (i) = 0;
+	else
+	  tree (i) = etree[i] + 1;
+
+      retval (0) = tree;
+
+      if (nargout == 2)
+	{
+	  // Calculate the tree post-ordering
+	  OCTAVE_LOCAL_BUFFER (int, post, n_col + 1);
+	  TreePostorder (n_col, etree, post);
+
+	  NDArray postorder (dim_vector (1, n_col));
+	  for (int i = 0; i < n_col; i++)
+	    postorder (i) = post[i] + 1;
+
+	  retval (1) = postorder;
+	}
+    }
+
+  return retval;
+}
+
+DEFUN_DLD (symbfact, args, nargout,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{count}, @var{h}, @var{parent}, @var{post}, @var{r}]} = symbfact (@var{s}, @var{typ})\n\
+\n\
+Performs a symbolic factorization analysis on the sparse matrix @var{s}.\n\
+@end deftypefn")
+{
+  error ("symbfact: not implemented yet");
+  return octave_value ();
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/DLD-FUNCTIONS/det.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/DLD-FUNCTIONS/det.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -33,7 +33,7 @@
 #include "oct-obj.h"
 #include "utils.h"
 
-DEFUN_DLD (det, args, nargout,
+DEFUN_DLD (det, args, ,
   "-*- texinfo -*-\n\
 @deftypefn {Loadable Function} {[@var{d}, @var{rcond}] = } det (@var{a})\n\
 Compute the determinant of @var{a} using @sc{Lapack}.  Return an estimate\n\
@@ -111,9 +111,7 @@
 	}
     }
   else
-    {
-      gripe_wrong_type_arg ("det", arg);
-    }
+    gripe_wrong_type_arg ("det", arg);
 
   return retval;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/dispatch.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,599 @@
+/*
+
+Copyright (C) 2001 John W. Eaton and Paul Kienzle
+
+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 Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <list>
+#include <map>
+#include <string>
+
+#include "defun-dld.h"
+#include "ov.h"
+#include "ov-fcn.h"
+#include "ov-typeinfo.h"
+#include "pager.h"
+#include "parse.h"
+#include "symtab.h"
+#include "variables.h"
+
+// XXX FIXME XXX should be using a map from type_id->name, rather
+// than type_name->name
+
+template class std::map<std::string,std::string>;
+
+typedef std::map<std::string,std::string> Table;
+
+class
+octave_dispatch : public octave_function
+{
+public:
+
+  // XXX FIXME XXX need to handle doc strings of dispatched functions, for
+  // example, by appending "for <f>(<type>,...) see <name>" for each
+  // time dispatch(f,type,name) is called.
+  octave_dispatch (const std::string &nm)
+    : octave_function (nm, "Overloaded function"), tab (), base (nm),
+      has_alias (false)
+  { }
+
+  // XXX FIXME XXX if we get deleted, we should restore the original
+  // symbol_record from base before dying.
+  ~octave_dispatch (void) { }
+
+  bool is_builtin_function (void) const { return true; }
+
+  octave_function *function_value (bool) { return this; }
+
+  octave_value do_index_op (const octave_value_list&, int)
+  {
+    error ("dispatch: do_index_op");
+    return octave_value ();
+  }
+
+  octave_value subsref (const std::string&,
+			const std::list<octave_value_list>&)
+  {
+    error ("dispatch: subsref (str, list)");
+    panic_impossible ();
+    return octave_value ();
+  }
+
+  octave_value_list subsref (const std::string& type,
+			     const std::list<octave_value_list>& idx,
+			     int nargout);
+
+  octave_value_list do_multi_index_op (int, const octave_value_list&);
+
+  void add (const std::string t, const std::string n);
+
+  void clear (const std::string t);
+
+  void print (std::ostream& os, bool pr_as_read=false) const;
+
+private:
+
+  Table tab;
+  std::string base;
+  bool has_alias;
+
+  octave_dispatch (void) 
+    : octave_function (), tab (), base (), has_alias (false) { }
+
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+
+  DECLARE_OCTAVE_ALLOCATOR
+};
+
+DEFINE_OCTAVE_ALLOCATOR (octave_dispatch);
+
+DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_dispatch,
+				     "overloaded function", "function");
+
+void 
+octave_dispatch::add (const std::string t, const std::string n)
+{ 
+  if (tab.count (t) > 0 && tab[t] != n)
+    warning ("replacing %s(%s,...)->%s with %s",
+	     base.c_str (), t.c_str (), tab[t].c_str (), n.c_str ());
+
+  tab[t] = n;
+
+  if (t == "any")
+    has_alias = true;
+}
+
+void
+octave_dispatch::clear (const std::string t)
+{
+  tab.erase (t); 
+
+  if (t == "any")
+    has_alias = false;
+}
+
+octave_value_list
+octave_dispatch::subsref (const std::string& type,
+			  const std::list<octave_value_list>& idx,
+			  int nargout)
+{
+  octave_value_list retval;
+
+  switch (type[0])
+    {
+    case '(':
+      retval = do_multi_index_op (nargout, idx.front ());
+      break;
+
+    case '{':
+    case '.':
+      {
+	const std::string nm = type_name ();
+	error ("%s cannot be indexed with %c", nm.c_str (), type[0]);
+      }
+      break;
+
+    default:
+      panic_impossible ();
+    }
+
+  if (idx.size () > 1)
+    retval = retval(0).next_subsref (type, idx);
+
+  return retval;
+}
+
+static octave_function*
+builtin (const std::string& base)
+{
+  octave_function *fcn = 0;
+
+  // Check if we are overriding a builtin function.  This is the
+  // case if builtin is protected.
+  symbol_record *builtin = fbi_sym_tab->lookup ("builtin:" + base, 0);
+
+  if (! builtin)
+    error ("builtin record has gone missing");
+
+  if (error_state)
+    return fcn;
+
+  if (builtin->is_read_only ())
+    {
+      // builtin is read only, so checking for updates is pointless
+      if (builtin->is_function ())
+        fcn = builtin->def().function_value ();
+      else
+	error ("builtin %s is not a function", base.c_str ());
+    }
+  else
+    {
+      // Check that builtin is up to date.
+ 
+      // Don't try to fight octave's function name handling
+      // mechanism.  Instead, move dispatch record out of the way,
+      // and restore the builtin to its original name.
+      symbol_record *dispatch = fbi_sym_tab->lookup (base, 0);
+      if (! dispatch)
+	error ("dispatch record has gone missing");
+
+      dispatch->unprotect ();
+
+      fbi_sym_tab->rename (base, "dispatch:" + base);
+
+      fbi_sym_tab->rename ("builtin:" + base, base);
+
+      // check for updates to builtin function; ignore errors that
+      // appear (they interfere with renaming), and remove the updated
+      // name from the current symbol table.  XXX FIXME XXX check that
+      // updating a function updates it in all contexts --- it may be
+      // that it is updated only in the current symbol table, and not
+      // the caller.  I believe this won't be a problem because the
+      // caller will go through the same logic and end up with the
+      // newer version.
+      fcn = is_valid_function (base, "dispatch", 1);
+      int cache_error = error_state;
+      error_state = 0;
+      curr_sym_tab->clear_function (base);
+
+      // Move the builtin function out of the way and restore the
+      // dispatch fuction.
+      // XXX FIXME XXX what if builtin wants to protect itself?
+      symbol_record *found=fbi_sym_tab->lookup (base, 0);
+      bool readonly = found->is_read_only ();
+      found->unprotect ();
+      fbi_sym_tab->rename (base, "builtin:" + base);
+      fbi_sym_tab->rename ("dispatch:" + base, base);
+      if (readonly)
+	found->protect ();
+      dispatch->protect ();
+
+      // remember if there were any errors.
+      error_state = cache_error;
+    }
+
+  return fcn;
+}
+
+static bool
+any_arg_is_magic_colon (const octave_value_list& args)
+{
+  int nargin = args.length ();
+
+  for (int i = 0; i < nargin; i++)
+    if (args(i).is_magic_colon ())
+      return true;
+
+  return false;
+}
+
+
+octave_value_list
+octave_dispatch::do_multi_index_op (int nargout, const octave_value_list& args)
+{
+  octave_value_list retval;
+
+  if (error_state) return retval;
+
+  if (any_arg_is_magic_colon (args))
+    {
+      ::error ("invalid use of colon in function argument list");
+      return retval;
+    }
+
+  // If more than one argument, check if argument template matches any
+  // overloaded functions.  Also provide a catch-all '*' type to provide
+  // single level pseudo rename and replace functionality.
+  if (args.length () > 0 && tab.count (args(0).type_name ()) > 0)
+    retval = feval (tab[args(0).type_name()], args, nargout);
+  else if (has_alias)
+    retval = feval (tab["any"], args, nargout);
+  else
+    {
+      octave_function *fcn = builtin (base);
+      if (! error_state && fcn)
+        retval = fcn->do_multi_index_op (nargout, args);
+    }
+
+  return retval;
+}
+
+void 
+octave_dispatch::print (std::ostream& os, bool) const
+{
+  os << "Overloaded function " << base << std::endl;
+
+  for (Table::const_iterator it = tab.begin (); it != tab.end (); it++)
+    os << base << "(" << it->first << ",...)->" 
+       << it->second << "(" << it->first << ",...)"
+       << std::endl;
+}
+
+DEFUN_DLD (builtin, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@dots{}]} builtin (@var{f}, @dots{})\n\
+Call the base function @var{f} even if @var{f} is overloaded to\n\
+some other function for the given type signature.\n\
+@end deftypefn\n\
+@seealso{dispatch}")
+{
+  octave_value_list retval; 
+
+  int nargin = args.length ();
+
+  if (nargin > 0)
+    {
+      const std::string name (args(0).string_value ());
+ 
+      if (error_state)
+	return retval;
+
+      symbol_record *sr = fbi_sym_tab->lookup (name, 0);
+      if (sr->def().type_id () == octave_dispatch::static_type_id ())
+	{
+	  octave_function *fcn = builtin (name);
+
+	  if (!error_state && fcn)
+	    retval = fcn->do_multi_index_op (nargout,
+					     args.splice (0, 1, retval));
+	}
+      else
+	retval = feval (name, args, nargout);
+    }
+  else
+    print_usage ("builtin");
+
+  return retval;
+}
+
+DEFUN_DLD (dispatch_help, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {} dispatch_help (@var{name}, @dots{})\n\
+Delayed loading of help messages for dispatched functions.\n\
+@end deftypefn\n\
+@seealso{builtin, dispatch}")
+{
+  octave_value_list retval;
+
+  int nargin = args.length ();
+
+  for (int i = 0; i < nargin; i++)
+    {
+      if (args(i).is_string ())
+	{
+	  const std::string name (args(i).string_value ());
+
+	  if (error_state)
+	    return retval;
+
+	  symbol_record *sr = fbi_sym_tab->lookup (name, false);
+
+	  if (sr)
+	    {
+	      std::string help = sr->help ();
+
+	      if (help[0] == '<' && help[1] == '>'
+		  && sr->def().type_id () == octave_dispatch::static_type_id ())
+		{
+		  builtin (name);
+
+		  symbol_record *builtin_record
+		    = fbi_sym_tab->lookup ("builtin:" + name, 0);
+
+		  help.replace (0, 2, builtin_record->help ());
+
+		  sr->document (help);
+		}
+	    }
+	}
+    }
+
+  return feval ("builtin:help", args, nargout);
+}
+
+static void
+dispatch_record (const std::string &f, const std::string &n, 
+		 const std::string &t)
+{
+  // find the base function in the symbol table, loading it if it
+  // is not already there; if it is already a dispatch, then bonus
+
+  symbol_record *sr = fbi_sym_tab->lookup (f, true);
+
+  if (sr->def().type_id () != octave_dispatch::static_type_id ())
+    {
+      // Preserve mark_as_command status
+      bool iscommand = sr->is_command ();
+
+      // Not an overloaded name, so if only display or clear then we are done
+      if (t.empty ())
+	return;
+
+      // sr is the base symbol; rename it to keep it safe.  When we need
+      // it we will rename it back again.
+      if (sr->is_read_only ()) 
+        {
+          sr->unprotect ();
+          fbi_sym_tab->rename (f, "builtin:" + f);
+  	  sr = fbi_sym_tab->lookup (f, true);
+          sr->protect ();
+	}
+      else 
+        fbi_sym_tab->rename (f, "builtin:" + f);
+
+      std::string basedoc ("<>"); 
+
+      if (! sr->help().empty ())
+	basedoc = sr->help ();
+
+      // Problem:  when a function is first called a new record
+      // is created for it in the current symbol table, so calling
+      // dispatch on a function that has already been called, we
+      // should also clear it from all existing symbol tables.
+      // This is too much work, so we will only do it for the
+      // top level symbol table.  We can't use the clear_function() 
+      // method, because it won't clear builtin functions.  Instead 
+      // we check if the symbol is a function and clear it then.  This
+      // won't properly clear shadowed functions, or functions in
+      // other namespaces (such as the current, if called from a
+      // function).
+      symbol_record *local = top_level_sym_tab->lookup (f, false);
+      if (local && local->is_function ())
+	local->clear ();
+
+      // Build a new dispatch object based on the function definition
+      octave_dispatch *dispatch = new octave_dispatch (f);
+  
+      // Create a symbol record for the dispatch object.
+      sr = fbi_sym_tab->lookup (f, true);
+      sr->unprotect ();
+      sr->define (octave_value (dispatch), symbol_record::BUILTIN_FUNCTION); 
+      // std::cout << "iscommand('"<<f<<"')=" << iscommand << std::endl;
+      if (iscommand)
+	sr->mark_as_command();
+      sr->document (basedoc + "\n\nOverloaded function\n");
+      sr->make_eternal (); // XXX FIXME XXX why??
+      sr->mark_as_static ();
+      sr->protect ();
+    }
+
+  // clear/replace/extend the map with the new type-function pair
+  const octave_dispatch& rep
+    = reinterpret_cast<const octave_dispatch&> (sr->def().get_rep ());
+
+  if (t.empty ())
+    // XXX FIXME XXX should return the list if nargout > 1
+    rep.print (octave_stdout);
+  else if (n.empty ())
+    {
+      // XXX FIXME XXX should we eliminate the dispatch function if
+      // there are no more elements?
+      // XXX FIXME XXX should clear the " $t:\w+" from the help string.
+      // XXX FIXME XXX -- seems bad to cast away const here...
+      octave_dispatch& xrep = const_cast<octave_dispatch&> (rep);
+
+      xrep.clear (t);
+    }
+  else
+    {
+      // XXX FIXME XXX -- seems bad to cast away const here...
+      octave_dispatch& xrep = const_cast<octave_dispatch&> (rep);
+
+      xrep.add (t, n);
+
+      if (! sr->help().empty ())
+	sr->document (sr->help() + "\n   " + n + "(" + t + ",...)");
+    }
+}
+
+DEFUN_DLD (dispatch, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {} dispatch (@var{f}, @var{r}, @var{type})\n\
+\n\
+Replace the function @var{f} with a dispatch so that function @var{r}\n\
+is called when @var{f} is called with the first argument of the named\n\
+@var{type}. If the type is @var{any} then call @var{r} if no other type\n\
+matches.  The original function @var{f} is accessible using\n\
+@code{builtin (@var{f}, @dots{}).\n\
+\n\
+If @var{r} is omitted, clear dispatch function associated with @var{type}.\n\
+\n\
+If both @var{r} and @var{type} are omitted, list dispatch functions\n\
+for @var{f}\n\
+@end deftypefn\n\
+@seealso{builtin}") 
+{
+  octave_value retval;
+  int nargin = args.length ();
+
+  if (nargin < 1 || nargin > 3)
+    {
+      print_usage ("dispatch");
+      return retval;
+    }
+
+  std::string f, t, n;
+  if (nargin > 0)
+    f = args(0).string_value ();
+
+  if (nargin == 2)
+    t = args(1).string_value ();
+  else if (nargin > 2)
+    {
+      n = args(1).string_value ();
+      t = args(2).string_value ();
+    }
+
+  if (error_state)
+    return retval;
+  
+  static bool register_type = true;
+
+  // register dispatch function type if you have not already done so
+  if (register_type)
+    {
+      octave_dispatch::register_type ();
+      register_type = false;
+      fbi_sym_tab->lookup("dispatch")->mark_as_static ();
+      dispatch_record ("help", "dispatch_help", "string");
+    }
+
+  dispatch_record (f, n, t);
+
+  return retval;
+}
+
+/*
+
+%!test # builtin function replacement
+%! dispatch('sin','length','string')
+%! assert(sin('abc'),3)
+%! assert(sin(0),0,10*eps); 
+%!test # 'any' function
+%! dispatch('sin','exp','any')
+%! assert(sin(0),1,eps);
+%! assert(sin('abc'),3);
+%!test # 'builtin' function
+%! assert(builtin('sin',0),0,eps);
+%! builtin('eval','x=1;');
+%! assert(x,1);
+%!test # clear function mapping
+%! dispatch('sin','string')
+%! dispatch('sin','any')
+%! assert(sin(0),0,10*eps);
+%!test # oct-file replacement
+%! dispatch('fft','length','string')
+%! assert(fft([1,1]),[2,0]);
+%! assert(fft('abc'),3)
+%! dispatch('fft','string');
+%!test # m-file replacement
+%! dispatch('hamming','length','string')
+%! assert(hamming(1),1)
+%! assert(hamming('abc'),3)
+%! dispatch('hamming','string')
+
+%!test # override preloaded builtin
+%! evalin('base','cos(1);');
+%! dispatch('cos','length','string')
+%! evalin('base',"assert(cos('abc'),3)");
+%! evalin('base',"assert(cos(0),1,eps)");
+%! dispatch('cos','string')
+%!test # override pre-loaded oct-file
+%! evalin('base','qr(1);');
+%! dispatch('qr','length','string')
+%! evalin('base',"assert(qr('abc'),3)");
+%! evalin('base',"assert(qr(1),1)");
+%! dispatch('qr','string');
+%!test # override pre-loaded m-file
+%! evalin('base','hanning(1);');
+%! dispatch('hanning','length','string')
+%! evalin('base','assert(hanning("abc"),3)');
+%! evalin('base','assert(hanning(1),1)');
+%! dispatch('hanning','string');
+
+XXX FIXME XXX I would rather not create dispatch_x/dispatch_y
+in the current directory!  I don't want them installed accidentally.
+
+%!test # replace base m-file
+%! system("echo 'function a=dispatch_x(a)'>dispatch_x.m");
+%! dispatch('dispatch_x','length','string')
+%! assert(dispatch_x(3),3)
+%! assert(dispatch_x('a'),1)
+%! pause(1);
+%! system("echo 'function a=dispatch_x(a),++a;'>dispatch_x.m");
+%! assert(dispatch_x(3),4)
+%! assert(dispatch_x('a'),1)
+%!test 
+%! system("rm dispatch_x.m");
+
+%!test # replace dispatch m-file
+%! system("echo 'function a=dispatch_y(a)'>dispatch_y.m");
+%! dispatch('hello','dispatch_y','complex scalar')
+%! assert(hello(3i),3i)
+%! pause(1);
+%! system("echo 'function a=dispatch_y(a),++a;'>dispatch_y.m");
+%! assert(hello(3i),1+3i)
+%!test 
+%! system("rm dispatch_y.m");
+
+XXX FIXME XXX add tests for preservation of mark_as_command status.
+
+*/
--- a/src/DLD-FUNCTIONS/gcd.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/DLD-FUNCTIONS/gcd.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -17,10 +17,6 @@
 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 
-In addition to the terms of the GPL, you are permitted to link
-this program with any Open Source program, as defined by the
-Open Source Initiative (www.opensource.org)
-
 */
 
 #ifdef HAVE_CONFIG_H
--- a/src/DLD-FUNCTIONS/rand.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/DLD-FUNCTIONS/rand.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -72,7 +72,7 @@
 	      {
 		retval = octave_rand::distribution ();
 	      }
-	    else if (s_arg == "seed")
+	    else if (s_arg == "seed" || s_arg == "state")
 	      {
 		retval = octave_rand::seed ();
 	      }
@@ -179,7 +179,9 @@
 
 	if (nargin == 2 && tmp.is_string ())
 	  {
-	    if (tmp.string_value () == "seed")
+	    std::string ts = tmp.string_value ();
+
+	    if (ts == "seed" || ts == "state")
 	      {
 		double d = args(1).double_value ();
 
--- a/src/DLD-FUNCTIONS/sort.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/DLD-FUNCTIONS/sort.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -25,6 +25,8 @@
 #include <config.h>
 #endif
 
+#include <vector>
+
 #include "lo-mappers.h"
 #include "quit.h"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,1369 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cstdlib>
+#include <string>
+
+#include "variables.h"
+#include "utils.h"
+#include "pager.h"
+#include "defun-dld.h"
+#include "gripes.h"
+#include "quit.h"
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+#include "ov-bool-sparse.h"
+
+static bool
+is_sparse (const octave_value& arg)
+{
+  return (arg.class_name () == "sparse");
+}
+
+DEFUN_DLD (issparse, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {} issparse (@var{expr})\n\
+Return 1 if the value of the expression @var{expr} is a sparse matrix.\n\
+@end deftypefn") 
+{
+   if (args.length() != 1) 
+     {
+       print_usage("issparse");
+       return octave_value ();
+     }
+   else 
+     return octave_value (is_sparse (args(0)));
+}
+
+DEFUN_DLD (sparse, args, ,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{sparse_val} =} sparse (...)\n\
+SPARSE: create a sparse matrix\n\
+\n\
+sparse can be called in the following ways:\n\
+\n\
+@enumerate\n\
+@item @var{S} = sparse(@var{A})  where @var{A} is a full matrix\n\
+\n\
+@item @var{S} = sparse(@var{A},1)  where @var{A} is a full matrix, result\n\
+is forced back to a full matrix is resulting matrix is sparse\n\
+\n\
+@item @var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},@var{nzmax})  where\n\
+   @itemize @w \n\
+@var{i},@var{j}   are integer index vectors (1 x nnz) @* \n\
+@var{s}     is the vector of real or complex entries (1 x nnz) @* \n\
+@var{m},@var{n}   are the scalar dimentions of S @* \n\
+@var{nzmax} is ignored (here for compatability with Matlab) @* \n\
+\n\
+        if multiple values are specified with the same @var{i},@var{j}\n\
+        position, the corresponding values in @var{s} will be added\n\
+   @end itemize\n\
+\n\
+@item The following usages are equivalent to (2) above:\n\
+   @itemize @w \n\
+@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n})@*\n\
+@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'summation')@*\n\
+@var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'sum')@*\n\
+   @end itemize\n\
+\n\
+@item @var{S} = sparse(@var{i},@var{j},@var{s},@var{m},@var{n},'unique')@*\n\
+\n\
+   @itemize @w \n\
+same as (2) above, except that rather than adding,\n\
+if more than two values are specified for the same @var{i},@var{j}\n\
+position, then the last specified value will be kept\n\
+   @end itemize\n\
+\n\
+@item @var{S}=  sparse(@var{i},@var{j},@var{sv})          uses @var{m}=max(@var{i}), @var{n}=max(@var{j})\n\
+\n\
+@item @var{S}=  sparse(@var{m},@var{n})            does sparse([],[],[],@var{m},@var{n},0)\n\
+\n\
+@var{sv}, and @var{i} or @var{j} may be scalars, in\n\
+which case they are expanded to all have the same length\n\
+@end enumerate\n\
+@seealso{full}\n\
+@end deftypefn")
+{
+   octave_value retval;
+   bool mutate = false;
+
+   // WARNING: This function should always use constructions like
+   //   retval = new octave_sparse_matrix (sm);
+   // To avoid calling the maybe_mutate function. This is the only
+   // function that should not call maybe_mutate, or at least only
+   // in very particular cases.
+
+   int nargin= args.length();
+   if (nargin < 1 || (nargin == 4 && !args(3).is_string ()) || nargin > 6) 
+     {
+       print_usage ("sparse");
+       return retval;
+     }
+
+   bool use_complex = false;
+   bool use_bool = false;
+   if (nargin > 2)
+     {
+       use_complex= args(2).is_complex_type();
+       use_bool = args(2).is_bool_type ();
+     }
+   else
+     {
+       use_complex= args(0).is_complex_type();
+       use_bool = args(0).is_bool_type ();
+     }
+
+   if (nargin == 2 && ! args(0).is_scalar_type() && args(1).is_scalar_type())
+       mutate = (args(1).double_value() != 0.);
+
+   if (nargin == 1 || (nargin == 2 && mutate)) 
+     {
+       octave_value arg = args (0);
+
+       if (is_sparse (arg))
+	 {
+	   if (use_complex) 
+	     {
+	       SparseComplexMatrix sm (((const octave_sparse_complex_matrix&) arg
+					.get_rep ())
+				       .sparse_complex_matrix_value ());
+	       retval = new octave_sparse_complex_matrix (sm);
+	     }
+	   else if (use_bool) 
+	     {
+	       SparseBoolMatrix sm (((const octave_sparse_bool_matrix&) arg
+					.get_rep ())
+				       .sparse_bool_matrix_value ());
+	       retval = new octave_sparse_bool_matrix (sm);
+	     }
+	   else
+	     {
+	       SparseMatrix sm (((const octave_sparse_matrix&) arg
+				 .get_rep ())
+				.sparse_matrix_value ());
+	       retval = new octave_sparse_matrix (sm);
+	     }
+	 }
+       else
+	 {
+	   if (use_complex) 
+	     {
+	       SparseComplexMatrix sm (args (0).complex_matrix_value ());
+	       if (error_state) 
+		 return retval;
+	       retval = new octave_sparse_complex_matrix (sm);
+	     } 
+	   else if (use_bool) 
+	     {
+	       SparseBoolMatrix sm (args (0).bool_matrix_value ());
+	       if (error_state) 
+		 return retval;
+	       retval = new octave_sparse_bool_matrix (sm);
+	     } 
+	   else 
+	     {
+	       SparseMatrix sm (args (0).matrix_value ());
+	       if (error_state) 
+		 return retval;
+	       retval = new octave_sparse_matrix (sm);
+	     }
+	 }
+     }
+   else 
+     {
+       int m = 1, n = 1;
+       if (nargin == 2) 
+	 {
+	   m = args(0).int_value();
+	   n = args(1).int_value();
+	   if (error_state) return retval;
+
+	   if (use_complex) 
+	     retval = new octave_sparse_complex_matrix 
+	       (SparseComplexMatrix (m, n));
+	   else if (use_bool) 
+	     retval = new octave_sparse_bool_matrix 
+	       (SparseBoolMatrix (m, n));
+	   else
+	     retval = new octave_sparse_matrix 
+	       (SparseMatrix (m, n));
+	 }
+       else 
+	 {
+	   if (args(0).is_empty () || args (1).is_empty () 
+	       || args(2).is_empty ())
+	     {
+	       if (nargin > 4)
+		 {
+		   m = args(3).int_value();
+		   n = args(4).int_value();
+		 }
+
+	       if (use_bool)
+		 retval = new octave_sparse_bool_matrix 
+		   (SparseBoolMatrix (m, n));
+	       else
+		 retval = new octave_sparse_matrix (SparseMatrix (m, n));
+	     }
+	   else
+	     {
+// 
+//  I use this clumsy construction so that we can use
+//  any orientation of args
+	       ColumnVector ridxA = ColumnVector (args(0).vector_value 
+					      (false, true));
+	       ColumnVector cidxA = ColumnVector (args(1).vector_value 
+						  (false, true));
+	       ColumnVector coefA;
+	       boolNDArray coefAB;
+	       ComplexColumnVector coefAC;
+	       bool assemble_do_sum = true; // this is the default in matlab6
+
+	       if (use_complex) 
+		 {
+		   if (args(2).is_empty ())
+		     coefAC = ComplexColumnVector (0);
+		   else
+		     coefAC = ComplexColumnVector 
+		       (args(2).complex_vector_value (false, true));
+		 }
+	       else if (use_bool)
+		 {
+		   if (args(2).is_empty ())
+		     coefAB = boolNDArray (dim_vector (1, 0));
+		   else
+		     coefAB = args(2).bool_array_value ();
+		   dim_vector AB_dims = coefAB.dims ();
+		   if (AB_dims.length() > 2 || (AB_dims(0) != 1 && 
+						AB_dims(1) != 1))
+		     error ("sparse: vector arguments required");
+		 }
+	       else 
+		 if (args(2).is_empty ())
+		   coefA = ColumnVector (0);
+		 else
+		   coefA = ColumnVector (args(2).vector_value (false, true));
+
+	       if (error_state)
+		 return retval;
+
+	       // Confirm that i,j,s all have the same number of elements
+	       int ns;
+	       if (use_complex) 
+		 ns = coefAC.length();
+	       else if (use_bool) 
+		 ns = coefAB.length();
+	       else 
+		 ns = coefA.length();
+
+	       int ni = ridxA.length();
+	       int nj = cidxA.length();
+	       int nnz = (ni > nj ? ni : nj);
+	       if ((ns != 1 && ns != nnz) ||
+		   (ni != 1 && ni != nnz) ||
+		   (nj != 1 && nj != nnz)) 
+		 {
+		   error ("sparse i, j and s must have the same length");
+		   return retval;
+		 }
+
+	       if (nargin == 3 || nargin == 4) 
+		 {
+		   m = static_cast<int> (ridxA.max());
+		   n = static_cast<int> (cidxA.max());
+
+		   // if args(3) is not string, then ignore the value
+		   // otherwise check for summation or unique
+		   if (nargin == 4 && args(3).is_string())
+		     {
+		       std::string vv= args(3).string_value();
+		       if (error_state) return retval;
+		       
+		       if ( vv == "summation" ||
+			    vv == "sum" ) 
+			 assemble_do_sum = true;
+		       else
+			 if ( vv == "unique" )
+			   assemble_do_sum = false;
+			 else {
+			   error("sparse repeat flag must be 'sum' or 'unique'");
+			   return retval;
+			 }
+		     }
+		 } 
+	       else 
+		 {
+		   m = args(3).int_value();
+		   n = args(4).int_value();
+		   if (error_state) 
+		     return retval;
+
+		   // if args(5) is not string, then ignore the value
+		   // otherwise check for summation or unique
+		   if (nargin >= 6 && args(5).is_string())
+		     {
+		       std::string vv= args(5).string_value();
+		       if (error_state) return retval;
+		       
+		       if ( vv == "summation" ||
+			    vv == "sum" ) 
+			 assemble_do_sum = true;
+		       else
+			 if ( vv == "unique" )
+			   assemble_do_sum = false;
+			 else {
+			   error("sparse repeat flag must be 'sum' or 'unique'");
+			   return retval;
+			 }
+		     }
+		   
+		 }
+
+	       // Convert indexing to zero-indexing used internally
+	       ridxA -= 1.;
+	       cidxA -= 1.;
+
+	       if (use_complex) 
+		 retval = new octave_sparse_complex_matrix 
+		   (SparseComplexMatrix (coefAC, ridxA, cidxA, m, n, 
+					 assemble_do_sum));
+	       else if (use_bool) 
+		 retval = new octave_sparse_bool_matrix 
+		   (SparseBoolMatrix (coefAB, ridxA, cidxA, m, n, 
+				      assemble_do_sum));
+	       else
+		 retval = new octave_sparse_matrix 
+		   (SparseMatrix (coefA, ridxA, cidxA, m, n, 
+				  assemble_do_sum));
+	     }
+	 }
+     }
+
+   // Only called in very particular cases, not the default case
+   if (mutate)
+     retval.maybe_mutate ();
+
+   return retval;
+}
+
+DEFUN_DLD (full, args, ,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{FM} =} full (@var{SM})\n\
+ returns a full storage matrix from a sparse one\n\
+@seealso{sparse}\n\
+@end deftypefn")
+{
+  octave_value retval;
+
+  if (args.length() < 1) {
+     print_usage ("full");
+     return retval;
+  }
+
+  if (args(0).class_name () == "sparse")
+    {
+      if (args(0).type_name () == "sparse matrix") 
+	retval = args(0).matrix_value ();
+      else if (args(0).type_name () == "sparse complex matrix")
+	retval = args(0).complex_matrix_value ();
+      else if (args(0).type_name () == "sparse bool matrix")
+	retval = args(0).bool_matrix_value ();
+    } 
+  else if (args(0).is_real_type())
+    retval = args(0).matrix_value();
+  else if (args(0).is_complex_type())
+    retval = args(0).complex_matrix_value();
+  else
+    gripe_wrong_type_arg ("full", args(0));
+
+  return retval;
+}
+
+DEFUN_DLD (nnz, args, ,
+   "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{scalar} =} nnz (@var{SM})\n\
+returns number of non zero elements in SM\n\
+@seealso{sparse}\n\
+@end deftypefn")
+{
+  octave_value retval;
+
+  if (args.length() < 1) 
+    {
+      print_usage ("nnz");
+      return retval;
+    }
+
+  if (args(0).class_name () == "sparse") 
+    {
+      // XXX FIXME XXX should nonzero be a method of octave_base_value so that the
+      // below can be replaced with "retval = (double) (args(0).nonzero ());"
+      const octave_value& rep = args(0).get_rep ();
+
+      if (args(0).type_name () == "sparse matrix")
+	retval = (double) ((const octave_sparse_matrix&) rep) .nonzero ();
+      else if (args(0).type_name () == "sparse complex matrix")
+	retval = (double) ((const octave_sparse_complex_matrix&) rep) .nonzero ();
+      else if (args(0).type_name () == "sparse bool matrix")
+	retval = (double) ((const octave_sparse_bool_matrix&) rep) .nonzero ();
+    } 
+  else if (args(0).type_name () == "complex matrix") 
+    {
+      const ComplexMatrix M = args(0).complex_matrix_value();
+      int nnz = 0;
+      for( int j = 0; j < M.cols(); j++)
+	for( int i = 0; i < M.rows(); i++)
+	  if (M (i, j) != 0.) 
+	    nnz++;
+      retval = (double) nnz;
+    } 
+  else if (args(0).type_name () == "matrix") 
+    {
+      const Matrix M = args(0).matrix_value();
+      int nnz = 0;
+      for( int j = 0; j < M.cols(); j++)
+	for( int i = 0; i < M.rows(); i++)
+	  if (M (i, j) != 0.) 
+	    nnz++;
+      retval = (double) nnz;
+    } 
+  else if (args(0).type_name () == "string") 
+    {
+      const charMatrix M = args(0).char_matrix_value();
+      int nnz = 0;
+      for( int j = 0; j < M.cols(); j++)
+	for( int i = 0; i < M.rows(); i++)
+	  if (M (i, j) != 0) 
+	    nnz++;
+      retval = (double) nnz;
+    } 
+  else if (args(0).type_name () == "scalar") 
+      retval = args(0).scalar_value() != 0.0 ? 1.0 : 0.0;
+  else if (args(0).type_name () == "complex scalar")
+    retval = args(0).complex_value() != 0.0 ? 1.0 : 0.0;
+  else
+     gripe_wrong_type_arg ("nnz", args(0));
+
+  return retval;
+}
+
+DEFUN_DLD (nzmax, args, ,
+   "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{scalar} =} nzmax (@var{SM})\n\
+Returns the amount of storage allocated to the sparse matrix @var{SM}.\n\
+Note that @sc{Octave} tends to crop unused memory at the first oppurtunity\n\
+for sparse objects. There are some cases of user created sparse objects\n\
+where the value returned by @dfn{nzmaz} will not be the same as @dfn{nnz},\n\
+but in general they will give the same result.\n\
+@seealso{sparse, spalloc}\n\
+@end deftypefn")
+{
+  octave_value retval;
+
+  if (args.length() < 1) 
+    {
+      print_usage ("nzmax");
+      return retval;
+    }
+
+  if (args(0).class_name () == "sparse") 
+    {
+      // XXX FIXME XXX should nnz be a method of octave_base_value so that the
+      // below can be replaced with "retval = (double) (args(0).nz ());"
+      const octave_value& rep = args(0).get_rep ();
+
+      if (args(0).type_name () == "sparse matrix")
+	retval = (double) ((const octave_sparse_matrix&) rep) .nnz ();
+      else if (args(0).type_name () == "sparse complex matrix")
+	retval = (double) ((const octave_sparse_complex_matrix&) rep) .nnz ();
+      else if (args(0).type_name () == "sparse bool matrix")
+	retval = (double) ((const octave_sparse_bool_matrix&) rep) .nnz ();
+    }
+  else
+    error ("nzmax: argument must be a sparse matrix");
+
+  return retval;
+}
+
+static octave_value_list
+sparse_find (const SparseMatrix& v)
+{
+  octave_value_list retval;
+  int nnz = v.nnz ();
+  dim_vector dv = v.dims ();
+  int nr = dv(0);
+  int nc = dv (1);
+
+  ColumnVector I (nnz), J (nnz);
+  ColumnVector S (nnz);
+
+  for (int i = 0, cx = 0; i < nc; i++) 
+    {
+      OCTAVE_QUIT;
+      for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) 
+	{
+	  I (cx) = static_cast<double> (v.ridx(j) + 1);
+	  J (cx) = static_cast<double> (i + 1);
+	  S (cx) = v.data(j);
+	  cx++;
+	}
+    }
+
+  if (dv(0) == 1)
+    {
+      retval(0)= I.transpose ();
+      retval(1)= J.transpose ();
+      retval(2)= S.transpose ();
+    }
+  else
+    {
+      retval(0)= I;
+      retval(1)= J;
+      retval(2)= S;
+    }
+  retval(3)= (double) nr;
+  retval(4)= (double) nc;
+  return retval;
+}
+
+static octave_value_list
+sparse_find (const SparseComplexMatrix& v)
+{
+  octave_value_list retval;
+  int nnz = v.nnz ();
+  dim_vector dv = v.dims ();
+  int nr = dv(0);
+  int nc = dv (1);
+
+  ColumnVector I (nnz), J (nnz);
+  ComplexColumnVector S (nnz);
+
+  for (int i = 0, cx = 0; i < nc; i++) 
+    {
+      OCTAVE_QUIT;
+      for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) 
+	{
+	  I (cx) = static_cast<double> (v.ridx(j) + 1);
+	  J (cx) = static_cast<double> (i + 1);
+	  S (cx) = v.data(j);
+	  cx++;
+	}
+    }
+
+  if (dv(0) == 1)
+    {
+      retval(0)= I.transpose ();
+      retval(1)= J.transpose ();
+      retval(2)= S.transpose ();
+    }
+  else
+    {
+      retval(0)= I;
+      retval(1)= J;
+      retval(2)= S;
+    }
+  retval(3)= (double) nr;
+  retval(4)= (double) nc;
+  return retval;
+}
+
+static octave_value_list
+sparse_find (const SparseBoolMatrix& v)
+{
+  octave_value_list retval;
+  int nnz = v.nnz ();
+  dim_vector dv = v.dims ();
+  int nr = dv(0);
+  int nc = dv (1);
+
+  ColumnVector I (nnz), J (nnz);
+  ColumnVector S (nnz);
+
+  for (int i = 0, cx = 0; i < nc; i++) 
+    {
+      OCTAVE_QUIT;
+      for (int j = v.cidx(i); j < v.cidx(i+1); j++ ) 
+	{
+	  I (cx) = static_cast<double> (v.ridx(j) + 1);
+	  J (cx) = static_cast<double> (i + 1);
+	  S (cx) = static_cast<double> (v.data(j));
+	  cx++;
+	}
+    }
+
+  if (dv(0) == 1)
+    {
+      retval(0)= I.transpose ();
+      retval(1)= J.transpose ();
+      retval(2)= S.transpose ();
+    }
+  else
+    {
+      retval(0)= I;
+      retval(1)= J;
+      retval(2)= S;
+    }
+  retval(3)= (double) nr;
+  retval(4)= (double) nc;
+  return retval;
+}
+
+// PKG_ADD: dispatch ("find", "spfind", "sparse matrix")
+// PKG_ADD: dispatch ("find", "spfind", "sparse complex matrix")
+// PKG_ADD: dispatch ("find", "spfind", "sparse bool matrix")
+DEFUN_DLD (spfind, args, nargout ,
+    "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[...] =} spfind (...)\n\
+SPFIND: a sparse version of the find operator\n\
+@enumerate\n\
+    @item\n\
+@var{x }= spfind( @var{a })\n\
+    @itemize @w\n\
+is analagous to @var{x}= find(@var{A}(:))@*\n\
+where @var{A}= full(@var{a})\n\
+    @end itemize\n\
+    @item\n\
+[@var{i},@var{j},@var{v},@var{nr},@var{nc}] = spfind( @var{a} )\n\
+    @itemize @w\n\
+returns column vectors @var{i},@var{j},@var{v} such that@*\n\
+@var{a}= sparse(@var{i},@var{j},@var{v},@var{nr},@var{nc})\n\
+    @end itemize\n\
+@end enumerate\n\
+@seealso{sparse}\n\
+@end deftypefn")
+{
+   octave_value_list retval;
+   int nargin = args.length ();
+
+   if (nargin != 1) 
+     {
+       print_usage ("spfind");
+       return retval;
+     }
+      
+
+   octave_value arg = args(0);
+
+   if (arg.class_name () == "sparse")
+     {
+       if (arg.type_name () == "sparse matrix")
+	 retval = sparse_find (args(0).sparse_matrix_value ());
+       else if (arg.type_name () == "sparse complex matrix" ) 
+	 retval = sparse_find (args(0).sparse_complex_matrix_value ());
+       else if (arg.type_name () == "sparse bool matrix" ) 
+	 retval = sparse_find (args(0).sparse_bool_matrix_value ());
+       else 
+	 gripe_wrong_type_arg ("spfind", arg);
+     }
+   else
+     gripe_wrong_type_arg ("spfind", arg);
+     
+   if (nargout == 1 || nargout ==0 ) 
+     { 
+       // only find location as fortran index
+       octave_value_list tmp;
+       tmp(0) = retval(0) + (retval(1)-1)*retval(3);
+       retval = tmp;
+     }
+
+   return retval;
+}
+
+#define SPARSE_DIM_ARG_BODY(NAME, FUNC) \
+    int nargin = args.length(); \
+    octave_value retval; \
+    if ((nargin != 1 ) && (nargin != 2)) \
+      print_usage (#NAME); \
+    else { \
+      int dim = (nargin == 1 ? -1 : args(1).int_value(true) - 1); \
+      if (error_state) return retval; \
+      if (dim < -1 || dim > 1) { \
+	error (#NAME ": invalid dimension argument = %d", dim + 1); \
+        return retval; \
+      } \
+      if (args(0).type_id () == \
+	  octave_sparse_matrix::static_type_id () || args(0).type_id () == \
+	  octave_sparse_bool_matrix::static_type_id ()) { \
+	  retval = args(0).sparse_matrix_value () .FUNC (dim); \
+      } else if (args(0).type_id () == \
+		 octave_sparse_complex_matrix::static_type_id ()) { \
+	  retval = args(0).sparse_complex_matrix_value () .FUNC (dim); \
+      } else \
+	  print_usage (#NAME); \
+    } \
+    return retval
+
+// PKG_ADD: dispatch ("prod", "spprod", "sparse matrix");
+// PKG_ADD: dispatch ("prod", "spprod", "sparse complex matrix");
+// PKG_ADD: dispatch ("prod", "spprod", "sparse bool matrix");
+DEFUN_DLD (spprod, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{y} =} spprod (@var{x},@var{dim})\n\
+Product of elements along dimension @var{dim}.  If @var{dim} is omitted,\n\
+it defaults to 1 (column-wise products).\n\
+@end deftypefn\n\
+@seealso{spsum, spsumsq}")
+{
+  SPARSE_DIM_ARG_BODY (spprod, prod);
+}
+
+// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse matrix");
+// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse complex matrix");
+// PKG_ADD: dispatch ("cumprod", "spcumprod", "sparse bool matrix");
+DEFUN_DLD (spcumprod, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{y} =} spcumprod (@var{x},@var{dim})\n\
+Cumulative product of elements along dimension @var{dim}.  If @var{dim}\n\
+is omitted, it defaults to 1 (column-wise cumulative products).\n\
+@end deftypefn\n\
+@seealso{spcumsum}")
+{
+  SPARSE_DIM_ARG_BODY (spcumprod, cumprod);
+}
+
+// PKG_ADD: dispatch ("sum", "spsum", "sparse matrix");
+// PKG_ADD: dispatch ("sum", "spsum", "sparse complex matrix");
+// PKG_ADD: dispatch ("sum", "spsum", "sparse bool matrix");
+DEFUN_DLD (spsum, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{y} =} spsum (@var{x},@var{dim})\n\
+Sum of elements along dimension @var{dim}.  If @var{dim} is omitted, it\n\
+defaults to 1 (column-wise sum).\n\
+@end deftypefn\n\
+@seealso{spprod, spsumsq}")
+{
+  SPARSE_DIM_ARG_BODY (spsum, sum);
+}
+
+// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse matrix");
+// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse complex matrix");
+// PKG_ADD: dispatch ("cumsum", "spcumsum", "sparse bool matrix");
+DEFUN_DLD (spcumsum, args, , 
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{y} =} spcumsum (@var{x},@var{dim})\n\
+Cumulative sum of elements along dimension @var{dim}.  If @var{dim}\n\
+is omitted, it defaults to 1 (column-wise cumulative sums).\n\
+@end deftypefn\n\
+@seealso{spcumprod}")
+{
+  SPARSE_DIM_ARG_BODY (spcumsum, cumsum);
+}
+
+// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse matrix");
+// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse complex matrix");
+// PKG_ADD: dispatch ("sumsq", "spsumsq", "sparse bool matrix");
+DEFUN_DLD (spsumsq, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {@var{y} =} spsumsq (@var{x},@var{dim})\n\
+Sum of squares of elements along dimension @var{dim}.  If @var{dim}\n\
+is omitted, it defaults to 1 (column-wise sum of squares).\n\
+This function is equivalent to computing\n\
+@example\n\
+spsum (x .* spconj (x), dim)\n\
+@end example\n\
+but it uses less memory and avoids calling @code{spconj} if @var{x} is\n\
+real.\n\
+@end deftypefn\n\
+@seealso{spprod, spsum}")
+{
+  SPARSE_DIM_ARG_BODY (spsumsq, sumsq);
+}
+
+#define MINMAX_BODY(FCN) \
+ \
+  octave_value_list retval;  \
+ \
+  int nargin = args.length (); \
+ \
+  if (nargin < 1 || nargin > 3 || nargout > 2) \
+    { \
+      print_usage (#FCN); \
+      return retval; \
+    } \
+ \
+  octave_value arg1; \
+  octave_value arg2; \
+  octave_value arg3; \
+ \
+  switch (nargin) \
+    { \
+    case 3: \
+      arg3 = args(2); \
+ \
+    case 2: \
+      arg2 = args(1); \
+ \
+    case 1: \
+      arg1 = args(0); \
+      break; \
+ \
+    default: \
+      panic_impossible (); \
+      break; \
+    } \
+ \
+  int dim; \
+  dim_vector dv = ((const octave_sparse_matrix&) arg1) .dims (); \
+  if (error_state) \
+    { \
+      gripe_wrong_type_arg (#FCN, arg1);  \
+      return retval; \
+    } \
+ \
+  if (nargin == 3) \
+    { \
+      dim = arg3.nint_value () - 1;  \
+      if (dim < 0 || dim >= dv.length ()) \
+        { \
+	  error ("%s: invalid dimension", #FCN); \
+	  return retval; \
+	} \
+    } \
+  else \
+    { \
+      dim = 0; \
+      while ((dim < dv.length ()) && (dv (dim) <= 1)) \
+	dim++; \
+      if (dim == dv.length ()) \
+	dim = 0; \
+    } \
+ \
+  bool single_arg = (nargin == 1) || arg2.is_empty();	\
+ \
+  if (single_arg && (nargout == 1 || nargout == 0)) \
+    { \
+      if (arg1.type_id () == octave_sparse_matrix::static_type_id ()) \
+	retval(0) = arg1.sparse_matrix_value () .FCN (dim); \
+      else if (arg1.type_id () == \
+	       octave_sparse_complex_matrix::static_type_id ()) \
+	retval(0) = arg1.sparse_complex_matrix_value () .FCN (dim); \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+    } \
+  else if (single_arg && nargout == 2) \
+    { \
+      Array2<int> index; \
+ \
+      if (arg1.type_id () == octave_sparse_matrix::static_type_id ()) \
+	retval(0) = arg1.sparse_matrix_value () .FCN (index, dim); \
+      else if (arg1.type_id () == \
+	       octave_sparse_complex_matrix::static_type_id ()) \
+	retval(0) = arg1.sparse_complex_matrix_value () .FCN (index, dim); \
+      else \
+	gripe_wrong_type_arg (#FCN, arg1); \
+ \
+      int len = index.numel (); \
+ \
+      if (len > 0) \
+	{ \
+	  double nan_val = lo_ieee_nan_value (); \
+ \
+	  NDArray idx (index.dims ()); \
+ \
+	  for (int i = 0; i < len; i++) \
+	    { \
+	      OCTAVE_QUIT; \
+	      int tmp = index.elem (i) + 1; \
+	      idx.elem (i) = (tmp <= 0) \
+		? nan_val : static_cast<double> (tmp); \
+	    } \
+ \
+	  retval(1) = idx; \
+	} \
+      else \
+	retval(1) = NDArray (); \
+    } \
+  else \
+    { \
+      int arg1_is_scalar = arg1.is_scalar_type (); \
+      int arg2_is_scalar = arg2.is_scalar_type (); \
+ \
+      int arg1_is_complex = arg1.is_complex_type (); \
+      int arg2_is_complex = arg2.is_complex_type (); \
+ \
+      if (arg1_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      Complex c1 = arg1.complex_value (); \
+	      \
+	      SparseComplexMatrix m2 = arg2.sparse_complex_matrix_value (); \
+	      \
+	      if (! error_state) \
+		{ \
+		  SparseComplexMatrix result = FCN (c1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      double d1 = arg1.double_value (); \
+	      SparseMatrix m2 = arg2.sparse_matrix_value (); \
+	      \
+	      if (! error_state) \
+		{ \
+		  SparseMatrix result = FCN (d1, m2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else if (arg2_is_scalar) \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      SparseComplexMatrix m1 = arg1.sparse_complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  Complex c2 = arg2.complex_value (); \
+		  SparseComplexMatrix result = FCN (m1, c2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	  else \
+	    { \
+	      SparseMatrix m1 = arg1.sparse_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  double d2 = arg2.double_value (); \
+		  SparseMatrix result = FCN (m1, d2); \
+		  if (! error_state) \
+		    retval(0) = result; \
+		} \
+	    } \
+	} \
+      else \
+	{ \
+	  if (arg1_is_complex || arg2_is_complex) \
+	    { \
+	      SparseComplexMatrix m1 = arg1.sparse_complex_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  SparseComplexMatrix m2 = arg2.sparse_complex_matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      SparseComplexMatrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	  else \
+	    { \
+	      SparseMatrix m1 = arg1.sparse_matrix_value (); \
+ \
+	      if (! error_state) \
+		{ \
+		  SparseMatrix m2 = arg2.sparse_matrix_value (); \
+ \
+		  if (! error_state) \
+		    { \
+		      SparseMatrix result = FCN (m1, m2); \
+		      if (! error_state) \
+			retval(0) = result; \
+		    } \
+		} \
+	    } \
+	} \
+    } \
+ \
+  return retval
+
+// PKG_ADD: dispatch ("min", "spmin", "sparse matrix");
+// PKG_ADD: dispatch ("min", "spmin", "sparse complex matrix");
+// PKG_ADD: dispatch ("min", "spmin", "sparse bool matrix");
+DEFUN_DLD (spmin, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Mapping Function} {} spmin (@var{x}, @var{y}, @var{dim})\n\
+@deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} spmin (@var{x})\n\
+@cindex Utility Functions\n\
+For a vector argument, return the minimum value.  For a matrix\n\
+argument, return the minimum value from each column, as a row\n\
+vector, or over the dimension @var{dim} if defined. For two matrices\n\
+(or a matrix and scalar), return the pair-wise minimum.\n\
+Thus,\n\
+\n\
+@example\n\
+min (min (@var{x}))\n\
+@end example\n\
+\n\
+@noindent\n\
+returns the smallest element of @var{x}, and\n\
+\n\
+@example\n\
+@group\n\
+min (2:5, pi)\n\
+    @result{}  2.0000  3.0000  3.1416  3.1416\n\
+@end group\n\
+@end example\n\
+@noindent\n\
+compares each element of the range @code{2:5} with @code{pi}, and\n\
+returns a row vector of the minimum values.\n\
+\n\
+For complex arguments, the magnitude of the elements are used for\n\
+comparison.\n\
+\n\
+If called with one input and two output arguments,\n\
+@code{min} also returns the first index of the\n\
+minimum value(s). Thus,\n\
+\n\
+@example\n\
+@group\n\
+[x, ix] = min ([1, 3, 0, 2, 5])\n\
+    @result{}  x = 0\n\
+        ix = 3\n\
+@end group\n\
+@end example\n\
+@end deftypefn")
+{
+  MINMAX_BODY (min);
+}
+
+// PKG_ADD: dispatch ("max", "spmax", "sparse matrix");
+// PKG_ADD: dispatch ("max", "spmax", "sparse complex matrix");
+// PKG_ADD: dispatch ("max", "spmax", "sparse bool matrix");
+DEFUN_DLD (spmax, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Mapping Function} {} spmax (@var{x}, @var{y}, @var{dim})\n\
+@deftypefnx {Mapping Function} {[@var{w}, @var{iw}] =} spmax (@var{x})\n\
+@cindex Utility Functions\n\
+For a vector argument, return the maximum value.  For a matrix\n\
+argument, return the maximum value from each column, as a row\n\
+vector, or over the dimension @var{dim} if defined. For two matrices\n\
+(or a matrix and scalar), return the pair-wise maximum.\n\
+Thus,\n\
+\n\
+@example\n\
+max (max (@var{x}))\n\
+@end example\n\
+\n\
+@noindent\n\
+returns the largest element of @var{x}, and\n\
+\n\
+@example\n\
+@group\n\
+max (2:5, pi)\n\
+    @result{}  3.1416  3.1416  4.0000  5.0000\n\
+@end group\n\
+@end example\n\
+@noindent\n\
+compares each element of the range @code{2:5} with @code{pi}, and\n\
+returns a row vector of the maximum values.\n\
+\n\
+For complex arguments, the magnitude of the elements are used for\n\
+comparison.\n\
+\n\
+If called with one input and two output arguments,\n\
+@code{max} also returns the first index of the\n\
+maximum value(s). Thus,\n\
+\n\
+@example\n\
+@group\n\
+[x, ix] = max ([1, 3, 5, 2, 5])\n\
+    @result{}  x = 5\n\
+        ix = 3\n\
+@end group\n\
+@end example\n\
+@end deftypefn")
+{
+  MINMAX_BODY (max);
+}
+
+// PKG_ADD: dispatch ("atan2", "spatan2", "sparse matrix");
+// PKG_ADD: dispatch ("atan2", "spatan2", "sparse complex matrix");
+// PKG_ADD: dispatch ("atan2", "spatan2", "sparse bool matrix");
+DEFUN_DLD (spatan2, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {} spatan2 (@var{y}, @var{x})\n\
+Compute atan (Y / X) for corresponding sparse matrix elements of Y and X.\n\
+The result is in range -pi to pi.\n\
+@end deftypefn\n")
+{
+  octave_value retval;
+  int nargin = args.length ();
+  if (nargin == 2) {  
+    SparseMatrix a, b;
+    double da, db;
+    bool is_double_a = false;
+    bool is_double_b = false;
+
+    if (args(0).is_scalar_type ())
+      {
+	is_double_a = true;
+	da = args(0).double_value();
+      }
+    else 
+      a = args(0).sparse_matrix_value ();
+
+    if (args(1).is_scalar_type ())
+      {
+	is_double_b = true;
+	db = args(1).double_value();
+      }
+    else 
+      b = args(1).sparse_matrix_value ();
+
+    if (is_double_a && is_double_b)
+      retval = Matrix (1, 1, atan2(da, db));
+    else if (is_double_a)
+      retval = atan2 (da, b);
+    else if (is_double_b)
+      retval = atan2 (a, db);
+    else
+      retval = atan2 (a, b);
+
+  } else
+    print_usage("spatan2");
+
+  return retval;
+}
+
+static octave_value
+make_spdiag (const octave_value& a, const octave_value& b)
+{
+  octave_value retval;
+
+  if (a.is_complex_type ())
+    {
+      SparseComplexMatrix m = a.sparse_complex_matrix_value ();
+      int k = b.nint_value(true);
+
+      if (error_state) 
+	return retval;
+
+      int nr = m.rows ();
+      int nc = m.columns ();
+	
+      if (nr == 0 || nc == 0)
+	retval = m;
+      else if (nr == 1 || nc == 1) 
+	{
+	  int roff = 0;
+	  int coff = 0;
+	  if (k > 0) 
+	    {
+	      roff = 0;
+	      coff = k;
+	    } 
+	  else if (k < 0) 
+	    {
+	      k = -k;
+	      roff = k;
+	      coff = 0;
+	    }
+
+	  if (nr == 1) 
+	    {
+	      int n = nc + k;
+	      int nz = m.nnz ();
+	      SparseComplexMatrix r (n, n, nz);
+	      for (int i = 0; i < coff+1; i++)
+		r.xcidx (i) = 0;
+	      for (int j = 0; j < nc; j++)
+		{
+		  for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+		    {
+		      r.xdata (i) = m.data (i);
+		      r.xridx (i) = j + roff;
+		    }
+		  r.xcidx (j+coff+1) = m.cidx(j+1);
+		}
+	      for (int i = nc+coff+1; i < n+1; i++)
+		r.xcidx (i) = nz;
+	      retval = r;
+	    } 
+	  else 
+	    {
+	      int n = nr + k;
+	      int nz = m.nnz ();
+	      int ii = 0;
+	      int ir = m.ridx(0);
+	      SparseComplexMatrix r (n, n, nz);
+	      for (int i = 0; i < coff+1; i++)
+		r.xcidx (i) = 0;
+	      for (int i = 0; i < nr; i++)
+		{
+		  if (ir == i)
+		    {
+		      r.xdata (ii) = m.data (ii);
+		      r.xridx (ii++) = ir + roff;
+		      if (ii != nz)
+			ir = m.ridx (ii);
+		    }
+		  r.xcidx (i+coff+1) = ii;
+		}
+	      for (int i = nr+coff+1; i < n+1; i++)
+		r.xcidx (i) = nz;
+	      retval = r;
+	    }
+	} 
+      else 
+	{
+	  SparseComplexMatrix r = m.diag (k);
+	  // Don't use numel, since it can overflow for very large matrices
+	  if (r.rows () > 0 && r.cols () > 0)
+	    retval = r;
+	}
+    } 
+  else if (a.is_real_type ())
+    {
+      SparseMatrix m = a.sparse_matrix_value ();
+
+      int k = b.nint_value(true);
+
+      if (error_state) 
+	return retval;
+
+      int nr = m.rows ();
+      int nc = m.columns ();
+	
+      if (nr == 0 || nc == 0)
+	retval = m;
+      else if (nr == 1 || nc == 1) 
+	{
+	  int roff = 0;
+	  int coff = 0;
+	  if (k > 0) 
+	    {
+	      roff = 0;
+	      coff = k;
+	    } 
+	  else if (k < 0) 
+	    {
+	      k = -k;
+	      roff = k;
+	      coff = 0;
+	    }
+
+	  if (nr == 1) 
+	    {
+	      int n = nc + k;
+	      int nz = m.nnz ();
+	      SparseMatrix r (n, n, nz);
+
+	      for (int i = 0; i < coff+1; i++)
+		r.xcidx (i) = 0;
+	      for (int j = 0; j < nc; j++)
+		{
+		  for (int i = m.cidx(j); i < m.cidx(j+1); i++)
+		    {
+		      r.xdata (i) = m.data (i);
+		      r.xridx (i) = j + roff;
+		    }
+		  r.xcidx (j+coff+1) = m.cidx(j+1);
+		}
+	      for (int i = nc+coff+1; i < n+1; i++)
+		r.xcidx (i) = nz;
+	      retval = r;
+	    } 
+	  else 
+	    {
+	      int n = nr + k;
+	      int nz = m.nnz ();
+	      int ii = 0;
+	      int ir = m.ridx(0);
+	      SparseMatrix r (n, n, nz);
+	      for (int i = 0; i < coff+1; i++)
+		r.xcidx (i) = 0;
+	      for (int i = 0; i < nr; i++)
+		{
+		  if (ir == i)
+		    {
+		      r.xdata (ii) = m.data (ii);
+		      r.xridx (ii++) = ir + roff;
+		      if (ii != nz)
+			ir = m.ridx (ii);
+		    }
+		  r.xcidx (i+coff+1) = ii;
+		}
+	      for (int i = nr+coff+1; i < n+1; i++)
+		r.xcidx (i) = nz;
+	      retval = r;
+	    }
+	} 
+      else 
+	{
+	  SparseMatrix r = m.diag (k);
+	  if (r.rows () > 0 && r.cols () > 0)
+	    retval = r;
+	}
+    }
+  else
+    gripe_wrong_type_arg ("spdiag", a);
+
+  return retval;
+}
+
+// PKG_ADD: dispatch ("diag", "spdiag", "sparse matrix");
+// PKG_ADD: dispatch ("diag", "spdiag", "sparse complex matrix");
+// PKG_ADD: dispatch ("diag", "spdiag", "sparse bool matrix");
+DEFUN_DLD (spdiag, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {} spdiag (@var{v}, @var{k})\n\
+Return a diagonal matrix with the sparse vector @var{v} on diagonal\n\
+@var{k}. The second argument is optional. If it is positive, the vector is\n\
+placed on the @var{k}-th super-diagonal. If it is negative, it is placed\n\
+on the @var{-k}-th sub-diagonal.  The default value of @var{k} is 0, and\n\
+the vector is placed on the main diagonal.  For example,\n\
+\n\
+@example\n\
+spdiag ([1, 2, 3], 1)\n\
+ans =\n\
+\n\
+Compressed Column Sparse (rows=4, cols=4, nnz=3)\n\
+  (1 , 2) -> 1\n\
+  (2 , 3) -> 2\n\
+  (3 , 4) -> 3\n\
+@end example\n\
+\n\
+@end deftypefn\n\
+@seealso{diag}")
+{
+  octave_value retval;
+
+  int nargin = args.length ();
+
+  if (nargin == 1 && args(0).is_defined ())
+    retval = make_spdiag (args(0), octave_value(0.));
+  else if (nargin == 2 && args(0).is_defined () && args(1).is_defined ())
+    retval = make_spdiag (args(0), args(1));
+  else
+    print_usage ("spdiag");
+
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/spdet.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,130 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "defun-dld.h"
+#include "error.h"
+#include "gripes.h"
+#include "oct-obj.h"
+#include "utils.h"
+
+#include "dbleDET.h"
+#include "CmplxDET.h"
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// PKG_ADD: dispatch ("det", "spdet", "sparse matrix")
+// PKG_ADD: dispatch ("det", "spdet", "sparse complex matrix")
+// PKG_ADD: dispatch ("det", "spdet", "sparse bool matrix")
+DEFUN_DLD (spdet, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{d}, @var{rcond}] = } spdet (@var{a})\n\
+Compute the determinant of sparse matrix @var{a} using UMFPACK.  Return\n\
+an estimate of the reciprocal condition number if requested.\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+
+  int nargin = args.length ();
+
+  if (nargin != 1)
+    {
+      print_usage ("spdet");
+      return retval;
+    }
+
+  octave_value arg = args(0);
+    
+  int nr = arg.rows ();
+  int nc = arg.columns ();
+
+  if (nr == 0 && nc == 0)
+    {
+      retval(0) = 1.0;
+      return retval;
+    }
+
+  int arg_is_empty = empty_arg ("spdet", nr, nc);
+  if (arg_is_empty < 0)
+    return retval;
+  if (arg_is_empty > 0)
+    return octave_value (Matrix (1, 1, 1.0));
+
+  if (nr != nc)
+    {
+      gripe_square_matrix_required ("spdet");
+      return retval;
+    }
+
+  if (arg.is_real_type ())
+    {
+      SparseMatrix m = args(0).sparse_matrix_value ();
+
+      if (! error_state)
+	{
+	  // Always compute rcond, so we can detect numerically
+	  // singular matrices.
+
+	  int info;
+	  double rcond = 0.0;
+	  DET det = m.determinant (info, rcond);
+	  retval(1) = rcond;
+	  volatile double xrcond = rcond;
+	  xrcond += 1.0;
+	  retval(0) = ((info == -1 || xrcond == 1.0) ? 0.0 : det.value ());
+	}
+    }
+  else if (arg.is_complex_type ())
+    {
+      SparseComplexMatrix m = args(0).sparse_complex_matrix_value ();
+
+      if (! error_state)
+	{
+	  // Always compute rcond, so we can detect numerically
+	  // singular matrices.
+
+	  int info;
+	  double rcond = 0.0;
+	  ComplexDET det = m.determinant (info, rcond);
+	  retval(1) = rcond;
+	  volatile double xrcond = rcond;
+	  xrcond += 1.0;
+	  retval(0) = ((info == -1 || xrcond == 1.0)
+		       ? Complex (0.0) : det.value ());
+	}
+    }
+  else
+    {
+      gripe_wrong_type_arg ("spdet", arg);
+    }
+
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/splu.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,400 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "defun-dld.h"
+#include "error.h"
+#include "gripes.h"
+#include "oct-obj.h"
+#include "utils.h"
+
+#include "SparseCmplxLU.h"
+#include "SparsedbleLU.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// PKG_ADD: dispatch ("lu", "splu", "sparse matrix")
+// PKG_ADD: dispatch ("lu", "splu", "sparse complex matrix")
+// PKG_ADD: dispatch ("lu", "splu", "sparse bool matrix")
+DEFUN_DLD (splu, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{l}, @var{u}] =} splu (@var{a})\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}] =} splu (@var{a})\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}, @var{Q}] =} splu (@var{a})\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}, @var{Q}] =} splu (@dots{}, @var{thres})\n\
+@deftypefnx {Loadable Function} {[@var{l}, @var{u}, @var{P}] =} splu (@dots{}, @var{Q})\n\
+@cindex LU decomposition\n\
+Compute the LU decomposition of the sparse matrix @var{a}, using\n\
+subroutines from UMFPACK.  The result is returned in a permuted\n\
+form, according to the optional return values @var{P} and @var{Q}.\n\
+\n\
+Called with two or three output arguments and a single input argument,\n\
+@dfn{splu} is a replacement for @dfn{lu}, and therefore the sparsity\n\
+preserving column permutations @var{Q} are not performed. Called with\n\
+a fourth output argument, the sparsity preserving column transformation\n\
+@var{Q} is returned, such that @code{@var{P} * @var{a} * @var{Q} =\n\
+@var{l} * @var{u}}.\n\
+\n\
+An additional input argument @var{thres}, that defines the pivoting\n\
+threshold can be given. Alternatively, the desired sparsity preserving\n\
+column permutations @var{Q} can be passed. Note that @var{Q} is assumed\n\
+to be fixed if three are fewer than four output arguments. Otherwise,\n\
+the updated column permutations are returned as the fourth argument.\n\
+\n\
+With two output arguments, returns the permuted forms of the upper and\n\
+lower triangular matrices, such that @code{@var{a} = @var{l} * @var{u}}.\n\
+With two or three output arguments, if a user-defined @var{Q} is given,\n\
+then @code{@var{u} * @var{Q}'} is returned. The matrix is not required to\n\
+be square.\n\
+@end deftypefn\n\
+@seealso{sparse, spinv, colamd, symamd}")
+{
+  octave_value_list retval;
+
+  int nargin = args.length ();
+
+  if (nargin < 1 || nargin > 3 || nargout > 4)
+    {
+      print_usage ("splu");
+      return retval;
+    }
+
+  octave_value arg = args(0);
+
+  int nr = arg.rows ();
+  int nc = arg.columns ();
+
+  int arg_is_empty = empty_arg ("splu", nr, nc);
+
+  if (arg_is_empty < 0)
+    return retval;
+  else if (arg_is_empty > 0)
+    return octave_value_list (3, SparseMatrix ());
+
+  ColumnVector Qinit;
+  bool have_Qinit = false;
+  double thres = -1.;
+
+  for (int k = 1; k < nargin; k++)
+    {
+      if (args(k).class_name () == "sparse") 
+	{
+	  SparseMatrix tmp = args (k).sparse_matrix_value ();
+	  
+	  if (error_state)
+	    {
+	      error ("splu: Not a valid permutation/threshold");
+	      return retval;
+	    }
+
+	  dim_vector dv = tmp.dims ();
+
+	  if (dv(0) == 1 && dv(1) == 1)
+	    thres = tmp (0);
+	  else if (dv(0) == 1 || dv(1) == 1)
+	    {
+	      int nel = tmp.numel ();
+	      Qinit.resize (nel);
+	      for (int i = 0; i < nel; i++)
+		Qinit (i) = tmp (i) - 1;
+	      have_Qinit = true;
+	    }
+	  else
+	    {
+	      int t_nc = tmp.cols ();
+	      
+	      if (tmp.nnz () != t_nc)
+		error ("splu: Not a valid permutation matrix");
+	      else
+		{
+		  for (int i = 0; i < t_nc + 1; i++)
+		    if (tmp.cidx(i) != i)
+		      {
+			error ("splu: Not a valid permutation matrix");
+			break;
+		      }
+		}
+		  
+	      if (!error_state)
+		{
+		  for (int i = 0; i < t_nc; i++)
+		    if (tmp.data (i) != 1.)
+		      {
+			error ("splu: Not a valid permutation matrix");
+			break;
+		      }
+		    else
+		      Qinit (i) = tmp.ridx (i) - 1; 
+		}
+	      
+	      if (! error_state)
+		have_Qinit = true;
+	    }
+	}
+      else
+	{
+	  NDArray tmp = args(k).array_value ();
+
+	  if (error_state)
+	    return retval;
+
+	  dim_vector dv = tmp.dims ();
+	  if (dv.length () > 2)
+	    {
+	      error ("splu: second argument must be a vector/matrix or a scalar");
+	    }
+	  else if (dv(0) == 1 && dv(1) == 1)
+	    thres = tmp (0);
+	  else if (dv(0) == 1 || dv(1) == 1)
+	    {
+	      int nel = tmp.numel ();
+	      Qinit.resize (nel);
+	      for (int i = 0; i < nel; i++)
+		Qinit (i) = tmp (i) - 1;
+	      have_Qinit = true;
+	    }
+	  else
+	    {
+	      SparseMatrix tmp2 (tmp);
+
+	      int t_nc = tmp2.cols ();
+	      
+	      if (tmp2.nnz () != t_nc)
+		error ("splu: Not a valid permutation matrix");
+	      else
+		{
+		  for (int i = 0; i < t_nc + 1; i++)
+		    if (tmp2.cidx(i) != i)
+		      {
+			error ("splu: Not a valid permutation matrix");
+			break;
+		      }
+		}
+		  
+	      if (!error_state)
+		{
+		  for (int i = 0; i < t_nc; i++)
+		    if (tmp2.data (i) != 1.)
+		      {
+			error ("splu: Not a valid permutation matrix");
+			break;
+		      }
+		    else
+		      Qinit (i) = tmp2.ridx (i) - 1; 
+		}
+	      
+	      if (! error_state)
+		have_Qinit = true;
+	    }
+	}
+    }
+
+  if (error_state)
+    return retval;
+
+  if (arg.is_real_type ())
+    {
+      SparseMatrix m = arg.sparse_matrix_value ();
+
+      if (nargout < 4 && ! have_Qinit)
+	{
+	  int m_nc = m.cols ();
+	  Qinit.resize (m_nc);
+	  for (int i = 0; i < m_nc; i++)
+	    Qinit (i) = i;
+	}
+
+      if (! error_state)
+	{
+	  switch (nargout)
+	    {
+	    case 0:
+	    case 1:
+	    case 2:
+	      {
+		SparseLU fact (m, Qinit, thres, true);
+
+		SparseMatrix P = fact.Pr ();
+		SparseMatrix L = P.transpose () * fact.L ();
+		if (have_Qinit)
+		  retval(1) = fact.U () * fact.Pc ().transpose ();
+		else
+		  retval(1) = fact.U ();
+
+		retval(0) = L;
+	      }
+	      break;
+
+	    case 3:
+	      {
+		SparseLU fact (m, Qinit, thres, true);
+
+		retval(2) = fact.Pr ();
+		if (have_Qinit)
+		  retval(1) = fact.U () * fact.Pc ().transpose ();
+		else
+		  retval(1) = fact.U ();
+		retval(0) = fact.L ();
+	      }
+	      break;
+
+	    case 4:
+	    default:
+	      {
+		if (have_Qinit)
+		  {
+		    SparseLU fact (m, Qinit, thres, false);
+
+		    retval(3) = fact.Pc ();
+		    retval(2) = fact.Pr ();
+		    retval(1) = fact.U ();
+		    retval(0) = fact.L ();
+		  }
+		else
+		  {
+		    SparseLU fact (m, thres);
+
+		    retval(3) = fact.Pc ();
+		    retval(2) = fact.Pr ();
+		    retval(1) = fact.U ();
+		    retval(0) = fact.L ();
+		  }
+	      }
+	      break;
+	    }
+	}
+    }
+  else if (arg.is_complex_type ())
+    {
+      SparseComplexMatrix m = arg.sparse_complex_matrix_value ();
+
+      if (nargout < 4 && ! have_Qinit)
+	{
+	  int m_nc = m.cols ();
+	  Qinit.resize (m_nc);
+	  for (int i = 0; i < m_nc; i++)
+	    Qinit (i) = i;
+	}
+
+      if (! error_state)
+	{
+	  switch (nargout)
+	    {
+	    case 0:
+	    case 1:
+	    case 2:
+	      {
+		SparseComplexLU fact (m, Qinit, thres, true);
+
+		SparseMatrix P = fact.Pr ();
+		SparseComplexMatrix L = P.transpose () * fact.L ();
+
+		if (have_Qinit)
+		  retval(1) = fact.U () * fact.Pc ().transpose ();
+		else
+		  retval(1) = fact.U ();
+		retval(0) = L;
+	      }
+	      break;
+
+	    case 3:
+	      {
+		SparseComplexLU fact (m, Qinit, thres, true);
+
+		retval(2) = fact.Pr ();
+		if (have_Qinit)
+		  retval(1) = fact.U () * fact.Pc ().transpose ();
+		else
+		  retval(1) = fact.U ();
+		retval(0) = fact.L ();
+	      }
+	      break;
+
+	    case 4:
+	    default:
+	      {
+		if (have_Qinit)
+		  {
+		    SparseComplexLU fact (m, Qinit, thres, false);
+
+		    retval(3) = fact.Pc ();
+		    retval(2) = fact.Pr ();
+		    retval(1) = fact.U ();
+		    retval(0) = fact.L ();
+		  }
+		else
+		  {
+		    SparseComplexLU fact (m, thres);
+
+		    retval(3) = fact.Pc ();
+		    retval(2) = fact.Pr ();
+		    retval(1) = fact.U ();
+		    retval(0) = fact.L ();
+		  }
+	      }
+	      break;
+	    }
+	}
+    }
+  else
+    {
+      gripe_wrong_type_arg ("splu", arg);
+    }
+
+  return retval;
+}
+
+// PKG_ADD: dispatch ("inv", "spinv", "sparse matrix")
+// PKG_ADD: dispatch ("inv", "spinv", "sparse complex matrix")
+// PKG_ADD: dispatch ("inv", "spinv", "sparse bool matrix")
+// PKG_ADD: dispatch ("inverse", "spinv", "sparse matrix")
+// PKG_ADD: dispatch ("inverse", "spinv", "sparse complex matrix")
+// PKG_ADD: dispatch ("inverse", "spinv", "sparse bool matrix")
+DEFUN_DLD (spinv, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{x}, @var{rcond}] = } spinv (@var{a}, @var{Q})\n\
+@deftypefnx {Loadable Function} {[@var{x}, @var{rcond}, @var{Q}] = } spinv (@var{a}, @var{Q})\n\
+Compute the inverse of the square matrix @var{a}.  Return an estimate\n\
+of the reciprocal condition number if requested, otherwise warn of an\n\
+ill-conditioned matrix if the reciprocal condition number is small.\n\
+\n\
+An optional second input argument @var{Q} is the optional pre-ordering of\n\
+the matrix, such that @code{@var{x} = inv (@var{a} (:, @var{Q}))}. @var{Q}\n\
+can equally be a matrix, in which case @code{@var{x} = inv (@var{a} *\n\
+@var{Q}))}.\n\
+\n\
+If a third output argument is given then the permuations to achieve a sparse\n\
+inverse are returned. It is not required that the return column permutations\n\
+@var{Q} and the same as the user supplied permutations\n\
+@end deftypefn")
+{
+  error ("spinv: not implemented yet");
+  return octave_value ();
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DLD-FUNCTIONS/spparms.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,167 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "defun-dld.h"
+#include "ov.h"
+#include "pager.h"
+#include "error.h"
+#include "gripes.h"
+
+#include "oct-spparms.h"
+
+DEFUN_DLD (spparms, args, nargout,
+  "-*- texinfo -*-\n\
+@deftypefn {Loadable Function} { } spparms ()\n\
+@deftypefnx {Loadable Function} {@var{vals} =} spparms ()\n\
+@deftypefnx {Loadable Function} {[@var{keys}, @var{vals}] =} spparms ()\n\
+@deftypefnx {Loadable Function} {@var{val} =} spparms (@var{key})\n\
+@deftypefnx {Loadable Function} { } spparms (@var{vals})\n\
+@deftypefnx {Loadable Function} { } spparms ('defaults')\n\
+@deftypefnx {Loadable Function} { } spparms ('tight')\n\
+@deftypefnx {Loadable Function} { } spparms (@var{key}, @var{val})\n\
+Sets or displays the parameters used by the sparse solvers and factorization\n\
+functions. The first four calls above get information about the current\n\
+settings, while the others change the current settings. The parameters are\n\
+stored as pairs of keys and values, where the values are all floats and the\n\
+keys are one of the strings\n\
+\n\
+@itemize\n\
+@item spumoni\n\
+Printing level of debugging information of the solvers (default 0)\n\
+@item ths_rel\n\
+?? (default 1)\n\
+@item ths_abs\n\
+?? (default 1)\n\
+@item exact_d\n\
+?? (default 0)\n\
+@item supernd\n\
+?? (default 3)\n\
+@item rreduce\n\
+?? (default 3)\n\
+@item wh_frac\n\
+?? (default 0.5)\n\
+@item autommd\n\
+Flag whether the LU/QR and the '\\' and '/' operators will automatically\n\
+use the sparsity preserving mmd functions (default 1)\n\
+@item autoamd\n\
+Flag whether the LU and the '\\' and '/' operators will automatically\n\
+use the sparsity preserving amd functions (default 1)\n\
+@item piv_tol\n\
+The pivot tolerance of the UMFPACK solvers (default 0.1)\n\
+@item bandden\n\
+?? (default 0.5)\n\
+@item umfpack\n\
+Flag whether the UMFPACK or mmd solvers are used for the LU, '\\' and\n\
+'/' operations (default 1)\n\
+@end itemize\n\
+\n\
+The value of individual keys can be set with @code{spparms (@var{key},\n\
+@var{val})}. The default values can be restored with the special keyword\n\
+'defaults'. The special keyword 'tight' can be used to set the mmd solvers\n\
+to attempt for a sparser solution at the potetial cost of longer running\n\
+time.\n\
+@end deftypefn")
+{
+  octave_value_list retval;
+  int nargin = args.length ();
+
+  if (nargin == 0)
+    {
+      if (nargout == 0)
+	Voctave_sparse_controls.print_info (octave_stdout, "");
+      else if (nargout == 1)
+	retval(0) =  Voctave_sparse_controls.get_vals ();
+      else if (nargout == 2)
+	{
+	  retval (0) = Voctave_sparse_controls.get_keys ();
+	  retval (1) = Voctave_sparse_controls.get_vals ();
+	}
+      else
+	error ("spparms: too many outpu arguments"); 
+    }
+  else if (nargin == 1)
+    {
+      if (args(0).is_string ())
+	{
+	  std::string str = args(0).string_value ();
+	  int len = str.length ();
+	  for (int i = 0; i < len; i++)
+	    str [i] = tolower (str [i]);
+
+	  if (str == "defaults")
+	    Voctave_sparse_controls.defaults ();
+	  else if (str == "tight")
+	    Voctave_sparse_controls.tight ();
+	  else
+	    {
+	      double val = Voctave_sparse_controls.get_key (str);
+	      if (xisnan (val))
+		error ("spparams: unrecognized key");
+	      else
+		retval (0) = val;
+	    }
+	}
+      else
+	{
+	  NDArray vals = args(0).array_value ();
+
+	  if (error_state)
+	    error ("spparms: input must be a string or a vector");
+	  else if (vals.numel () > OCTAVE_SPARSE_CONTROLS_SIZE)
+	    error ("spparams: too many elements in values vector");
+	  else
+	    for (int i = 0; i < vals.length (); i++)
+	      Voctave_sparse_controls (i) = vals (i);
+	}
+    }
+  else if (nargin == 2)
+    {
+      if (args(0).is_string ())
+	{
+	  std::string str = args(0).string_value ();
+	  
+	  double val = args(1).double_value ();
+
+	  if (error_state)
+	    error ("spparms: second argument must be a real scalar");
+          else if (str == "umfpack")
+	    warning ("spparms: request to disable umfpack solvers ignored");
+	  else if (!Voctave_sparse_controls.set_key (str, val))
+	    error ("spparms: key not found");
+	}
+      else
+	error ("spparms: first argument must be a string");
+    }
+  else
+    error ("spparms: too many input arguments");
+
+  return retval;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/Makefile.in	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/Makefile.in	Fri Feb 25 19:55:28 2005 +0000
@@ -42,13 +42,14 @@
 OPT_HANDLERS := DASPK-opts.cc DASRT-opts.cc DASSL-opts.cc \
 	LSODE-opts.cc NLEqn-opts.cc ODESSA-opts.cc Quad-opts.cc
 
-DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colloc.cc \
-	daspk.cc dasrt.cc dassl.cc det.cc eig.cc expm.cc fft.cc fft2.cc \
-	fftn.cc fftw_wisdom.cc filter.cc find.cc fsolve.cc gammainc.cc \
-	gcd.cc getgrent.cc getpwent.cc getrusage.cc givens.cc hess.cc \
-	inv.cc kron.cc lpsolve.cc lsode.cc lu.cc minmax.cc \
-	odessa.cc pinv.cc qr.cc quad.cc qz.cc rand.cc schur.cc \
-	sort.cc sqrtm.cc svd.cc syl.cc time.cc gplot.l
+DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colamd.cc \
+	colloc.cc daspk.cc dasrt.cc dassl.cc det.cc dispatch.cc \
+	eig.cc expm.cc fft.cc fft2.cc fftn.cc fftw_wisdom.cc \
+	filter.cc find.cc fsolve.cc gammainc.cc gcd.cc getgrent.cc \
+	getpwent.cc getrusage.cc givens.cc hess.cc inv.cc kron.cc \
+	lpsolve.cc lsode.cc lu.cc minmax.cc odessa.cc pinv.cc qr.cc \
+	quad.cc qz.cc rand.cc schur.cc sort.cc sparse.cc spdet.cc \
+	splu.cc spparms.cc sqrtm.cc svd.cc syl.cc time.cc gplot.l
 
 DLD_SRC := $(addprefix DLD-FUNCTIONS/, $(DLD_XSRC))
 
@@ -79,6 +80,9 @@
 	ov-typeinfo.h ov-type-conv.h \
 	$(OV_INTTYPE_INC)
 
+OV_SPARSE_INCLUDES := \
+	ov-base-sparse.h ov-bool-sparse.h ov-cx-sparse.h ov-re-sparse.h
+
 PT_INCLUDES := pt.h pt-all.h pt-arg-list.h pt-assign.h pt-binop.h \
         pt-bp.h	pt-cell.h pt-check.h pt-cmd.h pt-colon.h pt-const.h \
 	pt-decl.h pt-except.h pt-exp.h pt-fcn-handle.h pt-id.h pt-idx.h \
@@ -94,8 +98,12 @@
 	oct-prcstrm.h oct-procbuf.h oct-stdstrm.h oct-stream.h \
 	oct-strstrm.h oct-lvalue.h oct.h octave.h ops.h pager.h \
 	parse.h pr-output.h procstream.h sighandlers.h siglist.h \
-	symtab.h sysdep.h token.h toplev.h unwind-prot.h utils.h \
-	variables.h version.h xdiv.h xpow.h $(OV_INCLUDES) $(PT_INCLUDES)
+	sparse-ops.h sparse-xdiv.h sparse-xpow.h symtab.h sysdep.h \
+	token.h toplev.h unwind-prot.h utils.h variables.h version.h \
+	xdiv.h xpow.h \
+	$(OV_INCLUDES) \
+	$(PT_INCLUDES) \
+	$(OV_SPARSE_INCLUDES)
 
 TI_XSRC := Array-os.cc Array-sym.cc Array-tc.cc
 
@@ -105,6 +113,14 @@
 	op-i8-i8.cc op-i16-i16.cc op-i32-i32.cc op-i64-i64.cc \
 	op-ui8-ui8.cc op-ui16-ui16.cc op-ui32-ui32.cc op-ui64-ui64.cc
 
+SPARSE_OP_XSRC := op-bm-sbm.cc op-b-sbm.cc op-cm-scm.cc op-cm-sm.cc \
+	op-cs-scm.cc op-cs-sm.cc op-fil-sbm.cc op-fil-scm.cc \
+	op-fil-sm.cc op-m-scm.cc op-m-sm.cc op-sbm-b.cc op-sbm-bm.cc \
+	op-sbm-sbm.cc op-scm-cm.cc op-scm-cs.cc op-scm-m.cc \
+	op-scm-s.cc op-scm-scm.cc op-scm-sm.cc op-sm-cm.cc \
+	op-sm-cs.cc op-sm-m.cc op-sm-s.cc op-sm-scm.cc op-sm-sm.cc \
+	op-s-scm.cc op-s-sm.cc
+
 OP_XSRC := op-b-b.cc op-b-bm.cc op-bm-b.cc op-bm-bm.cc \
 	op-cell.cc op-chm.cc op-cm-cm.cc op-cm-cs.cc op-cm-m.cc \
 	op-cm-s.cc op-cs-cm.cc op-cs-cs.cc op-cs-m.cc \
@@ -114,7 +130,8 @@
 	op-m-cs.cc op-m-m.cc op-m-s.cc op-range.cc op-s-cm.cc \
 	op-s-cs.cc op-s-m.cc op-s-s.cc op-str-m.cc \
 	op-str-s.cc op-str-str.cc op-streamoff.cc op-struct.cc \
-	$(INTTYPE_OP_XSRC)
+	$(INTTYPE_OP_XSRC) \
+	$(SPARSE_OP_XSRC)
 
 OP_SRC := $(addprefix OPERATORS/, $(OP_XSRC))
 
@@ -124,6 +141,9 @@
 	ov-int8.cc ov-int16.cc ov-int32.cc ov-int64.cc \
 	ov-uint8.cc ov-uint16.cc ov-uint32.cc ov-uint64.cc
 
+OV_SPARSE_SRC := \
+	ov-base-sparse.cc ov-bool-sparse.cc ov-cx-sparse.cc ov-re-sparse.cc
+
 OV_SRC := ov-base.cc ov-ch-mat.cc \
 	ov-cs-list.cc ov-list.cc ov-re-mat.cc ov-cx-mat.cc \
 	ov-range.cc ov-scalar.cc ov-complex.cc ov-str-mat.cc \
@@ -131,7 +151,8 @@
 	ov-colon.cc ov-bool-mat.cc ov-bool.cc ov-file.cc ov-cell.cc \
 	ov.cc ov-fcn.cc ov-builtin.cc ov-dld-fcn.cc ov-mapper.cc \
 	ov-usr-fcn.cc ov-fcn-handle.cc ov-fcn-inline.cc ov-typeinfo.cc \
-	$(OV_INTTYPE_SRC)
+	$(OV_INTTYPE_SRC) \
+	$(OV_SPARSE_SRC)
 
 PT_SRC := pt.cc pt-arg-list.cc pt-assign.cc pt-bp.cc pt-binop.cc \
 	pt-cell.cc pt-check.cc pt-cmd.cc pt-colon.cc pt-const.cc \
@@ -149,9 +170,10 @@
 	oct-obj.cc oct-prcstrm.cc oct-procbuf.cc oct-stdstrm.cc \
 	oct-stream.cc oct-strstrm.cc oct-lvalue.cc pager.cc \
 	parse.y pr-output.cc procstream.cc sighandlers.cc \
-	siglist.c strcasecmp.c strncase.c strfns.cc symtab.cc \
-	syscalls.cc sysdep.cc token.cc toplev.cc \
-	unwind-prot.cc utils.cc variables.cc xdiv.cc xpow.cc \
+	siglist.c sparse-xdiv.cc sparse-xpow.cc strcasecmp.c \
+	strncase.c strfns.cc symtab.cc syscalls.cc sysdep.cc \
+	token.cc toplev.cc unwind-prot.cc utils.cc variables.cc \
+	xdiv.cc xpow.cc \
 	$(OV_SRC) \
 	$(PT_SRC)
 
--- a/src/OPERATORS/op-b-b.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-b-b.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-b-bm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-b-bm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-b-sbm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,96 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-bool.h"
+#include "ov-scalar.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+
+// bool by sparse bool matrix ops.
+
+DEFBINOP_FN (ne, bool, sparse_bool_matrix, mx_el_ne)
+DEFBINOP_FN (eq, bool, sparse_bool_matrix, mx_el_eq)
+
+DEFBINOP_FN (el_and, bool, sparse_bool_matrix, mx_el_and)
+DEFBINOP_FN (el_or, bool, sparse_bool_matrix, mx_el_or)
+
+DEFCATOP (b_sbm, bool, sparse_bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_bool&, const octave_sparse_bool_matrix&);
+  SparseBoolMatrix tmp (1, 1, v1.bool_value ());
+  return octave_value (tmp. concat (v2.sparse_bool_matrix_value (), 
+				    ra_idx));
+}
+
+DEFCATOP (b_sm, bool, sparse_matrix)
+{
+  CAST_BINOP_ARGS (octave_bool&, const octave_sparse_matrix&);
+  SparseMatrix tmp (1, 1, v1.scalar_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCATOP (s_sbm, scalar, sparse_bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_bool_matrix&);
+  SparseMatrix tmp (1, 1, v1.scalar_value ());
+  return octave_value(tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_bool_matrix_conv, bool, sparse_bool_matrix)
+{
+  CAST_CONV_ARG (const octave_bool&);
+
+  return new octave_sparse_bool_matrix 
+    (SparseBoolMatrix (1, 1, v.bool_value ()));
+}
+
+void
+install_b_sbm_ops (void)
+{
+  INSTALL_BINOP (op_eq, octave_bool, octave_sparse_bool_matrix, eq);
+  INSTALL_BINOP (op_ne, octave_bool, octave_sparse_bool_matrix, ne);
+
+  INSTALL_BINOP (op_el_and, octave_bool, octave_sparse_bool_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_bool, octave_sparse_bool_matrix, el_or);
+
+  INSTALL_CATOP (octave_bool, octave_sparse_bool_matrix, b_sbm);
+  INSTALL_CATOP (octave_bool, octave_sparse_matrix, b_sm);
+  INSTALL_CATOP (octave_scalar, octave_sparse_bool_matrix, s_sbm);
+
+  INSTALL_ASSIGNCONV (octave_bool, octave_sparse_bool_matrix, octave_sparse_bool_matrix);
+
+  INSTALL_WIDENOP (octave_bool, octave_sparse_bool_matrix, sparse_bool_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-bm-b.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-bm-b.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-bm-bm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-bm-bm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-bm-sbm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,102 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-bool-mat.h"
+#include "boolMatrix.h"
+#include "ov-scalar.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+#include "smx-bm-sbm.h"
+#include "smx-sbm-bm.h"
+
+// bool matrix by sparse bool matrix ops.
+
+DEFBINOP_FN (eq, bool_matrix, sparse_bool_matrix, mx_el_eq)
+DEFBINOP_FN (ne, bool_matrix, sparse_bool_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_and, bool_matrix, sparse_bool_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  bool_matrix, sparse_bool_matrix, mx_el_or)
+
+DEFCATOP (bm_sbm, bool_matrix, sparse_bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_bool_matrix&, const octave_sparse_bool_matrix&);
+  SparseBoolMatrix tmp (v1.bool_matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_bool_matrix_value (), 
+				    ra_idx));
+}
+
+DEFCATOP (m_sbm, matrix, sparse_bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_bool_matrix&);
+  SparseMatrix tmp (v1.matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCATOP (bm_sm, bool_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (octave_bool_matrix&, const octave_sparse_matrix&); 
+  SparseMatrix tmp (v1.matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_bool_matrix_conv, bool_matrix, sparse_bool_matrix)
+{
+  CAST_CONV_ARG (const octave_bool_matrix&);
+  return new octave_sparse_bool_matrix 
+    (SparseBoolMatrix (v.bool_matrix_value ()));
+}
+
+void
+install_bm_sbm_ops (void)
+{
+  INSTALL_BINOP (op_eq, octave_bool_matrix, octave_sparse_bool_matrix, eq);
+  INSTALL_BINOP (op_ne, octave_bool_matrix, octave_sparse_bool_matrix, ne);
+
+  INSTALL_BINOP (op_el_and, octave_bool_matrix, octave_sparse_bool_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_bool_matrix, octave_sparse_bool_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_bool_matrix, octave_sparse_bool_matrix, bm_sbm);
+  INSTALL_CATOP (octave_bool_matrix, octave_sparse_matrix, bm_sm);
+  INSTALL_CATOP (octave_matrix, octave_sparse_bool_matrix, m_sbm);
+
+  INSTALL_ASSIGNCONV (octave_bool_matrix, octave_sparse_bool_matrix, 
+		      octave_sparse_bool_matrix);
+
+  INSTALL_WIDENOP (octave_bool_matrix, octave_sparse_bool_matrix, 
+		   sparse_bool_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-cell.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cell.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-chm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-chm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cm-cm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cm-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cm-cs.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cm-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cm-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cm-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cm-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cm-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-cm-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,182 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-scm-cm.h"
+#include "smx-cm-scm.h"
+#include "ov-cx-sparse.h"
+
+// complex matrix by sparse complex matrix ops.
+
+DEFBINOP_OP (add, complex_matrix, sparse_complex_matrix,+)
+DEFBINOP_OP (sub, complex_matrix, sparse_complex_matrix,-)
+
+DEFBINOP (mul, complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  ComplexMatrix tmp (v2.complex_matrix_value ());
+
+  return octave_value ( v1.complex_matrix_value() * tmp);
+}
+
+DEFBINOP (div, complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return xdiv (v1.complex_matrix_value (), 
+	       v2.sparse_complex_matrix_value ());
+}
+
+DEFBINOPX (pow, complex_matrix, sparse_complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return xleftdiv (v1.complex_matrix_value (), 
+		   v2.complex_matrix_value ());
+}
+
+DEFBINOP_FN (lt, complex_matrix, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, complex_matrix, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, complex_matrix, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, complex_matrix, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, complex_matrix, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, complex_matrix, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, complex_matrix, sparse_complex_matrix, product)
+DEFBINOP_FN (el_div, complex_matrix, sparse_complex_matrix, quotient)
+
+DEFBINOP (el_pow, complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return octave_value 
+    (elem_xpow (SparseComplexMatrix (v1.complex_matrix_value ()),
+		v2.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+
+  return octave_value (quotient (v2.sparse_complex_matrix_value (), 
+				 v1.complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, complex_matrix, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  complex_matrix, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP (cm_scm, complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  SparseComplexMatrix tmp (v1.complex_matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), 
+				    ra_idx));
+}
+
+DEFCONV (sparse_complex_matrix_conv, complex_matrix, 
+	 sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_complex_matrix&);
+  return new octave_sparse_complex_matrix 
+    (SparseComplexMatrix (v.complex_matrix_value ()));
+}
+
+void
+install_cm_scm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_complex_matrix, 
+		 octave_sparse_complex_matrix, el_or);
+
+  INSTALL_CATOP (octave_complex_matrix, 
+		 octave_sparse_complex_matrix, cm_scm);
+
+  INSTALL_ASSIGNCONV (octave_complex_matrix, octave_sparse_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_complex_matrix, octave_sparse_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-cm-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,151 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-sm-cm.h"
+#include "smx-cm-sm.h"
+#include "ov-re-sparse.h"
+
+// complex matrix by sparse matrix ops.
+
+DEFBINOP_OP (add, complex_matrix, sparse_matrix, +)
+DEFBINOP_OP (sub, complex_matrix, sparse_matrix, -)
+
+DEFBINOP (mul, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_matrix&);
+  
+  Matrix tmp (v2.matrix_value ());
+
+  return octave_value (v1.complex_matrix_value() * tmp);
+}
+
+DEFBINOP (div, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_matrix&);
+  
+  return xdiv (v1.complex_matrix_value (), v2.sparse_matrix_value ());
+}
+
+DEFBINOPX (pow, complex_matrix, sparse_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_matrix&);
+  
+  return xleftdiv (v1.complex_matrix_value (), v2.matrix_value ());
+}
+
+DEFBINOP_FN (lt, complex_matrix, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, complex_matrix, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, complex_matrix, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, complex_matrix, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, complex_matrix, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, complex_matrix, sparse_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, complex_matrix, sparse_matrix, product)
+DEFBINOP_FN (el_div, complex_matrix, sparse_matrix, quotient)
+
+DEFBINOP (el_pow, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_matrix&);
+  
+  return octave_value 
+    (elem_xpow ( SparseComplexMatrix (v1.complex_matrix_value ()),
+		 v2.sparse_matrix_value ()));
+}
+
+DEFBINOP (el_ldiv, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex_matrix&, 
+		   const octave_sparse_matrix&);
+  return octave_value
+    (quotient (v2.sparse_matrix_value (), v1.complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, complex_matrix, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  complex_matrix, sparse_matrix, mx_el_or)
+
+DEFCATOP (cm_sm, complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (octave_complex_matrix&, const octave_sparse_matrix&);
+  SparseComplexMatrix tmp (v1.complex_matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+void
+install_cm_sm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_complex_matrix, octave_sparse_matrix, add);
+  INSTALL_BINOP (op_sub, octave_complex_matrix, octave_sparse_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_complex_matrix, octave_sparse_matrix, mul);
+  INSTALL_BINOP (op_div, octave_complex_matrix, octave_sparse_matrix, div);
+  INSTALL_BINOP (op_pow, octave_complex_matrix, octave_sparse_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_complex_matrix, octave_sparse_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_complex_matrix, octave_sparse_matrix, lt);
+  INSTALL_BINOP (op_le, octave_complex_matrix, octave_sparse_matrix, le);
+  INSTALL_BINOP (op_eq, octave_complex_matrix, octave_sparse_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_complex_matrix, octave_sparse_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_complex_matrix, octave_sparse_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_complex_matrix, octave_sparse_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_complex_matrix, octave_sparse_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_complex_matrix, octave_sparse_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_complex_matrix, octave_sparse_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_complex_matrix, octave_sparse_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_complex_matrix, octave_sparse_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_complex_matrix, octave_sparse_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_complex_matrix, octave_sparse_matrix, cm_sm);
+
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-cs-cm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cs-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cs-cs.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cs-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cs-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cs-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-cs-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-cs-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-cs-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,167 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ov-complex.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-cx-sparse.h"
+
+// complex scalar by sparse complex matrix ops.
+
+DEFBINOP_OP (add, complex, sparse_complex_matrix, +)
+DEFBINOP_OP (sub, complex, sparse_complex_matrix, -)
+DEFBINOP_OP (mul, complex, sparse_complex_matrix, *)
+
+DEFBINOP (div, complex, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, 
+		   const octave_sparse_complex_matrix&);
+
+  ComplexMatrix m1 = ComplexMatrix (1, 1, v1.complex_value ());
+  SparseComplexMatrix m2 = v2.sparse_complex_matrix_value ();
+
+  return xdiv (m1, m2);
+}
+
+DEFBINOP (pow, complex, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, 
+		   const octave_sparse_complex_matrix&);
+  return xpow (v1.complex_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOP (ldiv, complex, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_complex_matrix&);
+
+  Complex d = v1.complex_value ();
+
+  if (d == 0.0)
+    gripe_divide_by_zero ();
+
+  return octave_value (v2.sparse_complex_matrix_value () / d);
+}
+
+DEFBINOP_FN (lt, complex, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, complex, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, complex, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, complex, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, complex, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, complex, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_OP (el_mul, complex, sparse_complex_matrix, *)
+DEFBINOP_FN (el_div, complex, sparse_complex_matrix, x_el_div)
+
+DEFBINOP_FN (el_pow, complex, sparse_complex_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, complex, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_complex_matrix&);
+
+  Complex d = v1.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.complex_matrix_value () / d);
+    }
+  else
+      retval = octave_value (v2.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_and, complex, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  complex, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP (cs_scm, complex, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_complex&, const octave_sparse_complex_matrix&);
+  SparseComplexMatrix tmp (1, 1, v1.complex_value ());
+  return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), 
+				    ra_idx));
+}
+
+DEFCONV (sparse_complex_matrix_conv, complex, sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_complex&);
+
+  return new octave_sparse_complex_matrix 
+    (SparseComplexMatrix (v.complex_matrix_value ()));
+}
+
+void
+install_cs_scm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_complex, octave_sparse_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_complex, octave_sparse_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_complex, octave_sparse_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_complex, octave_sparse_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_complex, octave_sparse_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_complex, octave_sparse_complex_matrix, 
+		 ldiv);
+  INSTALL_BINOP (op_lt, octave_complex, octave_sparse_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_complex, octave_sparse_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_complex, octave_sparse_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_complex, octave_sparse_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_complex, octave_sparse_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_complex, octave_sparse_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_complex, octave_sparse_complex_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_complex, octave_sparse_complex_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_complex, octave_sparse_complex_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_complex, octave_sparse_complex_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_complex, octave_sparse_complex_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_complex, octave_sparse_complex_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_complex, octave_sparse_complex_matrix, cs_scm);
+
+  INSTALL_ASSIGNCONV (octave_complex, octave_sparse_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_complex, octave_sparse_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-cs-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,163 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-complex.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+#include "smx-cs-sm.h"
+#include "smx-sm-cs.h"
+
+// complex by sparse matrix ops.
+
+DEFBINOP_OP (add, complex, sparse_matrix, +)
+DEFBINOP_OP (sub, complex, sparse_matrix, -)
+DEFBINOP_OP (mul, complex, sparse_matrix, *)
+
+DEFBINOP (div, complex, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&);
+
+  ComplexMatrix m1 = ComplexMatrix (1, 1, v1.complex_value ());
+  SparseMatrix m2 = v2.sparse_matrix_value ();
+
+  return xdiv (m1, m2);
+}
+
+DEFBINOP (pow, complex, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&);
+  return xpow (v1.complex_value (), v2.matrix_value ());
+}
+
+DEFBINOP (ldiv, complex, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&);
+
+  Complex d = v1.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (lt, complex, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, complex, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, complex, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, complex, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, complex, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, complex, sparse_matrix, mx_el_ne)
+
+DEFBINOP_OP (el_mul, complex, sparse_matrix, *)
+DEFBINOP_FN (el_div, complex, sparse_matrix, x_el_div)
+DEFBINOP_FN (el_pow, complex, sparse_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, complex, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_complex&, const octave_sparse_matrix&);
+
+  Complex d = v1.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_and, complex, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  complex, sparse_matrix, mx_el_or)
+
+DEFCATOP (cs_sm, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (octave_complex&, const octave_sparse_matrix&);
+  SparseComplexMatrix tmp (1, 1, v1.complex_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_matrix_conv, complex, sparse_matrix)
+{
+  CAST_CONV_ARG (const octave_complex&);
+
+  return new octave_sparse_matrix 
+    (SparseMatrix (v.matrix_value ()));
+}
+
+void
+install_cs_sm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_complex, octave_sparse_matrix, add);
+  INSTALL_BINOP (op_sub, octave_complex, octave_sparse_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_complex, octave_sparse_matrix, mul);
+  INSTALL_BINOP (op_div, octave_complex, octave_sparse_matrix, div);
+  INSTALL_BINOP (op_pow, octave_complex, octave_sparse_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_complex, octave_sparse_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_complex, octave_sparse_matrix, lt);
+  INSTALL_BINOP (op_le, octave_complex, octave_sparse_matrix, le);
+  INSTALL_BINOP (op_eq, octave_complex, octave_sparse_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_complex, octave_sparse_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_complex, octave_sparse_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_complex, octave_sparse_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_complex, octave_sparse_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_complex, octave_sparse_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_complex, octave_sparse_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_complex, octave_sparse_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_complex, octave_sparse_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_complex, octave_sparse_matrix, el_or);
+
+  INSTALL_CATOP (octave_complex, octave_sparse_matrix, cs_sm);
+
+  INSTALL_ASSIGNCONV (octave_complex, octave_sparse_matrix, octave_sparse_matrix);
+
+  INSTALL_WIDENOP (octave_complex, octave_sparse_matrix, sparse_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-double-conv.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-double-conv.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -41,6 +37,8 @@
 #include "ov-uint64.h"
 #include "ov-bool.h"
 #include "ov-bool-mat.h"
+#include "ov-re-sparse.h"
+#include "ov-bool-sparse.h"
 #include "ov-range.h"
 #include "ov-scalar.h"
 #include "ov-re-mat.h"
@@ -73,6 +71,9 @@
 DEFDBLCONVFN (bool_matrix_to_double_matrix, bool_matrix, bool_array)
 DEFDBLCONVFN (bool_scalar_to_double_matrix, bool, bool_array)
 
+DEFDBLCONVFN (sparse_matrix_to_double_matrix, sparse_matrix, array)
+DEFDBLCONVFN (sparse_bool_matrix_to_double_matrix, sparse_bool_matrix, array)
+
 DEFDBLCONVFN (range_to_double_matrix, range, array)
 
 DEFSTRDBLCONVFN(char_matrix_str_to_double_matrix)
@@ -105,6 +106,9 @@
   INSTALL_CONVOP (octave_bool_matrix, octave_matrix, bool_matrix_to_double_matrix);
   INSTALL_CONVOP (octave_bool, octave_matrix, bool_scalar_to_double_matrix);
 
+  INSTALL_CONVOP (octave_sparse_matrix, octave_matrix, sparse_matrix_to_double_matrix);
+  INSTALL_CONVOP (octave_sparse_bool_matrix, octave_matrix, sparse_bool_matrix_to_double_matrix);
+
   INSTALL_CONVOP (octave_range, octave_matrix, range_to_double_matrix);
 
   INSTALL_CONVOP (octave_char_matrix_str, octave_matrix, char_matrix_str_to_double_matrix);
--- a/src/OPERATORS/op-fil-b.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-b.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-bm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-bm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-cm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-cs.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-lis.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-lis.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-rec.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-rec.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-fil-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-fil-sbm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,74 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+
+#include "mach-info.h"
+#include "error.h"
+#include "oct-obj.h"
+#include "oct-stream.h"
+#include "ops.h"
+#include "ov.h"
+#include "ov-file.h"
+#include "ov-typeinfo.h"
+
+#include "ov-bool-sparse.h"
+
+// file by sparse bool matrix ops.
+
+DEFBINOP (lshift, file, sparse_bool_matrix)
+{
+  CAST_BINOP_ARGS (const octave_file&, const octave_sparse_bool_matrix&);
+
+  octave_stream oct_stream = v1.stream_value ();
+
+  if (oct_stream)
+    {
+      std::ostream *osp = oct_stream.output_stream ();
+
+      if (osp)
+	{
+	  std::ostream& os = *osp;
+
+	  v2.print_raw (os);
+	}
+      else
+	error ("invalid file specified for binary operator `<<'");
+    }
+
+  return octave_value (oct_stream, v1.stream_number ());
+}
+
+void
+install_fil_sbm_ops (void)
+{
+  INSTALL_BINOP (op_lshift, octave_file, octave_sparse_bool_matrix, lshift);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-fil-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,75 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+
+#include "mach-info.h"
+#include "error.h"
+#include "oct-obj.h"
+#include "oct-stream.h"
+#include "ops.h"
+#include "ov.h"
+#include "ov-file.h"
+#include "ov-typeinfo.h"
+
+#include "ov-cx-sparse.h"
+
+// file by sparse complex matrix ops.
+
+DEFBINOP (lshift, file, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_file&, const octave_sparse_complex_matrix&);
+
+  octave_stream oct_stream = v1.stream_value ();
+
+  if (oct_stream)
+    {
+      std::ostream *osp = oct_stream.output_stream ();
+
+      if (osp)
+	{
+	  std::ostream& os = *osp;
+
+	  v2.print_raw (os);
+	}
+      else
+	error ("invalid file specified for binary operator `<<'");
+    }
+
+  return octave_value (oct_stream, v1.stream_number ());
+}
+
+void
+install_fil_scm_ops (void)
+{
+  INSTALL_BINOP (op_lshift, octave_file, octave_sparse_complex_matrix, 
+		 lshift);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-fil-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,74 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+
+#include "mach-info.h"
+#include "error.h"
+#include "oct-obj.h"
+#include "oct-stream.h"
+#include "ops.h"
+#include "ov.h"
+#include "ov-file.h"
+#include "ov-typeinfo.h"
+
+#include "ov-re-sparse.h"
+
+// file by sparse matrix ops.
+
+DEFBINOP (lshift, file, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_file&, const octave_sparse_matrix&);
+
+  octave_stream oct_stream = v1.stream_value ();
+
+  if (oct_stream)
+    {
+      std::ostream *osp = oct_stream.output_stream ();
+
+      if (osp)
+	{
+	  std::ostream& os = *osp;
+
+	  v2.print_raw (os);
+	}
+      else
+	error ("invalid file specified for binary operator `<<'");
+    }
+
+  return octave_value (oct_stream, v1.stream_number ());
+}
+
+void
+install_fil_sm_ops (void)
+{
+  INSTALL_BINOP (op_lshift, octave_file, octave_sparse_matrix, lshift);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-fil-str.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-fil-str.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-i16-i16.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-i16-i16.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-i32-i32.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-i32-i32.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-i64-i64.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-i64-i64.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-i8-i8.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-i8-i8.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-int-conv.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-int-conv.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-list.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-list.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-m-cm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-m-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-m-cs.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-m-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-m-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-m-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-m-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-m-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-m-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,165 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-re-mat.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-scm-m.h"
+#include "smx-m-scm.h"
+#include "ov-cx-sparse.h"
+
+// matrix by sparse complex matrix ops.
+
+DEFBINOP_OP (add, matrix, sparse_complex_matrix, +)
+DEFBINOP_OP (sub, matrix, sparse_complex_matrix, -)
+
+DEFBINOP (mul, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  ComplexMatrix tmp (v2.complex_matrix_value ());
+
+  return octave_value ( v1.matrix_value() * tmp);
+}
+
+DEFBINOP (div, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return xdiv (v1.matrix_value (), v2.sparse_complex_matrix_value ());
+}
+
+DEFBINOPX (pow, matrix, sparse_complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return xleftdiv (v1.matrix_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOP_FN (lt, matrix, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, matrix, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, matrix, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, matrix, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, matrix, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, matrix, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, matrix, sparse_complex_matrix, product)
+DEFBINOP_FN (el_div, matrix, sparse_complex_matrix, quotient)
+
+DEFBINOP (el_pow, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  
+  return octave_value 
+    (elem_xpow (SparseMatrix (v1.matrix_value ()),
+		v2.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP (el_ldiv, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, 
+		   const octave_sparse_complex_matrix&);
+  return octave_value 
+    (quotient (v2.sparse_complex_matrix_value (), v1.matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, matrix, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  matrix, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP (m_scm, matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_complex_matrix&);
+  SparseMatrix tmp (v1.matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_complex_matrix_value (), 
+				    ra_idx));
+}
+
+DEFCONV (sparse_complex_matrix_conv, matrix, sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_matrix&);
+  return new octave_sparse_complex_matrix 
+    (SparseComplexMatrix (v.complex_matrix_value ()));
+}
+
+void
+install_m_scm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_matrix, octave_sparse_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_matrix, octave_sparse_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_matrix, octave_sparse_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_matrix, octave_sparse_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_matrix, octave_sparse_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_matrix, octave_sparse_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_matrix, octave_sparse_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_matrix, octave_sparse_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_matrix, octave_sparse_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_matrix, octave_sparse_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_matrix, octave_sparse_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_matrix, octave_sparse_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_matrix, octave_sparse_complex_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_matrix, octave_sparse_complex_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_matrix, octave_sparse_complex_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_matrix, octave_sparse_complex_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_matrix, octave_sparse_complex_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_matrix, octave_sparse_complex_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_matrix, octave_sparse_complex_matrix, m_scm);
+
+  INSTALL_ASSIGNCONV (octave_matrix, octave_sparse_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_matrix, octave_sparse_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-m-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,151 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-re-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-sm-m.h"
+#include "smx-m-sm.h"
+#include "ov-re-sparse.h"
+
+// matrix by sparse matrix ops.
+
+DEFBINOP_OP (add, matrix, sparse_matrix, +)
+DEFBINOP_OP (sub, matrix, sparse_matrix, -)
+
+DEFBINOP (mul, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&);
+  
+  Matrix tmp (v2.matrix_value ());
+
+  return octave_value ( v1.matrix_value() * tmp);
+}
+
+DEFBINOP (div, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&);
+  
+  return xdiv (v1.matrix_value (), v2.sparse_matrix_value ());
+}
+
+DEFBINOPX (pow, matrix, sparse_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&);
+  
+  return xleftdiv (v1.matrix_value (), v2.matrix_value ());
+}
+
+DEFBINOP_FN (lt, matrix, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, matrix, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, matrix, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, matrix, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, matrix, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, matrix, sparse_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, matrix, sparse_matrix, product)
+DEFBINOP_FN (el_div, matrix, sparse_matrix, quotient)
+
+DEFBINOP (el_pow, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&);
+  
+  return octave_value (elem_xpow (SparseMatrix (v1.matrix_value ()), 
+				  v2.sparse_matrix_value ()));
+}
+
+DEFBINOP (el_ldiv, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_matrix&, const octave_sparse_matrix&);
+  
+  return octave_value 
+    (quotient (v2.sparse_matrix_value (), v1.matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, matrix, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  matrix, sparse_matrix, mx_el_or)
+
+DEFCATOP (m_sm, matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (octave_matrix&, const octave_sparse_matrix&);
+  SparseMatrix tmp (v1.matrix_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_matrix_conv, matrix, sparse_matrix)
+{
+  CAST_CONV_ARG (const octave_matrix&);
+  return new octave_sparse_matrix (SparseMatrix (v.matrix_value ()));
+}
+
+void
+install_m_sm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_matrix, octave_sparse_matrix, add);
+  INSTALL_BINOP (op_sub, octave_matrix, octave_sparse_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_matrix, octave_sparse_matrix, mul);
+  INSTALL_BINOP (op_div, octave_matrix, octave_sparse_matrix, div);
+  INSTALL_BINOP (op_pow, octave_matrix, octave_sparse_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_matrix, octave_sparse_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_matrix, octave_sparse_matrix, lt);
+  INSTALL_BINOP (op_le, octave_matrix, octave_sparse_matrix, le);
+  INSTALL_BINOP (op_eq, octave_matrix, octave_sparse_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_matrix, octave_sparse_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_matrix, octave_sparse_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_matrix, octave_sparse_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_matrix, octave_sparse_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_matrix, octave_sparse_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_matrix, octave_sparse_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_matrix, octave_sparse_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_matrix, octave_sparse_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_matrix, octave_sparse_matrix,  el_or);
+
+  INSTALL_CATOP (octave_matrix, octave_sparse_matrix, m_sm);
+
+  INSTALL_ASSIGNCONV (octave_matrix, octave_sparse_matrix, 
+		      octave_sparse_matrix);
+
+  INSTALL_WIDENOP (octave_matrix, octave_sparse_matrix, 
+		   sparse_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-range.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-range.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-s-cm.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-s-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-s-cs.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-s-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-s-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-s-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-s-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-s-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-s-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,177 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ov-scalar.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-s-scm.h"
+#include "smx-scm-s.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// scalar by sparse complex matrix ops.
+
+DEFBINOP_OP (add, scalar, sparse_complex_matrix, +)
+DEFBINOP_OP (sub, scalar, sparse_complex_matrix, -)
+DEFBINOP_OP (mul, scalar, sparse_complex_matrix, *)
+
+DEFBINOP (div, scalar, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, 
+		   const octave_sparse_complex_matrix&);
+
+  Matrix m1 = Matrix (1, 1, v1.scalar_value ());
+  SparseComplexMatrix m2 = v2.sparse_complex_matrix_value ();
+
+  return xdiv (m1, m2);
+}
+
+DEFBINOP (pow, scalar, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, 
+		   const octave_sparse_complex_matrix&);
+  return xpow (v1.scalar_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOP (ldiv, scalar, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, 
+		   const octave_sparse_complex_matrix&);
+
+  double d = v1.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.complex_matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (lt, scalar, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, scalar, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, scalar, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, scalar, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, scalar, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, scalar, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_OP (el_mul, scalar, sparse_complex_matrix, *)
+DEFBINOP_FN (el_div, scalar, sparse_complex_matrix, x_el_div)
+DEFBINOP_FN (el_pow, scalar, sparse_complex_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, scalar, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, 
+		   const octave_sparse_complex_matrix&);
+
+  double d = v1.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval =  octave_value (v2.complex_matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_and, scalar, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or, scalar, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP (s_scm, scalar, sparse_compelx_matrix)
+{
+  CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_complex_matrix&);
+  SparseMatrix tmp (1, 1, v1.scalar_value ());
+  return octave_value
+    (tmp. concat (v2.sparse_complex_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_complex_matrix_conv, scalar, sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_scalar&);
+
+  return new octave_sparse_complex_matrix 
+    (SparseComplexMatrix (v.complex_matrix_value ()));
+}
+
+void
+install_s_scm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_scalar, octave_sparse_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_scalar, octave_sparse_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_scalar, octave_sparse_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_scalar, octave_sparse_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_scalar, octave_sparse_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_scalar, octave_sparse_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_scalar, octave_sparse_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_scalar, octave_sparse_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_scalar, octave_sparse_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_scalar, octave_sparse_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_scalar, octave_sparse_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_scalar, octave_sparse_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_scalar, octave_sparse_complex_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_scalar, octave_sparse_complex_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_scalar, octave_sparse_complex_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_scalar, octave_sparse_complex_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_scalar, octave_sparse_complex_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_scalar, octave_sparse_complex_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_scalar, octave_sparse_complex_matrix, s_scm);
+
+  INSTALL_ASSIGNCONV (octave_scalar, octave_sparse_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_scalar, octave_sparse_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-s-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,159 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-scalar.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-re-sparse.h"
+
+// scalar by sparse matrix ops.
+
+DEFBINOP_OP (add, scalar, sparse_matrix, +)
+DEFBINOP_OP (sub, scalar, sparse_matrix, -)
+DEFBINOP_OP (mul, scalar, sparse_matrix, *)
+
+DEFBINOP (div, scalar, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&);
+
+  Matrix m1 = Matrix (1, 1, v1.double_value ());
+  SparseMatrix m2 = v2.sparse_matrix_value ();
+
+  return xdiv (m1, m2);
+}
+
+DEFBINOP (pow, scalar, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&);
+  return xpow (v1.scalar_value (), v2.matrix_value ());
+}
+
+DEFBINOP (ldiv, scalar, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&);
+
+  double d = v1.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (lt, scalar, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, scalar, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, scalar, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, scalar, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, scalar, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, scalar, sparse_matrix, mx_el_ne)
+
+DEFBINOP_OP (el_mul, scalar, sparse_matrix, *)
+DEFBINOP_FN (el_div, scalar, sparse_matrix, x_el_div)
+DEFBINOP_FN (el_pow, scalar, sparse_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, scalar, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_scalar&, const octave_sparse_matrix&);
+
+  double d = v1.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v2.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v2.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_and, scalar, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  scalar, sparse_matrix, mx_el_or)
+
+DEFCATOP (s_sm, scalar, sparse_matrix)
+{
+  CAST_BINOP_ARGS (octave_scalar&, const octave_sparse_matrix&);
+  SparseMatrix tmp (1, 1, v1.scalar_value ());
+  return octave_value (tmp. concat (v2.sparse_matrix_value (), ra_idx));
+}
+
+DEFCONV (sparse_matrix_conv, scalar, sparse_matrix)
+{
+  CAST_CONV_ARG (const octave_scalar&);
+
+  return new octave_sparse_matrix (SparseMatrix (v.matrix_value ()));
+}
+
+void
+install_s_sm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_scalar, octave_sparse_matrix, add);
+  INSTALL_BINOP (op_sub, octave_scalar, octave_sparse_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_scalar, octave_sparse_matrix, mul);
+  INSTALL_BINOP (op_div, octave_scalar, octave_sparse_matrix, div);
+  INSTALL_BINOP (op_pow, octave_scalar, octave_sparse_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_scalar, octave_sparse_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_scalar, octave_sparse_matrix, lt);
+  INSTALL_BINOP (op_le, octave_scalar, octave_sparse_matrix, le);
+  INSTALL_BINOP (op_eq, octave_scalar, octave_sparse_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_scalar, octave_sparse_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_scalar, octave_sparse_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_scalar, octave_sparse_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_scalar, octave_sparse_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_scalar, octave_sparse_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_scalar, octave_sparse_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_scalar, octave_sparse_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_scalar, octave_sparse_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_scalar, octave_sparse_matrix, el_or);
+
+  INSTALL_CATOP (octave_scalar, octave_sparse_matrix, s_sm);
+
+  INSTALL_ASSIGNCONV (octave_scalar, octave_sparse_matrix, octave_matrix);
+
+  INSTALL_WIDENOP (octave_scalar, octave_sparse_matrix, sparse_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sbm-b.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,97 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-bool.h"
+#include "ov-scalar.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+
+// sparse bool matrix by bool ops.
+
+DEFBINOP_FN (ne, sparse_bool_matrix, bool, mx_el_ne)
+DEFBINOP_FN (eq, sparse_bool_matrix, bool, mx_el_eq)
+
+DEFBINOP_FN (el_and, sparse_bool_matrix, bool, mx_el_and)
+DEFBINOP_FN (el_or, sparse_bool_matrix, bool, mx_el_or)
+
+DEFCATOP (sbm_b, sparse_bool_matrix, bool)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool&); 
+		   
+  SparseBoolMatrix tmp (1, 1, v2.bool_value ());
+  return octave_value (v1.sparse_bool_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFCATOP (sm_b, sparse_matrix, bool)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_bool&);
+		   
+  SparseMatrix tmp (1, 1, v2.scalar_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFCATOP (sbm_s, sparse_bool_matrix, scalar)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_scalar&); 
+		   
+  SparseMatrix tmp (1, 1, v2.scalar_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_bool_matrix, bool)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool&);
+
+  SparseBoolMatrix tmp (1, 1, v2.bool_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_sbm_b_ops (void)
+{
+  INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, octave_bool, eq);
+  INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, octave_bool, ne);
+
+  INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, octave_bool, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, octave_bool, el_or);
+
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_bool, sbm_b);
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_scalar, sbm_s);
+  INSTALL_CATOP (octave_sparse_matrix, octave_bool, sm_b);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, octave_bool, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sbm-bm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,102 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-bool-mat.h"
+#include "boolMatrix.h"
+#include "ov-scalar.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+#include "smx-bm-sbm.h"
+#include "smx-sbm-bm.h"
+
+// sparse bool matrix by bool matrix ops.
+
+DEFBINOP_FN (eq, sparse_bool_matrix, bool_matrix, mx_el_eq)
+DEFBINOP_FN (ne, sparse_bool_matrix, bool_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_and, sparse_bool_matrix, bool_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_bool_matrix, bool_matrix, mx_el_or)
+
+DEFCATOP (sbm_bm, sparse_bool_matrix, bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool_matrix&); 
+		   
+  SparseBoolMatrix tmp (v2.bool_matrix_value ());
+  return octave_value (v1.sparse_bool_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFCATOP (sbm_m, sparse_bool_matrix, matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_matrix&);
+		   
+  SparseMatrix tmp (v2.matrix_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFCATOP (sm_bm, sparse_matrix, bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_bool_matrix&); 
+		   
+  SparseMatrix tmp (v2.matrix_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_bool_matrix, bool_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_bool_matrix&, const octave_bool_matrix&);
+
+  v1.assign (idx, SparseBoolMatrix (v2.bool_matrix_value ()));
+  return octave_value ();
+}
+
+void
+install_sbm_bm_ops (void)
+{
+  INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, octave_bool_matrix, eq);
+  INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, octave_bool_matrix, ne);
+
+  INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, octave_bool_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, octave_bool_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_bool_matrix, sbm_bm);
+  INSTALL_CATOP (octave_sparse_matrix, octave_bool_matrix, sm_bm);
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_matrix, sbm_m);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, 
+		    octave_bool_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sbm-sbm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,108 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-bool-mat.h"
+#include "ov-scalar.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+#include "ov-bool-sparse.h"
+
+// unary sparse bool matrix ops.
+
+DEFUNOP_OP (not, sparse_bool_matrix, !)
+
+DEFUNOP (uplus, sparse_bool_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_bool_matrix&);
+  return octave_value (v.sparse_matrix_value ());
+}
+
+DEFUNOP (uminus, sparse_bool_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_bool_matrix&);
+  return octave_value ( - v.sparse_matrix_value ());
+}
+
+DEFUNOP (transpose, sparse_bool_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_bool_matrix&);
+  return octave_value (v.sparse_bool_matrix_value().transpose ());
+}
+
+// sparse bool matrix by sparse bool matrix ops.
+
+DEFBINOP_FN (eq, sparse_bool_matrix, sparse_bool_matrix, mx_el_eq)
+DEFBINOP_FN (ne, sparse_bool_matrix, sparse_bool_matrix, mx_el_ne)
+DEFBINOP_FN (el_and, sparse_bool_matrix, sparse_bool_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_bool_matrix, sparse_bool_matrix, mx_el_or)
+
+DEFNDCATOP_FN (sbm_sbm, sparse_bool_matrix, sparse_bool_matrix, 
+	       sparse_bool_matrix, sparse_bool_matrix, concat)
+DEFNDCATOP_FN (sbm_sm, sparse_bool_matrix, sparse_matrix, sparse_matrix, 
+	       sparse_matrix, concat)
+DEFNDCATOP_FN (sm_sbm, sparse_matrix, sparse_bool_matrix, sparse_matrix, 
+	       sparse_matrix, concat)
+
+DEFASSIGNOP_FN (assign, sparse_bool_matrix, sparse_bool_matrix, 
+		assign)
+
+void
+install_sbm_sbm_ops (void)
+{
+  INSTALL_UNOP (op_not, octave_sparse_bool_matrix, not);
+  INSTALL_UNOP (op_uplus, octave_sparse_bool_matrix, uplus);
+  INSTALL_UNOP (op_uminus, octave_sparse_bool_matrix, uminus);
+  INSTALL_UNOP (op_transpose, octave_sparse_bool_matrix, transpose);
+  INSTALL_UNOP (op_hermitian, octave_sparse_bool_matrix, transpose);
+
+  INSTALL_BINOP (op_eq, octave_sparse_bool_matrix, 
+		 octave_sparse_bool_matrix, eq);
+  INSTALL_BINOP (op_ne, octave_sparse_bool_matrix, 
+		 octave_sparse_bool_matrix, ne);
+
+  INSTALL_BINOP (op_el_and, octave_sparse_bool_matrix, 
+		 octave_sparse_bool_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_bool_matrix, 
+		 octave_sparse_bool_matrix, el_or);
+
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_sparse_bool_matrix, 
+		 sbm_sbm);
+  INSTALL_CATOP (octave_sparse_bool_matrix, octave_sparse_matrix, sbm_sm);
+  INSTALL_CATOP (octave_sparse_matrix, octave_sparse_bool_matrix, sm_sbm);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_bool_matrix, 
+		    octave_sparse_bool_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,180 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-scm-cm.h"
+#include "smx-cm-scm.h"
+#include "ov-cx-sparse.h"
+
+// sparse complex matrix by complex matrix ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, complex_matrix, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, complex_matrix, -)
+
+DEFBINOP (mul, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+  
+  ComplexMatrix tmp (v1.complex_matrix_value ());
+
+  return octave_value ( tmp * v2.complex_matrix_value());
+}
+
+DEFBINOP (div, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return xdiv (v1.complex_matrix_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOPX (pow, sparse_complex_matrix, complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return xleftdiv (v1.sparse_complex_matrix_value (), 
+		   v2.complex_matrix_value ());
+}
+
+DEFBINOP_FN (lt, sparse_complex_matrix, complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_complex_matrix, complex_matrix, product)
+DEFBINOP_FN (el_div, sparse_complex_matrix, complex_matrix, quotient)
+
+DEFBINOP (el_pow, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return octave_value 
+    (elem_xpow (v1.sparse_complex_matrix_value (), SparseComplexMatrix 
+		(v2.complex_matrix_value ())));
+}
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+
+  return octave_value (quotient (v2.complex_matrix_value (), 
+				 v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, complex_matrix, mx_el_or)
+
+DEFCATOP (scm_cm, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, 
+		   const octave_complex_matrix&);
+  SparseComplexMatrix tmp (v2.complex_matrix_value ());
+  return octave_value
+    (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_complex_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&,
+		   const octave_complex_matrix&);
+
+  SparseComplexMatrix tmp (v2.complex_matrix_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_scm_cm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, 
+		 octave_complex_matrix, el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, 
+		 octave_complex_matrix, scm_cm);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix,
+		    octave_complex_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,183 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ov-complex.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-cx-sparse.h"
+
+// sparse complex matrix by complex scalar ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, complex, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, complex, -)
+DEFBINOP_OP (mul, sparse_complex_matrix, complex, *)
+
+DEFBINOP (div, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex&);
+
+  Complex d = v2.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = (v1.complex_matrix_value ()  / d);
+    }
+  else
+    retval = octave_value (v1.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP (pow, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex&);
+  return xpow (v1.complex_matrix_value (), v2.scalar_value ());
+}
+
+DEFBINOP (ldiv, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex&);
+
+  SparseComplexMatrix m1 = v1.sparse_complex_matrix_value ();
+  ComplexMatrix m2 = ComplexMatrix (1, 1, v2.complex_value ());
+
+  return xleftdiv (m1, m2);
+}
+
+DEFBINOP_FN (lt, sparse_complex_matrix, complex, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, complex, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, complex, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, complex, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, complex, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, complex, mx_el_ne)
+
+DEFBINOP_OP (el_mul, sparse_complex_matrix, complex, *)
+
+DEFBINOP (el_div, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex&);
+
+  octave_value retval;
+
+  Complex d = v2.complex_value ();
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.complex_matrix_value () / d);
+    }
+  else
+    retval =  octave_value (v1.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_pow, sparse_complex_matrix, complex, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_complex&);
+
+  return octave_value
+    (x_el_div (v2.complex_value (), v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, complex, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, complex, mx_el_or)
+
+DEFCATOP (scm_cs, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_complex&);
+  SparseComplexMatrix tmp (1, 1, v2.complex_value ());
+  return octave_value
+    (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_complex_matrix, complex)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_complex&);
+
+  SparseComplexMatrix tmp (1, 1, v2.complex_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_scm_cs_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_complex, add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_complex, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_complex, mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_complex, div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_complex, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_complex, 
+		 ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_complex, lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_complex, le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_complex, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_complex, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_complex, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_complex, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_complex, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_complex, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_complex, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_complex, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_complex, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_complex, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, octave_complex, scm_cs);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_complex,
+		    assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,165 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-re-mat.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-scm-m.h"
+#include "smx-m-scm.h"
+#include "ov-cx-sparse.h"
+
+// sparse complex matrix by matrix ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, matrix, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, matrix, -)
+
+DEFBINOP (mul, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_matrix&);
+  
+  ComplexMatrix tmp (v1.complex_matrix_value ());
+
+  return octave_value ( tmp * v2.matrix_value());
+}
+
+DEFBINOP (div, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_matrix&);
+  
+  return xdiv (v1.complex_matrix_value (), v2.matrix_value ());
+}
+
+DEFBINOPX (pow, sparse_complex_matrix, matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_matrix&);
+  
+  return xleftdiv (v1.sparse_complex_matrix_value (), v2.matrix_value ());
+}
+
+DEFBINOP_FN (lt, sparse_complex_matrix, matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_complex_matrix, matrix, product)
+DEFBINOP_FN (el_div, sparse_complex_matrix, matrix, quotient)
+
+DEFBINOP (el_pow, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_matrix&);
+  
+  return octave_value 
+    (elem_xpow (v1.sparse_complex_matrix_value (), SparseMatrix 
+		(v2.matrix_value ())));
+}
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_matrix&);
+
+  return octave_value
+    (quotient (v2.matrix_value (), v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, matrix, mx_el_or)
+
+DEFCATOP (scm_m, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_matrix&);
+  SparseMatrix tmp (v2.matrix_value ());
+  return octave_value
+    (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_complex_matrix, matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_matrix&);
+
+  SparseComplexMatrix tmp (v2.complex_matrix_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_scm_m_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, octave_matrix, scm_m);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_matrix, 
+		    assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,188 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ov-scalar.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-scm-s.h"
+#include "smx-s-scm.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// sparse complex matrix by scalar ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, scalar, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, scalar, -)
+DEFBINOP_OP (mul, sparse_complex_matrix, scalar, *)
+
+DEFBINOP (div, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_scalar&);
+
+  double d = v2.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.complex_matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP (pow, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_scalar&);
+
+  double tmp = v2.scalar_value ();
+  if (static_cast<int> (tmp) == tmp)
+    return xpow (v1.sparse_complex_matrix_value (), tmp);
+  else
+    return xpow (v1.complex_matrix_value (), tmp);
+}
+
+DEFBINOP (ldiv, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_scalar&);
+
+  SparseComplexMatrix m1 = v1.sparse_complex_matrix_value ();
+  Matrix m2 = Matrix (1, 1, v2.scalar_value ());
+
+  return xleftdiv (m1, m2);
+}
+
+DEFBINOP_FN (lt, sparse_complex_matrix, scalar, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, scalar, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, scalar, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, scalar, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, scalar, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, scalar, mx_el_ne)
+
+DEFBINOP_OP (el_mul, sparse_complex_matrix, scalar, *)
+
+DEFBINOP (el_div, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_scalar&);
+
+  double d = v2.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.complex_matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_complex_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_pow, sparse_complex_matrix, scalar, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, const octave_scalar&);
+
+  return octave_value
+    (x_el_div (v2.double_value (), v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, scalar, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, scalar, mx_el_or)
+
+DEFCATOP (scm_s, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_scalar&);
+  SparseComplexMatrix tmp (1, 1, v2.complex_value ());
+  return octave_value
+    (v1.sparse_complex_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_complex_matrix, scalar)
+{
+  CAST_BINOP_ARGS (octave_sparse_complex_matrix&, const octave_scalar&);
+
+  SparseComplexMatrix tmp (1, 1, v2.complex_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_scm_s_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_scalar, add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_scalar, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_scalar, mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_scalar, div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_scalar, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_scalar, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_scalar, lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_scalar, le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_scalar, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_scalar, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_scalar, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_scalar, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, octave_scalar, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, octave_scalar, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, octave_scalar, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, octave_scalar, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, octave_scalar, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, octave_scalar, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, octave_scalar, scm_s);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, octave_scalar, 
+		    assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,196 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ops.h"
+
+#include "sparse-xdiv.h"
+#include "sparse-xpow.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
+#pragma implementation
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-cx-mat.h"
+#include "ov-typeinfo.h"
+#include "ops.h"
+#include "xdiv.h"
+#include "xpow.h"
+
+// unary sparse complex matrix ops.
+
+DEFUNOP_OP (not, sparse_complex_matrix, !)
+DEFUNOP_OP (uplus, sparse_complex_matrix, /* no-op */)
+DEFUNOP_OP (uminus, sparse_complex_matrix, -)
+
+DEFUNOP (transpose, sparse_complex_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_complex_matrix&);
+
+  return octave_value (v.sparse_complex_matrix_value().transpose ());
+}
+
+DEFUNOP (hermitian, sparse_complex_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_complex_matrix&);
+
+  return octave_value (v.sparse_complex_matrix_value().hermitian ());
+}
+
+#if 0
+DEFUNOP (incr, sparse_complex_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_complex_matrix&);
+
+  return octave_value (v.complex_matrix_value () .increment ());
+}
+
+DEFUNOP (decr, sparse_complex_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_complex_matrix&);
+
+  return octave_value (v.complex_matrix_value () .decrement ());
+}
+#endif
+
+// complex matrix by complex matrix ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, sparse_complex_matrix, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, sparse_complex_matrix, -)
+
+DEFBINOP_OP (mul, sparse_complex_matrix, sparse_complex_matrix, *)
+
+DEFBINOP_FN (div, sparse_complex_matrix, sparse_complex_matrix, xdiv)
+
+DEFBINOPX (pow, sparse_complex_matrix, sparse_complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP_FN (ldiv, sparse_complex_matrix, sparse_complex_matrix, xleftdiv)
+
+DEFBINOP_FN (lt, sparse_complex_matrix, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_complex_matrix, sparse_complex_matrix, product)
+DEFBINOP_FN (el_div, sparse_complex_matrix, sparse_complex_matrix, quotient)
+DEFBINOP_FN (el_pow, sparse_complex_matrix, sparse_complex_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_sparse_complex_matrix&);
+
+  return octave_value (quotient (v2.sparse_complex_matrix_value (), 
+				 v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP_FN (scm_scm, sparse_complex_matrix, sparse_complex_matrix, concat)
+
+DEFASSIGNOP_FN (assign, sparse_complex_matrix, sparse_complex_matrix, assign)
+
+void
+install_scm_scm_ops (void)
+{
+  INSTALL_UNOP (op_not, octave_sparse_complex_matrix, not);
+  INSTALL_UNOP (op_uplus, octave_sparse_complex_matrix, uplus);
+  INSTALL_UNOP (op_uminus, octave_sparse_complex_matrix, uminus);
+  INSTALL_UNOP (op_transpose, octave_sparse_complex_matrix, transpose);
+  INSTALL_UNOP (op_hermitian, octave_sparse_complex_matrix, hermitian);
+
+#if 0
+  INSTALL_NCUNOP (op_incr, octave_sparse_complex_matrix, incr);
+  INSTALL_NCUNOP (op_decr, octave_sparse_complex_matrix, decr);
+#endif
+
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, 
+		 octave_sparse_complex_matrix, scm_scm);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, 
+		    octave_sparse_complex_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-scm-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,133 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ops.h"
+
+#include "sparse-xdiv.h"
+#include "sparse-xpow.h"
+#include "smx-sm-scm.h"
+#include "smx-scm-sm.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// sparse complex matrix by sparse matrix ops.
+
+DEFBINOP_OP (add, sparse_complex_matrix, sparse_matrix, +)
+DEFBINOP_OP (sub, sparse_complex_matrix, sparse_matrix, -)
+
+DEFBINOP_OP (mul, sparse_complex_matrix, sparse_matrix, *)
+
+DEFBINOP_FN (div, sparse_complex_matrix, sparse_matrix, xdiv)
+
+DEFBINOPX (pow, sparse_complex_matrix, sparse_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP_FN (ldiv, sparse_complex_matrix, sparse_matrix, xleftdiv)
+
+DEFBINOP_FN (lt, sparse_complex_matrix, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_complex_matrix, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_complex_matrix, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_complex_matrix, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_complex_matrix, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_complex_matrix, sparse_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_complex_matrix, sparse_matrix, product)
+DEFBINOP_FN (el_div, sparse_complex_matrix, sparse_matrix, quotient)
+DEFBINOP_FN (el_pow, sparse_complex_matrix, sparse_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_complex_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_complex_matrix&, 
+		   const octave_sparse_matrix&);
+
+  return octave_value
+    (quotient (v2.sparse_matrix_value (), v1.sparse_complex_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_complex_matrix, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_complex_matrix, sparse_matrix, mx_el_or)
+
+DEFCATOP_FN (scm_sm, sparse_complex_matrix, sparse_matrix, concat)
+
+DEFASSIGNOP_FN (assign, sparse_complex_matrix, sparse_matrix, assign)
+
+void
+install_scm_sm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 add);
+  INSTALL_BINOP (op_sub, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 sub);
+  INSTALL_BINOP (op_mul, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 mul);
+  INSTALL_BINOP (op_div, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 div);
+  INSTALL_BINOP (op_pow, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_complex_matrix, octave_sparse_matrix,
+		 ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 lt);
+  INSTALL_BINOP (op_le, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 le);
+  INSTALL_BINOP (op_eq, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 eq);
+  INSTALL_BINOP (op_ge, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 ge);
+  INSTALL_BINOP (op_gt, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 gt);
+  INSTALL_BINOP (op_ne, octave_sparse_complex_matrix, octave_sparse_matrix, 
+		 ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_complex_matrix, 
+		 octave_sparse_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_complex_matrix, 
+		 octave_sparse_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_complex_matrix,
+		 octave_sparse_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_complex_matrix, 
+		 octave_sparse_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_complex_matrix, 
+		 octave_sparse_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_complex_matrix, 
+		 octave_sparse_matrix, el_or);
+
+  INSTALL_CATOP (octave_sparse_complex_matrix, octave_sparse_matrix, scm_sm);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_complex_matrix, 
+		    octave_sparse_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-cm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,163 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-cx-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-sm-cm.h"
+#include "smx-cm-sm.h"
+#include "ov-re-sparse.h"
+
+// sparse matrix by complex matrix ops.
+
+DEFBINOP_OP (add, sparse_matrix, complex_matrix, +)
+DEFBINOP_OP (sub, sparse_matrix, complex_matrix, -)
+
+DEFBINOP (mul, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_complex_matrix&);
+  
+  Matrix tmp (v1.matrix_value ());
+
+  return octave_value ( tmp * v2.complex_matrix_value());
+}
+
+DEFBINOP (div, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return xdiv (v1.matrix_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOPX (pow, sparse_matrix, complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return xleftdiv (v1.sparse_matrix_value (), v2.complex_matrix_value ());
+}
+
+DEFBINOP_FN (lt, sparse_matrix, complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_matrix, complex_matrix, product)
+DEFBINOP_FN (el_div, sparse_matrix, complex_matrix, quotient)
+
+DEFBINOP (el_pow, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_complex_matrix&);
+  
+  return octave_value 
+    (elem_xpow (v1.sparse_matrix_value (), SparseComplexMatrix 
+		(v2.complex_matrix_value ())));
+}
+
+DEFBINOP (el_ldiv, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_complex_matrix&);
+
+  return octave_value 
+    (quotient (v2.complex_matrix_value (), v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_matrix, complex_matrix, mx_el_or)
+
+DEFCATOP (sm_cm, sparse_matrix, complex_matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_complex_matrix&);
+  SparseComplexMatrix tmp (v2.complex_matrix_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFCONV (sparse_complex_matrix_conv, sparse_matrix, sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_sparse_matrix&);
+  return new octave_complex_matrix (v.complex_matrix_value ());
+}
+
+void
+install_sm_cm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_complex_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_complex_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_complex_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_complex_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_complex_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_complex_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_complex_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_complex_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_complex_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_complex_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_complex_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_complex_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_complex_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_complex_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_complex_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_complex_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_complex_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_complex_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_complex_matrix, sm_cm);
+
+  INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_sparse_matrix, octave_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-cs.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,163 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-complex.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+#include "smx-sm-cs.h"
+#include "smx-cs-sm.h"
+
+// sparse matrix by scalar ops.
+
+DEFBINOP_OP (add, sparse_matrix, complex, +)
+DEFBINOP_OP (sub, sparse_matrix, complex, -)
+DEFBINOP_OP (mul, sparse_matrix, complex, *)
+
+DEFBINOP (div, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&);
+
+  Complex d = v2.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP (pow, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&);
+  return xpow (v1.matrix_value (), v2.complex_value ());
+}
+
+DEFBINOP (ldiv, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&);
+
+  SparseMatrix m1 = v1.sparse_matrix_value ();
+  ComplexMatrix m2 = ComplexMatrix (1, 1, v2.complex_value ());
+
+  return xleftdiv (m1, m2);
+}
+
+DEFBINOP_FN (lt, sparse_matrix, complex, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, complex, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, complex, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, complex, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, complex, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, complex, mx_el_ne)
+
+DEFBINOP_OP (el_mul, sparse_matrix, complex, *)
+
+DEFBINOP (el_div, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&);
+
+  Complex d = v2.complex_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval =  octave_value (v1.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_pow, sparse_matrix, complex, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_complex&);
+
+  return octave_value (x_el_div (v2.complex_value (), 
+				 v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, complex, mx_el_and)
+DEFBINOP_FN (el_or, sparse_matrix, complex, mx_el_or)
+
+DEFCATOP (sm_cs, sparse_matrix, complex)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_complex&);
+  SparseComplexMatrix tmp (1, 1, v2.complex_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+void
+install_sm_cs_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_complex, add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_complex, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_complex, mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_complex, div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_complex, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_complex, ldiv);
+
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_complex, lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_complex, le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_complex, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_complex, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_complex, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_complex, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_complex, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_complex, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_complex, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_complex, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_complex, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_complex, el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_complex, sm_cs);
+
+  INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_complex,
+		      octave_sparse_complex_matrix);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,151 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-re-mat.h"
+#include "ops.h"
+#include "xdiv.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "smx-sm-m.h"
+#include "smx-m-sm.h"
+#include "ov-re-sparse.h"
+
+// sparse matrix by matrix ops.
+
+DEFBINOP_OP (add, sparse_matrix, matrix, +)
+DEFBINOP_OP (sub, sparse_matrix, matrix, -)
+
+DEFBINOP (mul, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&);
+  
+  Matrix tmp (v1.matrix_value ());
+
+  return octave_value ( tmp * v2.matrix_value());
+}
+
+DEFBINOP (div, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&);
+  
+  return xdiv (v1.matrix_value (), v2.matrix_value ());
+}
+
+DEFBINOPX (pow, sparse_matrix, matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP (ldiv, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&);
+  
+  return xleftdiv (v1.sparse_matrix_value (), v2.matrix_value ());
+}
+
+
+DEFBINOP_FN (lt, sparse_matrix, matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_matrix, matrix, product)
+DEFBINOP_FN (el_div, sparse_matrix, matrix, quotient)
+
+DEFBINOP (el_pow, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&);
+  
+  return octave_value (elem_xpow (v1.sparse_matrix_value (), 
+				  SparseMatrix (v2.matrix_value ())));
+}
+
+DEFBINOP (el_ldiv, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_matrix&);
+  
+  return octave_value
+    (quotient (v2.matrix_value (), v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_matrix, matrix, mx_el_or)
+
+DEFCATOP (sm_m, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_matrix&);
+  SparseMatrix tmp (v2.matrix_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_matrix, matrix)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_matrix&);
+
+  SparseMatrix tmp (v2.matrix_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_sm_m_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_matrix,  el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_matrix, sm_m);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_matrix, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,173 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-scalar.h"
+#include "ops.h"
+#include "xpow.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-re-sparse.h"
+
+// sparse matrix by scalar ops.
+
+DEFBINOP_OP (add, sparse_matrix, scalar, +)
+DEFBINOP_OP (sub, sparse_matrix, scalar, -)
+DEFBINOP_OP (mul, sparse_matrix, scalar, *)
+
+DEFBINOP (div, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&);
+
+  double d = v2.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP (pow, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&);
+
+  double tmp = v2.scalar_value ();
+  if (static_cast<int> (tmp) == tmp)
+    return xpow (v1.sparse_matrix_value (), tmp);
+  else
+    return xpow (v1.matrix_value (), tmp);
+}
+
+DEFBINOP (ldiv, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&);
+
+  SparseMatrix m1 = v1.sparse_matrix_value ();
+  Matrix m2 = Matrix (1, 1, v2.scalar_value ());
+
+  return xleftdiv (m1, m2);
+}
+
+DEFBINOP_FN (lt, sparse_matrix, scalar, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, scalar, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, scalar, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, scalar, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, scalar, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, scalar, mx_el_ne)
+
+DEFBINOP_OP (el_mul, sparse_matrix, scalar, *)
+
+DEFBINOP (el_div, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&);
+
+  double d = v2.double_value ();
+  octave_value retval;
+
+  if (d == 0.0)
+    {
+      gripe_divide_by_zero ();
+
+      retval = octave_value (v1.matrix_value () / d);
+    }
+  else
+    retval = octave_value (v1.sparse_matrix_value () / d);
+
+  return retval;
+}
+
+DEFBINOP_FN (el_pow, sparse_matrix, scalar, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_scalar&);
+
+  return octave_value 
+    (x_el_div (v2.complex_value (), v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, scalar, mx_el_and)
+DEFBINOP_FN (el_or, sparse_matrix, scalar, mx_el_or)
+
+DEFCATOP (sm_s, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_scalar&);
+  SparseMatrix tmp (1, 1, v2.scalar_value ());
+  return octave_value (v1.sparse_matrix_value (). concat (tmp, ra_idx));
+}
+
+DEFASSIGNOP (assign, sparse_matrix, scalar)
+{
+  CAST_BINOP_ARGS (octave_sparse_matrix&, const octave_scalar&);
+
+  SparseMatrix tmp (1, 1, v2.scalar_value ());
+  v1.assign (idx, tmp);
+  return octave_value ();
+}
+
+void
+install_sm_s_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_scalar, add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_scalar, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_scalar, mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_scalar, div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_scalar, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_scalar, ldiv);
+
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_scalar, lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_scalar, le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_scalar, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_scalar, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_scalar, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_scalar, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_scalar, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_scalar, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_scalar, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_scalar, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_scalar, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_scalar, el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_scalar, sm_s);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_scalar, assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-scm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,140 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ops.h"
+
+#include "sparse-xdiv.h"
+#include "sparse-xpow.h"
+#include "smx-sm-scm.h"
+#include "smx-scm-sm.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+// sparse matrix by sparse complex matrix ops.
+
+DEFBINOP_OP (add, sparse_matrix, sparse_complex_matrix, +)
+DEFBINOP_OP (sub, sparse_matrix, sparse_complex_matrix, -)
+
+DEFBINOP_OP (mul, sparse_matrix, sparse_complex_matrix, *)
+
+DEFBINOP_FN (div, sparse_matrix, sparse_complex_matrix, xdiv)
+
+DEFBINOPX (pow, sparse_matrix, sparse_complex_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP_FN (ldiv, sparse_matrix, sparse_complex_matrix, xleftdiv)
+
+DEFBINOP_FN (lt, sparse_matrix, sparse_complex_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, sparse_complex_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, sparse_complex_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, sparse_complex_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, sparse_complex_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, sparse_complex_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_matrix, sparse_complex_matrix, product)
+DEFBINOP_FN (el_div, sparse_matrix, sparse_complex_matrix, quotient)
+DEFBINOP_FN (el_pow, sparse_matrix, sparse_complex_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_matrix, sparse_complex_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, 
+		   const octave_sparse_complex_matrix&);
+
+  return octave_value
+    (quotient (v2.sparse_complex_matrix_value (), v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, sparse_complex_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_matrix, sparse_complex_matrix, mx_el_or)
+
+DEFCATOP_FN (sm_scm, sparse_matrix, sparse_complex_matrix, concat)
+
+DEFCONV (sparse_complex_matrix_conv, sparse_matrix, sparse_complex_matrix)
+{
+  CAST_CONV_ARG (const octave_sparse_matrix&);
+  return new octave_sparse_complex_matrix (v.sparse_complex_matrix_value ());
+}
+
+void
+install_sm_scm_ops (void)
+{
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_sparse_complex_matrix,
+		 ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_sparse_complex_matrix, 
+		 ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, 
+		 octave_sparse_complex_matrix, el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_sparse_complex_matrix, sm_scm);
+
+  INSTALL_ASSIGNCONV (octave_sparse_matrix, octave_sparse_complex_matrix, 
+		      octave_sparse_complex_matrix);
+
+  INSTALL_WIDENOP (octave_sparse_matrix, octave_sparse_complex_matrix, 
+		   sparse_complex_matrix_conv);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/OPERATORS/op-sm-sm.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,135 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gripes.h"
+#include "oct-obj.h"
+#include "ov.h"
+#include "ov-typeinfo.h"
+#include "ov-re-mat.h"
+#include "ops.h"
+
+#include "sparse-xpow.h"
+#include "sparse-xdiv.h"
+#include "ov-re-sparse.h"
+
+// sparse matrix unary ops.
+
+DEFUNOP_OP (not, sparse_matrix, !)
+DEFUNOP_OP (uplus, sparse_matrix, /* no-op */)
+DEFUNOP_OP (uminus, sparse_matrix, -)
+
+DEFUNOP (transpose, sparse_matrix)
+{
+  CAST_UNOP_ARG (const octave_sparse_matrix&);
+  return octave_value (v.sparse_matrix_value().transpose ());
+}
+
+// sparse matrix by sparse matrix ops.
+
+DEFBINOP_OP (add, sparse_matrix, sparse_matrix, +)
+DEFBINOP_OP (sub, sparse_matrix, sparse_matrix, -)
+DEFBINOP_OP (mul, sparse_matrix, sparse_matrix, *)
+
+DEFBINOP_FN (div, sparse_matrix, sparse_matrix, xdiv)
+
+DEFBINOPX (pow, sparse_matrix, sparse_matrix)
+{
+  error ("can't do A ^ B for A and B both matrices");
+  return octave_value ();
+}
+
+DEFBINOP_FN (ldiv, sparse_matrix, sparse_matrix, xleftdiv)
+
+DEFBINOP_FN (lt, sparse_matrix, sparse_matrix, mx_el_lt)
+DEFBINOP_FN (le, sparse_matrix, sparse_matrix, mx_el_le)
+DEFBINOP_FN (eq, sparse_matrix, sparse_matrix, mx_el_eq)
+DEFBINOP_FN (ge, sparse_matrix, sparse_matrix, mx_el_ge)
+DEFBINOP_FN (gt, sparse_matrix, sparse_matrix, mx_el_gt)
+DEFBINOP_FN (ne, sparse_matrix, sparse_matrix, mx_el_ne)
+
+DEFBINOP_FN (el_mul, sparse_matrix, sparse_matrix, product)
+DEFBINOP_FN (el_div, sparse_matrix, sparse_matrix, quotient)
+
+DEFBINOP_FN (el_pow, sparse_matrix, sparse_matrix, elem_xpow)
+
+DEFBINOP (el_ldiv, sparse_matrix, sparse_matrix)
+{
+  CAST_BINOP_ARGS (const octave_sparse_matrix&, const octave_sparse_matrix&);
+  return octave_value
+    (quotient (v2.sparse_matrix_value (), v1.sparse_matrix_value ()));
+}
+
+DEFBINOP_FN (el_and, sparse_matrix, sparse_matrix, mx_el_and)
+DEFBINOP_FN (el_or,  sparse_matrix, sparse_matrix, mx_el_or)
+
+DEFCATOP_FN (sm_sm, sparse_matrix, sparse_matrix, concat)
+
+DEFASSIGNOP_FN (assign, sparse_matrix, sparse_matrix, assign)
+
+void
+install_sm_sm_ops (void)
+{
+  INSTALL_UNOP (op_not, octave_sparse_matrix, not);
+  INSTALL_UNOP (op_uplus, octave_sparse_matrix, uplus);
+  INSTALL_UNOP (op_uminus, octave_sparse_matrix, uminus);
+  INSTALL_UNOP (op_transpose, octave_sparse_matrix, transpose);
+  INSTALL_UNOP (op_hermitian, octave_sparse_matrix, transpose);
+
+  INSTALL_BINOP (op_add, octave_sparse_matrix, octave_sparse_matrix, add);
+  INSTALL_BINOP (op_sub, octave_sparse_matrix, octave_sparse_matrix, sub);
+  INSTALL_BINOP (op_mul, octave_sparse_matrix, octave_sparse_matrix, mul);
+  INSTALL_BINOP (op_div, octave_sparse_matrix, octave_sparse_matrix, div);
+  INSTALL_BINOP (op_pow, octave_sparse_matrix, octave_sparse_matrix, pow);
+  INSTALL_BINOP (op_ldiv, octave_sparse_matrix, octave_sparse_matrix, ldiv);
+  INSTALL_BINOP (op_lt, octave_sparse_matrix, octave_sparse_matrix, lt);
+  INSTALL_BINOP (op_le, octave_sparse_matrix, octave_sparse_matrix, le);
+  INSTALL_BINOP (op_eq, octave_sparse_matrix, octave_sparse_matrix, eq);
+  INSTALL_BINOP (op_ge, octave_sparse_matrix, octave_sparse_matrix, ge);
+  INSTALL_BINOP (op_gt, octave_sparse_matrix, octave_sparse_matrix, gt);
+  INSTALL_BINOP (op_ne, octave_sparse_matrix, octave_sparse_matrix, ne);
+  INSTALL_BINOP (op_el_mul, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_mul);
+  INSTALL_BINOP (op_el_div, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_div);
+  INSTALL_BINOP (op_el_pow, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_pow);
+  INSTALL_BINOP (op_el_ldiv, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_ldiv);
+  INSTALL_BINOP (op_el_and, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_and);
+  INSTALL_BINOP (op_el_or, octave_sparse_matrix, octave_sparse_matrix, 
+		 el_or);
+
+  INSTALL_CATOP (octave_sparse_matrix, octave_sparse_matrix, sm_sm);
+
+  INSTALL_ASSIGNOP (op_asn_eq, octave_sparse_matrix, octave_sparse_matrix, 
+		    assign);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/OPERATORS/op-str-m.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-str-m.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-str-s.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-str-s.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-str-str.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-str-str.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-struct.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-struct.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-ui16-ui16.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-ui16-ui16.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-ui32-ui32.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-ui32-ui32.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-ui64-ui64.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-ui64-ui64.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/OPERATORS/op-ui8-ui8.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/OPERATORS/op-ui8-ui8.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -20,10 +20,6 @@
 
 */
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma implementation
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
--- a/src/data.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/data.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -537,7 +537,7 @@
 	  else
 	    {
 	      ColumnVector v = m.diag ();
-	      if (v.capacity () > 0)
+	      if (v.numel () > 0)
 		retval = v;
 	    }
 	}
@@ -560,7 +560,7 @@
 	  else
 	    {
 	      ComplexColumnVector v = cm.diag ();
-	      if (v.capacity () > 0)
+	      if (v.numel () > 0)
 		retval = v;
 	    }
 	}
@@ -729,16 +729,26 @@
 	  octave_value tmp;
           bool any_strings = false;
           bool all_strings = true;
+	  bool first_non_empty_arg = true;
           for (int i = 1; i < n_args; i++)
-	    if (args(i).is_string ())
-	      any_strings = true;
-	    else
-	      all_strings = false;
-	  
+	    if (! args (i).all_zero_dims ())
+	      {
+		if (first_non_empty_arg)
+		  {
+		    first_non_empty_arg = false;
+		    tmp = args (i);
+		  }
+
+		if (args(i).is_string ())
+		  any_strings = true;
+		else
+		  all_strings = false;
+	      }
+
 	  if (all_strings)
 	    tmp = octave_value (charNDArray (dv, Vstring_fill_char), true);
 	  else
-	    tmp = args(1).resize (dim_vector (0,0)).resize (dv);
+	    tmp = tmp.resize (dim_vector (0,0)).resize (dv);
 
 	  if (error_state)
 	    return retval;
--- a/src/ls-mat5.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ls-mat5.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -164,7 +164,7 @@
 
 template <class T>
 void
-read_mat5_integer_data (std::istream& is, T &m, int count, bool swap,
+read_mat5_integer_data (std::istream& is, T *m, int count, bool swap,
 			mat5_data_type type)
 {
 
@@ -188,33 +188,27 @@
   switch (type)
     {
     case miINT8:
-      READ_INTEGER_DATA (signed char, swap, m.fortran_vec (), 1, 
-			 count, is);
+      READ_INTEGER_DATA (signed char, swap, m, 1, count, is);
       break;
 
     case miUINT8:
-      READ_INTEGER_DATA (unsigned char, swap, m.fortran_vec (), 1, 
-			 count, is);
+      READ_INTEGER_DATA (unsigned char, swap, m, 1, count, is);
       break;
 
     case miINT16:
-      READ_INTEGER_DATA (signed TWO_BYTE_INT, swap, m.fortran_vec (), 2, 
-			 count, is);
+      READ_INTEGER_DATA (signed TWO_BYTE_INT, swap, m, 2, count, is);
       break;
 
     case miUINT16:
-      READ_INTEGER_DATA (unsigned TWO_BYTE_INT, swap, m.fortran_vec (), 2, 
-			 count, is);
+      READ_INTEGER_DATA (unsigned TWO_BYTE_INT, swap, m, 2, count, is);
       break;
 
     case miINT32:
-      READ_INTEGER_DATA (signed FOUR_BYTE_INT, swap, m.fortran_vec (), 4, 
-			 count, is);
+      READ_INTEGER_DATA (signed FOUR_BYTE_INT, swap, m, 4, count, is);
       break;
 
     case miUINT32:
-      READ_INTEGER_DATA (unsigned FOUR_BYTE_INT, swap, m.fortran_vec (), 4, 
-			 count, is);
+      READ_INTEGER_DATA (unsigned FOUR_BYTE_INT, swap, m, 4, count, is);
       break;
 
     case miSINGLE:
@@ -226,15 +220,13 @@
 
     case miINT64:
 #ifdef EIGHT_BYTE_INT
-      READ_INTEGER_DATA (signed EIGHT_BYTE_INT, swap, m.fortran_vec (), 8, 
-			 count, is);
+      READ_INTEGER_DATA (signed EIGHT_BYTE_INT, swap, m, 8, count, is);
 #endif
       break;
 
     case miUINT64:
 #ifdef EIGHT_BYTE_INT
-      READ_INTEGER_DATA (unsigned EIGHT_BYTE_INT, swap, m.fortran_vec (), 8, 
-			 count, is);
+      READ_INTEGER_DATA (unsigned EIGHT_BYTE_INT, swap, m, 8, count, is);
 #endif
       break;
 
@@ -247,28 +239,32 @@
 
 }
 
-template void read_mat5_integer_data (std::istream& is, int8NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_int8 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, int16NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_int16 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, int32NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_int32 *m,
+				      int count, bool swap,
+				      mat5_data_type type);
+template void read_mat5_integer_data (std::istream& is, octave_int64 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, int64NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_uint8 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, uint8NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_uint16 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, uint16NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_uint32 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, uint32NDArray &m,
+template void read_mat5_integer_data (std::istream& is, octave_uint64 *m,
 				      int count, bool swap,
 				      mat5_data_type type);
-template void read_mat5_integer_data (std::istream& is, uint64NDArray &m,
+
+template void read_mat5_integer_data (std::istream& is, int *m,
 				      int count, bool swap,
 				      mat5_data_type type);
 
@@ -286,7 +282,7 @@
   \
 	int n = re.length (); \
 	tmp_pos = is.tellg (); \
-	read_mat5_integer_data (is, re, n, swap, \
+	read_mat5_integer_data (is, re.fortran_vec (), n, swap,	\
 				(enum mat5_data_type) type); \
   \
 	if (! is || error_state) \
@@ -401,7 +397,7 @@
   bool imag;
   bool logicalvar;
   enum arrayclasstype arrayclass;
-  FOUR_BYTE_INT junk;
+  FOUR_BYTE_INT nnz;
   FOUR_BYTE_INT flags;
   dim_vector dims;
   int len;
@@ -448,7 +444,7 @@
   global = (flags & 0x0400) != 0; // global variable?
   logicalvar = (flags & 0x0200) != 0; // we don't use this yet
   arrayclass = (arrayclasstype)(flags & 0xff);
-  read_int (is, swap, junk);	// an "undefined" entry
+  read_int (is, swap, nnz);	// number of non-zero in sparse
   
   // dimensions array subelement
   {
@@ -531,8 +527,124 @@
       goto skip_ahead;
 
     case mxSPARSE_CLASS:
-      warning ("load: sparse arrays are not implemented");
-      goto skip_ahead;
+      {
+	int nr = dims(0);
+	int nc = dims(1);
+	SparseMatrix sm;
+	SparseComplexMatrix scm;
+	NDArray re;
+	int *ridx;
+	int *cidx;
+	double *data;
+
+	// Setup return value
+	if (imag)
+	  {
+	    scm = SparseComplexMatrix (nr, nc, nnz);
+	    ridx = scm.ridx ();
+	    cidx = scm.cidx ();
+	    re = NDArray (dim_vector (static_cast<int> (nnz)));
+	    data = re.fortran_vec ();
+	  }
+	else
+	  {
+	    sm = SparseMatrix (nr, nc, nnz);
+	    ridx = sm.ridx ();
+	    cidx = sm.cidx ();
+	    data = sm.data ();
+	  }
+
+	// row indices
+	std::streampos tmp_pos;
+	  
+	if (read_mat5_tag (is, swap, type, len))
+	  {
+	    error ("load: reading sparse row data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	tmp_pos = is.tellg ();
+
+	read_mat5_integer_data (is, ridx, nnz, swap,
+				(enum mat5_data_type) type);
+
+	if (! is || error_state)
+	  {
+	    error ("load: reading sparse row data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	is.seekg (tmp_pos + static_cast<std::streamoff> (PAD (len)));
+
+	// col indices
+	if (read_mat5_tag (is, swap, type, len))
+	  {
+	    error ("load: reading sparse column data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	tmp_pos = is.tellg ();
+
+	read_mat5_integer_data (is, cidx, nc + 1, swap,
+				(enum mat5_data_type) type);
+
+	if (! is || error_state)
+	  {
+	    error ("load: reading sparse column data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	is.seekg (tmp_pos + static_cast<std::streamoff> (PAD (len)));
+
+	// real data subelement
+	if (read_mat5_tag (is, swap, type, len))
+	  {
+	    error ("load: reading sparse matrix data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	tmp_pos = is.tellg ();
+	read_mat5_binary_data (is, data, nnz, swap,
+			       (enum mat5_data_type) type, flt_fmt);
+
+	if (! is || error_state)
+	  {
+	    error ("load: reading sparse matrix data for `%s'", retval.c_str ());
+	    goto data_read_error;
+	  }
+
+	is.seekg (tmp_pos + static_cast<std::streamoff> (PAD (len)));
+
+	// imaginary data subelement
+	if (imag)
+	  {
+	    NDArray im (dim_vector (static_cast<int> (nnz)));
+	  
+	    if (read_mat5_tag (is, swap, type, len))
+	      {
+		error ("load: reading sparse matrix data for `%s'", retval.c_str ());
+		goto data_read_error;
+	      }
+
+	    read_mat5_binary_data (is, im.fortran_vec (), nnz, swap,
+				   (enum mat5_data_type) type, flt_fmt);
+
+	    if (! is || error_state)
+	      {
+		error ("load: reading imaginary sparse matrix data for `%s'",
+		       retval.c_str ());
+		goto data_read_error;
+	      }
+
+	    for (int i = 0; i < nnz; i++)
+	      scm.xdata (i) = Complex (re (i), im (i));
+
+	    tc = scm;
+	  }
+	else
+	  tc = sm;
+      }
+      break;
 
     case mxFUNCTION_CLASS:
       warning ("load: function handles are not implemented");
@@ -913,9 +1025,8 @@
 
 template <class T>
 void 
-write_mat5_integer_data (std::ostream& os, const T& m, int size)
+write_mat5_integer_data (std::ostream& os, const T *m, int size, int nel)
 {
-  int nel = m.nelem ();
   mat5_data_type mst;
   unsigned len;
 
@@ -927,10 +1038,10 @@
     case 2:
       mst = miUINT16;
       break;
-    case 3:
+    case 4:
       mst = miUINT32;
       break;
-    case 4:
+    case 8:
       mst = miUINT64;
       break;
     case -1:
@@ -941,11 +1052,11 @@
       mst = miINT16;
       size = - size;
       break;
-    case -3:
+    case -4:
       mst = miINT32;
       size = - size;
       break;
-    case -4:
+    case -8:
     default:
       mst = miINT64;
       size = - size;
@@ -955,7 +1066,7 @@
   len = nel*size;
   write_mat5_tag (os, mst, len);
 
-  os.write (X_CAST(char *, m.data ()), len);
+  os.write (X_CAST(char *, m), len);
 
   if (PAD (len) > len)
     {
@@ -964,22 +1075,24 @@
     }
 }
 
-template void write_mat5_integer_data (std::ostream& os,
-				       const int8NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os, 
-				       const int16NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os, 
-				       const int32NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os,
-				       const int64NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os, 
-				       const uint8NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os,
-				       const uint16NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os,
-				       const uint32NDArray &m, int size);
-template void write_mat5_integer_data (std::ostream& os,
-				       const uint64NDArray &m, int size);
+template void write_mat5_integer_data (std::ostream& os, const octave_int8 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_int16 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_int32 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_int64 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_uint8 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_uint16 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_uint32 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const octave_uint64 *m,
+				       int size, int nel);
+template void write_mat5_integer_data (std::ostream& os, const int *m, 
+				       int size, int nel);
 
 // Write out cell element values in the cell array to OS, preceded by
 // the appropriate tag.
@@ -1011,7 +1124,7 @@
 			  bool mark_as_global, bool save_as_floats) 
 {
   FOUR_BYTE_INT flags=0;
-  FOUR_BYTE_INT junk=0;
+  FOUR_BYTE_INT nnz=0;
   std::streampos fixup, contin;
   std::string cname = tc.class_name ();
 
@@ -1046,6 +1159,20 @@
     flags |= mxUINT32_CLASS;
   else if (cname == "uint64")
     flags |= mxUINT64_CLASS;
+  else if (cname == "sparse")
+    {
+      flags |= mxSPARSE_CLASS;
+      if (tc.is_complex_type ())
+	{
+	  SparseComplexMatrix scm = tc.sparse_complex_matrix_value ();
+	  nnz = scm.nnz ();
+	}
+      else
+	{
+	  SparseMatrix sm = tc.sparse_matrix_value ();
+	  nnz = sm.nnz ();
+	}
+    }
   else if (tc.is_real_scalar ())
     flags |= mxDOUBLE_CLASS;
   else if (tc.is_real_matrix () || tc.is_range ())
@@ -1065,7 +1192,7 @@
     }
 
   os.write ((char *)&flags, 4);
-  os.write ((char *)&junk, 4);
+  os.write ((char *)&nnz, 4);
 
   {
     dim_vector dv = tc.dims ();
@@ -1128,53 +1255,93 @@
       if (paddedlength > len)
 	os.write ((char *)buf, paddedlength - len);
     }
+  else if (cname == "sparse")
+    {
+      if (tc.is_complex_type ())
+	{
+	  SparseComplexMatrix m = tc.sparse_complex_matrix_value ();
+	  int nc = m.cols ();
+
+	  write_mat5_integer_data (os, m.ridx (), - sizeof(int), nnz);
+	  write_mat5_integer_data (os, m.cidx (), - sizeof(int), nc + 1);
+
+	  NDArray buf (dim_vector (nnz, 1));
+
+	  for (int i = 0; i < nnz; i++)
+	    buf (i) = ::real (m.data (i));
+
+	  write_mat5_array (os, buf, save_as_floats);
+
+	  for (int i = 0; i < nnz; i++)
+	    buf (i) = ::imag (m.data (i));
+
+	  write_mat5_array (os, buf, save_as_floats);
+	}
+      else
+	{
+	  SparseMatrix m = tc.sparse_matrix_value ();
+	  int nc = m.cols ();
+
+	  write_mat5_integer_data (os, m.ridx (), - sizeof(int), nnz);
+	  write_mat5_integer_data (os, m.cidx (), - sizeof(int), nc + 1);
+
+	  // XXX FIXME XXX
+	  // Is there a way to easily do without this buffer
+	  NDArray buf (dim_vector (nnz, 1));
+
+	  for (int i = 0; i < nnz; i++)
+	    buf (i) = m.data (i);
+
+	  write_mat5_array (os, buf, save_as_floats);
+	}
+    }
   else if (cname == "int8")
     {
       int8NDArray m = tc.int8_array_value ();
 
-      write_mat5_integer_data (os, m, -1);
+      write_mat5_integer_data (os, m.fortran_vec (), -1, m.nelem ());
     }
   else if (cname == "int16")
     {
       int16NDArray m = tc.int16_array_value ();
 
-      write_mat5_integer_data (os, m, -2);
+      write_mat5_integer_data (os, m.fortran_vec (), -2, m.nelem ());
     }
   else if (cname == "int32")
     {
       int32NDArray m = tc.int32_array_value ();
 
-      write_mat5_integer_data (os, m, -4);
+      write_mat5_integer_data (os, m.fortran_vec (), -4, m.nelem ());
     }
   else if (cname == "int64")
     {
       int64NDArray m = tc.int64_array_value ();
 
-      write_mat5_integer_data (os, m, -8);
+      write_mat5_integer_data (os, m.fortran_vec (), -8, m.nelem ());
     }
   else if (cname == "uint8")
     {
       uint8NDArray m = tc.uint8_array_value ();
 
-      write_mat5_integer_data (os, m, 1);
+      write_mat5_integer_data (os, m.fortran_vec (), 1, m.nelem ());
     }
   else if (cname == "uint16")
     {
       uint16NDArray m = tc.uint16_array_value ();
 
-      write_mat5_integer_data (os, m, 2);
+      write_mat5_integer_data (os, m.fortran_vec (), 2, m.nelem ());
     }
   else if (cname == "uint32")
     {
       uint32NDArray m = tc.uint32_array_value ();
 
-      write_mat5_integer_data (os, m, 4);
+      write_mat5_integer_data (os, m.fortran_vec (), 4, m.nelem ());
     }
   else if (cname == "uint64")
     {
       uint64NDArray m = tc.uint64_array_value ();
 
-      write_mat5_integer_data (os, m, 8);
+      write_mat5_integer_data (os, m.fortran_vec (), 8, m.nelem ());
     }
   else if (tc.is_real_scalar () || tc.is_real_matrix () || tc.is_range ())
     {
--- a/src/oct.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/oct.h	Fri Feb 25 19:55:28 2005 +0000
@@ -28,18 +28,18 @@
 // config.h needs to be first because it includes #defines that can */
 // affect other header files.
 
-#include <octave/config.h>
+#include "config.h"
 
-#include <octave/Matrix.h>
+#include "Matrix.h"
 
-#include <octave/defun-dld.h>
-#include <octave/error.h>
-#include <octave/gripes.h>
-#include <octave/help.h>
-#include <octave/oct-obj.h>
-#include <octave/pager.h>
-#include <octave/utils.h>
-#include <octave/variables.h>
+#include "defun-dld.h"
+#include "error.h"
+#include "gripes.h"
+#include "help.h"
+#include "oct-obj.h"
+#include "pager.h"
+#include "utils.h"
+#include "variables.h"
 
 #endif
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-base-sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,327 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iostream>
+
+#include "oct-obj.h"
+#include "ov-base.h"
+#include "quit.h"
+#include "pr-output.h"
+
+#include "byte-swap.h"
+#include "ls-oct-ascii.h"
+#include "ls-utils.h"
+#if defined (HAVE_HDF5)
+#include "ls-hdf5.h"
+#endif
+
+#include "boolSparse.h"
+#include "ov-base-sparse.h"
+
+template <class T>
+octave_value
+octave_base_sparse<T>::do_index_op (const octave_value_list& idx, 
+				    int resize_ok)
+{
+  octave_value retval;
+
+  int n_idx = idx.length ();
+
+  int nd = matrix.ndims ();
+
+  switch (n_idx)
+    {
+    case 0:
+      error ("invalid number of indices (= 0) for %d-dimensional array", nd);
+      break;
+
+    case 1:
+      {
+	idx_vector i = idx (0).index_vector ();
+
+	if (! error_state)
+	  retval = octave_value (matrix.index (i, resize_ok));
+      }
+      break;
+
+    default:
+      {
+	if (n_idx == 2 && nd == 2)
+	  {
+	    idx_vector i = idx (0).index_vector ();
+
+	    if (! error_state)
+	      {
+		idx_vector j = idx (1).index_vector ();
+
+		if (! error_state)
+		  retval = octave_value (matrix.index (i, j, resize_ok));
+	      }
+	  }
+	else
+	  {
+	    Array<idx_vector> idx_vec (n_idx);
+
+	    for (int i = 0; i < n_idx; i++)
+	      {
+		idx_vec(i) = idx(i).index_vector ();
+
+		if (error_state)
+		  break;
+	      }
+
+	    if (! error_state)
+	      retval = octave_value (matrix.index (idx_vec, resize_ok));
+	  }
+      }
+      break;
+    }
+
+  return retval;
+}
+
+template <class T>
+octave_value
+octave_base_sparse<T>::subsref (const std::string& type,
+				const std::list<octave_value_list>& idx)
+{
+  octave_value retval;
+
+  switch (type[0])
+    {
+    case '(':
+      retval = do_index_op (idx.front ());
+      break;
+
+    case '{':
+    case '.':
+      {
+	std::string nm = type_name ();
+	error ("%s cannot be indexed with %c", nm.c_str (), type[0]);
+      }
+      break;
+
+    default:
+      panic_impossible ();
+    }
+
+  return retval.next_subsref (type, idx);
+}
+
+template <class T>
+octave_value 
+octave_base_sparse<T>::subsasgn (const std::string& type,
+				 const std::list<octave_value_list>& idx,
+				 const octave_value& rhs)
+{
+  octave_value retval;
+
+  switch (type[0])
+    {
+    case '(':
+      {
+	if (type.length () == 1)
+	  retval = numeric_assign (type, idx, rhs);
+	else
+	  {
+	    std::string nm = type_name ();
+	    error ("in indexed assignment of %s, last lhs index must be ()",
+		   nm.c_str ());
+	  }
+      }
+      break;
+
+    case '{':
+    case '.':
+      {
+	if (is_empty ())
+	  {
+	    octave_value tmp = octave_value::empty_conv (type, rhs);
+
+	    retval = tmp.subsasgn (type, idx, rhs);
+	  }
+	else
+	  {
+	    std::string nm = type_name ();
+	    error ("%s cannot be indexed with %c", nm.c_str (), type[0]);
+	  }
+      }
+      break;
+
+    default:
+      panic_impossible ();
+    }
+
+  return retval;
+}
+
+template <class T>
+void 
+octave_base_sparse<T>::assign (const octave_value_list& idx, const T& rhs)
+{
+  int len = idx.length ();
+
+  for (int i = 0; i < len; i++)
+    matrix.set_index (idx(i).index_vector ());
+
+  ::assign (matrix, rhs);
+}
+
+
+template <class T>
+bool 
+octave_base_sparse<T>::is_true (void) const
+{
+  bool retval = false;
+  dim_vector dv = matrix.dims ();
+  int nel = dv.numel ();
+  int nz = nnz ();
+
+  if (nz == nel && nel > 0)
+    {
+      T t1 (matrix.reshape (dim_vector (nel, 1)));
+
+      SparseBoolMatrix t2 = t1.all ();
+
+      retval = t2(0);
+    }
+
+  return retval;
+}
+
+template <class T>
+bool 
+octave_base_sparse<T>::print_as_scalar (void) const
+{
+  dim_vector dv = dims ();
+
+  return (dv.all_ones () || dv.any_zero ());
+}
+
+template <class T>
+void 
+octave_base_sparse<T>::print (std::ostream& os, bool pr_as_read_syntax) const
+{
+  print_raw (os, pr_as_read_syntax);
+  newline (os);
+}
+
+template <class T>
+void 
+octave_base_sparse<T>::print_info (std::ostream& os, 
+				   const std::string& prefix) const
+{
+  matrix.print_info (os, prefix);
+}
+
+template <class T>
+void
+octave_base_sparse<T>::print_raw (std::ostream& os,
+				      bool pr_as_read_syntax) const
+{
+  int nr = matrix.rows ();
+  int nc = matrix.cols ();
+  int nz = nonzero ();
+
+  os << "Compressed Column Sparse (rows=" << nr <<
+    ", cols=" << nc <<
+    ", nnz=" << nz << ")";
+
+  // add one to the printed indices to go from
+  //  zero-based to one-based arrays
+
+  if (nz != 0)
+    {
+      for (int j = 0; j < nc; j++)
+	{
+	  OCTAVE_QUIT;
+	  for (int i = matrix.cidx(j); i < matrix.cidx(j+1); i++)
+	    {
+	      os << "\n";
+	      os << "  (" << matrix.ridx(i)+1 <<
+		" , "  << j+1 << ") -> ";
+	      octave_print_internal( os, matrix.data(i), pr_as_read_syntax);
+	    }
+	}
+    }
+}
+
+template <class T>
+bool
+octave_base_sparse<T>::save_ascii (std::ostream& os, bool&, bool)
+{
+  dim_vector dv = this->dims ();
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  os << "# nnz: "      << nnz () << "\n";
+  os << "# rows: "     << dv (0) << "\n";
+  os << "# columns: "  << dv (1) << "\n";
+
+  os << this->matrix;
+
+  return true;
+}
+
+template <class T>
+bool 
+octave_base_sparse<T>::load_ascii (std::istream& is)
+{
+  int nz = 0;
+  int nr = 0;
+  int nc = 0;
+  bool success = true;
+
+  if (extract_keyword (is, "nnz", nz, true) &&
+      extract_keyword (is, "rows", nr, true) &&
+      extract_keyword (is, "columns", nc, true))
+    {
+      T tmp (nr, nc, nz);
+
+      is >> tmp;
+
+      if (!is) 
+	{
+	  error ("load: failed to load matrix constant");
+	  success = false;
+	}
+
+      matrix = tmp;
+    }
+  else
+    {
+      error ("load: failed to extract number of rows and columns");
+      success = false;
+    }
+
+  return success;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-base-sparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,157 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_base_sparse_h)
+#define octave_base_sparse_h 1
+
+#include <cstdlib>
+
+#include <iostream>
+#include <string>
+
+#include "str-vec.h"
+
+#include "error.h"
+#include "oct-obj.h"
+#include "ov-base.h"
+#include "ov-typeinfo.h"
+
+#include "boolSparse.h"
+#include "SparseType.h"
+
+class Octave_map;
+
+class tree_walker;
+
+class octave_sparse_bool_matrix;
+
+template <class T>
+class
+octave_base_sparse : public octave_base_value
+{
+ public:
+ 
+  octave_base_sparse (void) : octave_base_value (), typ (SparseType ()) { }
+
+  octave_base_sparse (const T& a) : octave_base_value (), matrix (a),
+				    typ (SparseType ())
+  {
+    if (matrix.ndims () == 0)
+      matrix.resize (dim_vector (0, 0));
+  }
+
+  octave_base_sparse (const T& a, const SparseType& t) : octave_base_value (), 
+				matrix (a), typ (t)
+  {
+    if (matrix.ndims () == 0)
+      matrix.resize (dim_vector (0, 0));
+  }
+
+  octave_base_sparse (const octave_base_sparse& a) : 
+    octave_base_value (), matrix (a.matrix), typ (a.typ) { }
+
+  ~octave_base_sparse (void) { }
+
+  octave_value *clone (void) const { return new octave_base_sparse (*this); }
+  octave_value *empty_clone (void) const 
+    { return new octave_base_sparse (); }
+
+  int nnz (void) const { return matrix.nnz (); }
+  int nonzero (void) const { return matrix.nonzero (); }
+
+  size_t byte_size (void) const { return matrix.byte_size (); }
+
+  octave_value squeeze (void) const { return matrix.squeeze (); }
+
+  octave_value subsref (const std::string& type,
+			const std::list<octave_value_list>& idx);
+
+  octave_value_list subsref (const std::string&,
+			     const std::list<octave_value_list>&, int)
+    {
+      panic_impossible ();
+      return octave_value_list ();
+    }
+
+  octave_value subsasgn (const std::string& type,
+			 const std::list<octave_value_list>& idx,
+			 const octave_value& rhs);
+
+  void assign (const octave_value_list& idx, const T& rhs);
+
+  dim_vector dims (void) const { return matrix.dims (); }
+
+  octave_value do_index_op (const octave_value_list& idx, int resize_ok);
+
+  octave_value do_index_op (const octave_value_list& idx)
+    { return do_index_op (idx, 0); }
+
+  octave_value reshape (const dim_vector& new_dims) const
+    { return T (matrix.reshape (new_dims)); }
+
+  octave_value permute (const Array<int>& vec, bool inv = false) const
+    { return T (matrix.permute (vec, inv)); }
+
+  octave_value resize (const dim_vector& dv) const
+    { T retval (matrix); retval.resize (dv); return retval; }
+
+  octave_value all (int dim = 0) const { return matrix.all (dim); }
+  octave_value any (int dim = 0) const { return matrix.any (dim); }
+
+  bool is_matrix_type (void) const { return true; }
+
+  bool is_numeric_type (void) const { return true; }
+
+  bool is_defined (void) const { return true; }
+
+  bool is_constant (void) const { return true; }
+
+  bool is_true (void) const;
+
+  int capacity (void) const { return matrix.capacity (); }
+
+  bool print_as_scalar (void) const;
+
+  void print (std::ostream& os, bool pr_as_read_syntax = false) const;
+
+  void print_info (std::ostream& os, const std::string& prefix) const;
+
+  void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
+
+  bool save_ascii (std::ostream& os, bool& infnan_warned,
+		 bool strip_nan_and_inf);
+
+  bool load_ascii (std::istream& is);
+
+protected:
+
+  T matrix;
+
+  SparseType typ;
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/ov-base.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-base.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -413,6 +413,30 @@
   return retval;
 }
 
+SparseMatrix
+octave_base_value::sparse_matrix_value (bool) const
+{
+  SparseMatrix retval;
+  gripe_wrong_type_arg ("octave_base_value::sparse_matrix_value()", type_name ());
+  return retval;
+}
+
+SparseComplexMatrix
+octave_base_value::sparse_complex_matrix_value (bool) const
+{
+  SparseComplexMatrix retval;
+  gripe_wrong_type_arg ("octave_base_value::sparse_complex_matrix_value()", type_name ());
+  return retval;
+}
+
+SparseBoolMatrix
+octave_base_value::sparse_bool_matrix_value (bool) const
+{
+  SparseBoolMatrix retval;
+  gripe_wrong_type_arg ("octave_base_value::sparse_bool_matrix_value()", type_name ());
+  return retval;
+}
+
 octave_int8
 octave_base_value::int8_scalar_value (void) const
 {
--- a/src/ov-base.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-base.h	Fri Feb 25 19:55:28 2005 +0000
@@ -94,6 +94,8 @@
 
   int numel (void) const { return dims ().numel (); }
 
+  int capacity (void) const { return numel (); }
+
   size_t byte_size (void) const { return 0; }
 
   octave_value reshape (const dim_vector&) const;
@@ -218,6 +220,12 @@
 
   charNDArray char_array_value (bool = false) const;
 
+  SparseMatrix sparse_matrix_value (bool = false) const;
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
+
+  SparseBoolMatrix sparse_bool_matrix_value (bool = false) const;
+
   octave_int8 int8_scalar_value (void) const;
 
   octave_int16 int16_scalar_value (void) const;
--- a/src/ov-bool-mat.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-bool-mat.h	Fri Feb 25 19:55:28 2005 +0000
@@ -108,6 +108,15 @@
   boolNDArray bool_array_value (void) const
     { return matrix; }
 
+  SparseMatrix sparse_matrix_value (bool = false) const
+  { return SparseMatrix (Matrix (matrix.matrix_value ())); }
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const
+  { return SparseComplexMatrix (ComplexMatrix (matrix.matrix_value ())); }
+
+  SparseBoolMatrix sparse_bool_matrix_value (bool = false) const
+  { return SparseBoolMatrix (matrix.matrix_value ()); }
+
   octave_value convert_to_str_internal (bool pad, bool force) const;
 
   void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-bool-sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,696 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <climits>
+
+#include <iostream>
+#include <vector>
+
+#include "ov-base.h"
+#include "ov-scalar.h"
+#include "ov-bool.h"
+#include "ov-bool-mat.h"
+#include "gripes.h"
+#include "ops.h"
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+#include "ov-bool-sparse.h"
+
+#include "ov-base-sparse.h"
+#include "ov-base-sparse.cc"
+
+template class octave_base_sparse<SparseBoolMatrix>;
+
+DEFINE_OCTAVE_ALLOCATOR (octave_sparse_bool_matrix);
+
+DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_bool_matrix, "sparse bool matrix", "sparse");
+
+static octave_value *
+default_numeric_conversion_function (const octave_value& a)
+{
+  CAST_CONV_ARG (const octave_sparse_bool_matrix&);
+
+  return new octave_sparse_matrix (SparseMatrix (v.sparse_bool_matrix_value ()));
+}
+
+type_conv_fcn
+octave_sparse_bool_matrix::numeric_conversion_function (void) const
+{
+  return default_numeric_conversion_function;
+}
+
+octave_value *
+octave_sparse_bool_matrix::try_narrowing_conversion (void)
+{
+  octave_value *retval = 0;
+
+  // Don't use numel, since it can overflow for very large matrices
+  // Note that for the second test, this means it becomes approximative
+  // since it involves a cast to double to avoid issues of overflow
+  if (matrix.rows () == 1 && matrix.cols () == 1)
+    {
+      // Const copy of the matrix, so the right version of () operator used
+      const SparseBoolMatrix tmp (matrix);
+
+      retval = new octave_bool (tmp (0));
+    }
+  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	   double (matrix.byte_size ()) > double (matrix.rows ()) *
+	   double (matrix.cols ()) * sizeof (bool))
+    retval = new octave_bool_matrix (matrix.matrix_value ());
+
+  return retval;
+}
+
+bool
+octave_sparse_bool_matrix::valid_as_scalar_index (void) const
+{
+  // XXX FIXME XXX
+  return false;
+}
+
+double
+octave_sparse_bool_matrix::double_value (bool) const
+{
+  double retval = lo_ieee_nan_value ();
+
+  if (numel () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("bool sparse matrix", "real scalar");
+
+      retval = matrix (0, 0);
+    }
+  else
+    gripe_invalid_conversion ("bool sparse matrix", "real scalar");
+
+  return retval;
+}
+
+Complex
+octave_sparse_bool_matrix::complex_value (bool) const
+{
+  double tmp = lo_ieee_nan_value ();
+
+  Complex retval (tmp, tmp);
+
+  // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar()
+  if (rows () > 0 && columns () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("bool sparse matrix", "complex scalar");
+
+      retval = matrix (0, 0);
+    }
+  else
+    gripe_invalid_conversion ("bool sparse matrix", "complex scalar");
+
+  return retval;
+}
+
+octave_value
+octave_sparse_bool_matrix::convert_to_str_internal (bool pad, bool force) const
+{
+  octave_value tmp = octave_value (array_value ());
+  return tmp.convert_to_str (pad, force);
+}
+
+// XXX FIXME XXX These are inefficient ways of creating full matrices
+
+Matrix
+octave_sparse_bool_matrix::matrix_value (bool) const
+{
+  return Matrix (matrix.matrix_value ());
+}
+
+ComplexMatrix
+octave_sparse_bool_matrix::complex_matrix_value (bool) const
+{
+  return ComplexMatrix (matrix.matrix_value ());
+}
+
+ComplexNDArray
+octave_sparse_bool_matrix::complex_array_value (bool) const
+{
+  return ComplexNDArray (ComplexMatrix (matrix.matrix_value ()));
+}
+
+NDArray 
+octave_sparse_bool_matrix::array_value (bool) const
+{
+  return NDArray (Matrix(matrix.matrix_value ()));
+}
+
+boolMatrix 
+octave_sparse_bool_matrix::bool_matrix_value (void) const
+{ 
+  return matrix.matrix_value (); 
+}
+
+boolNDArray 
+octave_sparse_bool_matrix::bool_array_value (void) const
+{ 
+  return boolNDArray (matrix.matrix_value ()); 
+}
+
+
+SparseMatrix 
+octave_sparse_bool_matrix::sparse_matrix_value (void) const
+{
+  return SparseMatrix (this->matrix);
+}
+
+SparseComplexMatrix 
+octave_sparse_bool_matrix::sparse_complex_matrix_value (void) const
+{
+  return SparseComplexMatrix (this->matrix);
+}
+
+bool 
+octave_sparse_bool_matrix::save_binary (std::ostream& os, bool&)
+{
+  dim_vector d = this->dims ();
+  if (d.length() < 1)
+    return false;
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  int nr = d(0);
+  int nc = d(1);
+  int nz = nnz ();
+
+  FOUR_BYTE_INT itmp;
+  // Use negative value for ndims to be consistent with other formats
+  itmp= -2;        
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nr;    
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nc;
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nz;
+  os.write (X_CAST (char *, &itmp), 4);
+
+  // add one to the printed indices to go from
+  // zero-based to one-based arrays
+  for (int i = 0; i < nc+1; i++)  
+    {
+      OCTAVE_QUIT;
+      itmp = matrix.cidx(i);
+      os.write (X_CAST (char *, &itmp), 4);
+    }
+
+  for (int i = 0; i < nz; i++) 
+    {
+      OCTAVE_QUIT;
+      itmp = matrix.ridx(i); 
+      os.write (X_CAST (char *, &itmp), 4);
+    }
+
+  OCTAVE_LOCAL_BUFFER (char, htmp, nz);
+
+  for (int i = 0; i < nz; i++)
+    htmp[i] = (matrix.data (i) ? 1 : 0);
+   
+  os.write (htmp, nz);
+
+  return true;
+}
+
+bool
+octave_sparse_bool_matrix::load_binary (std::istream& is, bool swap,
+					oct_mach_info::float_format fmt)
+{
+  FOUR_BYTE_INT nz, nc, nr, tmp;
+  if (! is.read (X_CAST (char *, &tmp), 4))
+    return false;
+
+  if (swap)
+    swap_bytes<4> (&tmp);
+
+  if (tmp != -2) {
+    error("load: only 2D sparse matrices are supported");
+    return false;
+  }
+
+  if (! is.read (X_CAST (char *, &nr), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nc), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nz), 4))
+    return false;
+
+  if (swap)
+    {
+      swap_bytes<4> (&nr);
+      swap_bytes<4> (&nc);
+      swap_bytes<4> (&nz);
+    }
+
+  SparseBoolMatrix m (nr, nc, nz);
+
+  for (int i = 0; i < nc+1; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.cidx(i) = tmp;
+    }
+
+  for (int i = 0; i < nz; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.ridx(i) = tmp;
+    }
+
+  if (error_state || ! is)
+    return false;
+
+  OCTAVE_LOCAL_BUFFER (char, htmp, nz);
+
+  if (! is.read (htmp, nz))
+    return false;
+
+  for (int i = 0; i < nz; i++)
+    m.data(i) = (htmp[i] ? 1 : 0);
+ 
+  matrix = m;
+
+  return true;
+}
+
+#if defined (HAVE_HDF5)
+bool
+octave_sparse_bool_matrix::save_hdf5 (hid_t loc_id, const char *name, bool)
+{
+  dim_vector dv = dims ();
+  int empty = save_hdf5_empty (loc_id, name, dv);
+  if (empty)
+    return (empty > 0);
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  hid_t group_hid = H5Gcreate (loc_id, name, 0);
+  if (group_hid < 0)
+    return false;
+
+  hid_t space_hid = -1, data_hid = -1;
+  bool retval = true;
+  SparseBoolMatrix m = sparse_bool_matrix_value ();
+  int tmp;
+  hsize_t hdims[2];
+
+  space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0);
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.rows ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.cols ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.nnz ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.cols() + 1;
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  int * itmp = m.xcidx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.nnz();
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  itmp = m.xridx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "data", H5T_NATIVE_HBOOL, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  hbool_t htmp[m.nnz ()];
+  for (int i = 0; i < m.nnz (); i++)
+    htmp[i] = m.xdata(i);
+
+  retval = H5Dwrite (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL,
+		     H5P_DEFAULT, (void*) htmp) >= 0;
+  H5Dclose (data_hid);
+  H5Sclose (space_hid);
+  H5Gclose (group_hid);
+
+  return retval;
+}
+
+bool
+octave_sparse_bool_matrix::load_hdf5 (hid_t loc_id, const char *name,
+				      bool /* have_h5giterate_bug */)
+{
+  int nr, nc, nz;
+  hid_t group_hid, data_hid, space_hid;
+  hsize_t rank;
+  
+  dim_vector dv;
+  int empty = load_hdf5_empty (loc_id, name, dv);
+  if (empty > 0)
+    matrix.resize(dv);
+  if (empty)
+    return (empty > 0);
+  
+  group_hid = H5Gopen (loc_id, name);
+  if (group_hid < 0 ) return false;
+
+  data_hid = H5Dopen (group_hid, "nr");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nr) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "nc");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nc) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+  
+  data_hid = H5Dopen (group_hid, "nz");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nz) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  SparseBoolMatrix m (nr, nc, nz);
+
+  data_hid = H5Dopen (group_hid, "cidx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
+  OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank);
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nc + 1 || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  int *itmp = m.xcidx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "ridx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  itmp = m.xridx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "data");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  hbool_t htmp[nz];
+  bool retval = false;
+  if (H5Dread (data_hid, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) htmp) >= 0) 
+    {
+      retval = true;
+
+      for (int i = 0; i < nz; i++)
+	m.xdata(i) = htmp[i];
+
+      matrix = m;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+  H5Gclose (group_hid);
+
+  return retval;
+}
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-bool-sparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,149 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_bool_matrix_h)
+#define octave_sparse_bool_matrix_h 1
+
+#include <cstdlib>
+
+#include <iostream>
+#include <string>
+
+#include "mx-base.h"
+#include "oct-alloc.h"
+#include "so-array.h"
+#include "str-vec.h"
+
+#include "error.h"
+#include "oct-stream.h"
+#include "ov-base.h"
+#include "ov-typeinfo.h"
+
+#include "boolSparse.h"
+#include "ov-base-sparse.h"
+#include "ov-re-sparse.h"
+
+class Octave_map;
+class octave_value_list;
+
+class tree_walker;
+
+class
+octave_sparse_bool_matrix : public octave_base_sparse<SparseBoolMatrix>
+{
+public:
+
+  octave_sparse_bool_matrix (void)
+    : octave_base_sparse<SparseBoolMatrix> () { }
+
+  octave_sparse_bool_matrix (const SparseBoolMatrix& bnda)
+    : octave_base_sparse<SparseBoolMatrix> (bnda) { }
+
+  octave_sparse_bool_matrix (const SparseBoolMatrix& bnda,
+			     const SparseType& t)
+    : octave_base_sparse<SparseBoolMatrix> (bnda, t) { }
+
+  octave_sparse_bool_matrix (const boolNDArray& m)
+    : octave_base_sparse<SparseBoolMatrix> (SparseBoolMatrix (m)) { }
+
+  octave_sparse_bool_matrix (const boolMatrix& m)
+    : octave_base_sparse<SparseBoolMatrix> (SparseBoolMatrix (m)) { }
+
+  octave_sparse_bool_matrix (const Sparse<bool>& a)
+    : octave_base_sparse<SparseBoolMatrix> (a) { }
+
+  octave_sparse_bool_matrix (const octave_sparse_bool_matrix& bm)
+    : octave_base_sparse<SparseBoolMatrix> (bm) { }
+
+  ~octave_sparse_bool_matrix (void) { }
+
+  octave_value *clone (void) const { return new octave_sparse_bool_matrix (*this); }
+  octave_value *empty_clone (void) const { return new octave_sparse_bool_matrix (); }
+
+  type_conv_fcn numeric_conversion_function (void) const;
+
+  octave_value *try_narrowing_conversion (void);
+
+#if 0
+  idx_vector index_vector (void) const { return idx_vector (matrix); }
+#endif
+
+  bool is_bool_matrix (void) const { return true; }
+
+  bool is_bool_type (void) const { return true; }
+
+  bool is_real_type (void) const { return true; }
+
+  bool valid_as_scalar_index (void) const;
+
+  double double_value (bool = false) const;
+
+  double scalar_value (bool frc_str_conv = false) const
+    { return double_value (frc_str_conv); }
+
+  Matrix matrix_value (bool = false) const;
+
+  NDArray array_value (bool = false) const;
+
+  Complex complex_value (bool = false) const;
+
+  ComplexMatrix complex_matrix_value (bool = false) const;
+
+  ComplexNDArray complex_array_value (bool = false) const;
+
+  boolMatrix bool_matrix_value (void) const;
+
+  boolNDArray bool_array_value (void) const;
+
+  SparseMatrix sparse_matrix_value (void) const;
+
+  SparseComplexMatrix sparse_complex_matrix_value (void) const;
+
+  SparseBoolMatrix sparse_bool_matrix_value (void) const
+    { return matrix; }
+
+  octave_value convert_to_str_internal (bool pad, bool force) const;
+
+  bool save_binary (std::ostream& os, bool& save_as_floats);
+
+  bool load_binary (std::istream& is, bool swap, 
+		    oct_mach_info::float_format fmt);
+
+#if defined (HAVE_HDF5)
+  bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
+
+  bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
+#endif
+
+protected:
+
+  DECLARE_OCTAVE_ALLOCATOR
+
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/ov-cell.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-cell.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -25,6 +25,7 @@
 #endif
 
 #include <iostream>
+#include <vector>
 
 #include "lo-sstream.h"
 #include "lo-utils.h"
--- a/src/ov-cx-mat.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-cx-mat.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -179,6 +179,25 @@
   return matrix.matrix_value ();
 }
 
+SparseMatrix
+octave_complex_matrix::sparse_matrix_value (bool force_conversion) const
+{
+  SparseMatrix retval;
+
+  if (! force_conversion && Vwarn_imag_to_real)
+    gripe_implicit_conversion ("complex matrix", "real matrix");
+
+  retval = SparseMatrix (::real (matrix.matrix_value ()));
+
+  return retval;
+}
+
+SparseComplexMatrix
+octave_complex_matrix::sparse_complex_matrix_value (bool) const
+{
+  return SparseComplexMatrix (matrix.matrix_value ());
+}
+
 static ComplexMatrix
 strip_infnan (const ComplexMatrix& m)
 {
--- a/src/ov-cx-mat.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-cx-mat.h	Fri Feb 25 19:55:28 2005 +0000
@@ -104,6 +104,10 @@
 
   ComplexNDArray complex_array_value (bool = false) const { return matrix; }
 
+  SparseMatrix sparse_matrix_value (bool = false) const;
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
+
   void increment (void) { matrix += Complex (1.0); }
 
   void decrement (void) { matrix -= Complex (1.0); }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-cx-sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,761 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <climits>
+
+#include <iostream>
+#include <vector>
+
+#include "ov-base.h"
+#include "ov-scalar.h"
+#include "ov-complex.h"
+#include "gripes.h"
+
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+
+#include "ov-base-sparse.h"
+#include "ov-base-sparse.cc"
+
+#include "ov-bool-sparse.h"
+
+template class octave_base_sparse<SparseComplexMatrix>;
+
+DEFINE_OCTAVE_ALLOCATOR (octave_sparse_complex_matrix);
+
+DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_complex_matrix, "sparse complex matrix", "sparse");
+
+octave_value *
+octave_sparse_complex_matrix::try_narrowing_conversion (void)
+{
+  octave_value *retval = 0;
+
+  int nr = matrix.rows ();
+  int nc = matrix.cols ();
+
+  // Don't use numel, since it can overflow for very large matrices
+  // Note that for the tests on matrix size, they become approximative
+  // since they involves a cast to double to avoid issues of overflow
+  if (matrix.rows () == 1 && matrix.cols () == 1)
+    {
+      // Const copy of the matrix, so the right version of () operator used
+      const SparseComplexMatrix tmp (matrix);
+
+      Complex c = tmp (0, 0);
+
+      if (imag (c) == 0.0)
+	retval = new octave_scalar (std::real (c));
+      else
+	retval = new octave_complex (c);
+    }
+  else if (nr == 0 || nc == 0)
+    retval = new octave_matrix (Matrix (nr, nc));
+  else if (matrix.all_elements_are_real ())
+    if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	double (matrix.byte_size ()) > double (matrix.rows ()) *
+	double (matrix.cols ()) * sizeof (double))
+      retval = new octave_matrix (::real (matrix.matrix_value ()));
+    else
+      retval = new octave_sparse_matrix (::real (matrix));
+  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	   double (matrix.byte_size ()) > double (matrix.rows ()) *
+	   double (matrix.cols ()) * sizeof (Complex))
+    retval = new octave_complex_matrix (matrix.matrix_value ());
+    
+  return retval;
+}
+
+void
+octave_sparse_complex_matrix::assign (const octave_value_list& idx,
+				      const SparseComplexMatrix& rhs)
+{
+  octave_base_sparse<SparseComplexMatrix>::assign (idx, rhs);
+}
+
+void
+octave_sparse_complex_matrix::assign (const octave_value_list& idx,
+				      const SparseMatrix& rhs)
+{
+  int len = idx.length ();
+
+  for (int i = 0; i < len; i++)
+    matrix.set_index (idx(i).index_vector ());
+
+  ::assign (matrix, rhs);
+}
+
+bool
+octave_sparse_complex_matrix::valid_as_scalar_index (void) const
+{
+  // XXX FIXME XXX
+  return false;
+}
+
+double
+octave_sparse_complex_matrix::double_value (bool force_conversion) const
+{
+  double retval = lo_ieee_nan_value ();
+
+  if (! force_conversion && Vwarn_imag_to_real)
+    gripe_implicit_conversion ("complex sparse matrix", "real scalar");
+
+  // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar()
+  if (numel () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("complex sparse matrix", "real scalar");
+
+      retval = std::real (matrix (0, 0));
+    }
+  else
+    gripe_invalid_conversion ("complex sparse matrix", "real scalar");
+
+  return retval;
+}
+
+Matrix
+octave_sparse_complex_matrix::matrix_value (bool force_conversion) const
+{
+  Matrix retval;
+
+  if (! force_conversion && Vwarn_imag_to_real)
+    gripe_implicit_conversion ("complex sparse matrix", "real matrix");
+
+  retval = ::real (matrix.matrix_value ());
+
+  return retval;
+}
+
+Complex
+octave_sparse_complex_matrix::complex_value (bool) const
+{
+  double tmp = lo_ieee_nan_value ();
+
+  Complex retval (tmp, tmp);
+
+  // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar()
+  if (numel () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("complex sparse matrix", "real scalar");
+
+      retval = matrix (0, 0);
+    }
+  else
+    gripe_invalid_conversion ("complex sparse matrix", "real scalar");
+
+  return retval;
+}
+
+ComplexMatrix
+octave_sparse_complex_matrix::complex_matrix_value (bool) const
+{
+  return matrix.matrix_value ();
+}
+
+ComplexNDArray 
+octave_sparse_complex_matrix::complex_array_value (bool) const
+{
+  return ComplexNDArray (matrix.matrix_value ());
+}
+
+SparseMatrix
+octave_sparse_complex_matrix::sparse_matrix_value (bool force_conversion) const
+{
+  SparseMatrix retval;
+
+  if (! force_conversion && Vwarn_imag_to_real)
+    gripe_implicit_conversion ("complex sparse matrix", 
+			       "real sparse matrix");
+
+  retval = ::real (matrix);
+
+  return retval;
+}
+
+bool 
+octave_sparse_complex_matrix::save_binary (std::ostream& os, 
+					   bool&save_as_floats)
+{
+  dim_vector d = this->dims ();
+  if (d.length() < 1)
+    return false;
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  int nr = d(0);
+  int nc = d(1);
+  int nz = nnz ();
+
+  FOUR_BYTE_INT itmp;
+  // Use negative value for ndims to be consistent with other formats
+  itmp= -2;        
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nr;    
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nc;
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nz;
+  os.write (X_CAST (char *, &itmp), 4);
+
+  save_type st = LS_DOUBLE;
+  if (save_as_floats)
+    {
+      if (matrix.too_large_for_float ())
+	{
+	  warning ("save: some values too large to save as floats --");
+	  warning ("save: saving as doubles instead");
+	}
+      else
+	st = LS_FLOAT;
+    }
+  else if (matrix.nnz () > 8192) // XXX FIXME XXX -- make this configurable.
+    {
+      double max_val, min_val;
+      if (matrix.all_integers (max_val, min_val))
+	st = get_save_type (max_val, min_val);
+    }
+
+  // add one to the printed indices to go from
+  // zero-based to one-based arrays
+   for (int i = 0; i < nc+1; i++)  
+     {
+       OCTAVE_QUIT;
+       itmp = matrix.cidx(i);
+       os.write (X_CAST (char *, &itmp), 4);
+     }
+
+   for (int i = 0; i < nz; i++) 
+     {
+       OCTAVE_QUIT;
+       itmp = matrix.ridx(i); 
+       os.write (X_CAST (char *, &itmp), 4);
+     }
+
+   write_doubles (os, X_CAST (const double *, matrix.data()), st, 2 * nz);
+
+  return true;
+}
+
+bool
+octave_sparse_complex_matrix::load_binary (std::istream& is, bool swap,
+				   oct_mach_info::float_format fmt)
+{
+  FOUR_BYTE_INT nz, nc, nr, tmp;
+  if (! is.read (X_CAST (char *, &tmp), 4))
+    return false;
+
+  if (swap)
+    swap_bytes<4> (&tmp);
+
+  if (tmp != -2) {
+    error("load: only 2D sparse matrices are supported");
+    return false;
+  }
+
+  if (! is.read (X_CAST (char *, &nr), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nc), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nz), 4))
+    return false;
+
+  if (swap)
+    {
+      swap_bytes<4> (&nr);
+      swap_bytes<4> (&nc);
+      swap_bytes<4> (&nz);
+    }
+
+  SparseComplexMatrix m (nr, nc, nz);
+
+  for (int i = 0; i < nc+1; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.cidx(i) = tmp;
+    }
+
+  for (int i = 0; i < nz; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.ridx(i) = tmp;
+    }
+
+  if (! is.read (X_CAST (char *, &tmp), 1))
+    return false;
+  
+  read_doubles (is, X_CAST(double *, m.data()), X_CAST (save_type, tmp), 
+		2 * nz, swap, fmt);
+
+  if (error_state || ! is)
+    return false;
+  matrix = m;
+
+  return true;
+}
+
+#if defined (HAVE_HDF5)
+bool
+octave_sparse_complex_matrix::save_hdf5 (hid_t loc_id, const char *name, 
+					 bool save_as_floats)
+{
+  dim_vector dv = dims ();
+  int empty = save_hdf5_empty (loc_id, name, dv);
+  if (empty)
+    return (empty > 0);
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  hid_t group_hid = H5Gcreate (loc_id, name, 0);
+  if (group_hid < 0)
+    return false;
+
+  hid_t space_hid = -1, data_hid = -1;
+  bool retval = true;
+  SparseComplexMatrix m = sparse_complex_matrix_value ();
+  int tmp;
+  hsize_t hdims[2];
+
+  space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0);
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.rows ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.cols ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.nnz ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.cols() + 1;
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  int * itmp = m.xcidx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.nnz();
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  itmp = m.xridx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  hid_t save_type_hid = H5T_NATIVE_DOUBLE;
+
+  if (save_as_floats)
+    {
+      if (m.too_large_for_float ())
+	{
+	  warning ("save: some values too large to save as floats --");
+	  warning ("save: saving as doubles instead");
+	}
+      else
+	save_type_hid = H5T_NATIVE_FLOAT;
+    }
+#if HAVE_HDF5_INT2FLOAT_CONVERSIONS
+  // hdf5 currently doesn't support float/integer conversions
+  else
+    {
+      double max_val, min_val;
+
+      if (m.all_integers (max_val, min_val))
+	save_type_hid
+	  = save_type_to_hdf5 (get_save_type (max_val, min_val));
+    }
+#endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */
+
+  hid_t type_hid = hdf5_make_complex_type (save_type_hid);
+  if (type_hid < 0)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "data", type_hid, space_hid, H5P_DEFAULT);
+  if (data_hid < 0)
+    {
+      H5Sclose (space_hid);
+      H5Tclose (type_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  hid_t complex_type_hid = hdf5_make_complex_type (H5T_NATIVE_DOUBLE);
+  retval = false;
+  if (complex_type_hid >= 0) 
+    {
+      Complex * ctmp = m.xdata ();
+
+      retval = H5Dwrite (data_hid, complex_type_hid, H5S_ALL, H5S_ALL,
+			 H5P_DEFAULT, (void*) ctmp) >= 0;
+    }
+
+  H5Dclose (data_hid);
+  H5Sclose (space_hid);
+  H5Tclose (type_hid);
+  H5Gclose (group_hid);
+
+  return retval;
+}
+
+bool
+octave_sparse_complex_matrix::load_hdf5 (hid_t loc_id, const char *name,
+					 bool /* have_h5giterate_bug */)
+{
+  int nr, nc, nz;
+  hid_t group_hid, data_hid, space_hid;
+  hsize_t rank;
+  
+  dim_vector dv;
+  int empty = load_hdf5_empty (loc_id, name, dv);
+  if (empty > 0)
+    matrix.resize(dv);
+  if (empty)
+    return (empty > 0);
+  
+  group_hid = H5Gopen (loc_id, name);
+  if (group_hid < 0 ) return false;
+
+  data_hid = H5Dopen (group_hid, "nr");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nr) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "nc");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nc) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+  
+  data_hid = H5Dopen (group_hid, "nz");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nz) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  SparseComplexMatrix m (nr, nc, nz);
+
+  data_hid = H5Dopen (group_hid, "cidx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
+  OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank);
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nc + 1 || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  int *itmp = m.xcidx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "ridx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  itmp = m.xridx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "data");
+  hid_t type_hid = H5Dget_type (data_hid);
+
+  hid_t complex_type = hdf5_make_complex_type (H5T_NATIVE_DOUBLE);
+
+  if (! hdf5_types_compatible (type_hid, complex_type))
+    {
+      H5Tclose (complex_type);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  Complex *ctmp = m.xdata ();
+  bool retval = false;
+  if (H5Dread (data_hid, complex_type, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+	       (void *) ctmp) >= 0) 
+    {
+      retval = true;
+      matrix = m;
+    }
+
+  H5Tclose (complex_type);
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+  H5Gclose (group_hid);
+
+  return retval;
+}
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-cx-sparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,147 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_complex_matrix_h)
+#define octave_sparse_complex_matrix_h 1
+
+#include <cstdlib>
+
+#include <iostream>
+#include <string>
+
+#include "mx-base.h"
+#include "oct-alloc.h"
+#include "so-array.h"
+#include "str-vec.h"
+
+#include "error.h"
+#include "oct-stream.h"
+#include "ov-base.h"
+#include "ov-typeinfo.h"
+
+#include "CSparse.h"
+#include "ov-base-sparse.h"
+#include "ov-re-sparse.h"
+#include "ov-bool-sparse.h"
+
+class Octave_map;
+class octave_value_list;
+
+class tree_walker;
+
+class
+octave_sparse_complex_matrix : public octave_base_sparse<SparseComplexMatrix>
+{
+public:
+
+  octave_sparse_complex_matrix (void)
+    : octave_base_sparse<SparseComplexMatrix> () { }
+
+  octave_sparse_complex_matrix (const ComplexNDArray& m)
+    : octave_base_sparse<SparseComplexMatrix> (SparseComplexMatrix (m)) { }
+
+  octave_sparse_complex_matrix (const ComplexMatrix& m)
+    : octave_base_sparse<SparseComplexMatrix> (SparseComplexMatrix (m)) { }
+
+  octave_sparse_complex_matrix (const SparseComplexMatrix& m)
+    : octave_base_sparse<SparseComplexMatrix> (m) { }
+
+  octave_sparse_complex_matrix (const SparseComplexMatrix& m, 
+				const SparseType &t)
+    : octave_base_sparse<SparseComplexMatrix> (m, t) { }
+
+  octave_sparse_complex_matrix (const MSparse<Complex>& m)
+    : octave_base_sparse<SparseComplexMatrix> (m) { }
+
+  octave_sparse_complex_matrix (const octave_sparse_complex_matrix& cm)
+    : octave_base_sparse<SparseComplexMatrix> (cm) { }
+
+  ~octave_sparse_complex_matrix (void) { }
+
+  octave_value *clone (void) const { return new octave_sparse_complex_matrix (*this); }
+  octave_value *empty_clone (void) const { return new octave_sparse_complex_matrix (); }
+
+  octave_value *try_narrowing_conversion (void);
+
+  void assign (const octave_value_list& idx, const SparseComplexMatrix& rhs);
+
+  void assign (const octave_value_list& idx, const SparseMatrix& rhs);
+
+  bool is_complex_matrix (void) const { return true; }
+
+  bool is_complex_type (void) const { return true; }
+
+  bool valid_as_scalar_index (void) const;
+
+  double double_value (bool = false) const;
+
+  double scalar_value (bool frc_str_conv = false) const
+    { return double_value (frc_str_conv); }
+
+  Matrix matrix_value (bool = false) const;
+
+  Complex complex_value (bool = false) const;
+
+  ComplexMatrix complex_matrix_value (bool = false) const;
+
+  ComplexNDArray complex_array_value (bool = false) const;
+
+  SparseMatrix sparse_matrix_value (bool = false) const;
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const
+    { return matrix; }
+
+#if 0
+  int write (octave_stream& os, int block_size,
+	     oct_data_conv::data_type output_type, int skip,
+	     oct_mach_info::float_format flt_fmt) const
+    {
+      // Yes, for compatibility, we drop the imaginary part here.
+      return os.write (matrix_value (true), block_size, output_type,
+		       skip, flt_fmt);
+    }
+#endif
+
+  bool save_binary (std::ostream& os, bool& save_as_floats);
+
+  bool load_binary (std::istream& is, bool swap, 
+		    oct_mach_info::float_format fmt);
+
+#if defined (HAVE_HDF5)
+  bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
+
+  bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
+#endif
+
+private:
+
+  DECLARE_OCTAVE_ALLOCATOR
+
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/ov-fcn-handle.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-fcn-handle.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -25,6 +25,7 @@
 #endif
 
 #include <iostream>
+#include <vector>
 
 #include "defun.h"
 #include "error.h"
--- a/src/ov-fcn-inline.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-fcn-inline.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -29,6 +29,7 @@
 
 #include <istream>
 #include <iostream>
+#include <vector>
 
 #include "defun.h"
 #include "error.h"
--- a/src/ov-fcn-inline.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-fcn-inline.h	Fri Feb 25 19:55:28 2005 +0000
@@ -17,10 +17,6 @@
 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 
-In addition to the terms of the GPL, you are permitted to link
-this program with any Open Source program, as defined by the
-Open Source Initiative (www.opensource.org)
-
 */
 
 #if !defined (octave_fcn_inline_h)
--- a/src/ov-int16.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-int16.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-int32.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-int32.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-int64.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-int64.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-int8.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-int8.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-re-mat.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-re-mat.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -160,6 +160,21 @@
   return retval;
 }
   
+SparseMatrix 
+octave_matrix::sparse_matrix_value (bool) const
+{
+  return SparseMatrix (matrix.matrix_value ());
+}
+
+SparseComplexMatrix 
+octave_matrix::sparse_complex_matrix_value (bool) const
+{
+  // XXX FIXME XXX Need a SparseComplexMatrix (Matrix) constructor to make
+  // this function more efficient. Then this should become
+  // return SparseComplexMatrix (matrix.matrix_value ());
+  return SparseComplexMatrix (sparse_matrix_value ());
+}
+
 streamoff_array
 octave_matrix::streamoff_array_value (void) const
 {
--- a/src/ov-re-mat.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-re-mat.h	Fri Feb 25 19:55:28 2005 +0000
@@ -107,6 +107,10 @@
   
   NDArray array_value (bool = false) const { return matrix; }
 
+  SparseMatrix sparse_matrix_value (bool = false) const;
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const;
+
   streamoff_array streamoff_array_value (void) const;
 
   void increment (void) { matrix += 1.0; }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-re-sparse.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,704 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <climits>
+
+#include <iostream>
+#include <vector>
+
+#include "ov-base.h"
+#include "ov-scalar.h"
+#include "gripes.h"
+
+#include "ls-hdf5.h"
+
+#include "ov-re-sparse.h"
+
+#include "ov-base-sparse.h"
+#include "ov-base-sparse.cc"
+
+#include "ov-bool-sparse.h"
+
+template class octave_base_sparse<SparseMatrix>;
+
+DEFINE_OCTAVE_ALLOCATOR (octave_sparse_matrix);
+
+DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_sparse_matrix, "sparse matrix", "sparse");
+
+octave_value *
+octave_sparse_matrix::try_narrowing_conversion (void)
+{
+  octave_value *retval = 0;
+
+  // Don't use numel, since it can overflow for very large matrices
+  // Note that for the second test, this means it becomes approximative
+  // since it involves a cast to double to avoid issues of overflow
+  if (matrix.rows () == 1 && matrix.cols () == 1)
+    {
+      // Const copy of the matrix, so the right version of () operator used
+      const SparseMatrix tmp (matrix);
+
+      retval = new octave_scalar (tmp (0));
+    }
+  else if (matrix.cols () > 0 && matrix.rows () > 0 && 
+	   double (matrix.byte_size ()) > double (matrix.rows ()) *
+	   double (matrix.cols ()) * sizeof (double))
+    retval = new octave_matrix (matrix.matrix_value ());
+
+  return retval;
+}
+
+bool
+octave_sparse_matrix::valid_as_scalar_index (void) const
+{
+  // XXX FIXME XXX
+  return false;
+}
+
+double
+octave_sparse_matrix::double_value (bool) const
+{
+  double retval = lo_ieee_nan_value ();
+
+  if (numel () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("real sparse matrix", "real scalar");
+
+      retval = matrix (0, 0);
+    }
+  else
+    gripe_invalid_conversion ("real sparse matrix", "real scalar");
+
+  return retval;
+}
+
+Complex
+octave_sparse_matrix::complex_value (bool) const
+{
+  double tmp = lo_ieee_nan_value ();
+
+  Complex retval (tmp, tmp);
+
+  // XXX FIXME XXX -- maybe this should be a function, valid_as_scalar()
+  if (rows () > 0 && columns () > 0)
+    {
+      // XXX FIXME XXX -- is warn_fortran_indexing the right variable here?
+      if (Vwarn_fortran_indexing)
+	gripe_implicit_conversion ("real sparse matrix", "complex scalar");
+
+      retval = matrix (0, 0);
+    }
+  else
+    gripe_invalid_conversion ("real sparse matrix", "complex scalar");
+
+  return retval;
+}
+
+Matrix
+octave_sparse_matrix::matrix_value (bool) const
+{
+  return matrix.matrix_value ();
+}
+
+ComplexMatrix
+octave_sparse_matrix::complex_matrix_value (bool) const
+{
+  return ComplexMatrix (matrix.matrix_value ());
+}
+
+ComplexNDArray
+octave_sparse_matrix::complex_array_value (bool) const
+{
+  return ComplexNDArray (ComplexMatrix (matrix.matrix_value ()));
+}
+
+NDArray 
+octave_sparse_matrix::array_value (bool) const
+{
+  return NDArray (matrix.matrix_value ());
+}
+
+streamoff_array
+octave_sparse_matrix::streamoff_array_value (void) const
+{
+  streamoff_array retval (dims ());
+  int nc = matrix.cols ();
+  int nr = matrix.rows ();
+
+  for (int j = 0; j < nc; j++)
+    for (int i = matrix.cidx(i); i < matrix.cidx(i+1); i++)
+      {
+	double d = matrix.data(i);
+
+	if (D_NINT (d) == d)
+	  {
+	    retval(matrix.ridx(i) + nr * j) = 
+	      std::streamoff (static_cast<long> (d));
+	  }
+	else
+	  {
+	    error ("conversion to streamoff_array value failed");
+	    break;
+	  }
+      }
+
+  return retval;
+}
+
+bool 
+octave_sparse_matrix::save_binary (std::ostream& os, bool&save_as_floats)
+{
+  dim_vector d = this->dims ();
+  if (d.length() < 1)
+    return false;
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  int nr = d(0);
+  int nc = d(1);
+  int nz = nnz ();
+
+  FOUR_BYTE_INT itmp;
+  // Use negative value for ndims to be consistent with other formats
+  itmp= -2;        
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nr;    
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nc;
+  os.write (X_CAST (char *, &itmp), 4);
+  
+  itmp= nz;
+  os.write (X_CAST (char *, &itmp), 4);
+
+  save_type st = LS_DOUBLE;
+  if (save_as_floats)
+    {
+      if (matrix.too_large_for_float ())
+	{
+	  warning ("save: some values too large to save as floats --");
+	  warning ("save: saving as doubles instead");
+	}
+      else
+	st = LS_FLOAT;
+    }
+  else if (matrix.nnz () > 8192) // XXX FIXME XXX -- make this configurable.
+    {
+      double max_val, min_val;
+      if (matrix.all_integers (max_val, min_val))
+	st = get_save_type (max_val, min_val);
+    }
+
+  // add one to the printed indices to go from
+  // zero-based to one-based arrays
+   for (int i = 0; i < nc+1; i++)  
+     {
+       OCTAVE_QUIT;
+       itmp = matrix.cidx(i);
+       os.write (X_CAST (char *, &itmp), 4);
+     }
+
+   for (int i = 0; i < nz; i++) 
+     {
+       OCTAVE_QUIT;
+       itmp = matrix.ridx(i); 
+       os.write (X_CAST (char *, &itmp), 4);
+     }
+
+   write_doubles (os, matrix.data(), st, nz);
+
+  return true;
+}
+
+bool
+octave_sparse_matrix::load_binary (std::istream& is, bool swap,
+				   oct_mach_info::float_format fmt)
+{
+  FOUR_BYTE_INT nz, nc, nr, tmp;
+  if (! is.read (X_CAST (char *, &tmp), 4))
+    return false;
+
+  if (swap)
+    swap_bytes<4> (&tmp);
+
+  if (tmp != -2) {
+    error("load: only 2D sparse matrices are supported");
+    return false;
+  }
+
+  if (! is.read (X_CAST (char *, &nr), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nc), 4))
+    return false;
+  if (! is.read (X_CAST (char *, &nz), 4))
+    return false;
+
+  if (swap)
+    {
+      swap_bytes<4> (&nr);
+      swap_bytes<4> (&nc);
+      swap_bytes<4> (&nz);
+    }
+
+  SparseMatrix m (nr, nc, nz);
+
+  for (int i = 0; i < nc+1; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.xcidx(i) = tmp;
+    }
+
+  for (int i = 0; i < nz; i++) 
+    {
+      OCTAVE_QUIT;
+      if (! is.read (X_CAST (char *, &tmp), 4))
+	return false;
+      if (swap)
+	swap_bytes<4> (&tmp);
+      m.xridx(i) = tmp;
+    }
+
+  if (! is.read (X_CAST (char *, &tmp), 1))
+    return false;
+  
+  read_doubles (is, m.xdata(), X_CAST (save_type, tmp), nz, swap, fmt);
+
+  if (error_state || ! is)
+    return false;
+  matrix = m;
+
+  return true;
+}
+
+#if defined (HAVE_HDF5)
+bool
+octave_sparse_matrix::save_hdf5 (hid_t loc_id, const char *name, 
+				 bool save_as_floats)
+{
+  dim_vector dv = dims ();
+  int empty = save_hdf5_empty (loc_id, name, dv);
+  if (empty)
+    return (empty > 0);
+
+  // Ensure that additional memory is deallocated
+  matrix.maybe_compress ();
+
+  hid_t group_hid = H5Gcreate (loc_id, name, 0);
+  if (group_hid < 0)
+    return false;
+
+  hid_t space_hid = -1, data_hid = -1;
+  bool retval = true;
+  SparseMatrix m = sparse_matrix_value ();
+  int tmp;
+  hsize_t hdims[2];
+
+  space_hid = H5Screate_simple (0, hdims, (hsize_t*) 0);
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "nr", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.rows ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nc", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.cols ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  data_hid = H5Dcreate (group_hid, "nz", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  tmp = m.nnz ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) &tmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.cols() + 1;
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "cidx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  int * itmp = m.xcidx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }    
+
+  H5Sclose (space_hid);
+
+  hdims[0] = m.nnz();
+  hdims[1] = 1;
+
+  space_hid = H5Screate_simple (2, hdims, 0);
+
+  if (space_hid < 0) 
+    {
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  data_hid = H5Dcreate (group_hid, "ridx", H5T_NATIVE_INT, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  itmp = m.xridx ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+		     (void*) itmp) >= 0;
+  H5Dclose (data_hid);
+  if (!retval)
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  hid_t save_type_hid = H5T_NATIVE_DOUBLE;
+
+  if (save_as_floats)
+    {
+      if (m.too_large_for_float ())
+	{
+	  warning ("save: some values too large to save as floats --");
+	  warning ("save: saving as doubles instead");
+	}
+      else
+	save_type_hid = H5T_NATIVE_FLOAT;
+    }
+#if HAVE_HDF5_INT2FLOAT_CONVERSIONS
+  // hdf5 currently doesn't support float/integer conversions
+  else
+    {
+      double max_val, min_val;
+
+      if (m.all_integers (max_val, min_val))
+	save_type_hid
+	  = save_type_to_hdf5 (get_save_type (max_val, min_val));
+    }
+#endif /* HAVE_HDF5_INT2FLOAT_CONVERSIONS */
+
+  data_hid = H5Dcreate (group_hid, "data", save_type_hid, space_hid, 
+			H5P_DEFAULT);
+  if (data_hid < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+  
+  double * dtmp = m.xdata ();
+  retval = H5Dwrite (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
+		     H5P_DEFAULT, (void*) dtmp) >= 0;
+  H5Dclose (data_hid);
+  H5Sclose (space_hid);
+  H5Gclose (group_hid);
+
+  return retval;
+}
+
+bool
+octave_sparse_matrix::load_hdf5 (hid_t loc_id, const char *name,
+				      bool /* have_h5giterate_bug */)
+{
+  int nr, nc, nz;
+  hid_t group_hid, data_hid, space_hid;
+  hsize_t rank;
+  
+  dim_vector dv;
+  int empty = load_hdf5_empty (loc_id, name, dv);
+  if (empty > 0)
+    matrix.resize(dv);
+  if (empty)
+    return (empty > 0);
+  
+  group_hid = H5Gopen (loc_id, name);
+  if (group_hid < 0 ) return false;
+
+  data_hid = H5Dopen (group_hid, "nr");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nr) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "nc");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nc) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+  
+  data_hid = H5Dopen (group_hid, "nz");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) &nz) < 0)
+    { 
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Dclose (data_hid);
+
+  SparseMatrix m (nr, nc, nz);
+
+  data_hid = H5Dopen (group_hid, "cidx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  OCTAVE_LOCAL_BUFFER (hsize_t, hdims, rank);
+  OCTAVE_LOCAL_BUFFER (hsize_t, maxdims, rank);
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nc + 1 || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  int *itmp = m.xcidx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "ridx");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  itmp = m.xridx ();
+  if (H5Dread (data_hid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) itmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+
+  data_hid = H5Dopen (group_hid, "data");
+  space_hid = H5Dget_space (data_hid);
+  rank = H5Sget_simple_extent_ndims (space_hid);
+
+  if (rank != 2)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sget_simple_extent_dims (space_hid, hdims, maxdims);
+
+  if (hdims[0] != nz || hdims[1] != 1)
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  double *dtmp = m.xdata ();
+  if (H5Dread (data_hid, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, 
+	       H5P_DEFAULT, (void *) dtmp) < 0) 
+    {
+      H5Sclose (space_hid);
+      H5Dclose (data_hid);
+      H5Gclose (group_hid);
+      return false;
+    }
+
+  H5Sclose (space_hid);
+  H5Dclose (data_hid);
+  H5Gclose (group_hid);
+
+  matrix = m;
+
+  return true;
+}
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ov-re-sparse.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,148 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_matrix_h)
+#define octave_sparse_matrix_h 1
+
+#include <cstdlib>
+
+#include <iostream>
+#include <string>
+
+#include "mx-base.h"
+#include "oct-alloc.h"
+#include "so-array.h"
+#include "str-vec.h"
+
+#include "error.h"
+#include "oct-stream.h"
+#include "ov-base.h"
+#include "ov-typeinfo.h"
+
+#include "dSparse.h"
+#include "SparseType.h"
+#include "ov-base-sparse.h"
+#include "ov-bool-sparse.h"
+#include "ov-cx-sparse.h"
+
+class Octave_map;
+class octave_value_list;
+
+class tree_walker;
+
+class
+octave_sparse_matrix : public octave_base_sparse<SparseMatrix>
+{
+public:
+
+  octave_sparse_matrix (void)
+    : octave_base_sparse<SparseMatrix> () { }
+
+  octave_sparse_matrix (const Matrix& m)
+    : octave_base_sparse<SparseMatrix> (SparseMatrix (m)) { }
+
+  octave_sparse_matrix (const NDArray& m)
+    : octave_base_sparse<SparseMatrix> (SparseMatrix (m)) { }
+
+  octave_sparse_matrix (const SparseMatrix& m)
+    : octave_base_sparse<SparseMatrix> (m) { }
+
+  octave_sparse_matrix (const SparseMatrix& m, const SparseType& t)
+    : octave_base_sparse<SparseMatrix> (m, t) { }
+
+  octave_sparse_matrix (const MSparse<double>& m)
+    : octave_base_sparse<SparseMatrix> (m) { }
+    
+  octave_sparse_matrix (const octave_sparse_matrix& m)
+    : octave_base_sparse<SparseMatrix> (m) { }
+
+  ~octave_sparse_matrix (void) { }
+
+  octave_value *clone (void) const { return new octave_sparse_matrix (*this); }
+  octave_value *empty_clone (void) const { return new octave_sparse_matrix (); }
+
+  octave_value *try_narrowing_conversion (void);
+
+#if 0
+  idx_vector index_vector (void) const { return idx_vector (matrix); }
+#endif
+
+  bool is_real_matrix (void) const { return true; }
+
+  bool is_real_type (void) const { return true; }
+
+  bool valid_as_scalar_index (void) const;
+
+  double double_value (bool = false) const;
+
+  double scalar_value (bool frc_str_conv = false) const
+    { return double_value (frc_str_conv); }
+
+  Matrix matrix_value (bool = false) const;
+
+  Complex complex_value (bool = false) const;
+
+  ComplexMatrix complex_matrix_value (bool = false) const;
+
+  ComplexNDArray complex_array_value (bool = false) const;
+   
+  NDArray array_value (bool = false) const;
+
+  SparseMatrix sparse_matrix_value (bool = false) const
+    { return matrix; }
+
+  SparseComplexMatrix sparse_complex_matrix_value (bool = false) const
+    { return SparseComplexMatrix (matrix); }
+
+  streamoff_array streamoff_array_value (void) const;
+
+#if 0
+  int write (octave_stream& os, int block_size,
+	     oct_data_conv::data_type output_type, int skip,
+	     oct_mach_info::float_format flt_fmt) const
+    { return os.write (matrix, block_size, output_type, skip, flt_fmt); }
+#endif
+
+  bool save_binary (std::ostream& os, bool& save_as_floats);
+
+  bool load_binary (std::istream& is, bool swap, 
+		    oct_mach_info::float_format fmt);
+
+#if defined (HAVE_HDF5)
+  bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats);
+
+  bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug);
+#endif
+
+private:
+
+  DECLARE_OCTAVE_ALLOCATOR
+
+  DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
+};
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/ov-uint16.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-uint16.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-uint32.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-uint32.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-uint64.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-uint64.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov-uint8.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov-uint8.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -27,7 +27,6 @@
 #include <climits>
 
 #include <iostream>
-#include <vector>
 
 #include "lo-ieee.h"
 #include "lo-utils.h"
--- a/src/ov.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -38,6 +38,9 @@
 #include "ov-cell.h"
 #include "ov-scalar.h"
 #include "ov-re-mat.h"
+#include "ov-bool-sparse.h"
+#include "ov-cx-sparse.h"
+#include "ov-re-sparse.h"
 #include "ov-int8.h"
 #include "ov-int16.h"
 #include "ov-int32.h"
@@ -602,6 +605,27 @@
   maybe_mutate ();
 }
 
+octave_value::octave_value (const SparseMatrix& m, const SparseType &t)
+  : rep (new octave_sparse_matrix (m, t))
+{
+  rep->count = 1;
+  maybe_mutate ();
+}
+
+octave_value::octave_value (const SparseComplexMatrix& m, const SparseType &t)
+  : rep (new octave_sparse_complex_matrix (m, t))
+{
+  rep->count = 1;
+  maybe_mutate ();
+}
+
+octave_value::octave_value (const SparseBoolMatrix& bm, const SparseType &t)
+  : rep (new octave_sparse_bool_matrix (bm, t))
+{
+  rep->count = 1;
+  maybe_mutate ();
+}
+
 octave_value::octave_value (const octave_int8& i)
   : rep (new octave_int8_scalar (i))
 {
@@ -1705,6 +1729,13 @@
 {
   octave_value retval;
 
+  // Rapid return for concatenation with an empty object. Dimension
+  // checking handled elsewhere.
+  if (v1.all_zero_dims ())
+    return v2;
+  if (v2.all_zero_dims ())
+    return v1;
+
   int t1 = v1.type_id ();
   int t2 = v2.type_id ();
 
@@ -2165,6 +2196,9 @@
   octave_uint16_matrix::register_type ();
   octave_uint32_matrix::register_type ();
   octave_uint64_matrix::register_type ();
+  octave_sparse_bool_matrix::register_type ();
+  octave_sparse_matrix::register_type ();
+  octave_sparse_complex_matrix::register_type ();
   octave_struct::register_type ();
   octave_file::register_type ();
   octave_list::register_type ();
--- a/src/ov.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/ov.h	Fri Feb 25 19:55:28 2005 +0000
@@ -39,6 +39,7 @@
 #include "oct-alloc.h"
 #include "oct-time.h"
 #include "str-vec.h"
+#include "SparseType.h"
 
 class Cell;
 class streamoff_array;
@@ -214,6 +215,11 @@
   octave_value (const charMatrix& chm, bool is_string = false);
   octave_value (const charNDArray& chnda, bool is_string = false);
   octave_value (const ArrayN<char>& chnda, bool is_string = false);
+  octave_value (const SparseMatrix& m, const SparseType& t = SparseType ());
+  octave_value (const SparseComplexMatrix& m, 
+		const SparseType& t = SparseType ());
+  octave_value (const SparseBoolMatrix& bm, 
+		const SparseType& t = SparseType ());
   octave_value (const octave_int8& i);
   octave_value (const octave_int16& i);
   octave_value (const octave_int32& i);
@@ -356,9 +362,14 @@
 
   int ndims (void) const;
 
+  bool all_zero_dims (void) const { return dims().all_zero (); }
+
   virtual int numel (void) const
     { return rep->numel (); }
 
+  virtual int capacity (void) const
+    { return rep->capacity (); }
+
   virtual size_t byte_size (void) const
     { return rep->byte_size (); }
 
@@ -568,6 +579,15 @@
   virtual charNDArray char_array_value (bool frc_str_conv = false) const
     { return rep->char_array_value (frc_str_conv); }
 
+  virtual SparseMatrix sparse_matrix_value (bool frc_str_conv = false) const
+  { return rep->sparse_matrix_value (frc_str_conv); }
+
+  virtual SparseComplexMatrix sparse_complex_matrix_value (bool frc_str_conv = false) const
+  { return rep->sparse_complex_matrix_value (frc_str_conv); }
+
+  virtual SparseBoolMatrix sparse_bool_matrix_value (bool frc_str_conv = false) const
+  { return rep->sparse_bool_matrix_value (frc_str_conv); }
+
   virtual octave_int8 int8_scalar_value (void) const
     { return rep->int8_scalar_value (); }
 
--- a/src/pt-arg-list.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/pt-arg-list.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -125,10 +125,6 @@
 	{
 	case -1:
 	  {
-	    // We want numel = prod (size ()) here, so don't use
-	    // index_object->numel () as that may be different (it is
-	    // the number of nonzero elements for sparse arrays).
-
 	    int numel = dv.numel ();
 
 	    if (numel < 0)
--- a/src/pt-mat.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/pt-mat.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -592,10 +592,24 @@
 	  ctmp = octave_value (charNDArray (dv, Vstring_fill_char), true);
       else
 	{
-	  if (all_empty_p)
-	    ctmp = (*(tmp.begin() -> begin()));
-	  else
-	    ctmp = (*(tmp.begin() -> begin())).resize (dim_vector (0,0)).resize (dv);
+	  // Find the first non-empty object
+	  for (tm_const::iterator p = tmp.begin (); p != tmp.end (); p++)
+	    {
+	      tm_row_const row = *p;
+	      for (tm_row_const::iterator q = row.begin (); 
+		   q != row.end (); q++)
+		{
+		  ctmp = *q;
+		  if (! ctmp.all_zero_dims ())
+		    goto found_non_empty;
+		}
+	    }
+
+	  ctmp = (*(tmp.begin() -> begin()));
+
+	found_non_empty:
+	  if (! all_empty_p)
+	    ctmp = ctmp.resize (dim_vector (0,0)).resize (dv);
 	}
 
       if (error_state)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sparse-xdiv.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,640 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cassert>
+
+#include "Array-util.h"
+#include "oct-cmplx.h"
+#include "quit.h"
+#include "error.h"
+
+#include "dSparse.h"
+#include "CSparse.h"
+#include "oct-spparms.h"
+#include "sparse-xdiv.h"
+
+static inline bool
+result_ok (int info)
+{
+#ifdef HAVE_LSSOLVE
+  return (info != -2 && info != -1);
+#else
+  // If the matrix is singular, who cares as we don't have QR based solver yet
+  return (info != -1);
+#endif
+}
+
+static void
+solve_singularity_warning (double rcond)
+{
+  warning ("matrix singular to machine precision, rcond = %g", rcond);
+  warning ("attempting to find minimum norm solution");
+}
+
+template <class T1, class T2>
+bool
+mx_leftdiv_conform (const T1& a, const T2& b)
+{
+  int a_nr = a.rows ();
+  int b_nr = b.rows ();
+
+  if (a_nr != b_nr)
+    {
+      int a_nc = a.cols ();
+      int b_nc = b.cols ();
+
+      gripe_nonconformant ("operator \\", a_nr, a_nc, b_nr, b_nc);
+      return false;
+    }
+
+  return true;
+}
+
+#define INSTANTIATE_MX_LEFTDIV_CONFORM(T1, T2) \
+  template bool mx_leftdiv_conform (const T1&, const T2&)
+
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, SparseMatrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, SparseComplexMatrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, SparseMatrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, SparseComplexMatrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, Matrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseMatrix, ComplexMatrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, Matrix);
+INSTANTIATE_MX_LEFTDIV_CONFORM (SparseComplexMatrix, ComplexMatrix);
+
+template <class T1, class T2>
+bool
+mx_div_conform (const T1& a, const T2& b)
+{
+  int a_nc = a.cols ();
+  int b_nc = b.cols ();
+
+  if (a_nc != b_nc)
+    {
+      int a_nr = a.rows ();
+      int b_nr = b.rows ();
+
+      gripe_nonconformant ("operator /", a_nr, a_nc, b_nr, b_nc);
+      return false;
+    }
+
+  return true;
+}
+
+#define INSTANTIATE_MX_DIV_CONFORM(T1, T2) \
+  template bool mx_div_conform (const T1&, const T2&)
+
+INSTANTIATE_MX_DIV_CONFORM (SparseMatrix, SparseMatrix);
+INSTANTIATE_MX_DIV_CONFORM (SparseMatrix, SparseComplexMatrix);
+INSTANTIATE_MX_DIV_CONFORM (SparseComplexMatrix, SparseMatrix);
+INSTANTIATE_MX_DIV_CONFORM (SparseComplexMatrix, SparseComplexMatrix);
+INSTANTIATE_MX_DIV_CONFORM (Matrix, SparseMatrix);
+INSTANTIATE_MX_DIV_CONFORM (Matrix, SparseComplexMatrix);
+INSTANTIATE_MX_DIV_CONFORM (ComplexMatrix, SparseMatrix);
+INSTANTIATE_MX_DIV_CONFORM (ComplexMatrix, SparseComplexMatrix);
+
+// Right division functions.
+//
+//              op2 / op1:   m   cm   sm  scm
+//                   +--   +---+----+----+----+
+//   sparse matrix         | 1 |  3 |  5 |  7 |
+//                         +---+----+----+----+
+//   sparse complex_matrix | 2 |  4 |  6 |  8 |
+//                         +---+----+----+----+
+
+// -*- 1 -*-
+Matrix
+xdiv (const Matrix& a, const SparseMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return Matrix ();
+
+  Matrix atmp = a.transpose ();
+  SparseMatrix btmp = b.transpose ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      Matrix result = btmp.solve (atmp, info, rcond, 
+				  solve_singularity_warning);
+
+      if (result_ok (info))
+	return Matrix (result.transpose ());
+    }
+
+  int rank;
+  Matrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.transpose ();
+}
+
+// -*- 2 -*-
+ComplexMatrix
+xdiv (const Matrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return ComplexMatrix ();
+
+  Matrix atmp = a.transpose ();
+  SparseComplexMatrix btmp = b.hermitian ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  ComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// -*- 3 -*-
+ComplexMatrix
+xdiv (const ComplexMatrix& a, const SparseMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return ComplexMatrix ();
+
+  ComplexMatrix atmp = a.hermitian ();
+  SparseMatrix btmp = b.transpose ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  ComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// -*- 4 -*-
+ComplexMatrix
+xdiv (const ComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return ComplexMatrix ();
+
+  ComplexMatrix atmp = a.hermitian ();
+  SparseComplexMatrix btmp = b.hermitian ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  ComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// -*- 5 -*-
+SparseMatrix
+xdiv (const SparseMatrix& a, const SparseMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return SparseMatrix ();
+
+  SparseMatrix atmp = a.transpose ();
+  SparseMatrix btmp = b.transpose ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseMatrix result = btmp.solve (atmp, info, rcond, 
+					solve_singularity_warning);
+
+      if (result_ok (info))
+	return SparseMatrix (result.transpose ());
+    }
+
+  int rank;
+  SparseMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.transpose ();
+}
+
+// -*- 6 -*-
+SparseComplexMatrix
+xdiv (const SparseMatrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return SparseComplexMatrix ();
+
+  SparseMatrix atmp = a.transpose ();
+  SparseComplexMatrix btmp = b.hermitian ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  SparseComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// -*- 7 -*-
+SparseComplexMatrix
+xdiv (const SparseComplexMatrix& a, const SparseMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return SparseComplexMatrix ();
+
+  SparseComplexMatrix atmp = a.hermitian ();
+  SparseMatrix btmp = b.transpose ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  SparseComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// -*- 8 -*-
+SparseComplexMatrix
+xdiv (const SparseComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_div_conform (a, b))
+    return SparseComplexMatrix ();
+
+  SparseComplexMatrix atmp = a.hermitian ();
+  SparseComplexMatrix btmp = b.hermitian ();
+
+  int info;
+  if (btmp.rows () == btmp.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= btmp.solve (atmp, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result.hermitian ();
+    }
+
+  int rank;
+  SparseComplexMatrix result = btmp.lssolve (atmp, info, rank);
+
+  return result.hermitian ();
+}
+
+// Funny element by element division operations.
+//
+//       op2 \ op1:   s   cs
+//            +--   +---+----+
+//   matrix         | 1 |  3 |
+//                  +---+----+
+//   complex_matrix | 2 |  4 |
+//                  +---+----+
+
+Matrix
+x_el_div (double a, const SparseMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  Matrix result;
+  if (a == 0.)
+    result = Matrix (nr, nc, octave_NaN);
+  else if (a > 0.)
+    result = Matrix (nr, nc, octave_Inf);
+  else
+    result = Matrix (nr, nc, -octave_Inf);
+
+
+  for (int j = 0; j < nc; j++)
+    for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+      {
+	OCTAVE_QUIT;
+	result.elem (b.ridx(i), j) = a / b.data (i);
+      }
+
+  return result;
+}
+
+ComplexMatrix
+x_el_div (double a, const SparseComplexMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  ComplexMatrix  result (nr, nc, Complex(octave_NaN, octave_NaN));
+
+  for (int j = 0; j < nc; j++)
+    for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+      {
+	OCTAVE_QUIT;
+	result.elem (b.ridx(i), j) = a / b.data (i);
+      }
+
+  return result;
+}
+
+ComplexMatrix
+x_el_div (const Complex a, const SparseMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  ComplexMatrix result (nr, nc, (a / 0.0));
+
+  for (int j = 0; j < nc; j++)
+    for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+      {
+	OCTAVE_QUIT;
+	result.elem (b.ridx(i), j) = a / b.data (i);
+      }
+
+  return result;
+}
+
+ComplexMatrix
+x_el_div (const Complex a, const SparseComplexMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  ComplexMatrix result (nr, nc, (a / 0.0));
+
+  for (int j = 0; j < nc; j++)
+    for (int i = b.cidx(j); i < b.cidx(j+1); i++)
+      {
+	OCTAVE_QUIT;
+	result.elem (b.ridx(i), j) = a / b.data (i);
+      }
+
+  return result;
+}
+
+// Left division functions.
+//
+//              op2 \ op1:   m   cm
+//                   +--   +---+----+
+//   matrix                | 1 |  5 |
+//                         +---+----+
+//   complex_matrix        | 2 |  6 |
+//                         +---+----+
+//   sparse matrix         | 3 |  7 |
+//                         +---+----+
+//   sparse complex_matrix | 4 |  8 |
+//                         +---+----+
+
+// -*- 1 -*-
+Matrix
+xleftdiv (const SparseMatrix& a, const Matrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return Matrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      Matrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 2 -*-
+ComplexMatrix
+xleftdiv (const SparseMatrix& a, const ComplexMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return ComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 3 -*-
+SparseMatrix
+xleftdiv (const SparseMatrix& a, const SparseMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return SparseMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 4 -*-
+SparseComplexMatrix
+xleftdiv (const SparseMatrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return SparseComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 5 -*-
+ComplexMatrix
+xleftdiv (const SparseComplexMatrix& a, const Matrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return ComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 6 -*-
+ComplexMatrix
+xleftdiv (const SparseComplexMatrix& a, const ComplexMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return ComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      ComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 7 -*-
+SparseComplexMatrix
+xleftdiv (const SparseComplexMatrix& a, const SparseMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return SparseComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+// -*- 8 -*-
+SparseComplexMatrix
+xleftdiv (const SparseComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  if (! mx_leftdiv_conform (a, b))
+    return SparseComplexMatrix ();
+
+  int info;
+  if (a.rows () == a.columns ())
+    {
+      double rcond = 0.0;
+
+      SparseComplexMatrix result
+	= a.solve (b, info, rcond, solve_singularity_warning);
+
+      if (result_ok (info))
+	return result;
+    }
+
+  int rank;
+  return a.lssolve (b, info, rank);
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sparse-xdiv.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,70 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_xdiv_h)
+#define octave_sparse_xdiv_h 1
+
+#include "oct-cmplx.h"
+
+class SparseMatrix;
+class SparseComplexMatrix;
+
+extern Matrix xdiv (const Matrix& a, const SparseMatrix& b);
+extern ComplexMatrix xdiv (const Matrix& a, const SparseComplexMatrix& b);
+extern ComplexMatrix xdiv (const ComplexMatrix& a, const SparseMatrix& b);
+extern ComplexMatrix xdiv (const ComplexMatrix& a, 
+			   const SparseComplexMatrix& b);
+
+extern SparseMatrix xdiv (const SparseMatrix& a, const SparseMatrix& b);
+extern SparseComplexMatrix xdiv (const SparseMatrix& a, 
+				 const SparseComplexMatrix& b);
+extern SparseComplexMatrix xdiv (const SparseComplexMatrix& a, 
+				 const SparseMatrix& b);
+extern SparseComplexMatrix xdiv (const SparseComplexMatrix& a, 
+				 const SparseComplexMatrix& b);
+
+extern Matrix x_el_div (double a, const SparseMatrix& b);
+extern ComplexMatrix x_el_div (double a, const SparseComplexMatrix& b);
+extern ComplexMatrix x_el_div (const Complex a, const SparseMatrix& b);
+extern ComplexMatrix x_el_div (const Complex a, 
+			       const SparseComplexMatrix& b);
+
+extern Matrix xleftdiv (const SparseMatrix& a, const Matrix& b);
+extern ComplexMatrix xleftdiv (const SparseMatrix& a, const ComplexMatrix& b);
+extern ComplexMatrix xleftdiv (const SparseComplexMatrix& a, const Matrix& b);
+extern ComplexMatrix xleftdiv (const SparseComplexMatrix& a, 
+			       const ComplexMatrix& b);
+
+extern SparseMatrix xleftdiv (const SparseMatrix& a, const SparseMatrix& b);
+extern SparseComplexMatrix xleftdiv (const SparseMatrix& a, 
+				     const SparseComplexMatrix& b);
+extern SparseComplexMatrix xleftdiv (const SparseComplexMatrix& a, 
+				     const SparseMatrix& b);
+extern SparseComplexMatrix xleftdiv (const SparseComplexMatrix& a, 
+				     const SparseComplexMatrix& b);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sparse-xpow.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,795 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cassert>
+#include <climits>
+
+#include "Array-util.h"
+#include "oct-cmplx.h"
+#include "quit.h"
+
+#include "error.h"
+#include "oct-obj.h"
+#include "utils.h"
+
+#include "dSparse.h"
+#include "CSparse.h"
+#include "ov-re-sparse.h"
+#include "ov-cx-sparse.h"
+#include "sparse-xpow.h"
+
+static inline int
+xisint (double x)
+{
+  return (D_NINT (x) == x
+	  && ((x >= 0 && x < INT_MAX)
+	      || (x <= 0 && x > INT_MIN)));
+}
+
+
+// Safer pow functions. Only two make sense for sparse matrices, the
+// others should all promote to full matrices.
+
+octave_value
+xpow (const SparseMatrix& a, double b)
+{
+  octave_value retval;
+
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  if (nr == 0 || nc == 0 || nr != nc)
+    error ("for A^b, A must be square");
+  else
+    {
+      if (static_cast<int> (b) == b)
+	{
+	  int btmp = static_cast<int> (b);
+	  if (btmp == 0)
+	    {
+	      SparseMatrix tmp = SparseMatrix (nr, nr, nr);
+	      for (int i = 0; i < nr; i++)
+		{
+		  tmp.data (i) = 1.0;
+		  tmp.ridx (i) = i;
+		}
+	      for (int i = 0; i < nr + 1; i++)
+		tmp.cidx (i) = i;
+
+	      retval = tmp;
+	    }
+	  else
+	    {
+	      SparseMatrix atmp;
+	      if (btmp < 0)
+		{
+		  btmp = -btmp;
+
+		  int info;
+		  double rcond = 0.0;
+
+		  atmp = a.inverse (info, rcond, 1);
+
+		  if (info == -1)
+		    warning ("inverse: matrix singular to machine\
+ precision, rcond = %g", rcond);
+		}
+	      else
+		atmp = a;
+
+	      SparseMatrix result (atmp);
+
+	      btmp--;
+
+	      while (btmp > 0)
+		{
+		  if (btmp & 1)
+		    result = result * atmp;
+
+		  btmp >>= 1;
+
+		  if (btmp > 0)
+		    atmp = atmp * atmp;
+		}
+
+	      retval = result;
+	    }
+	}
+      else
+	error ("use full(a) ^ full(b)");
+    }
+
+  return retval;
+}
+
+octave_value
+xpow (const SparseComplexMatrix& a, double b)
+{
+  octave_value retval;
+
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  if (nr == 0 || nc == 0 || nr != nc)
+    error ("for A^b, A must be square");
+  else
+    {
+      if (static_cast<int> (b) == b)
+	{
+	  int btmp = static_cast<int> (b);
+	  if (btmp == 0)
+	    {
+	      SparseMatrix tmp = SparseMatrix (nr, nr, nr);
+	      for (int i = 0; i < nr; i++)
+		{
+		  tmp.data (i) = 1.0;
+		  tmp.ridx (i) = i;
+		}
+	      for (int i = 0; i < nr + 1; i++)
+		tmp.cidx (i) = i;
+
+	      retval = tmp;
+	    }
+	  else
+	    {
+	      SparseComplexMatrix atmp;
+	      if (btmp < 0)
+		{
+		  btmp = -btmp;
+
+		  int info;
+		  double rcond = 0.0;
+
+		  atmp = a.inverse (info, rcond, 1);
+
+		  if (info == -1)
+		    warning ("inverse: matrix singular to machine\
+ precision, rcond = %g", rcond);
+		}
+	      else
+		atmp = a;
+
+	      SparseComplexMatrix result (atmp);
+
+	      btmp--;
+
+	      while (btmp > 0)
+		{
+		  if (btmp & 1)
+		    result = result * atmp;
+
+		  btmp >>= 1;
+
+		  if (btmp > 0)
+		    atmp = atmp * atmp;
+		}
+
+	      retval = result;
+	    }
+	}
+      else
+	error ("use full(a) ^ full(b)");
+    }
+
+  return retval;
+}
+
+// Safer pow functions that work elementwise for matrices.
+//
+//       op2 \ op1:   s   m   cs   cm
+//            +--   +---+---+----+----+
+//   scalar   |     | * | 3 |  * |  9 |
+//                  +---+---+----+----+
+//   matrix         | 1 | 4 |  7 | 10 |
+//                  +---+---+----+----+
+//   complex_scalar | * | 5 |  * | 11 |
+//                  +---+---+----+----+
+//   complex_matrix | 2 | 6 |  8 | 12 |
+//                  +---+---+----+----+
+//
+//   * -> not needed.
+
+// XXX FIXME XXX -- these functions need to be fixed so that things
+// like
+//
+//   a = -1; b = [ 0, 0.5, 1 ]; r = a .^ b
+//
+// and
+//
+//   a = -1; b = [ 0, 0.5, 1 ]; for i = 1:3, r(i) = a .^ b(i), end
+//
+// produce identical results.  Also, it would be nice if -1^0.5
+// produced a pure imaginary result instead of a complex number with a
+// small real part.  But perhaps that's really a problem with the math
+// library...
+
+// -*- 1 -*-
+octave_value
+elem_xpow (double a, const SparseMatrix& b)
+{
+  octave_value retval;
+
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  double d1, d2;
+
+  if (a < 0.0 && ! b.all_integers (d1, d2))
+    {
+      Complex atmp (a);
+      ComplexMatrix result (nr, nc);
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      OCTAVE_QUIT;
+	      result (i, j) = pow (atmp, b(i,j));
+	    }
+	}
+
+      retval = result;
+    }
+  else
+    {
+      Matrix result (nr, nc);
+
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      OCTAVE_QUIT;
+	      result (i, j) = pow (a, b(i,j));
+	    }
+	}
+
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 2 -*-
+octave_value
+elem_xpow (double a, const SparseComplexMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  Complex atmp (a);
+  ComplexMatrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  OCTAVE_QUIT;
+	  result (i, j) = pow (atmp, b(i,j));
+	}
+    }
+
+  return result;
+}
+
+// -*- 3 -*-
+octave_value
+elem_xpow (const SparseMatrix& a, double b)
+{
+  // XXX FIXME XXX What should a .^ 0 give?? Matlab gives a 
+  // sparse matrix with same structure as a, which is strictly
+  // incorrect. Keep compatiability.
+
+  octave_value retval;
+
+  int nz = a.nnz ();
+
+  if (b <= 0.0)
+    {
+      int nr = a.rows ();
+      int nc = a.cols ();
+
+      if (static_cast<int> (b) != b && a.any_element_is_negative ())
+	{
+	  ComplexMatrix result (nr, nc, Complex (pow (0.0, b)));
+
+	  // XXX FIXME XXX -- avoid apparent GNU libm bug by
+	  // converting A and B to complex instead of just A.
+	  Complex btmp (b);
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+	      {
+		OCTAVE_QUIT;
+	      
+		Complex atmp (a.data (i));
+		
+		result (a.ridx(i), j) = pow (atmp, btmp);
+	      }
+
+	  retval = octave_value (result);
+	}
+      else
+	{
+	  Matrix result (nr, nc, (pow (0.0, b)));
+
+	  for (int j = 0; j < nc; j++)
+	    for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+	      {
+		OCTAVE_QUIT;
+		result (a.ridx(i), j) = pow (a.data (i), b);
+	      }
+
+	  retval = octave_value (result);
+	}
+    }
+  else if (static_cast<int> (b) != b && a.any_element_is_negative ())
+    {
+      SparseComplexMatrix result (a);
+
+      for (int i = 0; i < nz; i++)
+	{
+	  OCTAVE_QUIT;
+
+	  // XXX FIXME XXX -- avoid apparent GNU libm bug by
+	  // converting A and B to complex instead of just A.
+
+	  Complex atmp (a.data (i));
+	  Complex btmp (b);
+
+	  result.data (i) = pow (atmp, btmp);
+	}
+
+      result.maybe_compress (true);
+
+      retval = result;
+    }
+  else
+    {
+      SparseMatrix result (a);
+
+      for (int i = 0; i < nz; i++)
+	{
+	  OCTAVE_QUIT;
+	  result.data (i) = pow (a.data (i), b);
+	}
+
+      result.maybe_compress (true);
+
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 4 -*-
+octave_value
+elem_xpow (const SparseMatrix& a, const SparseMatrix& b)
+{
+  octave_value retval;
+
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  int b_nr = b.rows ();
+  int b_nc = b.cols ();
+
+  if (nr != b_nr || nc != b_nc)
+    {
+      gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
+      return octave_value ();
+    }
+
+  int convert_to_complex = 0;
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	OCTAVE_QUIT;
+	double atmp = a (i, j);
+	double btmp = b (i, j);
+	if (atmp < 0.0 && static_cast<int> (btmp) != btmp)
+	  {
+	    convert_to_complex = 1;
+	    goto done;
+	  }
+      }
+
+done:
+
+  int nel = 0;
+  for (int j = 0; j < nc; j++) 
+    for (int i = 0; i < nr; i++)
+      if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.))
+	nel++;
+
+  if (convert_to_complex)
+    {
+      SparseComplexMatrix complex_result (nr, nc, nel);
+
+      int ii = 0;
+      complex_result.cidx(0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      OCTAVE_QUIT;
+	      Complex atmp (a (i, j));
+	      Complex btmp (b (i, j));
+	      Complex tmp =  pow (atmp, btmp);
+	      if (tmp != 0.)
+		{
+		  complex_result.data (ii) = tmp;
+		  complex_result.ridx (ii++) = i;
+		}
+	    }
+	  complex_result.cidx (j+1) = ii;
+	}
+      complex_result.maybe_compress ();
+
+      retval = complex_result;
+    }
+  else
+    {
+      SparseMatrix result (nr, nc, nel);
+      int ii = 0;
+
+      result.cidx (0) = 0;
+      for (int j = 0; j < nc; j++)
+	{
+	  for (int i = 0; i < nr; i++)
+	    {
+	      OCTAVE_QUIT;
+	      double tmp = pow (a (i, j), b (i, j));
+	      if (tmp != 0.)
+		{
+		  result.data (ii) = tmp;
+		  result.ridx (ii++) = i;
+		}
+	    }
+	  result.cidx (j+1) = ii;
+	}
+
+      result.maybe_compress ();
+
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 5 -*-
+octave_value
+elem_xpow (const SparseMatrix& a, const Complex& b)
+{
+  octave_value retval;
+
+  if (b == 0.0)
+    // Can this case ever happen, due to automatic retyping with maybe_mutate?
+    retval = octave_value (NDArray (a.dims (), 1));
+  else
+    {
+      int nz = a.nnz ();
+      SparseComplexMatrix result (a);
+      
+      for (int i = 0; i < nz; i++)
+	{
+	  OCTAVE_QUIT;
+	  result.data (i) = pow (Complex (a.data (i)), b);
+	}
+  
+      result.maybe_compress (true);
+
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 6 -*-
+octave_value
+elem_xpow (const SparseMatrix& a, const SparseComplexMatrix& b)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  int b_nr = b.rows ();
+  int b_nc = b.cols ();
+
+  if (nr != b_nr || nc != b_nc)
+    {
+      gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
+      return octave_value ();
+    }
+
+  int nel = 0;
+  for (int j = 0; j < nc; j++) 
+    for (int i = 0; i < nr; i++)
+      if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.))
+	nel++;
+
+  SparseComplexMatrix result (nr, nc, nel);
+  int ii = 0;
+
+  result.cidx(0) = 0;
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  OCTAVE_QUIT;
+	  Complex tmp = pow (Complex (a (i, j)), b (i, j));
+	  if (tmp != 0.)
+	    {
+	      result.data (ii) = tmp; 
+	      result.ridx (ii++) = i; 
+	    }
+	}
+      result.cidx (j+1) = ii;
+    }
+
+  result.maybe_compress ();
+
+  return result;
+}
+
+// -*- 7 -*-
+octave_value
+elem_xpow (const Complex& a, const SparseMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  ComplexMatrix result (nr, nc);
+
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  OCTAVE_QUIT;
+	  double btmp = b (i, j);
+	  if (xisint (btmp))
+	    result (i, j) = pow (a, static_cast<int> (btmp));
+	  else
+	    result (i, j) = pow (a, btmp);
+	}
+    }
+
+  return result;
+}
+
+// -*- 8 -*-
+octave_value
+elem_xpow (const Complex& a, const SparseComplexMatrix& b)
+{
+  int nr = b.rows ();
+  int nc = b.cols ();
+
+  ComplexMatrix result (nr, nc);
+  for (int j = 0; j < nc; j++)
+    for (int i = 0; i < nr; i++)
+      {
+	OCTAVE_QUIT;
+	result (i, j) = pow (a, b (i, j));
+      }
+
+  return result;
+}
+
+// -*- 9 -*-
+octave_value
+elem_xpow (const SparseComplexMatrix& a, double b)
+{
+  octave_value retval;
+
+  if (b <= 0)
+    {
+      int nr = a.rows ();
+      int nc = a.cols ();
+
+      ComplexMatrix result (nr, nc, Complex (pow (0.0, b)));
+
+      if (xisint (b))
+	{
+	  for (int j = 0; j < nc; j++)
+	    for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+	      {
+		OCTAVE_QUIT;
+		result (a.ridx(i), j) = 
+		  pow (a.data (i), static_cast<int> (b));
+	      }
+	}
+      else
+	{
+	  for (int j = 0; j < nc; j++)
+	    for (int i = a.cidx(j); i < a.cidx(j+1); i++)
+	      {
+		OCTAVE_QUIT;
+		result (a.ridx(i), j) = pow (a.data (i), b);
+	      }
+	}  
+
+      retval = result;
+    }
+  else
+    {
+      int nz = a.nnz ();
+
+      SparseComplexMatrix result (a);
+  
+      if (xisint (b))
+	{
+	  for (int i = 0; i < nz; i++)
+	    {
+	      OCTAVE_QUIT;
+	      result.data (i) = pow (a.data (i), static_cast<int> (b));
+	    }
+	}
+      else
+	{
+	  for (int i = 0; i < nz; i++)
+	    {
+	      OCTAVE_QUIT;
+	      result.data (i) = pow (a.data (i), b);
+	    }
+	}  
+
+      result.maybe_compress (true);
+
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 10 -*-
+octave_value
+elem_xpow (const SparseComplexMatrix& a, const SparseMatrix& b)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  int b_nr = b.rows ();
+  int b_nc = b.cols ();
+
+  if (nr != b_nr || nc != b_nc)
+    {
+      gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
+      return octave_value ();
+    }
+
+  int nel = 0;
+  for (int j = 0; j < nc; j++) 
+    for (int i = 0; i < nr; i++)
+      if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.))
+	nel++;
+
+  SparseComplexMatrix result (nr, nc, nel);
+  int ii = 0;
+
+  result.cidx (0) = 0;
+  for (int j = 0; j < nc; j++)
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  OCTAVE_QUIT;
+	  double btmp = b (i, j);
+	  Complex tmp;
+
+	  if (xisint (btmp))
+	    tmp = pow (a (i, j), static_cast<int> (btmp));
+	  else
+	    tmp = pow (a (i, j), btmp);
+	  if (tmp != 0.)
+	    {
+	      result.data (ii) = tmp; 
+	      result.ridx (ii++) = i; 
+	    }
+	}
+      result.cidx (j+1) = ii;
+    }
+
+  result.maybe_compress ();
+
+  return result;
+}
+
+// -*- 11 -*-
+octave_value
+elem_xpow (const SparseComplexMatrix& a, const Complex& b)
+{
+  octave_value retval;
+
+  if (b == 0.0)
+    // Can this case ever happen, due to automatic retyping with maybe_mutate?
+    retval = octave_value (NDArray (a.dims (), 1));
+  else
+    {
+
+      int nz = a.nnz ();
+
+      SparseComplexMatrix result (a);
+
+      for (int i = 0; i < nz; i++)
+	{
+	  OCTAVE_QUIT;
+	  result.data (i) = pow (a.data (i), b);
+	}
+
+      result.maybe_compress (true);
+      
+      retval = result;
+    }
+
+  return retval;
+}
+
+// -*- 12 -*-
+octave_value
+elem_xpow (const SparseComplexMatrix& a, const SparseComplexMatrix& b)
+{
+  int nr = a.rows ();
+  int nc = a.cols ();
+
+  int b_nr = b.rows ();
+  int b_nc = b.cols ();
+
+  if (nr != b_nr || nc != b_nc)
+    {
+      gripe_nonconformant ("operator .^", nr, nc, b_nr, b_nc);
+      return octave_value ();
+    }
+
+  int nel = 0;
+  for (int j = 0; j < nc; j++) 
+    for (int i = 0; i < nr; i++)
+      if (!(a.elem (i, j) == 0. && b.elem (i, j) != 0.))
+	nel++;
+
+  SparseComplexMatrix result (nr, nc, nel);
+  int ii = 0;
+
+  result.cidx (0) = 0;
+  for (int j = 0; j < nc; j++) 
+    {
+      for (int i = 0; i < nr; i++)
+	{
+	  OCTAVE_QUIT;
+	  Complex tmp = pow (a (i, j), b (i, j));
+	  if (tmp != 0.)
+	    {
+	      result.data (ii) = tmp;
+	      result.ridx (ii++) = i;
+	    }
+	}
+      result.cidx (j+1) = ii;
+    }
+  result.maybe_compress (true);
+
+  return result;
+}
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sparse-xpow.h	Fri Feb 25 19:55:28 2005 +0000
@@ -0,0 +1,61 @@
+/*
+
+Copyright (C) 2004 David Bateman
+Copyright (C) 1998-2004 Andy Adler
+
+Octave 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.
+
+Octave 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; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_sparse_xpow_h)
+#define octave_sparse_xpow_h 1
+
+#include "oct-cmplx.h"
+
+class SparseMatrix;
+class SparseComplexMatrix;
+class octave_value;
+
+extern octave_value xpow (const SparseMatrix& a, double b);
+extern octave_value xpow (const SparseComplexMatrix& a, double b);
+
+extern octave_value elem_xpow (double a, const SparseMatrix& b);
+extern octave_value elem_xpow (double a, const SparseComplexMatrix& b);
+
+extern octave_value elem_xpow (const SparseMatrix& a, double b);
+extern octave_value elem_xpow (const SparseMatrix& a, const SparseMatrix& b);
+extern octave_value elem_xpow (const SparseMatrix& a, const Complex& b);
+extern octave_value elem_xpow (const SparseMatrix& a, 
+			       const SparseComplexMatrix& b);
+
+extern octave_value elem_xpow (const Complex& a, const SparseMatrix& b);
+extern octave_value elem_xpow (const Complex& a, 
+			       const SparseComplexMatrix& b);
+
+extern octave_value elem_xpow (const SparseComplexMatrix& a, double b);
+extern octave_value elem_xpow (const SparseComplexMatrix& a, 
+			       const SparseMatrix& b);
+extern octave_value elem_xpow (const SparseComplexMatrix& a, 
+			       const Complex& b);
+extern octave_value elem_xpow (const SparseComplexMatrix& a, 
+			       const SparseComplexMatrix& b);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
--- a/src/symtab.cc	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/symtab.cc	Fri Feb 25 19:55:28 2005 +0000
@@ -607,7 +607,7 @@
 	      break;
 
 	    case 'e':
-	      os << numel ();
+	      os << capacity ();
 	      break;
 
 	    case 'n':
@@ -1345,7 +1345,7 @@
 			      > static_cast<size_t> (param_length(pos_t)))
 			     ? str.length () : param_length(pos_t));
 
-      elements1 = symbols(i)->numel ();
+      elements1 = symbols(i)->capacity ();
       ss1 << elements1;
       str = ss1.str ();
       param_length(pos_e) = ((str.length ()
@@ -1561,7 +1561,7 @@
 	  for (int j = 0; j < len; j++)
 	    {
 	      symbols(j)->print_symbol_info_line (os, params);
-	      elements += symbols(j)->numel ();
+	      elements += symbols(j)->capacity ();
 	      bytes += symbols(j)->byte_size ();
 	    }
 
--- a/src/symtab.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/symtab.h	Fri Feb 25 19:55:28 2005 +0000
@@ -176,6 +176,9 @@
     int numel (void) const
       { return definition.numel (); };
 
+    int capacity (void) const
+      { return definition.capacity (); };
+
     dim_vector dims (void) const 
       { return definition.dims (); }
 
@@ -380,6 +383,9 @@
   int numel (void) const
     { return definition->numel (); };
 
+  int capacity (void) const
+    { return definition->capacity (); };
+
   dim_vector dims (void) const { return definition->dims (); }
 
   int dimensions_string_req_first_space (int print_dims) const;
--- a/src/token.h	Fri Feb 25 17:42:55 2005 +0000
+++ b/src/token.h	Fri Feb 25 19:55:28 2005 +0000
@@ -23,10 +23,6 @@
 #if !defined (octave_token_h)
 #define octave_token_h 1
 
-#if defined (__GNUG__) && defined (USE_PRAGMA_INTERFACE_IMPLEMENTATION)
-#pragma interface
-#endif
-
 #include <string>
 
 class symbol_record;