1 /*
2 ARPACK++ v1.2 2/20/2000
3 c++ interface to ARPACK code.
4
5 MODULE CHOLMODc.h.
6 Interface to CHOLMOD routines.
7
8 Author of this class:
9 Martin Reuter
10 Date 11/05/2012
11
12 Arpack++ Author:
13 Francisco Gomes
14
15 ARPACK Authors
16 Richard Lehoucq
17 Danny Sorensen
18 Chao Yang
19 Dept. of Computational & Applied Mathematics
20 Rice University
21 Houston, Texas
22 */
23
24 #ifndef CHOLMODC_H
25 #define CHOLMODC_H
26
27 #include "cholmod.h"
28 #include <fstream>
29
Write_Cholmod_Sparse_Matrix(const std::string & fname,cholmod_sparse * A,cholmod_common * c)30 inline void Write_Cholmod_Sparse_Matrix(const std::string & fname,
31 cholmod_sparse* A, cholmod_common *c)
32 {
33 std::ofstream myfile;
34 myfile.open ( fname.c_str() );
35 cholmod_triplet * T = cholmod_sparse_to_triplet(A,c);
36 //std::cout << " [ " << std::endl;
37 myfile.precision(20);
38 for (unsigned int i=0;i<T->nnz;i++)
39 {
40 myfile << ((int*)T->i)[i]+1 << " " << ((int*)T->j)[i]+1 << " " << ((double*)T->x)[i] << std::endl;
41 }
42 //std::cout << " ] " << std::endl;
43 myfile.close();
44
45 cholmod_free_triplet(&T,c);
46
47 }
48
49 // Create_Cholmod_Sparse_Matrix
Create_Cholmod_Sparse_Matrix(int m,int n,int nnz,double * a,int * irow,int * pcol,char uplo,cholmod_common * c)50 inline cholmod_sparse* Create_Cholmod_Sparse_Matrix(int m, int n, int nnz,
51 double* a, int* irow, int* pcol, char uplo, cholmod_common *c)
52 {
53
54 cholmod_sparse* A = new cholmod_sparse;
55 A->nrow = m;
56 A->ncol = n;
57 A->nzmax = nnz;
58 A->p = pcol;
59 A->i = irow;
60 A->nz = NULL;
61 A->x = a;
62 A->z = NULL;
63 if (uplo == 'L') A->stype = -1;
64 else A->stype = 1;
65 A->itype = CHOLMOD_INT;
66 A->xtype = CHOLMOD_REAL; // real
67 A->dtype = CHOLMOD_DOUBLE; // double
68 A->sorted = 0;
69 A->packed = 1;
70
71 return A;
72
73
74 /* double* hd = new double[nnz];
75 int* hi = new int[nnz];
76 int* hp = new int[n+1];
77
78 int col,j;
79 int counter=0;
80 int counter2=0;
81 for (col=0;col<n;col++) // column
82 {
83 hp[col] = counter2;
84 for (j=pcol[col];j<pcol[col+1];j++)
85 {
86 int & row = irow[counter];
87 if ((uplo == 'L' && row >= col) ||(uplo == 'U' && row <= col))
88 {
89 hd[counter2] = a[counter];
90 hi[counter2] = irow[counter];
91 counter2++;
92 //std::cout << " In : " << std::flush;
93 }
94 //else std::cout << " Out : " << std::flush;
95
96 //std::cout << row+1 << " " << col+1 << " " << a[counter] << std::endl;
97 counter++;
98 }
99
100 }
101 hp[n] = counter2;
102
103
104 cholmod_sparse* A = new cholmod_sparse;
105 A->nrow = m;
106 A->ncol = n;
107 A->nzmax = counter2;
108 A->p = hp;
109 A->i = hi;
110 A->nz = NULL;
111 A->x = hd;
112 A->z = NULL;
113 if (uplo == 'L') A->stype = -1;
114 else A->stype = 1;
115 A->itype = CHOLMOD_INT;
116 A->xtype = CHOLMOD_REAL; // real
117 A->dtype = CHOLMOD_DOUBLE; // double
118 A->sorted = 0;
119 A->packed = 1;
120
121 //cholmod_sparse* As = cholmod_copy_sparse(A,c);
122
123 return A;*/
124
125 } // Create_Cholmod_Sparse_Matrix (double).
126
127 // Create_Cholmod_Dense_Matrix (from Triplet)
Create_Cholmod_Dense_Matrix(int m,int n,double * a,cholmod_common * c)128 inline cholmod_dense* Create_Cholmod_Dense_Matrix(int m, int n,
129 double* a, cholmod_common *c)
130 {
131
132
133 cholmod_dense* A = new cholmod_dense;
134 A->nrow = m;
135 A->ncol = n;
136 A->nzmax = m*n;
137 A->d = m;
138 A->x = a;
139 A->z = NULL;
140 A->xtype = CHOLMOD_REAL; // real
141 A->dtype = CHOLMOD_DOUBLE; // double
142
143 // cholmod_dense* As = cholmod_copy_dense(A,c);
144
145 return A;
146
147 } // Create_Cholmod_Dense_Matrix (double).
148
149 // Create_Cholmod_Dense_Matrix (from Triplet)
Get_Cholmod_Dense_Data(cholmod_dense * A,int n,double * a)150 inline void Get_Cholmod_Dense_Data(cholmod_dense* A, int n, double* a)
151 {
152 memcpy(a,A->x,n*sizeof(double));
153
154 // for (int i = 0;i<n;i++)
155 // a[i] = ((double*)A->x)[i];
156
157 } // Create_Cholmod_Dense_Matrix (double).
158
159
160
161 #endif // CHOLMODC_H
162