1 #include <../../nrnconf.h>
34 static char rcsid[] =
"spchfctr.c,v 1.1 1997/12/04 17:55:51 hines Exp";
43 extern char *calloc(), *realloc();
56 int idx1, idx2, len1, len2, tmp;
58 register row_elt *elts1, *elts2;
61 elts1 = row1->elt; elts2 = row2->elt;
62 len1 = row1->len; len2 = row2->len;
66 if ( len1 <= 0 || len2 <= 0 )
68 if ( elts1->
col >= lim || elts2->
col >= lim )
77 idx1 = (idx1 < 0) ? -(idx1+2) : idx1;
82 else if ( len2 > 2*len1 )
85 idx2 = (idx2 < 0) ? -(idx2+2) : idx2;
90 if ( len1 <= 0 || len2 <= 0 )
93 elts1 = &(elts1[idx1]); elts2 = &(elts2[idx2]);
98 if ( (tmp=elts1->
col-elts2->
col) < 0 )
101 if ( ! len1 || elts1->
col >= lim )
107 if ( ! len2 || elts2->
col >= lim )
112 sum += elts1->
val * elts2->
val;
115 if ( ! len1 || ! len2 ||
116 elts1->
col >= lim || elts2->
col >= lim )
131 register Real sum, tmp;
134 elts =
row->elt; len =
row->len;
135 for ( idx = 0; idx < len; idx++, elts++ )
137 if ( elts->
col >= lim )
162 scan_row = (
int *)calloc(new_len,
sizeof(
int));
163 scan_idx = (
int *)calloc(new_len,
sizeof(
int));
164 col_list = (
int *)calloc(new_len,
sizeof(
int));
184 int idx,
k, m, minim,
n, num_scan, diag_idx, tmp1;
187 row_elt *elt_piv, *elt_op, *old_elt;
200 for (
k = 0;
k < m;
k++ )
202 r_piv = &(
A->row[
k]);
205 elt_piv = r_piv->
elt;
209 old_elt = &(elt_piv[diag_idx]);
210 for (
i = 0;
i < r_piv->
len;
i++ )
212 if ( elt_piv[
i].col >
k )
226 elt_piv[diag_idx].
val = pivot =
sqrt(tmp2);
237 for (
i = 0;
i < num_scan;
i++ )
241 minim = ( tmp1 >= 0 && tmp1 < minim ) ? tmp1 : minim;
253 r_op = &(
A->row[minim]);
274 elt_op[idx].
val = (elt_op[idx].
val -
281 old_elt = &(r_op->
elt[idx]);
286 for (
i = 0;
i < num_scan;
i++ )
318 Real diag_val, sum, *out_ve;
324 if ( b->
dim != L->m )
329 if ( ! L->flag_diag )
337 for (
i = 0;
i <
n;
i++ )
342 for ( j_idx = 0; j_idx <
row->len; j_idx++, elt++ )
346 sum -= elt->
val*out_ve[elt->
col];
348 if (
row->diag >= 0 )
349 out_ve[
i] = sum/(
row->elt[
row->diag].val);
355 for (
i =
n-1;
i >= 0;
i-- )
360 elt = &(
row->elt[
row->diag]);
374 out_ve[
i] = sum/diag_val;
386 int k, m,
n, nxt_row, nxt_idx, diag_idx;
399 if ( !
A->flag_diag )
403 for (
k = 0;
k < m;
k++ )
405 r_piv = &(
A->row[
k]);
407 diag_idx = r_piv->
diag;
411 elt_piv = r_piv->
elt;
417 elt_piv[diag_idx].
val = pivot =
sqrt(tmp2);
420 nxt_row = elt_piv[diag_idx].
nxt_row;
421 nxt_idx = elt_piv[diag_idx].
nxt_idx;
424 while ( nxt_row >= 0 && nxt_idx >= 0 )
428 r_op = &(
A->row[nxt_row]);
430 elt_op[nxt_idx].
val = (elt_op[nxt_idx].
val -
433 nxt_row = elt_op[nxt_idx].
nxt_row;
434 nxt_idx = elt_op[nxt_idx].
nxt_idx;
449 int idx,
k, m, minim,
n, num_scan, diag_idx, tmp1;
451 row_elt *elt_piv, *elt_op, *old_elt;
461 if ( !
A->flag_diag )
466 for (
k = 0;
k < m;
k++ )
468 r_piv = &(
A->row[
k]);
471 elt_piv = r_piv->
elt;
475 old_elt = &(elt_piv[diag_idx]);
476 for (
i = 0;
i < r_piv->
len;
i++ )
478 if ( elt_piv[
i].col >
k )
496 for (
i = 0;
i < num_scan;
i++ )
500 minim = ( tmp1 >= 0 && tmp1 < minim ) ? tmp1 : minim;
505 r_op = &(
A->row[minim]);
529 old_elt = &(r_op->
elt[idx]);
534 for (
i = 0;
i < num_scan;
i++ )
561 int i, idx, idx2,
j, m, minim,
n, num_scan, tmp1;
574 for (
i = 0;
i < m;
i++ )
583 for (
j = 0;
j < r->
len;
j++ )
596 for ( idx = 0; idx < num_scan; idx++ )
599 minim = ( tmp1 >= 0 && tmp1 < minim ) ? tmp1 : minim;
603 r2 = &(
A->row[minim]);
612 for ( idx = 0; idx < num_scan; idx++ )
#define error(err_num, fn_name)
int const size_t const size_t n
static philox4x32_key_t k
double sp_set_val(SPMAT *A, int i, int j, double val)
SPMAT * sp_diag_access(SPMAT *A)
SPMAT * sp_get(int m, int n, int maxlen)
SPMAT * sp_col_access(SPMAT *A)
int sprow_idx(SPROW *, int)
#define sprow_idx2(r, c, hint)
SPMAT * spCHsymb(SPMAT *A)
VEC * spCHsolve(SPMAT *L, VEC *b, VEC *out)
SPMAT * comp_AAT(SPMAT *A)
double sprow_ip(SPROW *row1, SPROW *row2, int lim)
SPMAT * spICHfactor(SPMAT *A)
double sprow_sqr(SPROW *row, int lim)
SPMAT * spCHfactor(SPMAT *A)
int set_scan(int new_len)