1 #include <../../nrnconf.h> 33 static char rcsid[] =
"lufactor.c,v 1.1 1997/12/04 17:55:32 hines Exp";
52 Real **A_v, *A_piv, *A_row;
53 Real max1, temp, tiny;
58 if ( pivot->
size !=
A->m )
77 temp =
fabs(A_v[i][j]);
78 max1 =
max(max1,temp);
85 for ( k=0; k<k_max; k++ )
88 max1 = 0.0; i_max = -1;
90 if (
fabs(scale->
ve[i]) >= tiny*
fabs(A_v[i][k]) )
92 temp =
fabs(A_v[i][k])/scale->
ve[
i];
94 { max1 = temp; i_max =
i; }
110 for ( j=0; j<
n; j++ )
112 temp = A_v[i_max][
j];
113 A_v[i_max][
j] = A_v[
k][
j];
119 for ( i=k+1; i<m; i++ )
121 temp = A_v[
i][
k] = A_v[
i][
k]/A_v[
k][
k];
122 A_piv = &(A_v[
k][k+1]);
123 A_row = &(A_v[
i][k+1]);
147 if (
A->m !=
A->n ||
A->n != b->
dim )
164 if ( ! LU || ! b || ! pivot )
166 if ( LU->m != LU->n || LU->n != b->
dim )
191 if ( ! out || out->m <
A->m || out->n <
A->n )
204 for ( i = 0; i <
A->n; i++ )
222 Real cond_est=0.0, L_norm, U_norm, sum, tiny;
225 if ( ! LU || ! pivot )
227 if ( LU->m != LU->n )
229 if ( LU->n != pivot->
size )
240 for ( i = 0; i <
n; i++ )
243 for ( j = 0; j <
i; j++ )
244 sum -= LU->me[j][i]*y->
ve[j];
245 sum -= (sum < 0.0) ? 1.0 : -1.0;
246 if (
fabs(LU->me[i][i]) <= tiny*
fabs(sum) )
248 y->
ve[
i] = sum / LU->me[
i][
i];
260 for ( i = 0; i <
n; i++ )
263 for ( j = i; j <
n; j++ )
264 sum +=
fabs(LU->me[i][j]);
269 for ( i = 0; i <
n; i++ )
272 for ( j = 0; j <
i; j++ )
273 sum +=
fabs(LU->me[i][j]);
VEC * UTsolve(MAT *A, VEC *b, VEC *x, double diag_val)
double max(double a, double b)
MAT * LUfactor(MAT *A, PERM *pivot)
MAT * m_inverse(MAT *A, MAT *out)
static Object ** v_resize(void *v)
static philox4x32_key_t k
VEC * px_vec(PERM *, VEC *, VEC *)
PERM * px_transp(PERM *px, u_int i, u_int j)
VEC * LTsolve(MAT *A, VEC *b, VEC *x, double diag_val)
int const size_t const size_t n
VEC * LUsolve(MAT *A, PERM *pivot, VEC *b, VEC *x)
void __mltadd__(Real *dp1, Real *dp2, double s, int len)
PERM * px_resize(PERM *, int)
#define tracecatch(ok_part, function)
#define set_col(mat, col, vec)
VEC * LUTsolve(MAT *LU, PERM *pivot, VEC *b, VEC *x)
VEC * Usolve(MAT *A, VEC *b, VEC *x, double diag_val)
VEC * pxinv_vec(PERM *, VEC *, VEC *)
static Object ** m_resize(void *v)
#define MEM_STAT_REG(var, type)
#define error(err_num, fn_name)
VEC * Lsolve(MAT *A, VEC *b, VEC *x, double diag_val)
double LUcondest(MAT *LU, PERM *pivot)