diff -Nabur UMFPACKv4.3/UMFPACK/Include/umfpack_load_numeric.h UMFPACKv4.3-new/UMFPACK/Include/umfpack_load_numeric.h
--- UMFPACKv4.3/UMFPACK/Include/umfpack_load_numeric.h	2004-01-29 19:40:48.000000000 +0000
+++ UMFPACKv4.3-new/UMFPACK/Include/umfpack_load_numeric.h	2004-04-18 06:25:28.000000000 +0000
@@ -33,6 +33,30 @@
     char *filename
 ) ;
 
+int umfpack_di_load_numeric_mem
+(
+    void **Numeric,
+    char *user_mem
+) ;
+
+long umfpack_dl_load_numeric_mem
+(
+    void **Numeric,
+    char *user_mem
+) ;
+
+int umfpack_zi_load_numeric_mem
+(
+    void **Numeric,
+    char *user_mem
+) ;
+
+long umfpack_zl_load_numeric_mem
+(
+    void **Numeric,
+    char *user_mem
+) ;
+
 /*
 double int Syntax:
 
diff -Nabur UMFPACKv4.3/UMFPACK/Include/umfpack_save_numeric.h UMFPACKv4.3-new/UMFPACK/Include/umfpack_save_numeric.h
--- UMFPACKv4.3/UMFPACK/Include/umfpack_save_numeric.h	2004-01-29 19:40:48.000000000 +0000
+++ UMFPACKv4.3-new/UMFPACK/Include/umfpack_save_numeric.h	2004-04-18 06:25:06.000000000 +0000
@@ -33,6 +33,90 @@
     char *filename
 ) ;
 
+int umfpack_di_save_numeric_mem
+(
+    void *Numeric,
+    char *user_mem
+) ;
+
+long umfpack_dl_save_numeric_mem
+(
+    void *Numeric,
+    char *user_mem
+) ;
+
+int umfpack_zi_save_numeric_mem
+(
+    void *Numeric,
+    char *user_mem
+) ;
+
+long umfpack_zl_save_numeric_mem
+(
+    void *Numeric,
+    char *user_mem
+) ;
+
+int umfpack_di_numeric_bytes
+(
+    void *Numeric
+) ;
+
+long umfpack_dl_numeric_bytes
+(
+    void *Numeric
+) ;
+
+int umfpack_zi_numeric_bytes
+(
+    void *Numeric
+) ;
+
+long umfpack_zl_numeric_bytes
+(
+    void *Numeric
+) ;
+
+int umfpack_di_negatives_on_diag
+(
+    void *Numeric
+) ;
+
+long umfpack_dl_negatives_on_diag
+(
+    void *Numeric
+) ;
+
+int umfpack_zi_negatives_on_diag
+(
+    void *Numeric
+) ;
+
+long umfpack_zl_negatives_on_diag
+(
+    void *Numeric
+) ;
+
+double* umfpack_di_u_diagonal
+(
+    void *Numeric
+) ;
+
+double* umfpack_dl_u_diagonal
+(
+    void *Numeric
+) ;
+
+double* umfpack_zi_u_diagonal
+(
+    void *Numeric
+) ;
+
+double* umfpack_zl_u_diagonal
+(
+    void *Numeric
+) ;
+
 /*
 double int Syntax:
 
diff -Nabur UMFPACKv4.3/UMFPACK/Source/umf_version.h UMFPACKv4.3-new/UMFPACK/Source/umf_version.h
--- UMFPACKv4.3/UMFPACK/Source/umf_version.h	2004-01-29 19:41:06.000000000 +0000
+++ UMFPACKv4.3-new/UMFPACK/Source/umf_version.h	2004-04-18 06:24:04.000000000 +0000
@@ -615,8 +615,13 @@
 #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_numeric_mem umfpack_di_save_numeric_mem
+#define UMFPACK_negatives_on_diag umfpack_di_negatives_on_diag          
+#define UMFPACK_u_diagonal       umfpack_di_u_diagonal                 
 #define UMFPACK_save_symbolic	 umfpack_di_save_symbolic
+#define UMFPACK_numeric_bytes    umfpack_di_numeric_bytes
 #define UMFPACK_load_numeric	 umfpack_di_load_numeric
+#define UMFPACK_load_numeric_mem umfpack_di_load_numeric_mem
 #define UMFPACK_load_symbolic	 umfpack_di_load_symbolic
 #define UMFPACK_scale		 umfpack_di_scale
 #define UMFPACK_solve		 umfpack_di_solve
@@ -729,8 +734,12 @@
 #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_numeric_mem umfpack_dl_save_numeric_mem
+#define UMFPACK_negatives_on_diag umfpack_dl_negatives_on_diag          
+#define UMFPACK_u_diagonal       umfpack_dl_u_diagonal                 
 #define UMFPACK_save_symbolic	 umfpack_dl_save_symbolic
 #define UMFPACK_load_numeric	 umfpack_dl_load_numeric
+#define UMFPACK_load_numeric_mem umfpack_dl_load_numeric_mem
 #define UMFPACK_load_symbolic	 umfpack_dl_load_symbolic
 #define UMFPACK_scale		 umfpack_dl_scale
 #define UMFPACK_solve		 umfpack_dl_solve
@@ -843,8 +852,12 @@
 #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_numeric_mem umfpack_zi_save_numeric_mem
+#define UMFPACK_negatives_on_diag umfpack_zi_negatives_on_diag          
+#define UMFPACK_u_diagonal       umfpack_zi_u_diagonal                 
 #define UMFPACK_save_symbolic	 umfpack_zi_save_symbolic
 #define UMFPACK_load_numeric	 umfpack_zi_load_numeric
+#define UMFPACK_load_numeric_mem umfpack_zi_load_numeric_mem
 #define UMFPACK_load_symbolic	 umfpack_zi_load_symbolic
 #define UMFPACK_scale		 umfpack_zi_scale
 #define UMFPACK_solve		 umfpack_zi_solve
@@ -957,8 +970,12 @@
 #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_numeric_mem umfpack_zl_save_numeric_mem
+#define UMFPACK_negatives_on_diag umfpack_zl_negatives_on_diag          
+#define UMFPACK_u_diagonal       umfpack_zl_u_diagonal                 
 #define UMFPACK_save_symbolic	 umfpack_zl_save_symbolic
 #define UMFPACK_load_numeric	 umfpack_zl_load_numeric
+#define UMFPACK_load_numeric_mem umfpack_zl_load_numeric_mem
 #define UMFPACK_load_symbolic	 umfpack_zl_load_symbolic
 #define UMFPACK_scale		 umfpack_zl_scale
 #define UMFPACK_solve		 umfpack_zl_solve
diff -Nabur UMFPACKv4.3/UMFPACK/Source/umfpack_load_numeric.c UMFPACKv4.3-new/UMFPACK/Source/umfpack_load_numeric.c
--- UMFPACKv4.3/UMFPACK/Source/umfpack_load_numeric.c	2004-01-29 19:41:06.000000000 +0000
+++ UMFPACKv4.3-new/UMFPACK/Source/umfpack_load_numeric.c	2004-04-18 06:16:36.000000000 +0000
@@ -42,6 +42,18 @@
     } \
 }
 
+#define READMEM(mem,offset,object,type,n) \
+{ \
+    object = (type *) UMF_malloc (n, sizeof (type)) ; \
+    if (object == (type *) NULL) \
+    { \
+        UMFPACK_free_numeric ((void **) &Numeric) ; \
+        return (UMFPACK_ERROR_out_of_memory) ; \
+    } \
+    memcpy(object, mem[offset], sizeof(type)*(n) ); \
+    offset += sizeof(type)*(n); \
+}
+
 /* ========================================================================== */
 /* === UMFPACK_load_numeric ================================================= */
 /* ========================================================================== */
