umfpack-rs 0.0.1

Some UMFPACK bindings for rust
use super::control::Control;
use super::info::Info;
use super::numeric::Numeric;
use super::symbolic::Symbolic;
use super::sys::UMFPACK;
use num_complex::Complex64;
use std::ffi::c_void;
use std::ptr;

mod c {
    use std::ffi::c_void;

    #[link(name="umfpack")]
    extern "C" {
        pub fn umfpack_zi_symbolic(
            n: i32,
            m: i32,
            Ap: *const i32,
            Ai: *const i32,
            Ax: *const f64,
            Az: *const f64,
            Symbolic: *mut *mut c_void,
            Control: *const f64,
            Info: *mut f64,
        ) -> i32;
        pub fn umfpack_zi_numeric(
            Ap: *const i32,
            Ai: *const i32,
            Ax: *const f64,
            Az: *const f64,
            Symbolic: *const c_void,
            Numeric: *mut *mut c_void,
            Control: *const f64,
            Info: *mut f64,
        ) -> i32;
        pub fn umfpack_zi_free_symbolic(Symbolic: *mut *mut c_void);
        pub fn umfpack_zi_free_numeric(Numeric: *mut *mut c_void);
        pub fn umfpack_zi_solve(
            sys: i32,
            Ap: *const i32,
            Ai: *const i32,
            Ax: *const f64,
            Az: *const f64,
            Xx: *mut f64,
            Xz: *mut f64,
            Bx: *const f64,
            Bz: *const f64,
            Numeric: *const c_void,
            Control: *const f64,
            Info: *mut f64,
        ) -> i32;
    }
}

#[allow(non_snake_case)]
pub fn umfpack_zi_symbolic(
    n: i32,
    m: i32,
    Ap: &[i32],
    Ai: &[i32],
    Az: &[Complex64],
    symbolic: &mut Symbolic,
    control: Option<&Control>,
    info: Option<&mut Info>,
) -> i32 {
    unsafe {
        c::umfpack_zi_symbolic(
            n,
            m,
            Ap.as_ptr(),
            Ai.as_ptr(),
            Az.as_ptr() as *const f64,
            ptr::null(),
            &mut symbolic.data as *mut *mut c_void,
            match control {
                None => ptr::null(),
                Some(c) => c.data().as_ptr(),
            },
            match info {
                None => ptr::null_mut(),
                Some(i) => i.data.as_mut_ptr(),
            },
        )
    }
}

#[allow(non_snake_case)]
pub fn umfpack_zi_numeric(
    Ap: &[i32],
    Ai: &[i32],
    Az: &[Complex64],
    symbolic: &Symbolic,
    numeric: &mut Numeric,
    control: Option<&Control>,
    info: Option<&mut Info>,
) -> i32 {
    unsafe {
        c::umfpack_zi_numeric(
            Ap.as_ptr(),
            Ai.as_ptr(),
            Az.as_ptr() as *const f64,
            ptr::null(),
            symbolic.data,
            &mut numeric.data as *mut *mut c_void,
            match control {
                None => ptr::null(),
                Some(c) => c.data().as_ptr(),
            },
            match info {
                None => ptr::null_mut(),
                Some(i) => i.data.as_mut_ptr(),
            },
        )
    }
}

pub fn umfpack_zi_free_symbolic(symbolic: &mut Symbolic) {
    unsafe { c::umfpack_zi_free_symbolic(&mut symbolic.data as *mut *mut c_void) }
}

pub fn umfpack_zi_free_numeric(numeric: &mut Numeric) {
    unsafe { c::umfpack_zi_free_numeric(&mut numeric.data as *mut *mut c_void) }
}

#[allow(non_snake_case)]
pub fn umfpack_zi_solve(
    sys: UMFPACK,
    Ap: &[i32],
    Ai: &[i32],
    Az: &[Complex64],
    Xz: &mut [Complex64],
    Bz: &[Complex64],
    numeric: &Numeric,
    control: Option<&Control>,
    info: Option<&mut Info>,
) -> i32 {
    unsafe {
        c::umfpack_zi_solve(
            sys.to_int(),
            Ap.as_ptr(),
            Ai.as_ptr(),
            Az.as_ptr() as *const f64,
            ptr::null(),
            Xz.as_mut_ptr() as *mut f64,
            ptr::null_mut(),
            Bz.as_ptr() as *const f64,
            ptr::null(),
            numeric.data,
            match control {
                None => ptr::null(),
                Some(c) => c.data().as_ptr(),
            },
            match info {
                None => ptr::null_mut(),
                Some(i) => i.data.as_mut_ptr(),
            },
        )
    }
}