1 #include <../../nrnconf.h> 54 int i, best_i,
k, idx, len, best_len, m,
n;
55 SPROW *r, *r_piv, tmp_row;
62 if ( alpha <= 0.0 || alpha > 1.0 )
64 if ( px->
size <=
A->m )
75 A->flag_col =
A->flag_diag =
FALSE;
81 for ( k = 0; k <
n; k++ )
87 for ( i = k; i < m; i++ )
95 if (
fabs(tmp) > max_val )
97 col_vals->
ve[
i] = tmp;
100 if ( max_val == 0.0 )
105 for ( i = k; i < m; i++ )
107 tmp =
fabs(col_vals->
ve[i]);
110 if ( tmp >=
alpha*max_val )
114 len = (r->
len) - idx;
115 if ( len < best_len )
128 tmp = col_vals->
ve[best_i];
129 col_vals->
ve[best_i] = col_vals->
ve[
k];
130 col_vals->
ve[
k] = tmp;
133 r_piv = &(
A->row[
k]);
134 for ( i = k+1; i <
n; i++ )
137 tmp = col_vals->
ve[
i]/col_vals->
ve[
k];
170 int i, idx, len, lim;
179 if ( ! x || x->
dim !=
A->n )
182 if ( pivot !=
PNULL )
188 lim =
min(
A->m,
A->n);
189 for ( i = 0; i < lim; i++ )
195 for ( idx = 0; idx < len && elt->
col <
i; idx++, elt++ )
196 sum -= elt->
val*x_ve[elt->
col];
200 for ( i = lim-1; i >= 0; i-- )
205 elt = &(r->
elt[len-1]);
206 for ( idx = len-1; idx >= 0 && elt->
col >
i; idx--, elt-- )
207 sum -= elt->
val*x_ve[elt->
col];
208 if ( idx < 0 || elt->col != i || elt->
val == 0.0 )
210 x_ve[
i] = sum/elt->
val;
224 int i, idx, lim, rownum;
239 if ( !
A->flag_diag )
242 lim =
min(
A->m,
A->n);
245 for ( i = 0; i < lim; i++ )
248 rownum =
A->start_row[
i];
249 idx =
A->start_idx[
i];
250 if ( rownum < 0 || idx < 0 )
252 while ( rownum < i && rownum >= 0 && idx >= 0 )
254 elt = &(
A->row[rownum].elt[idx]);
255 sum -= elt->
val*tmp_ve[rownum];
261 elt = &(
A->row[rownum].elt[idx]);
262 if ( elt->
val == 0.0 )
264 tmp_ve[
i] = sum/elt->
val;
268 for ( i = lim-1; i >= 0; i-- )
272 idx =
A->row[rownum].diag;
275 elt = &(
A->row[rownum].elt[idx]);
278 while ( rownum < lim && rownum >= 0 && idx >= 0 )
280 elt = &(
A->row[rownum].elt[idx]);
281 sum -= elt->
val*tmp_ve[rownum];
288 if ( pivot !=
PNULL )
306 int i,
k, idx, idx_piv, m,
n, old_idx, old_idx_piv;
320 for ( k = 0; k <
n; k++ )
325 r_piv = &(
A->row[
k]);
326 idx_piv = r_piv->
diag;
335 old_idx_piv = idx_piv;
336 piv_val = r_piv->
elt[idx_piv].
val;
340 if ( piv_val == 0.0 )
378 while ( idx_piv < r_piv->len && idx < r->len )
406 idx_piv = old_idx_piv;
double sp_set_val(SPMAT *A, int i, int j, double val)
double sprow_set_val(SPROW *, int, double)
SPMAT * sp_diag_access(SPMAT *A)
static Object ** v_resize(void *v)
VEC * spLUsolve(SPMAT *A, PERM *pivot, VEC *b, VEC *x)
static philox4x32_key_t k
VEC * px_vec(PERM *, VEC *, VEC *)
PERM * px_transp(PERM *px, u_int i, u_int j)
int const size_t const size_t n
PERM * px_resize(PERM *, int)
SPROW * sprow_mltadd(SPROW *, SPROW *, double, int, SPROW *, int type)
int sprow_idx(SPROW *, int)
VEC * spLUTsolve(SPMAT *A, PERM *pivot, VEC *b, VEC *x)
SPMAT * spLUfactor(SPMAT *A, PERM *px, double alpha)
VEC * pxinv_vec(PERM *, VEC *, VEC *)
SPMAT * spILUfactor(SPMAT *A, double alpha)
#define MEM_STAT_REG(var, type)
#define error(err_num, fn_name)
SPMAT * sp_col_access(SPMAT *A)
SPROW * sprow_xpd(SPROW *r, int n, int type)
PERM * px_ident(PERM *px)