mirror of
http://172.16.200.102/MOISE/Timed-Altarica-To-Fiacre-Translator.git
synced 2025-11-26 06:17:57 +01:00
Initial commit.
This commit is contained in:
1053
sdk/boost/numeric/bindings/umfpack/umfpack.hpp
Normal file
1053
sdk/boost/numeric/bindings/umfpack/umfpack.hpp
Normal file
File diff suppressed because it is too large
Load Diff
59
sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp
Normal file
59
sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) Kresimir Fresl 2003
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Author acknowledges the support of the Faculty of Civil Engineering,
|
||||
* University of Zagreb, Croatia.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
/* UMFPACK Copyright, License and Availability */
|
||||
/***********************************************************************/
|
||||
/*
|
||||
*
|
||||
* UMFPACK Version 4.1 (Apr. 30, 2003), Copyright (c) 2003 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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* Used by permission. */
|
||||
|
||||
|
||||
#ifndef BOOST_NUMERIC_BINDINGS_UMFPACK_INC_H
|
||||
#define BOOST_NUMERIC_BINDINGS_UMFPACK_INC_H
|
||||
|
||||
extern "C" {
|
||||
#include <umfpack.h>
|
||||
}
|
||||
|
||||
#endif
|
||||
472
sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp
Normal file
472
sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp
Normal file
@@ -0,0 +1,472 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) Kresimir Fresl 2003
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* Author acknowledges the support of the Faculty of Civil Engineering,
|
||||
* University of Zagreb, Croatia.
|
||||
*
|
||||
*/
|
||||
|
||||
/* for UMFPACK Copyright, License and Availability see umfpack_inc.hpp */
|
||||
|
||||
|
||||
#ifndef BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP
|
||||
#define BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP
|
||||
|
||||
#include <boost/numeric/bindings/umfpack/umfpack_inc.hpp>
|
||||
#include <boost/numeric/bindings/detail/array.hpp>
|
||||
#include <boost/numeric/bindings/traits/detail/utils.hpp>
|
||||
#include <cassert>
|
||||
|
||||
namespace boost { namespace numeric { namespace bindings {
|
||||
|
||||
namespace umfpack { namespace detail {
|
||||
|
||||
////////////////////////////
|
||||
// UMFPACK primary routines:
|
||||
////////////////////////////
|
||||
|
||||
// symbolic
|
||||
|
||||
inline
|
||||
int symbolic (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai, double const* Ax,
|
||||
void **Symbolic, double const* Control, double* Info)
|
||||
{
|
||||
return umfpack_di_symbolic (n_row, n_col, Ap, Ai, Ax,
|
||||
Symbolic, Control, Info);
|
||||
}
|
||||
|
||||
inline
|
||||
int symbolic (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai, traits::complex_d const* Ax,
|
||||
void **Symbolic, double const* Control, double* Info)
|
||||
{
|
||||
int nnz = Ap[n_col];
|
||||
bindings::detail::array<double> Axr (nnz);
|
||||
if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Axi (nnz);
|
||||
if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Ax, Ax+nnz,
|
||||
Axr.storage(), Axi.storage());
|
||||
return umfpack_zi_symbolic (n_row, n_col, Ap, Ai,
|
||||
Axr.storage(), Axi.storage(),
|
||||
Symbolic, Control, Info);
|
||||
}
|
||||
|
||||
|
||||
// numeric
|
||||
|
||||
inline
|
||||
int numeric (int, int,
|
||||
int const* Ap, int const* Ai, double const* Ax,
|
||||
void *Symbolic, void **Numeric,
|
||||
double const* Control, double* Info)
|
||||
{
|
||||
return umfpack_di_numeric (Ap, Ai, Ax, Symbolic, Numeric, Control, Info);
|
||||
}
|
||||
|
||||
inline
|
||||
int numeric (int, int n_col,
|
||||
int const* Ap, int const* Ai, traits::complex_d const* Ax,
|
||||
void *Symbolic, void **Numeric,
|
||||
double const* Control, double* Info)
|
||||
{
|
||||
int nnz = Ap[n_col];
|
||||
bindings::detail::array<double> Axr (nnz);
|
||||
if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Axi (nnz);
|
||||
if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Ax, Ax+nnz,
|
||||
Axr.storage(), Axi.storage());
|
||||
return umfpack_zi_numeric (Ap, Ai, Axr.storage(), Axi.storage(),
|
||||
Symbolic, Numeric, Control, Info);
|
||||
}
|
||||
|
||||
|
||||
// solve
|
||||
|
||||
inline
|
||||
int solve (int sys, int,
|
||||
int const* Ap, int const* Ai, double const* Ax,
|
||||
double* X, double const* B, void *Numeric,
|
||||
double const* Control, double* Info)
|
||||
{
|
||||
return umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info);
|
||||
}
|
||||
|
||||
inline
|
||||
int solve (int sys, int n,
|
||||
int const* Ap, int const* Ai, traits::complex_d const* Ax,
|
||||
traits::complex_d* X, traits::complex_d const* B,
|
||||
void *Numeric, double const* Control, double* Info)
|
||||
{
|
||||
int nnz = Ap[n];
|
||||
bindings::detail::array<double> Axr (nnz);
|
||||
if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Axi (nnz);
|
||||
if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Ax, Ax+nnz,
|
||||
Axr.storage(), Axi.storage());
|
||||
bindings::detail::array<double> Br (n);
|
||||
if (!Br.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Bi (n);
|
||||
if (!Bi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (B, B+n,
|
||||
Br.storage(), Bi.storage());
|
||||
bindings::detail::array<double> Xr (n);
|
||||
if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Xi (n);
|
||||
if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
|
||||
int status = umfpack_zi_solve (sys, Ap, Ai,
|
||||
Axr.storage(), Axi.storage(),
|
||||
Xr.storage(), Xi.storage(),
|
||||
Br.storage(), Bi.storage(),
|
||||
Numeric, Control, Info);
|
||||
if (status != UMFPACK_OK) return status;
|
||||
traits::detail::interlace (Xr.storage(), Xr.storage() + n,
|
||||
Xi.storage(), X);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
// free_symbolic
|
||||
|
||||
inline
|
||||
void free_symbolic (double, int, void **Symbolic) {
|
||||
umfpack_di_free_symbolic (Symbolic);
|
||||
}
|
||||
inline
|
||||
void free_symbolic (traits::complex_d const&, int, void **Symbolic) {
|
||||
umfpack_zi_free_symbolic (Symbolic);
|
||||
}
|
||||
|
||||
|
||||
// free_numeric
|
||||
|
||||
inline
|
||||
void free_numeric (double, int, void **Numeric) {
|
||||
umfpack_di_free_numeric (Numeric);
|
||||
}
|
||||
inline
|
||||
void free_numeric (traits::complex_d const&, int, void **Numeric) {
|
||||
umfpack_zi_free_numeric (Numeric);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////
|
||||
// UMFPACK alternative routines:
|
||||
////////////////////////////////
|
||||
|
||||
// default control
|
||||
|
||||
inline
|
||||
void defaults (double, int, double* Control) {
|
||||
umfpack_di_defaults (Control);
|
||||
}
|
||||
inline
|
||||
void defaults (traits::complex_d const&, int, double* Control) {
|
||||
umfpack_zi_defaults (Control);
|
||||
}
|
||||
|
||||
|
||||
// symbolic with specified column preordering
|
||||
|
||||
inline
|
||||
int qsymbolic (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai, double const* Ax,
|
||||
int const* Qinit,
|
||||
void **Symbolic, double const* Control, double* Info)
|
||||
{
|
||||
return umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit,
|
||||
Symbolic, Control, Info);
|
||||
}
|
||||
|
||||
inline
|
||||
int qsymbolic (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai, traits::complex_d const* Ax,
|
||||
int const* Qinit,
|
||||
void **Symbolic, double const* Control, double* Info)
|
||||
{
|
||||
int nnz = Ap[n_col];
|
||||
bindings::detail::array<double> Axr (nnz);
|
||||
if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Axi (nnz);
|
||||
if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Ax, Ax+nnz,
|
||||
Axr.storage(), Axi.storage());
|
||||
return umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai,
|
||||
Axr.storage(), Axi.storage(),
|
||||
Qinit, Symbolic, Control, Info);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////
|
||||
// UMFPACK matrix manipulation routines
|
||||
///////////////////////////////////////
|
||||
|
||||
// triplet (coordinate) to compressed column
|
||||
|
||||
inline
|
||||
int triplet_to_col (int n_row, int n_col, int nz,
|
||||
int const* Ti, int const* Tj, double const* Tx,
|
||||
int* Ap, int* Ai, double* Ax, int* Map)
|
||||
{
|
||||
return umfpack_di_triplet_to_col (n_row, n_col, nz,
|
||||
Ti, Tj, Tx,
|
||||
Ap, Ai, Ax, Map);
|
||||
}
|
||||
|
||||
inline
|
||||
int triplet_to_col (int n_row, int n_col, int nz,
|
||||
int const* Ti, int const* Tj,
|
||||
traits::complex_d const* Tx,
|
||||
int* Ap, int* Ai, traits::complex_d* Ax,
|
||||
int* Map)
|
||||
{
|
||||
assert (Tx == 0 && Ax == 0 || Tx != 0 && Ax != 0);
|
||||
double *Txr = 0, *Txi = 0;
|
||||
if (Tx != 0) {
|
||||
bindings::detail::array<double> ATxr (nz);
|
||||
if (!ATxr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> ATxi (nz);
|
||||
if (!ATxi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
Txr = ATxr.storage();
|
||||
Txi = ATxi.storage();
|
||||
traits::detail::disentangle (Tx, Tx+nz, Txr, Txi);
|
||||
}
|
||||
double *Axr = 0, *Axi = 0;
|
||||
if (Ax != 0) {
|
||||
bindings::detail::array<double> AAxr (nz);
|
||||
if (!AAxr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> AAxi (nz);
|
||||
if (!AAxi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
Axr = AAxr.storage();
|
||||
Axi = AAxi.storage();
|
||||
}
|
||||
int status;
|
||||
status = umfpack_zi_triplet_to_col (n_row, n_col, nz,
|
||||
Ti, Tj, Txr, Txi,
|
||||
Ap, Ai, Axr, Axi, Map);
|
||||
if (Ax != 0) {
|
||||
if (status != UMFPACK_OK) return status;
|
||||
traits::detail::interlace (Axr, Axr + nz, Axi, Ax);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
// scale
|
||||
|
||||
inline
|
||||
int scale (int, double* X, double const* B, void* Numeric) {
|
||||
return umfpack_di_scale (X, B, Numeric);
|
||||
}
|
||||
|
||||
inline
|
||||
int scale (int n, traits::complex_d* X,
|
||||
traits::complex_d const* B, void* Numeric)
|
||||
{
|
||||
bindings::detail::array<double> Br (n);
|
||||
if (!Br.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Bi (n);
|
||||
if (!Bi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (B, B+n,
|
||||
Br.storage(), Bi.storage());
|
||||
bindings::detail::array<double> Xr (n);
|
||||
if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Xi (n);
|
||||
if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
|
||||
int status = umfpack_zi_scale (Xr.storage(), Xi.storage(),
|
||||
Br.storage(), Bi.storage(),
|
||||
Numeric);
|
||||
if (status != UMFPACK_OK) return status;
|
||||
traits::detail::interlace (Xr.storage(), Xr.storage() + n,
|
||||
Xi.storage(), X);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////
|
||||
// UMFPACK reporting routines:
|
||||
//////////////////////////////
|
||||
|
||||
// report status
|
||||
|
||||
inline
|
||||
void report_status (double, int, double const* Control, int status) {
|
||||
umfpack_di_report_status (Control, status);
|
||||
}
|
||||
inline
|
||||
void report_status (traits::complex_d const&, int,
|
||||
double const* Control, int status)
|
||||
{
|
||||
umfpack_zi_report_status (Control, status);
|
||||
}
|
||||
|
||||
|
||||
// report control
|
||||
|
||||
inline
|
||||
void report_control (double, int, double const* Control) {
|
||||
umfpack_di_report_control (Control);
|
||||
}
|
||||
inline
|
||||
void
|
||||
report_control (traits::complex_d const&, int, double const* Control) {
|
||||
umfpack_zi_report_control (Control);
|
||||
}
|
||||
|
||||
|
||||
// report info
|
||||
|
||||
inline
|
||||
void report_info (double, int, double const* Control, double const* Info) {
|
||||
umfpack_di_report_info (Control, Info);
|
||||
}
|
||||
inline
|
||||
void report_info (traits::complex_d const&, int,
|
||||
double const* Control, double const* Info)
|
||||
{
|
||||
umfpack_zi_report_info (Control, Info);
|
||||
}
|
||||
|
||||
|
||||
// report matrix
|
||||
|
||||
inline
|
||||
int report_matrix (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai, double const* Ax,
|
||||
int col_form, double const* Control)
|
||||
{
|
||||
return umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax,
|
||||
col_form, Control);
|
||||
}
|
||||
|
||||
inline
|
||||
int report_matrix (int n_row, int n_col,
|
||||
int const* Ap, int const* Ai,
|
||||
traits::complex_d const* Ax,
|
||||
int col_form, double const* Control)
|
||||
{
|
||||
int nnz = Ap[n_col];
|
||||
bindings::detail::array<double> Axr (nnz);
|
||||
if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Axi (nnz);
|
||||
if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Ax, Ax+nnz,
|
||||
Axr.storage(), Axi.storage());
|
||||
return umfpack_zi_report_matrix (n_row, n_col, Ap, Ai,
|
||||
Axr.storage(), Axi.storage(),
|
||||
col_form, Control);
|
||||
}
|
||||
|
||||
|
||||
// report triplet (coordinate)
|
||||
|
||||
inline
|
||||
int report_triplet (int n_row, int n_col, int nz,
|
||||
int const* Ti, int const* Tj, double const* Tx,
|
||||
double const* Control)
|
||||
{
|
||||
return umfpack_di_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control);
|
||||
}
|
||||
|
||||
inline
|
||||
int report_triplet (int n_row, int n_col, int nz,
|
||||
int const* Ti, int const* Tj,
|
||||
traits::complex_d const* Tx,
|
||||
double const* Control)
|
||||
{
|
||||
bindings::detail::array<double> Txr (nz);
|
||||
if (!Txr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Txi (nz);
|
||||
if (!Txi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (Tx, Tx+nz,
|
||||
Txr.storage(), Txi.storage());
|
||||
return umfpack_zi_report_triplet (n_row, n_col, nz, Ti, Tj,
|
||||
Txr.storage(), Txi.storage(),
|
||||
Control);
|
||||
}
|
||||
|
||||
|
||||
// report vector
|
||||
|
||||
inline
|
||||
int report_vector (int n, double const* X, double const* Control) {
|
||||
return umfpack_di_report_vector (n, X, Control);
|
||||
}
|
||||
|
||||
inline
|
||||
int report_vector (int n, traits::complex_d const* X,
|
||||
double const* Control)
|
||||
{
|
||||
#if 0
|
||||
// see UMFPACK v 4.1 User Guide
|
||||
bindings::detail::array<double> Xr (n);
|
||||
if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
bindings::detail::array<double> Xi (n);
|
||||
if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory;
|
||||
traits::detail::disentangle (X, X+n,
|
||||
Xr.storage(), Xi.storage());
|
||||
return umfpack_zi_report_vector (n, Xr.storage(), Xi.storage(), Control);
|
||||
#endif
|
||||
return umfpack_zi_report_vector (n,
|
||||
reinterpret_cast<double const*> (X),
|
||||
reinterpret_cast<double const*> (0),
|
||||
Control);
|
||||
}
|
||||
|
||||
|
||||
// report numeric
|
||||
|
||||
inline
|
||||
int report_numeric (double, int, void* Numeric, double const* Control) {
|
||||
return umfpack_di_report_numeric (Numeric, Control);
|
||||
}
|
||||
inline
|
||||
int report_numeric (traits::complex_d const&, int,
|
||||
void* Numeric, double const* Control)
|
||||
{
|
||||
return umfpack_zi_report_numeric (Numeric, Control);
|
||||
}
|
||||
|
||||
|
||||
// report symbolic
|
||||
|
||||
inline
|
||||
int report_symbolic (double, int, void* Symbolic, double const* Control) {
|
||||
return umfpack_di_report_symbolic (Symbolic, Control);
|
||||
}
|
||||
inline
|
||||
int report_symbolic (traits::complex_d const&, int,
|
||||
void* Symbolic, double const* Control)
|
||||
{
|
||||
return umfpack_zi_report_symbolic (Symbolic, Control);
|
||||
}
|
||||
|
||||
|
||||
// report permutation vector
|
||||
|
||||
inline
|
||||
int report_perm (double, int, int np,
|
||||
int const* Perm, double const* Control) {
|
||||
return umfpack_di_report_perm (np, Perm, Control);
|
||||
}
|
||||
inline
|
||||
int report_perm (traits::complex_d const&, int, int np,
|
||||
int const* Perm, double const* Control) {
|
||||
return umfpack_zi_report_perm (np, Perm, Control);
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
}}}
|
||||
|
||||
#endif // BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP
|
||||
Reference in New Issue
Block a user