@@ -160,3 +172,85 @@
     *NumericHandle = (void *) Numeric ;
     return (UMFPACK_OK) ;
 }
+
+GLOBAL Int UMFPACK_load_numeric_mem
+(
+    void **NumericHandle,
+    char *user_mem
+)
+{
+    NumericType *Numeric ;
+    char *filename ;
+    int Off = 0, nEntry ;
+
+    *NumericHandle = (void *) NULL ;
+
+    /* ---------------------------------------------------------------------- */
+    /* read the Numeric header from memory                                    */
+    /* ---------------------------------------------------------------------- */
+
+    Numeric = (NumericType *) UMF_malloc (1, sizeof (NumericType)) ;
+    if (Numeric == (NumericType *) NULL)
+    {
+        return (UMFPACK_ERROR_out_of_memory) ;
+    }
+    READMEM(&user_mem, Off, Numeric, NumericType, 1);
+
+    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) ;
+        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 */
+    /* ---------------------------------------------------------------------- */
+
+    nEntry = MIN (Numeric->n_row, Numeric->n_col)+1 ;
+    READMEM (&user_mem, Off, Numeric->D,     Entry, nEntry ) ;
+    READMEM (&user_mem, Off, Numeric->Rperm, Int,   Numeric->n_row+1) ;
+    READMEM (&user_mem, Off, Numeric->Cperm, Int,   Numeric->n_col+1) ;
+    READMEM (&user_mem, Off, Numeric->Lpos,  Int,   Numeric->npiv+1) ;
+    READMEM (&user_mem, Off, Numeric->Lilen, Int,   Numeric->npiv+1) ;
+    READMEM (&user_mem, Off, Numeric->Lip,   Int,   Numeric->npiv+1) ;
+    READMEM (&user_mem, Off, Numeric->Upos,  Int,   Numeric->npiv+1) ;
+    READMEM (&user_mem, Off, Numeric->Uilen, Int,   Numeric->npiv+1) ;
+    READMEM (&user_mem, Off, Numeric->Uip,   Int,   Numeric->npiv+1) ;
+    if (Numeric->scale != UMFPACK_SCALE_NONE)
+    {
+        READMEM (&user_mem, Off, Numeric->Rs, double, Numeric->n_row) ;
+    }
+    if (Numeric->ulen > 0)
+    {
+        READMEM (&user_mem, Off, Numeric->Upattern, Int, Numeric->ulen+1) ;
+    }
+    READMEM (&user_mem, Off, Numeric->Memory, Unit, Numeric->size) ;
+
+    /* 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) ;
+}
diff -Nabur UMFPACKv4.3/UMFPACK/Source/umfpack_save_numeric.c UMFPACKv4.3-new/UMFPACK/Source/umfpack_save_numeric.c
--- UMFPACKv4.3/UMFPACK/Source/umfpack_save_numeric.c	2004-01-29 19:41:05.000000000 +0000
+++ UMFPACKv4.3-new/UMFPACK/Source/umfpack_save_numeric.c	2004-04-18 06:16:08.000000000 +0000
@@ -27,6 +27,13 @@
     } \
 }
 
+#define WRITEMEM(mem,offset,object,type,n) \
+{ \
+    ASSERT (object != (type *) NULL) ; \
+    memcpy(mem[offset], object, sizeof(type)*(n) ); \
+    offset += sizeof(type)*(n); \
+}
+
 /* ========================================================================== */
 /* === UMFPACK_save_numeric ================================================= */
 /* ========================================================================== */
