1 #include <../../nrnconf.h>
38 static char rcsid[] =
"sparse.c,v 1.1 1997/12/04 17:55:48 hines Exp";
54 if ( i < 0 || i >=
A->m || j < 0 || j >=
A->n )
72 int idx, idx2, new_len;
76 if ( i < 0 || i >=
A->m || j < 0 || j >=
A->n )
83 { r->
elt[idx].
val = val;
return val; }
87 A->flag_col =
A->flag_diag =
FALSE;
104 for ( idx2 = r->
len-1; idx2 >= idx; idx2-- )
114 return r->
elt[idx].
val = val;
127 int i, j_idx, m,
n, max_idx;
134 if ( x->
dim !=
A->n )
136 if ( ! out || out->
dim <
A->m )
143 for (
i = 0;
i < m;
i++ )
149 for ( j_idx = 0; j_idx < max_idx; j_idx++, elts++ )
150 sum += elts->
val*x_ve[elts->
col];
163 int i, j_idx, m,
n, max_idx;
164 Real tmp, *x_ve, *out_ve;
170 if ( x->
dim !=
A->m )
172 if ( ! out || out->
dim <
A->n )
179 x_ve = x->
ve; out_ve = out->
ve;
181 for (
i = 0;
i < m;
i++ )
187 for ( j_idx = 0; j_idx < max_idx; j_idx++, elts++ )
188 out_ve[elts->
col] += elts->
val*tmp;
205 if ( m < 0 ||
n < 0 )
208 maxlen =
max(maxlen,1);
229 if ( !
A->start_row || !
A->start_idx )
234 for (
i = 0;
i <
n;
i++ )
235 A->start_row[
i] =
A->start_idx[
i] = -1;
241 for (
i = 0;
i < m;
i++, rows++ )
268 if (
A->start_row != (
int *)
NULL ) {
272 free((
char *)(
A->start_row));
274 if (
A->start_idx != (
int *)
NULL ) {
279 free((
char *)(
A->start_idx));
291 for (
i = 0;
i <
A->m;
i++ )
298 free((
char *)(r->
elt));
309 free((
char *)(
A->row));
343 for (
i = 0;
i <
A->m;
i++ )
346 row2 = &(out->
row[
i]);
379 int i,
j, j_idx, len, m,
n;
382 int *start_row, *start_idx;
390 start_row =
A->start_row; start_idx =
A->start_idx;
391 for (
j = 0;
j <
n;
j++ )
392 { *start_row++ = -1; *start_idx++ = -1; }
394 start_row =
A->start_row; start_idx =
A->start_idx;
397 for (
i = m-1;
i >= 0;
i-- )
402 for ( j_idx = 0; j_idx < len; j_idx++, r_elt++ )
408 start_idx[
j] = j_idx;
429 for (
i = 0;
i < m;
i++,
row++ )
448 if ( ! out || out->m <
A->m || out->n <
A->n )
452 for (
i = 0;
i <
A->m;
i++ )
456 for ( j_idx = 0; j_idx <
row->len; j_idx++, elt++ )
457 out->me[
i][elt->
col] = elt->
val;
474 if (
A->m !=
B->m ||
A->n !=
B->n )
476 if (C ==
A || C ==
B)
478 else in_situ =
FALSE;
483 if ( C->m !=
A->m || C->n !=
A->n )
494 for (
i=0;
i <
A->m;
i++) {
502 for (
i=0;
i <
A->m;
i++) {
506 C->flag_col = C->flag_diag =
FALSE;
521 if (
A->m !=
B->m ||
A->n !=
B->n )
523 if (C ==
A || C ==
B)
525 else in_situ =
FALSE;
530 if ( C->m !=
A->m || C->n !=
A->n )
541 for (
i=0;
i <
A->m;
i++) {
549 for (
i=0;
i <
A->m;
i++) {
553 C->flag_col = C->flag_diag =
FALSE;
569 if (
A->m !=
B->m ||
A->n !=
B->n )
571 if (C ==
A || C ==
B)
573 else in_situ =
FALSE;
578 if ( C->m !=
A->m || C->n !=
A->n )
589 for (
i=0;
i <
A->m;
i++) {
597 for (
i=0;
i <
A->m;
i++) {
599 &(C->row[
i]),TYPE_SPMAT);
602 C->flag_col = C->flag_diag =
FALSE;
621 if (
A->m !=
B->m ||
A->n !=
B->n )
624 for (
i=0;
i <
A->m;
i++) {
642 for (
i = 0;
i <
A->m;
i++ )
646 for ( idx = 0; idx < len; idx++ )
683 for (
i =
OUT->m; i < A->m;
i++ )
686 if ( !
OUT->row[
i].elt )
701 for (
i = 0;
i <
A->m;
i++ )
703 r1 = &(
A->row[
i]); r2 = &(
OUT->row[
i]);
740 if (m ==
A->m &&
n ==
A->n)
745 for (
i =
A->m;
i < m;
i++ )
759 for (
i =
A->m;
i < m;
i++ )
783 A->start_row =
RENEW(
A->start_row,(
unsigned)
n,
int);
784 A->start_idx =
RENEW(
A->start_idx,(
unsigned)
n,
int);
785 if ( !
A->start_row || !
A->start_idx )
794 for (
i = 0;
i <
A->m;
i++ )
823 A->flag_col =
A->flag_diag =
FALSE;
825 for (
i = 0;
i <
A->m;
i++ )
828 elt1 = elt2 = r->
elt;
830 while ( idx1 < r->len )
834 { idx1++; elt1++;
continue; }
868 while ((par = va_arg(ap,
SPMAT **))) {
898 while ((par = va_arg(ap,
SPMAT **))) {
927 while ((par = va_arg(ap,
SPMAT **))) {
960 deg = va_arg(ap,
int);
961 while ((par = va_arg(ap,
SPMAT **))) {
993 while ((par = va_arg(ap,
SPMAT **))) {
1022 while ((par = va_arg(ap,
SPMAT **))) {
#define error(err_num, fn_name)
static Object ** v_resize(void *v)
static Object ** m_zero(void *v)
#define RENEW(var, num, type)
#define mem_numvar(type, num)
#define mem_bytes(type, old_size, new_size)
#define MEM_STAT_REG(var, type)
int const size_t const size_t n
static char scratch[MAXLINE+1]
SPMAT * sp_zero(SPMAT *A)
VEC * sp_vm_mlt(SPMAT *A, VEC *x, VEC *out)
SPMAT * sp_resize(SPMAT *A, int m, int n)
int sp_resize_vars(int m, int n,...)
double sp_set_val(SPMAT *A, int i, int j, double val)
double sp_get_val(SPMAT *A, int i, int j)
SPMAT * sp_compact(SPMAT *A, double tol)
MAT * sp_m2dense(SPMAT *A, MAT *out)
int sp_get_vars(int m, int n, int deg,...)
SPMAT * sp_mltadd(SPMAT *A, SPMAT *B, double alpha, SPMAT *C)
SPMAT * sp_diag_access(SPMAT *A)
SPMAT * sp_copy(SPMAT *A)
SPMAT * sp_sub(SPMAT *A, SPMAT *B, SPMAT *C)
SPMAT * sp_get(int m, int n, int maxlen)
VEC * sp_mv_mlt(SPMAT *A, VEC *x, VEC *out)
SPMAT * sp_smlt(SPMAT *A, double alpha, SPMAT *B)
int sp_free_vars(SPMAT **va,...)
SPMAT * sp_copy2(SPMAT *A, SPMAT *OUT)
SPMAT * sp_col_access(SPMAT *A)
SPMAT * sp_add(SPMAT *A, SPMAT *B, SPMAT *C)
SPROW * sprow_mltadd(SPROW *, SPROW *, double, int, SPROW *, int type)
SPROW * sprow_copy(SPROW *, SPROW *, SPROW *, int type)
SPROW * sprow_sub(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)
SPROW * sprow_xpd(SPROW *r, int n, int type)
SPROW * sprow_resize(SPROW *r, int n, int type)
SPROW * sprow_smlt(SPROW *r1, double alpha, int j0, SPROW *r_out, int type)
SPROW * sprow_add(SPROW *r1, SPROW *r2, int j0, SPROW *r_out, int type)
int sprow_idx(SPROW *, int)