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