1 // =============================================================================
2 // === spqr_freenum ============================================================
3 // =============================================================================
4
5 // Frees the contents of the QR Numeric object
6
7 #include "spqr.hpp"
8
spqr_freenum(spqr_numeric<Entry> ** QRnum_handle,cholmod_common * cc)9 template <typename Entry> void spqr_freenum
10 (
11 spqr_numeric <Entry> **QRnum_handle,
12
13 // workspace and parameters
14 cholmod_common *cc
15 )
16 {
17 spqr_numeric <Entry> *QRnum ;
18 Long nf, n, m, rjsize, hisize, ns, stack, maxstack ;
19
20 if (QRnum_handle == NULL || *QRnum_handle == NULL)
21 {
22 // nothing to do; caller probably ran out of memory
23 return ;
24 }
25 QRnum = *QRnum_handle ;
26
27 n = QRnum->n ;
28 m = QRnum->m ;
29 nf = QRnum->nf ;
30 rjsize = QRnum->rjsize ;
31 hisize = QRnum->hisize ;
32 ns = QRnum->ns ;
33 maxstack = QRnum->maxstack ;
34
35 cholmod_l_free (nf, sizeof (Entry *), QRnum->Rblock, cc) ;
36 cholmod_l_free (n, sizeof (char), QRnum->Rdead, cc) ;
37
38 if (QRnum->keepH)
39 {
40 // QRnum->H* items are present only if H is kept
41 cholmod_l_free (rjsize, sizeof (Long), QRnum->HStair, cc) ;
42 cholmod_l_free (rjsize, sizeof (Entry), QRnum->HTau, cc) ;
43 cholmod_l_free (nf, sizeof (Long), QRnum->Hm, cc) ;
44 cholmod_l_free (nf, sizeof (Long), QRnum->Hr, cc) ;
45 cholmod_l_free (hisize, sizeof (Long), QRnum->Hii, cc) ;
46 cholmod_l_free (m, sizeof (Long), QRnum->HPinv, cc) ;
47 }
48
49 // free each stack
50 if (QRnum->Stacks != NULL)
51 {
52 Long *Stack_size = QRnum->Stack_size ;
53 for (stack = 0 ; stack < ns ; stack++)
54 {
55 size_t s = Stack_size ? (Stack_size [stack]) : maxstack ;
56 cholmod_l_free (s, sizeof (Entry), QRnum->Stacks [stack], cc) ;
57 }
58 }
59 cholmod_l_free (ns, sizeof (Entry *), QRnum->Stacks, cc) ;
60 cholmod_l_free (ns, sizeof (Long), QRnum->Stack_size, cc) ;
61
62 cholmod_l_free (1, sizeof (spqr_numeric<Entry>), QRnum, cc) ;
63 *QRnum_handle = NULL ;
64 }
65
66 // =============================================================================
67
68 template void spqr_freenum <double>
69 (
70 spqr_numeric <double> **QRnum_handle,
71
72 // workspace and parameters
73 cholmod_common *cc
74 ) ;
75
76 // =============================================================================
77
78 template void spqr_freenum <Complex>
79 (
80 spqr_numeric <Complex> **QRnum_handle,
81
82 // workspace and parameters
83 cholmod_common *cc
84 ) ;
85