@@ -91,3 +98,118 @@
 
     return (UMFPACK_OK) ;
 }
+
+GLOBAL Int UMFPACK_save_numeric_mem
+(
+    void *NumericHandle,
+    char *user_mem
+)
+{
+    NumericType *Numeric ;
+    int Off = 0, nEntry;
+
+    /* 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) ;
+    }
+
+    nEntry = MIN (Numeric->n_row, Numeric->n_col)+1 ;
+    /* write the Numeric object to memory */
+    WRITEMEM (&user_mem, Off, Numeric,        NumericType, 1) ;
+    WRITEMEM (&user_mem, Off, Numeric->D,     Entry, nEntry) ;
+    WRITEMEM (&user_mem, Off, Numeric->Rperm, Int,   Numeric->n_row+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Cperm, Int,   Numeric->n_col+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Lpos,  Int,   Numeric->npiv+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Lilen, Int,   Numeric->npiv+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Lip,   Int,   Numeric->npiv+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Upos,  Int,   Numeric->npiv+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Uilen, Int,   Numeric->npiv+1) ;
+    WRITEMEM (&user_mem, Off, Numeric->Uip,   Int,   Numeric->npiv+1) ;
+    if (Numeric->scale != UMFPACK_SCALE_NONE)
+    {
+        WRITEMEM (&user_mem, Off, Numeric->Rs, double, Numeric->n_row) ;
+    }
+    if (Numeric->ulen > 0)
+    {
+        WRITEMEM(&user_mem, Off, Numeric->Upattern, Int, Numeric->ulen+1);
+    }
+    WRITEMEM (&user_mem, Off, Numeric->Memory, Unit, Numeric->size) ;
+
+    return (UMFPACK_OK) ;
+}
+
+GLOBAL Int UMFPACK_numeric_bytes
+(
+    void *NumericHandle
+)
+{
+    NumericType *Numeric ;
+    int nBytes  = 0;
+
+    /* 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) ;
+    }
+
+    nBytes += sizeof( NumericType) ;
+    nBytes += sizeof( Entry ) * ( MIN(Numeric->n_row, Numeric->n_col)+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->n_row+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->n_col+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    nBytes += sizeof( Int   ) * ( Numeric->npiv+1) ;
+    if (Numeric->scale != UMFPACK_SCALE_NONE)
+    {
+        nBytes += sizeof( double ) * (Numeric->n_row) ;
+    }
+    if (Numeric->ulen > 0)
+    {
+        nBytes += sizeof( Int ) * (Numeric->ulen+1) ;
+    }
+    nBytes += sizeof( Unit ) * (Numeric->size) ;
+
+    return nBytes ;
+}
+
+GLOBAL Int UMFPACK_negatives_on_diag
+(
+    void *NumericHandle
+)
+{
+    NumericType *Numeric ;
+    int i, count = 0;
+
+    /* get the Numeric object */
+    Numeric = (NumericType *) NumericHandle ;
+
+    for (i = 0; i < Numeric->n_row; i++) {
+        if ( REAL_COMPONENT( (*Numeric).D[i] ) < 0.0 )
+            ++count;
+    }
+
+    return count ;
+}
+
+GLOBAL double* UMFPACK_u_diagonal
+(
+    void *NumericHandle
+)
+{
+    NumericType *Numeric ;
+
+    /* get the Numeric object */
+    Numeric = (NumericType *) NumericHandle ;
+
+    return (double *) &(*Numeric).D[0];
+}
