NEURON
sprow.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  Sparse rows package
29  See also: sparse.h, matrix.h
30  */
31 
32 #include <stdio.h>
33 #include <math.h>
34 #include <stdlib.h>
35 #include "sparse.h"
36 
37 
38 static char rcsid[] = "sprow.c,v 1.1 1997/12/04 17:55:53 hines Exp";
39 
40 #define MINROWLEN 10
41 
42 
43 /* sprow_dump - prints relevant information about the sparse row r */
44 
45 void sprow_dump(fp,r)
46 FILE *fp;
47 SPROW *r;
48 {
49  int j_idx;
50  row_elt *elts;
51 
52  fprintf(fp,"SparseRow dump:\n");
53  if ( ! r )
54  { fprintf(fp,"*** NULL row ***\n"); return; }
55 
56  fprintf(fp,"row: len = %d, maxlen = %d, diag idx = %d\n",
57  r->len,r->maxlen,r->diag);
58  fprintf(fp,"element list @ 0x%p\n",(r->elt));
59  if ( ! r->elt )
60  {
61  fprintf(fp,"*** NULL element list ***\n");
62  return;
63  }
64  elts = r->elt;
65  for ( j_idx = 0; j_idx < r->len; j_idx++, elts++ )
66  fprintf(fp,"Col: %d, Val: %g, nxt_row = %d, nxt_idx = %d\n",
67  elts->col,elts->val,elts->nxt_row,elts->nxt_idx);
68  fprintf(fp,"\n");
69 }
70 
71 
72 /* sprow_idx -- get index into row for a given column in a given row
73  -- return -1 on error
74  -- return -(idx+2) where idx is index to insertion point */
75 int sprow_idx(r,col)
76 SPROW *r;
77 int col;
78 {
79  register int lo, hi, mid;
80  int tmp;
81  register row_elt *r_elt;
82 
83  /*******************************************
84  if ( r == (SPROW *)NULL )
85  return -1;
86  if ( col < 0 )
87  return -1;
88  *******************************************/
89 
90  r_elt = r->elt;
91  if ( r->len <= 0 )
92  return -2;
93 
94  /* try the hint */
95  /* if ( hint >= 0 && hint < r->len && r_elt[hint].col == col )
96  return hint; */
97 
98  /* otherwise use binary search... */
99  /* code from K&R Ch. 6, p. 125 */
100  lo = 0; hi = r->len - 1; mid = lo;
101  while ( lo <= hi )
102  {
103  mid = (hi + lo)/2;
104  if ( (tmp=r_elt[mid].col-col) > 0 )
105  hi = mid-1;
106  else if ( tmp < 0 )
107  lo = mid+1;
108  else /* tmp == 0 */
109  return mid;
110  }
111  tmp = r_elt[mid].col - col;
112 
113  if ( tmp > 0 )
114  return -(mid+2); /* insert at mid */
115  else /* tmp < 0 */
116  return -(mid+3); /* insert at mid+1 */
117 }
118 
119 
120 /* sprow_get -- gets, initialises and returns a SPROW structure
121  -- max. length is maxlen */
122 SPROW *sprow_get(maxlen)
123 int maxlen;
124 {
125  SPROW *r;
126 
127  if ( maxlen < 0 )
128  error(E_NEG,"sprow_get");
129 
130  r = NEW(SPROW);
131  if ( ! r )
132  error(E_MEM,"sprow_get");
133  else if (mem_info_is_on()) {
134  mem_bytes(TYPE_SPROW,0,sizeof(SPROW));
135  mem_numvar(TYPE_SPROW,1);
136  }
137  r->elt = NEW_A(maxlen,row_elt);
138  if ( ! r->elt )
139  error(E_MEM,"sprow_get");
140  else if (mem_info_is_on()) {
141  mem_bytes(TYPE_SPROW,0,maxlen*sizeof(row_elt));
142  }
143  r->len = 0;
144  r->maxlen = maxlen;
145  r->diag = -1;
146 
147  return r;
148 }
149 
150 
151 /* sprow_xpd -- expand row by means of realloc()
152  -- type must be TYPE_SPMAT if r is a row of a SPMAT structure,
153  otherwise it must be TYPE_SPROW
154  -- returns r */
156 SPROW *r;
157 int n,type;
158 {
159  int newlen;
160 
161  if ( ! r ) {
162  r = NEW(SPROW);
163  if (! r )
164  error(E_MEM,"sprow_xpd");
165  else if ( mem_info_is_on()) {
166  if (type != TYPE_SPMAT && type != TYPE_SPROW)
167  warning(WARN_WRONG_TYPE,"sprow_xpd");
168  mem_bytes(type,0,sizeof(SPROW));
169  if (type == TYPE_SPROW)
170  mem_numvar(type,1);
171  }
172  }
173 
174  if ( ! r->elt )
175  {
176  r->elt = NEW_A((unsigned)n,row_elt);
177  if ( ! r->elt )
178  error(E_MEM,"sprow_xpd");
179  else if (mem_info_is_on()) {
180  mem_bytes(type,0,n*sizeof(row_elt));
181  }
182  r->len = 0;
183  r->maxlen = n;
184  return r;
185  }
186  if ( n <= r->len )
187  newlen = max(2*r->len + 1,MINROWLEN);
188  else
189  newlen = n;
190  if ( newlen <= r->maxlen )
191  {
192  MEM_ZERO((char *)(&(r->elt[r->len])),
193  (newlen-r->len)*sizeof(row_elt));
194  r->len = newlen;
195  }
196  else
197  {
198  if (mem_info_is_on()) {
199  mem_bytes(type,r->maxlen*sizeof(row_elt),
200  newlen*sizeof(row_elt));
201  }
202  r->elt = RENEW(r->elt,newlen,row_elt);
203  if ( ! r->elt )
204  error(E_MEM,"sprow_xpd");
205  r->maxlen = newlen;
206  r->len = newlen;
207  }
208 
209  return r;
210 }
211 
212 /* sprow_resize -- resize a SPROW variable by means of realloc()
213  -- n is a new size
214  -- returns r */
216 SPROW *r;
217 int n,type;
218 {
219  if (n < 0)
220  error(E_NEG,"sprow_resize");
221 
222  if ( ! r )
223  return sprow_get(n);
224 
225  if (n == r->len)
226  return r;
227 
228  if ( ! r->elt )
229  {
230  r->elt = NEW_A((unsigned)n,row_elt);
231  if ( ! r->elt )
232  error(E_MEM,"sprow_resize");
233  else if (mem_info_is_on()) {
234  mem_bytes(type,0,n*sizeof(row_elt));
235  }
236  r->maxlen = r->len = n;
237  return r;
238  }
239 
240  if ( n <= r->maxlen )
241  r->len = n;
242  else
243  {
244  if (mem_info_is_on()) {
245  mem_bytes(type,r->maxlen*sizeof(row_elt),
246  n*sizeof(row_elt));
247  }
248  r->elt = RENEW(r->elt,n,row_elt);
249  if ( ! r->elt )
250  error(E_MEM,"sprow_resize");
251  r->maxlen = r->len = n;
252  }
253 
254  return r;
255 }
256 
257 
258 /* release a row of a matrix */
260 SPROW *r;
261 {
262  if ( ! r )
263  return -1;
264 
265  if (mem_info_is_on()) {
266  mem_bytes(TYPE_SPROW,sizeof(SPROW),0);
267  mem_numvar(TYPE_SPROW,-1);
268  }
269 
270  if ( r->elt )
271  {
272  if (mem_info_is_on()) {
273  mem_bytes(TYPE_SPROW,r->maxlen*sizeof(row_elt),0);
274  }
275  free((char *)r->elt);
276  }
277  free((char *)r);
278  return 0;
279 }
280 
281 
282 /* sprow_merge -- merges r1 and r2 into r_out
283  -- cannot be done in-situ
284  -- type must be SPMAT or SPROW depending on
285  whether r_out is a row of a SPMAT structure
286  or a SPROW variable
287  -- returns r_out */
288 SPROW *sprow_merge(r1,r2,r_out,type)
289 SPROW *r1, *r2, *r_out;
290 int type;
291 {
292  int idx1, idx2, idx_out, len1, len2, len_out;
293  row_elt *elt1, *elt2, *elt_out;
294 
295  if ( ! r1 || ! r2 )
296  error(E_NULL,"sprow_merge");
297  if ( ! r_out )
298  r_out = sprow_get(MINROWLEN);
299  if ( r1 == r_out || r2 == r_out )
300  error(E_INSITU,"sprow_merge");
301 
302  /* Initialise */
303  len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
304  idx1 = idx2 = idx_out = 0;
305  elt1 = r1->elt; elt2 = r2->elt; elt_out = r_out->elt;
306 
307  while ( idx1 < len1 || idx2 < len2 )
308  {
309  if ( idx_out >= len_out )
310  { /* r_out is too small */
311  r_out->len = idx_out;
312  r_out = sprow_xpd(r_out,0,type);
313  len_out = r_out->len;
314  elt_out = &(r_out->elt[idx_out]);
315  }
316  if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
317  {
318  elt_out->col = elt1->col;
319  elt_out->val = elt1->val;
320  if ( elt1->col == elt2->col && idx2 < len2 )
321  { elt2++; idx2++; }
322  elt1++; idx1++;
323  }
324  else
325  {
326  elt_out->col = elt2->col;
327  elt_out->val = elt2->val;
328  elt2++; idx2++;
329  }
330  elt_out++; idx_out++;
331  }
332  r_out->len = idx_out;
333 
334  return r_out;
335 }
336 
337 /* sprow_copy -- copies r1 and r2 into r_out
338  -- cannot be done in-situ
339  -- type must be SPMAT or SPROW depending on
340  whether r_out is a row of a SPMAT structure
341  or a SPROW variable
342  -- returns r_out */
343 SPROW *sprow_copy(r1,r2,r_out,type)
344 SPROW *r1, *r2, *r_out;
345 int type;
346 {
347  int idx1, idx2, idx_out, len1, len2, len_out;
348  row_elt *elt1, *elt2, *elt_out;
349 
350  if ( ! r1 || ! r2 )
351  error(E_NULL,"sprow_copy");
352  if ( ! r_out )
353  r_out = sprow_get(MINROWLEN);
354  if ( r1 == r_out || r2 == r_out )
355  error(E_INSITU,"sprow_copy");
356 
357  /* Initialise */
358  len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
359  idx1 = idx2 = idx_out = 0;
360  elt1 = r1->elt; elt2 = r2->elt; elt_out = r_out->elt;
361 
362  while ( idx1 < len1 || idx2 < len2 )
363  {
364  while ( idx_out >= len_out )
365  { /* r_out is too small */
366  r_out->len = idx_out;
367  r_out = sprow_xpd(r_out,0,type);
368  len_out = r_out->maxlen;
369  elt_out = &(r_out->elt[idx_out]);
370  }
371  if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
372  {
373  elt_out->col = elt1->col;
374  elt_out->val = elt1->val;
375  if ( elt1->col == elt2->col && idx2 < len2 )
376  { elt2++; idx2++; }
377  elt1++; idx1++;
378  }
379  else
380  {
381  elt_out->col = elt2->col;
382  elt_out->val = 0.0;
383  elt2++; idx2++;
384  }
385  elt_out++; idx_out++;
386  }
387  r_out->len = idx_out;
388 
389  return r_out;
390 }
391 
392 /* sprow_mltadd -- sets r_out <- r1 + alpha.r2
393  -- cannot be in situ
394  -- only for columns j0, j0+1, ...
395  -- type must be SPMAT or SPROW depending on
396  whether r_out is a row of a SPMAT structure
397  or a SPROW variable
398  -- returns r_out */
399 SPROW *sprow_mltadd(r1,r2,alpha,j0,r_out,type)
400 SPROW *r1, *r2, *r_out;
401 double alpha;
402 int j0, type;
403 {
404  int idx1, idx2, idx_out, len1, len2, len_out;
405  row_elt *elt1, *elt2, *elt_out;
406 
407  if ( ! r1 || ! r2 )
408  error(E_NULL,"sprow_mltadd");
409  if ( r1 == r_out || r2 == r_out )
410  error(E_INSITU,"sprow_mltadd");
411  if ( j0 < 0 )
412  error(E_BOUNDS,"sprow_mltadd");
413  if ( ! r_out )
414  r_out = sprow_get(MINROWLEN);
415 
416  /* Initialise */
417  len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
418  /* idx1 = idx2 = idx_out = 0; */
419  idx1 = sprow_idx(r1,j0);
420  idx2 = sprow_idx(r2,j0);
421  idx_out = sprow_idx(r_out,j0);
422  idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
423  idx2 = (idx2 < 0) ? -(idx2+2) : idx2;
424  idx_out = (idx_out < 0) ? -(idx_out+2) : idx_out;
425  elt1 = &(r1->elt[idx1]);
426  elt2 = &(r2->elt[idx2]);
427  elt_out = &(r_out->elt[idx_out]);
428 
429  while ( idx1 < len1 || idx2 < len2 )
430  {
431  if ( idx_out >= len_out )
432  { /* r_out is too small */
433  r_out->len = idx_out;
434  r_out = sprow_xpd(r_out,0,type);
435  len_out = r_out->maxlen;
436  elt_out = &(r_out->elt[idx_out]);
437  }
438  if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
439  {
440  elt_out->col = elt1->col;
441  elt_out->val = elt1->val;
442  if ( idx2 < len2 && elt1->col == elt2->col )
443  {
444  elt_out->val += alpha*elt2->val;
445  elt2++; idx2++;
446  }
447  elt1++; idx1++;
448  }
449  else
450  {
451  elt_out->col = elt2->col;
452  elt_out->val = alpha*elt2->val;
453  elt2++; idx2++;
454  }
455  elt_out++; idx_out++;
456  }
457  r_out->len = idx_out;
458 
459  return r_out;
460 }
461 
462 /* sprow_add -- sets r_out <- r1 + r2
463  -- cannot be in situ
464  -- only for columns j0, j0+1, ...
465  -- type must be SPMAT or SPROW depending on
466  whether r_out is a row of a SPMAT structure
467  or a SPROW variable
468  -- returns r_out */
469 SPROW *sprow_add(r1,r2,j0,r_out,type)
470 SPROW *r1, *r2, *r_out;
471 int j0, type;
472 {
473  int idx1, idx2, idx_out, len1, len2, len_out;
474  row_elt *elt1, *elt2, *elt_out;
475 
476  if ( ! r1 || ! r2 )
477  error(E_NULL,"sprow_add");
478  if ( r1 == r_out || r2 == r_out )
479  error(E_INSITU,"sprow_add");
480  if ( j0 < 0 )
481  error(E_BOUNDS,"sprow_add");
482  if ( ! r_out )
483  r_out = sprow_get(MINROWLEN);
484 
485  /* Initialise */
486  len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
487  /* idx1 = idx2 = idx_out = 0; */
488  idx1 = sprow_idx(r1,j0);
489  idx2 = sprow_idx(r2,j0);
490  idx_out = sprow_idx(r_out,j0);
491  idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
492  idx2 = (idx2 < 0) ? -(idx2+2) : idx2;
493  idx_out = (idx_out < 0) ? -(idx_out+2) : idx_out;
494  elt1 = &(r1->elt[idx1]);
495  elt2 = &(r2->elt[idx2]);
496  elt_out = &(r_out->elt[idx_out]);
497 
498  while ( idx1 < len1 || idx2 < len2 )
499  {
500  if ( idx_out >= len_out )
501  { /* r_out is too small */
502  r_out->len = idx_out;
503  r_out = sprow_xpd(r_out,0,type);
504  len_out = r_out->maxlen;
505  elt_out = &(r_out->elt[idx_out]);
506  }
507  if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
508  {
509  elt_out->col = elt1->col;
510  elt_out->val = elt1->val;
511  if ( idx2 < len2 && elt1->col == elt2->col )
512  {
513  elt_out->val += elt2->val;
514  elt2++; idx2++;
515  }
516  elt1++; idx1++;
517  }
518  else
519  {
520  elt_out->col = elt2->col;
521  elt_out->val = elt2->val;
522  elt2++; idx2++;
523  }
524  elt_out++; idx_out++;
525  }
526  r_out->len = idx_out;
527 
528  return r_out;
529 }
530 
531 /* sprow_sub -- sets r_out <- r1 - r2
532  -- cannot be in situ
533  -- only for columns j0, j0+1, ...
534  -- type must be SPMAT or SPROW depending on
535  whether r_out is a row of a SPMAT structure
536  or a SPROW variable
537  -- returns r_out */
538 SPROW *sprow_sub(r1,r2,j0,r_out,type)
539 SPROW *r1, *r2, *r_out;
540 int j0, type;
541 {
542  int idx1, idx2, idx_out, len1, len2, len_out;
543  row_elt *elt1, *elt2, *elt_out;
544 
545  if ( ! r1 || ! r2 )
546  error(E_NULL,"sprow_sub");
547  if ( r1 == r_out || r2 == r_out )
548  error(E_INSITU,"sprow_sub");
549  if ( j0 < 0 )
550  error(E_BOUNDS,"sprow_sub");
551  if ( ! r_out )
552  r_out = sprow_get(MINROWLEN);
553 
554  /* Initialise */
555  len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
556  /* idx1 = idx2 = idx_out = 0; */
557  idx1 = sprow_idx(r1,j0);
558  idx2 = sprow_idx(r2,j0);
559  idx_out = sprow_idx(r_out,j0);
560  idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
561  idx2 = (idx2 < 0) ? -(idx2+2) : idx2;
562  idx_out = (idx_out < 0) ? -(idx_out+2) : idx_out;
563  elt1 = &(r1->elt[idx1]);
564  elt2 = &(r2->elt[idx2]);
565  elt_out = &(r_out->elt[idx_out]);
566 
567  while ( idx1 < len1 || idx2 < len2 )
568  {
569  if ( idx_out >= len_out )
570  { /* r_out is too small */
571  r_out->len = idx_out;
572  r_out = sprow_xpd(r_out,0,type);
573  len_out = r_out->maxlen;
574  elt_out = &(r_out->elt[idx_out]);
575  }
576  if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
577  {
578  elt_out->col = elt1->col;
579  elt_out->val = elt1->val;
580  if ( idx2 < len2 && elt1->col == elt2->col )
581  {
582  elt_out->val -= elt2->val;
583  elt2++; idx2++;
584  }
585  elt1++; idx1++;
586  }
587  else
588  {
589  elt_out->col = elt2->col;
590  elt_out->val = -elt2->val;
591  elt2++; idx2++;
592  }
593  elt_out++; idx_out++;
594  }
595  r_out->len = idx_out;
596 
597  return r_out;
598 }
599 
600 
601 /* sprow_smlt -- sets r_out <- alpha*r1
602  -- can be in situ
603  -- only for columns j0, j0+1, ...
604  -- returns r_out */
605 SPROW *sprow_smlt(r1,alpha,j0,r_out,type)
606 SPROW *r1, *r_out;
607 double alpha;
608 int j0, type;
609 {
610  int idx1, idx_out, len1;
611  row_elt *elt1, *elt_out;
612 
613  if ( ! r1 )
614  error(E_NULL,"sprow_smlt");
615  if ( j0 < 0 )
616  error(E_BOUNDS,"sprow_smlt");
617  if ( ! r_out )
618  r_out = sprow_get(MINROWLEN);
619 
620  /* Initialise */
621  len1 = r1->len;
622  idx1 = sprow_idx(r1,j0);
623  idx_out = sprow_idx(r_out,j0);
624  idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
625  idx_out = (idx_out < 0) ? -(idx_out+2) : idx_out;
626  elt1 = &(r1->elt[idx1]);
627 
628  r_out = sprow_resize(r_out,idx_out+len1-idx1,type);
629  elt_out = &(r_out->elt[idx_out]);
630 
631  for ( ; idx1 < len1; elt1++,elt_out++,idx1++,idx_out++ )
632  {
633  elt_out->col = elt1->col;
634  elt_out->val = alpha*elt1->val;
635  }
636 
637  r_out->len = idx_out;
638 
639  return r_out;
640 }
641 
642 
643 /* sprow_foutput -- print a representation of r on stream fp */
645 FILE *fp;
646 SPROW *r;
647 {
648  int i, len;
649  row_elt *e;
650 
651  if ( ! r )
652  {
653  fprintf(fp,"SparseRow: **** NULL ****\n");
654  return;
655  }
656  len = r->len;
657  fprintf(fp,"SparseRow: length: %d\n",len);
658  for ( i = 0, e = r->elt; i < len; i++, e++ )
659  fprintf(fp,"Column %d: %g, next row: %d, next index %d\n",
660  e->col, e->val, e->nxt_row, e->nxt_idx);
661 }
662 
663 
664 /* sprow_set_val -- sets the j-th column entry of the sparse row r
665  -- Note: destroys the usual column & row access paths */
666 double sprow_set_val(r,j,val)
667 SPROW *r;
668 int j;
669 double val;
670 {
671  int idx, idx2, new_len;
672 
673  if ( ! r )
674  error(E_NULL,"sprow_set_val");
675 
676  idx = sprow_idx(r,j);
677  if ( idx >= 0 )
678  { r->elt[idx].val = val; return val; }
679  /* else */ if ( idx < -1 )
680  {
681  /* shift & insert new value */
682  idx = -(idx+2); /* this is the intended insertion index */
683  if ( r->len >= r->maxlen )
684  {
685  r->len = r->maxlen;
686  new_len = max(2*r->maxlen+1,5);
687  if (mem_info_is_on()) {
688  mem_bytes(TYPE_SPROW,r->maxlen*sizeof(row_elt),
689  new_len*sizeof(row_elt));
690  }
691 
692  r->elt = RENEW(r->elt,new_len,row_elt);
693  if ( ! r->elt ) /* can't allocate */
694  error(E_MEM,"sprow_set_val");
695  r->maxlen = 2*r->maxlen+1;
696  }
697  for ( idx2 = r->len-1; idx2 >= idx; idx2-- )
698  MEM_COPY((char *)(&(r->elt[idx2])),
699  (char *)(&(r->elt[idx2+1])),sizeof(row_elt));
700  /************************************************************
701  if ( idx < r->len )
702  MEM_COPY((char *)(&(r->elt[idx])),(char *)(&(r->elt[idx+1])),
703  (r->len-idx)*sizeof(row_elt));
704  ************************************************************/
705  r->len++;
706  r->elt[idx].col = j;
707  r->elt[idx].nxt_row = -1;
708  r->elt[idx].nxt_idx = -1;
709  return r->elt[idx].val = val;
710  }
711  /* else -- idx == -1, error in index/matrix! */
712  return 0.0;
713 }
714 
715 
#define alpha
Definition: bkpfacto.c:43
short type
Definition: cabvars.h:9
static Frame * fp
Definition: code.cpp:161
#define error(err_num, fn_name)
Definition: err.h:73
#define WARN_WRONG_TYPE
Definition: err.h:120
#define E_MEM
Definition: err.h:97
#define E_NULL
Definition: err.h:102
#define E_BOUNDS
Definition: err.h:96
#define E_NEG
Definition: err.h:114
#define E_INSITU
Definition: err.h:106
void MEM_COPY(char *from, char *to, int len)
Definition: extras.c:37
void MEM_ZERO(char *ptr, int len)
Definition: extras.c:58
void warning(const char *s, const char *t)
Definition: hoc.cpp:1522
#define NEW_A(num, type)
Definition: matrix.h:139
#define RENEW(var, num, type)
Definition: matrix.h:142
#define NEW(type)
Definition: matrix.h:136
#define max(a, b)
Definition: matrix.h:154
#define i
Definition: md1redef.h:12
int mem_info_is_on(void)
Definition: meminfo.c:221
#define mem_numvar(type, num)
Definition: meminfo.h:139
#define mem_bytes(type, old_size, new_size)
Definition: meminfo.h:136
#define fprintf
Definition: mwprefix.h:30
int const size_t const size_t n
Definition: nrngsl.h:11
size_t j
#define e
Definition: passive0.cpp:22
void sprow_dump(FILE *fp, SPROW *r)
Definition: sprow.c:45
SPROW * sprow_merge(SPROW *r1, SPROW *r2, SPROW *r_out, int type)
Definition: sprow.c:288
SPROW * sprow_get(int maxlen)
Definition: sprow.c:122
int sprow_free(SPROW *r)
Definition: sprow.c:259
SPROW * sprow_xpd(SPROW *r, int n, int type)
Definition: sprow.c:155
#define MINROWLEN
Definition: sprow.c:40
void sprow_foutput(FILE *fp, SPROW *r)
Definition: sprow.c:644
SPROW * sprow_mltadd(SPROW *r1, SPROW *r2, double alpha, int j0, SPROW *r_out, int type)
Definition: sprow.c:399
SPROW * sprow_sub(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)
Definition: sprow.c:538
SPROW * sprow_resize(SPROW *r, int n, int type)
Definition: sprow.c:215
SPROW * sprow_smlt(SPROW *r1, double alpha, int j0, SPROW *r_out, int type)
Definition: sprow.c:605
SPROW * sprow_copy(SPROW *r1, SPROW *r2, SPROW *r_out, int type)
Definition: sprow.c:343
int sprow_idx(SPROW *r, int col)
Definition: sprow.c:75
SPROW * sprow_add(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)
Definition: sprow.c:469
double sprow_set_val(SPROW *r, int j, double val)
Definition: sprow.c:666
static char rcsid[]
Definition: sprow.c:38
Definition: sparse.h:49
int diag
Definition: sparse.h:50
int maxlen
Definition: sparse.h:50
int len
Definition: sparse.h:50
row_elt * elt
Definition: sparse.h:51
Definition: sparse.h:44
int nxt_row
Definition: sparse.h:45
int nxt_idx
Definition: sparse.h:45
int col
Definition: sparse.h:45
Real val
Definition: sparse.h:46