NEURON
sparseio.c
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 
3 /**************************************************************************
4 **
5 ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
6 **
7 ** Meschach Library
8 **
9 ** This Meschach Library is provided "as is" without any express
10 ** or implied warranty of any kind with respect to this software.
11 ** In particular the authors shall not be liable for any direct,
12 ** indirect, special, incidental or consequential damages arising
13 ** in any way from use of the software.
14 **
15 ** Everyone is granted permission to copy, modify and redistribute this
16 ** Meschach Library, provided:
17 ** 1. All copies contain this copyright notice.
18 ** 2. All modified copies shall carry a notice stating who
19 ** made the last modification and the date of such modification.
20 ** 3. No charge is made for this software or works derived from it.
21 ** This clause shall not be construed as constraining other software
22 ** distributed on the same medium as this software, nor is a
23 ** distribution fee considered a charge.
24 **
25 ***************************************************************************/
26 
27 
28 /*
29  This file has the routines for sparse matrix input/output
30  It works in conjunction with sparse.c, sparse.h etc
31 */
32 
33 #include <stdio.h>
34 #include "sparse.h"
35 
36 static char rcsid[] = "sparseio.c,v 1.1 1997/12/04 17:55:49 hines Exp";
37 
38 
39 
40 /* local variables */
41 static char line[MAXLINE];
42 
43 /* sp_foutput -- output sparse matrix A to file/stream fp */
45 FILE *fp;
46 SPMAT *A;
47 {
48  int i, j_idx, m /* , n */;
49  SPROW *rows;
50  row_elt *elts;
51 
52  fprintf(fp,"SparseMatrix: ");
53  if ( A == SMNULL )
54  {
55  fprintf(fp,"*** NULL ***\n");
56  error(E_NULL,"sp_foutput"); return;
57  }
58  fprintf(fp,"%d by %d\n",A->m,A->n);
59  m = A->m; /* n = A->n; */
60  if ( ! (rows=A->row) )
61  {
62  fprintf(fp,"*** NULL rows ***\n");
63  error(E_NULL,"sp_foutput"); return;
64  }
65 
66  for ( i = 0; i < m; i++ )
67  {
68  fprintf(fp,"row %d: ",i);
69  if ( ! (elts=rows[i].elt) )
70  {
71  fprintf(fp,"*** NULL element list ***\n");
72  continue;
73  }
74  for ( j_idx = 0; j_idx < rows[i].len; j_idx++ )
75  {
76  fprintf(fp,"%d:%-20.15g ",elts[j_idx].col,
77  elts[j_idx].val);
78  if ( j_idx % 3 == 2 && j_idx != rows[i].len-1 )
79  fprintf(fp,"\n ");
80  }
81  fprintf(fp,"\n");
82  }
83  fprintf(fp,"#\n"); /* to stop looking beyond for next entry */
84 }
85 
86 /* sp_foutput2 -- print out sparse matrix **as a dense matrix**
87  -- see output format used in matrix.h etc */
88 /******************************************************************
89 void sp_foutput2(fp,A)
90 FILE *fp;
91 SPMAT *A;
92 {
93  int cnt, i, j, j_idx;
94  SPROW *r;
95  row_elt *elt;
96 
97  if ( A == SMNULL )
98  {
99  fprintf(fp,"Matrix: *** NULL ***\n");
100  return;
101  }
102  fprintf(fp,"Matrix: %d by %d\n",A->m,A->n);
103  for ( i = 0; i < A->m; i++ )
104  {
105  fprintf(fp,"row %d:",i);
106  r = &(A->row[i]);
107  elt = r->elt;
108  cnt = j = j_idx = 0;
109  while ( j_idx < r->len || j < A->n )
110  {
111  if ( j_idx >= r->len )
112  fprintf(fp,"%14.9g ",0.0);
113  else if ( j < elt[j_idx].col )
114  fprintf(fp,"%14.9g ",0.0);
115  else
116  fprintf(fp,"%14.9g ",elt[j_idx++].val);
117  if ( cnt++ % 4 == 3 )
118  fprintf(fp,"\n");
119  j++;
120  }
121  fprintf(fp,"\n");
122  }
123 }
124 ******************************************************************/
125 
126 /* sp_dump -- prints ALL relevant information about the sparse matrix A */
127 void sp_dump(fp,A)
128 FILE *fp;
129 SPMAT *A;
130 {
131  int i, j, j_idx;
132  SPROW *rows;
133  row_elt *elts;
134 
135  fprintf(fp,"SparseMatrix dump:\n");
136  if ( ! A )
137  { fprintf(fp,"*** NULL ***\n"); return; }
138  fprintf(fp,"Matrix at 0x%p\n",A);
139  fprintf(fp,"Dimensions: %d by %d\n",A->m,A->n);
140  fprintf(fp,"MaxDimensions: %d by %d\n",A->max_m,A->max_n);
141  fprintf(fp,"flag_col = %d, flag_diag = %d\n",A->flag_col,A->flag_diag);
142  fprintf(fp,"start_row @ 0x%p:\n",(A->start_row));
143  for ( j = 0; j < A->n; j++ )
144  {
145  fprintf(fp,"%d ",A->start_row[j]);
146  if ( j % 10 == 9 )
147  fprintf(fp,"\n");
148  }
149  fprintf(fp,"\n");
150  fprintf(fp,"start_idx @ 0x%p:\n",(A->start_idx));
151  for ( j = 0; j < A->n; j++ )
152  {
153  fprintf(fp,"%d ",A->start_idx[j]);
154  if ( j % 10 == 9 )
155  fprintf(fp,"\n");
156  }
157  fprintf(fp,"\n");
158  fprintf(fp,"Rows @ 0x%p:\n", (A->row));
159  if ( ! A->row )
160  { fprintf(fp,"*** NULL row ***\n"); return; }
161  rows = A->row;
162  for ( i = 0; i < A->m; i++ )
163  {
164  fprintf(fp,"row %d: len = %d, maxlen = %d, diag idx = %d\n",
165  i,rows[i].len,rows[i].maxlen,rows[i].diag);
166  fprintf(fp,"element list @ 0x%p\n",(rows[i].elt));
167  if ( ! rows[i].elt )
168  {
169  fprintf(fp,"*** NULL element list ***\n");
170  continue;
171  }
172  elts = rows[i].elt;
173  for ( j_idx = 0; j_idx < rows[i].len; j_idx++, elts++ )
174  fprintf(fp,"Col: %d, Val: %g, nxt_row = %d, nxt_idx = %d\n",
175  elts->col,elts->val,elts->nxt_row,elts->nxt_idx);
176  fprintf(fp,"\n");
177  }
178 }
179 
180 #define MAXSCRATCH 100
181 
182 /* sp_finput -- input sparse matrix from stream/file fp
183  -- uses friendly input routine if fp is a tty
184  -- uses format identical to output format otherwise */
186 FILE *fp;
187 {
188  int i, len, ret_val;
189  int col, curr_col, m, n, tmp, tty;
190  Real val;
191  SPMAT *A;
192  SPROW *rows;
193 
195  /* cannot handle >= MAXSCRATCH elements in a row */
196 
197  for ( i = 0; i < MAXSCRATCH; i++ )
198  scratch[i].nxt_row = scratch[i].nxt_idx = -1;
199 
200  tty = isatty(fileno(fp));
201 
202  if ( tty )
203  {
204  fprintf(stderr,"SparseMatrix: ");
205  do {
206  fprintf(stderr,"input rows cols: ");
207  if ( ! fgets(line,MAXLINE,fp) )
208  error(E_INPUT,"sp_finput");
209  } while ( sscanf(line,"%u %u",&m,&n) != 2 );
210  A = sp_get(m,n,5);
211  rows = A->row;
212 
213  for ( i = 0; i < m; i++ )
214  {
215  fprintf(stderr,"Row %d:\n",i);
216  fprintf(stderr,"Enter <col> <val> or 'e' to end row\n");
217  curr_col = -1;
218  for ( len = 0; len < MAXSCRATCH; len++ )
219  {
220  do {
221  fprintf(stderr,"Entry %d: ",len);
222  if ( ! fgets(line,MAXLINE,fp) )
223  error(E_INPUT,"sp_finput");
224  if ( *line == 'e' || *line == 'E' )
225  break;
226 #if REAL == DOUBLE
227  } while ( sscanf(line,"%u %lf",&col,&val) != 2 ||
228 #elif REAL == FLOAT
229  } while ( sscanf(line,"%u %f",&col,&val) != 2 ||
230 #endif
231  col >= n || col <= curr_col );
232 
233  if ( *line == 'e' || *line == 'E' )
234  break;
235 
236  scratch[len].col = col;
237  scratch[len].val = val;
238  curr_col = col;
239  }
240 
241  /* Note: len = # elements in row */
242  if ( len > 5 )
243  {
244  if (mem_info_is_on()) {
245  mem_bytes(TYPE_SPMAT,
246  A->row[i].maxlen*sizeof(row_elt),
247  len*sizeof(row_elt));
248  }
249 
250  rows[i].elt = (row_elt *)realloc((char *)rows[i].elt,
251  len*sizeof(row_elt));
252  rows[i].maxlen = len;
253  }
254  MEM_COPY(scratch,rows[i].elt,len*sizeof(row_elt));
255  rows[i].len = len;
256  rows[i].diag = sprow_idx(&(rows[i]),i);
257  }
258  }
259  else /* not tty */
260  {
261  ret_val = 0;
262  skipjunk(fp);
263  if (fscanf(fp,"SparseMatrix:") == EOF) {
264  error(E_INPUT, "sp_finput");
265  }
266  skipjunk(fp);
267  if ( (ret_val=fscanf(fp,"%u by %u",&m,&n)) != 2 )
268  error((ret_val == EOF) ? E_EOF : E_FORMAT,"sp_finput");
269  A = sp_get(m,n,5);
270 
271  /* initialise start_row */
272  for ( i = 0; i < A->n; i++ )
273  A->start_row[i] = -1;
274 
275  rows = A->row;
276  for ( i = 0; i < m; i++ )
277  {
278  /* printf("Reading row # %d\n",i); */
279  rows[i].diag = -1;
280  skipjunk(fp);
281  if ( (ret_val=fscanf(fp,"row %d :",&tmp)) != 1 ||
282  tmp != i )
283  error((ret_val == EOF) ? E_EOF : E_FORMAT,
284  "sp_finput");
285  curr_col = -1;
286  for ( len = 0; len < MAXSCRATCH; len++ )
287  {
288 #if REAL == DOUBLE
289  if ( (ret_val=fscanf(fp,"%u : %lf",&col,&val)) != 2 )
290 #elif REAL == FLOAT
291  if ( (ret_val=fscanf(fp,"%u : %f",&col,&val)) != 2 )
292 #endif
293  break;
294  if ( col <= curr_col || col >= n )
295  error(E_FORMAT,"sp_finput");
296  scratch[len].col = col;
297  scratch[len].val = val;
298  }
299  if ( ret_val == EOF )
300  error(E_EOF,"sp_finput");
301 
302  if ( len > rows[i].maxlen )
303  {
304  rows[i].elt = (row_elt *)realloc((char *)rows[i].elt,
305  len*sizeof(row_elt));
306  rows[i].maxlen = len;
307  }
308  MEM_COPY(scratch,rows[i].elt,len*sizeof(row_elt));
309  rows[i].len = len;
310  /* printf("Have read row # %d\n",i); */
311  rows[i].diag = sprow_idx(&(rows[i]),i);
312  /* printf("Have set diag index for row # %d\n",i); */
313  }
314  }
315 
316  return A;
317 }
318 
static char line[MAXLINE]
Definition: sparseio.c:41
Real val
Definition: sparse.h:46
int diag
Definition: sparse.h:50
void sp_foutput(FILE *fp, SPMAT *A)
Definition: sparseio.c:44
#define diag(s)
Definition: fmenu.cpp:188
#define E_INPUT
Definition: err.h:101
#define Real
Definition: machine.h:189
#define REAL
Definition: machine.h:191
struct row_elt row_elt
row_elt * elt
Definition: sparse.h:51
char flag_col
Definition: sparse.h:56
int nxt_row
Definition: sparse.h:45
#define MAXSCRATCH
Definition: sparseio.c:180
Definition: sparse.h:44
int col
Definition: sparse.h:45
int mem_info_is_on(void)
Definition: meminfo.c:221
static Frame * fp
Definition: code.cpp:154
Definition: sparse.h:54
int const size_t const size_t n
Definition: nrngsl.h:12
#define E_FORMAT
Definition: err.h:100
int n
Definition: sparse.h:55
int val
Definition: dll.cpp:167
#define mem_bytes(type, old_size, new_size)
Definition: meminfo.h:136
int m
Definition: sparse.h:55
int sprow_idx(SPROW *, int)
Definition: sprow.c:75
Definition: sparse.h:49
SPMAT * sp_get(int m, int n, int maxlen)
Definition: sparse.c:198
void MEM_COPY(char *from, char *to, int len)
Definition: extras.c:37
void sp_dump(FILE *fp, SPMAT *A)
Definition: sparseio.c:127
#define E_NULL
Definition: err.h:102
size_t j
char flag_diag
Definition: sparse.h:56
fprintf(stderr, "Don't know the location of params at %p\, pp)
#define FLOAT
Definition: machine.h:165
#define E_EOF
Definition: err.h:112
static char scratch[MAXLINE+1]
Definition: otherio.c:41
int len
Definition: sparse.h:50
#define SMNULL
Definition: sparse.h:74
int * start_idx
Definition: sparse.h:59
int max_n
Definition: sparse.h:55
SPROW * row
Definition: sparse.h:57
int maxlen
Definition: sparse.h:50
int nxt_idx
Definition: sparse.h:45
#define i
Definition: md1redef.h:12
#define A(i)
Definition: multisplit.cpp:61
SPMAT * sp_finput(FILE *fp)
Definition: sparseio.c:185
#define error(err_num, fn_name)
Definition: err.h:73
int skipjunk(FILE *fp)
Definition: matrixio.c:47
int max_m
Definition: sparse.h:55
for(i=0;i< n;i++)
#define MAXLINE
Definition: matrix.h:168
static char rcsid[]
Definition: sparseio.c:36
int * start_row
Definition: sparse.h:58