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