1 #include <../../nrnconf.h> 38 static char rcsid[] =
"sprow.c,v 1.1 1997/12/04 17:55:53 hines Exp";
54 {
fprintf(
fp,
"*** NULL row ***\n");
return; }
56 fprintf(
fp,
"row: len = %d, maxlen = %d, diag idx = %d\n",
61 fprintf(
fp,
"*** NULL element list ***\n");
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",
79 register int lo, hi, mid;
100 lo = 0; hi = r->
len - 1; mid = lo;
104 if ( (tmp=r_elt[mid].col-col) > 0 )
111 tmp = r_elt[mid].
col - col;
166 if (
type != TYPE_SPMAT &&
type != TYPE_SPROW)
169 if (
type == TYPE_SPROW)
190 if ( newlen <= r->maxlen )
240 if ( n <= r->maxlen )
275 free((
char *)r->
elt);
289 SPROW *r1, *r2, *r_out;
292 int idx1, idx2, idx_out, len1, len2, len_out;
293 row_elt *elt1, *elt2, *elt_out;
299 if ( r1 == r_out || r2 == r_out )
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;
307 while ( idx1 < len1 || idx2 < len2 )
309 if ( idx_out >= len_out )
311 r_out->len = idx_out;
313 len_out = r_out->len;
314 elt_out = &(r_out->elt[idx_out]);
316 if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
320 if ( elt1->
col == elt2->
col && idx2 < len2 )
330 elt_out++; idx_out++;
332 r_out->len = idx_out;
344 SPROW *r1, *r2, *r_out;
347 int idx1, idx2, idx_out, len1, len2, len_out;
348 row_elt *elt1, *elt2, *elt_out;
354 if ( r1 == r_out || r2 == r_out )
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;
362 while ( idx1 < len1 || idx2 < len2 )
364 while ( idx_out >= len_out )
366 r_out->len = idx_out;
368 len_out = r_out->maxlen;
369 elt_out = &(r_out->elt[idx_out]);
371 if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
375 if ( elt1->
col == elt2->
col && idx2 < len2 )
385 elt_out++; idx_out++;
387 r_out->len = idx_out;
400 SPROW *r1, *r2, *r_out;
404 int idx1, idx2, idx_out, len1, len2, len_out;
405 row_elt *elt1, *elt2, *elt_out;
409 if ( r1 == r_out || r2 == r_out )
417 len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
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]);
429 while ( idx1 < len1 || idx2 < len2 )
431 if ( idx_out >= len_out )
433 r_out->len = idx_out;
435 len_out = r_out->maxlen;
436 elt_out = &(r_out->elt[idx_out]);
438 if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
442 if ( idx2 < len2 && elt1->col == elt2->
col )
455 elt_out++; idx_out++;
457 r_out->len = idx_out;
470 SPROW *r1, *r2, *r_out;
473 int idx1, idx2, idx_out, len1, len2, len_out;
474 row_elt *elt1, *elt2, *elt_out;
478 if ( r1 == r_out || r2 == r_out )
486 len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
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]);
498 while ( idx1 < len1 || idx2 < len2 )
500 if ( idx_out >= len_out )
502 r_out->len = idx_out;
504 len_out = r_out->maxlen;
505 elt_out = &(r_out->elt[idx_out]);
507 if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
511 if ( idx2 < len2 && elt1->col == elt2->
col )
513 elt_out->
val += elt2->
val;
524 elt_out++; idx_out++;
526 r_out->len = idx_out;
539 SPROW *r1, *r2, *r_out;
542 int idx1, idx2, idx_out, len1, len2, len_out;
543 row_elt *elt1, *elt2, *elt_out;
547 if ( r1 == r_out || r2 == r_out )
555 len1 = r1->len; len2 = r2->len; len_out = r_out->maxlen;
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]);
567 while ( idx1 < len1 || idx2 < len2 )
569 if ( idx_out >= len_out )
571 r_out->len = idx_out;
573 len_out = r_out->maxlen;
574 elt_out = &(r_out->elt[idx_out]);
576 if ( idx2 >= len2 || (idx1 < len1 && elt1->col <= elt2->col) )
580 if ( idx2 < len2 && elt1->col == elt2->
col )
582 elt_out->
val -= elt2->
val;
590 elt_out->
val = -elt2->
val;
593 elt_out++; idx_out++;
595 r_out->len = idx_out;
610 int idx1, idx_out, len1;
624 idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
625 idx_out = (idx_out < 0) ? -(idx_out+2) : idx_out;
626 elt1 = &(r1->elt[idx1]);
629 elt_out = &(r_out->elt[idx_out]);
631 for ( ; idx1 < len1; elt1++,elt_out++,idx1++,idx_out++ )
637 r_out->len = idx_out;
653 fprintf(
fp,
"SparseRow: **** NULL ****\n");
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",
671 int idx, idx2, new_len;
697 for ( idx2 = r->
len-1; idx2 >= idx; idx2-- )
double max(double a, double b)
double sprow_set_val(SPROW *r, int j, double val)
void sprow_foutput(FILE *fp, SPROW *r)
void sprow_dump(FILE *fp, SPROW *r)
int sprow_idx(SPROW *r, int col)
SPROW * sprow_get(int maxlen)
int const size_t const size_t n
#define mem_bytes(type, old_size, new_size)
SPROW * sprow_resize(SPROW *r, int n, int type)
fprintf(stderr, "Don't know the location of params at %p\, pp)
SPROW * sprow_smlt(SPROW *r1, double alpha, int j0, SPROW *r_out, int type)
SPROW * sprow_mltadd(SPROW *r1, SPROW *r2, double alpha, int j0, SPROW *r_out, int type)
void warning(const char *s, const char *t)
SPROW * sprow_sub(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)
#define error(err_num, fn_name)
SPROW * sprow_xpd(SPROW *r, int n, int type)
SPROW * sprow_merge(SPROW *r1, SPROW *r2, SPROW *r_out, int type)
#define mem_numvar(type, num)
SPROW * sprow_copy(SPROW *r1, SPROW *r2, SPROW *r_out, int type)
#define RENEW(var, num, type)
SPROW * sprow_add(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)