1 /* ========================================================================== */
2 /* === UMFPACK_save_symbolic ================================================ */
3 /* ========================================================================== */
4 
5 /* -------------------------------------------------------------------------- */
6 /* UMFPACK Copyright (c) Timothy A. Davis, CISE,                              */
7 /* Univ. of Florida.  All Rights Reserved.  See ../Doc/License for License.   */
8 /* web: http://www.cise.ufl.edu/research/sparse/umfpack                       */
9 /* -------------------------------------------------------------------------- */
10 
11 /*
12     User-callable.  Saves a Symbolic object to a file.  It can later be read
13     back in via a call to umfpack_*_load_symbolic.
14 */
15 
16 #include "umf_internal.h"
17 #include "umf_valid_symbolic.h"
18 
19 #define WRITE(object,type,n) \
20 { \
21     ASSERT (object != (type *) NULL) ; \
22     if (fwrite (object, sizeof (type), n, f) != (size_t) n) \
23     { \
24 	fclose (f) ; \
25 	return (UMFPACK_ERROR_file_IO) ; \
26     } \
27 }
28 
29 /* ========================================================================== */
30 /* === UMFPACK_save_symbolic ================================================ */
31 /* ========================================================================== */
32 
UMFPACK_save_symbolic(void * SymbolicHandle,char * user_filename)33 GLOBAL Int UMFPACK_save_symbolic
34 (
35     void *SymbolicHandle,
36     char *user_filename
37 )
38 {
39     SymbolicType *Symbolic ;
40     char *filename ;
41     FILE *f ;
42 
43     /* get the Symbolic object */
44     Symbolic = (SymbolicType *) SymbolicHandle ;
45 
46     /* make sure the Symbolic object is valid */
47     if (!UMF_valid_symbolic (Symbolic))
48     {
49 	return (UMFPACK_ERROR_invalid_Symbolic_object) ;
50     }
51 
52     /* get the filename, or use the default name if filename is NULL */
53     if (user_filename == (char *) NULL)
54     {
55 	filename = "symbolic.umf" ;
56     }
57     else
58     {
59 	filename = user_filename ;
60     }
61     f = fopen (filename, "wb") ;
62     if (!f)
63     {
64 	return (UMFPACK_ERROR_file_IO) ;
65     }
66 
67     /* write the Symbolic object to the file, in binary */
68     WRITE (Symbolic,                     SymbolicType, 1) ;
69     WRITE (Symbolic->Cperm_init,         Int, Symbolic->n_col+1) ;
70     WRITE (Symbolic->Rperm_init,         Int, Symbolic->n_row+1) ;
71     WRITE (Symbolic->Front_npivcol,      Int, Symbolic->nfr+1) ;
72     WRITE (Symbolic->Front_parent,       Int, Symbolic->nfr+1) ;
73     WRITE (Symbolic->Front_1strow,       Int, Symbolic->nfr+1) ;
74     WRITE (Symbolic->Front_leftmostdesc, Int, Symbolic->nfr+1) ;
75     WRITE (Symbolic->Chain_start,        Int, Symbolic->nchains+1) ;
76     WRITE (Symbolic->Chain_maxrows,      Int, Symbolic->nchains+1) ;
77     WRITE (Symbolic->Chain_maxcols,      Int, Symbolic->nchains+1) ;
78     WRITE (Symbolic->Cdeg,               Int, Symbolic->n_col+1) ;
79     WRITE (Symbolic->Rdeg,               Int, Symbolic->n_row+1) ;
80     if (Symbolic->esize > 0)
81     {
82 	/* only when dense rows are present */
83 	WRITE (Symbolic->Esize, Int, Symbolic->esize) ;
84     }
85     if (Symbolic->prefer_diagonal)
86     {
87 	/* only when diagonal pivoting is prefered */
88 	WRITE (Symbolic->Diagonal_map, Int, Symbolic->n_col+1) ;
89     }
90 
91     /* close the file */
92     fclose (f) ;
93 
94     return (UMFPACK_OK) ;
95 }
96