source: CIVL/examples/amg/csr/seq/csr_add_impl.c@ 2e3b9a2

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 2e3b9a2 was 2e3b9a2, checked in by Wenhao Wu <wuwenhao@…>, 10 years ago

Add the specification and implementation version of csr matrix addition

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@3756 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 5.0 KB
Line 
1#include <stdlib.h>
2
3/* = = = = = = = = TASS I/O = = = = = = = = */
4#pragma TASS input {N==1}
5int N;
6#pragma TASS input {M==4}
7int M;
8
9#pragma TASS input
10double A0[N*M];
11#pragma TASS input
12double B0[N*M];
13#pragma TASS output
14double OUTS[N*M];
15
16/* = = = = = = = = Dense and CSR Matrix Def = = = = = = = = */
17struct CSRM_struct {
18 double *data;
19 int *i;
20 int *j;
21 int num_rows;
22 int num_cols;
23 int num_nonzeros;
24};
25
26typedef struct CSRM_struct hypre_CSRMatrix;
27
28/* = = = = = = = = Hypre_CSR = = = = = = = = */
29hypre_CSRMatrix *
30hypre_CSRMatrixCreate(
31 int num_rows,
32 int num_cols,
33 int num_nonzeros )
34{
35 hypre_CSRMatrix *matrix;
36
37 matrix = (hypre_CSRMatrix *) malloc (sizeof(hypre_CSRMatrix));
38 matrix->data = (double *) NULL;
39 matrix->i = (int *) NULL;
40 matrix->j = (int *) NULL;
41 matrix->num_rows = num_rows;
42 matrix->num_cols = num_cols;
43 matrix->num_nonzeros = num_nonzeros;
44
45 return matrix;
46}
47
48
49int
50hypre_CSRMatrixInitialize(
51 hypre_CSRMatrix *matrix )
52{
53 int num_rows;
54 int num_nonzeros;
55 int ierr;
56
57 ierr = 0;
58 num_rows = matrix->num_rows;
59 num_nonzeros = matrix->num_nonzeros;
60
61 if (matrix->data == (double *)NULL && num_nonzeros != 0 )
62 matrix->data = (double *)malloc(num_nonzeros*sizeof(double));
63 if (matrix->i == (int *)NULL)
64 matrix->i = (int *)malloc((num_rows + 1)*sizeof(int));
65 if (matrix->j == (int *)NULL)
66 matrix->j = (int *)malloc(num_nonzeros*sizeof(int));
67 return ierr;
68}
69
70void free_CSR( hypre_CSRMatrix *matrix ) {
71 if (matrix->data != (double *) NULL)
72 free(matrix->data);
73 if (matrix->i != (int *) NULL)
74 free(matrix->i);
75 if (matrix->j != (int *) NULL)
76 free(matrix->j);
77 free(matrix);
78}
79
80hypre_CSRMatrix *
81hypre_CSRMatrixAdd( hypre_CSRMatrix *A, hypre_CSRMatrix *B) {
82 double * A_data;
83 int * A_i;
84 int * A_j;
85 int nrows_A;
86 int ncols_A;
87 double * B_data;
88 int * B_i;
89 int * B_j;
90 int nrows_B;
91 int ncols_B;
92 hypre_CSRMatrix *C;
93 double *C_data;
94 int *C_i;
95 int *C_j;
96 int ia;
97 int ib;
98 int ic;
99 int jcol;
100 int num_nonzeros;
101 int pos;
102 int * marker;
103
104 A_data = A->data;
105 A_i = A->i;
106 A_j = A->j;
107 nrows_A = A->num_rows;
108 ncols_A = A->num_cols;
109 B_data = B->data;
110 B_i = B->i;
111 B_j = B->j;
112 nrows_B = B->num_rows;
113 ncols_B = B->num_cols;
114
115 marker = (int *) malloc (ncols_A * sizeof(int));
116 C_i = (int *) malloc ((nrows_A+1) * sizeof(int));
117 for (ia = 0; ia < ncols_A; ia++)
118 marker[ia] = -1;
119 num_nonzeros = 0;
120 C_i[0] = 0;
121 for (ic = 0; ic < nrows_A; ic++) {
122 for (ia = A_i[ic]; ia < A_i[ic+1]; ia++) {
123 jcol = A_j[ia];
124 marker[jcol] = ic;
125 num_nonzeros++;
126 }
127 for (ib = B_i[ic]; ib < B_i[ic+1]; ib++) {
128 jcol = B_j[ib];
129 if (marker[jcol] != ic) {
130 marker[jcol] = ic;
131 num_nonzeros++;
132 }
133 }
134 C_i[ic+1] = num_nonzeros;
135 }
136
137 C = hypre_CSRMatrixCreate(nrows_A, ncols_A, num_nonzeros);
138 C->i = C_i;
139 hypre_CSRMatrixInitialize(C);
140 C_j = C->j;
141 C_data = C->data;
142
143 for (ia = 0; ia < ncols_A; ia++)
144 marker[ia] = -1;
145 pos = 0;
146
147addLoop:
148 for (ic = 0; ic < nrows_A; ic++) {
149 for (ia = A_i[ic]; ia < A_i[ic+1]; ia++) {
150 jcol = A_j[ia];
151 C_j[pos] = jcol;
152 C_data[pos] = A_data[ia];
153 marker[jcol] = pos;
154 pos++;
155 }
156 for (ib = B_i[ic]; ib < B_i[ic+1]; ib++) {
157 jcol = B_j[ib];
158 if (marker[jcol] < C_i[ic]) {
159 C_j[pos] = jcol;
160 C_data[pos] = B_data[ib];
161 marker[jcol] = pos;
162 pos++;
163 }else{
164 C_data[marker[jcol]] += B_data[ib];
165 }
166 }
167 }
168 free(marker);
169 return C;
170}
171
172double *
173expand(hypre_CSRMatrix * mat)
174{
175 int i;
176 int j;
177 int k;
178 double * rtn;
179
180 rtn = (double *) malloc ((mat->num_rows) * (mat->num_cols) * sizeof(double));
181 for (i = 0; i < mat->num_rows;i++)
182 for (j = 0; j < mat->num_cols; j++)
183 rtn[i*M + j] = 0.0;
184 k = 0;
185 for (i = 0; i < mat->num_rows; i++)
186 while(k < mat->i[i+1])
187 for (j = 0; (k < mat->num_nonzeros) && (j < mat->num_cols); j++)
188 if (j == mat->j[k]){
189 rtn[i*M + j] = mat->data[k];
190 k++;
191 }
192
193 return rtn;
194}
195
196int main() {
197 int i;
198 int j;
199 int k;
200 int xnz;
201 int ynz;
202 double tmp;
203 double * sum;
204 hypre_CSRMatrix * X;
205 hypre_CSRMatrix * Y;
206 hypre_CSRMatrix * Z;
207
208 xnz = 0;
209 for (i=0; i < N*M; i++)
210 if (A0[i] != 0)
211 xnz = xnz + 1;
212 ynz = 0;
213 for (i=0; i < N*M; i++)
214 if (B0[i] != 0)
215 ynz = ynz + 1;
216 X = hypre_CSRMatrixCreate(N,M, xnz);
217 Y = hypre_CSRMatrixCreate(N,M, ynz);
218 hypre_CSRMatrixInitialize(X);
219 hypre_CSRMatrixInitialize(Y);
220 k = 0;
221 X->i[0] = k;
222 for (i = 0; i < N; i++){
223 for (j = 0; j < M; j++){
224 tmp = A0[i*M + j];
225 if (tmp != 0){
226 X->data[k] = tmp;
227 X->j[k] = j;
228 k++;
229 }
230 }
231 X->i[i+1] = k;
232 }
233 k = 0;
234 Y->i[0] = k;
235 for (i = 0; i < N; i++){
236 for (j = 0; j < M; j++){
237 tmp = B0[i*M + j];
238 if (tmp != 0){
239 Y->data[k] = tmp;
240 Y->j[k] = j;
241 k++;
242 }
243 }
244 Y->i[i+1] = k;
245 }
246 Z = hypre_CSRMatrixAdd(X,Y);
247 sum = expand(Z);
248 for (i=0; i<N*M; i++)
249 OUTS[i] = sum[i];
250 free_CSR(X);
251 free_CSR(Y);
252 free_CSR(Z);
253 free(sum);
254 return 0;
255}
Note: See TracBrowser for help on using the repository browser.