1 #include <../../nrnconf.h> 33 static char rcsid[] =
"solve.c,v 1.1 1997/12/04 17:55:47 hines Exp";
54 Real **mat_ent, *mat_row, *b_ent, *out_ent, *out_col, sum, tiny;
58 dim =
min(matrix->m,matrix->n);
61 if ( out==(
VEC *)NULL || out->
dim < dim )
63 mat_ent = matrix->me; b_ent = b->
ve; out_ent = out->
ve;
67 for ( i=dim-1; i>=0; i-- )
68 if ( b_ent[i] != 0.0 )
77 mat_row = &(mat_ent[
i][i+1]);
78 out_col = &(out_ent[i+1]);
79 sum -=
__ip__(mat_row,out_col,i_lim-i);
87 if (
fabs(mat_ent[i][i]) <= tiny*
fabs(sum) )
90 out_ent[
i] = sum/mat_ent[
i][
i];
93 out_ent[
i] = sum/
diag;
106 Real **mat_ent, *mat_row, *b_ent, *out_ent, *out_col, sum, tiny;
110 dim =
min(matrix->m,matrix->n);
113 if ( out==(
VEC *)NULL || out->
dim < dim )
115 mat_ent = matrix->me; b_ent = b->
ve; out_ent = out->
ve;
117 for ( i=0; i<dim; i++ )
118 if ( b_ent[i] != 0.0 )
129 mat_row = &(mat_ent[
i][i_lim]);
130 out_col = &(out_ent[i_lim]);
131 sum -=
__ip__(mat_row,out_col,(
int)(i-i_lim));
139 if (
fabs(mat_ent[i][i]) <= tiny*
fabs(sum) )
142 out_ent[
i] = sum/mat_ent[
i][
i];
145 out_ent[
i] = sum/
diag;
160 Real **U_me, *b_ve, *out_ve, tmp, invdiag, tiny;
164 dim =
min(U->m,U->n);
168 U_me = U->me; b_ve = b->
ve; out_ve = out->
ve;
172 for ( i=0; i<dim; i++ )
173 if ( b_ve[i] != 0.0 )
181 MEM_COPY(&(b_ve[i_lim]),&(out_ve[i_lim]),(dim-i_lim)*
sizeof(
Real));
189 if (
fabs(tmp) <= tiny*
fabs(out_ve[i]) )
192 __mltadd__(&(out_ve[i+1]),&(U_me[i][i+1]),-out_ve[i],dim-i-1);
200 out_ve[
i] *= invdiag;
201 __mltadd__(&(out_ve[i+1]),&(U_me[i][i+1]),-out_ve[i],dim-i-1);
217 dim =
min(
A->m,
A->n);
225 for ( i=0; i<dim; i++ )
244 Real **L_me, *b_ve, *out_ve, tmp, invdiag, tiny;
248 dim =
min(L->m,L->n);
252 L_me = L->me; b_ve = b->
ve; out_ve = out->
ve;
256 for ( i=dim-1; i>=0; i-- )
257 if ( b_ve[i] != 0.0 )
272 if (
fabs(tmp) <= tiny*
fabs(out_ve[i]) )
283 out_ve[
i] *= invdiag;
VEC * UTsolve(MAT *U, VEC *b, VEC *out, double diag)
VEC * Usolve(MAT *matrix, VEC *b, VEC *out, double diag)
static Object ** v_resize(void *v)
void __mltadd__(Real *dp1, Real *dp2, double s, int len)
VEC * Dsolve(MAT *A, VEC *b, VEC *x)
VEC * LTsolve(MAT *L, VEC *b, VEC *out, double diag)
void __zero__(Real *dp, int len)
double __ip__(Real *dp1, Real *dp2, int len)
VEC * Lsolve(MAT *matrix, VEC *b, VEC *out, double diag)
#define error(err_num, fn_name)