1 #include <../../nrnconf.h>
38 static char rcsid[] =
"lanczos.c,v 1.1 1997/12/04 17:55:31 hines Exp";
50 void lanczos(A_fn,A_params,m,x0,a,b,beta2,Q)
62 if ( ! A_fn || ! x0 || ! a || ! b )
66 if ( Q && ( Q->
m < x0->
dim || Q->
n < m ) )
78 (*A_fn)(A_params,w,
v);
80 for (
j = 0;
j < m;
j++ )
104 (*A_fn)(A_params,w,tmp);
131 for (
i = 0;
i < a->
dim;
i++ )
137 mant =
frexp(mant,&tmp_expt);
142 for (
i = 0;
i < a->
dim;
i++ )
144 tmp_fctr = a->
ve[
i] - offset;
145 tmp_fctr += (tmp_fctr > 0.0 ) ? -
MACHEPS*offset :
147 mant *=
frexp(tmp_fctr,&tmp_expt);
151 mant =
frexp(mant,&tmp_expt);
156 mant =
frexp(mant,&tmp_expt);
169 Real mant, mu, tmp_fctr;
174 if ( k < 0 || k >= a->
dim )
180 for (
i = 0;
i < a->
dim;
i++ )
184 tmp_fctr = a->
ve[
i] - mu;
186 mant *=
frexp(tmp_fctr,&tmp_expt);
190 mant =
frexp(mant,&tmp_expt);
194 mant =
frexp(mant,&tmp_expt);
207 return (tmp > 0 ? 1 : tmp < 0 ? -1: 0);
224 Real beta, pb_mant, det_mant, det_mant1, det_mant2;
225 int i, pb_expt, det_expt, det_expt1, det_expt2;
227 if ( ! A_fn || ! x0 )
243 pb_mant =
product(b,(
double)0.0,&pb_expt);
253 for (
i = 0;
i < a2->dim - 1;
i++ )
255 a2->ve[
i] = a->
ve[
i+1];
256 b2->ve[
i] = b->
ve[
i+1];
258 a2->ve[a2->dim-1] = a->
ve[a2->dim];
274 for (
i = 0;
i < a->
dim;
i++ )
277 det_mant2 =
product(a2,(
double)a->
ve[
i],&det_expt2);
282 if ( det_mant1 == 0.0 )
284 err_est->
ve[
i] = 0.0;
287 else if ( det_mant2 == 0.0 )
289 err_est->
ve[
i] = HUGE;
292 if ( (det_expt1 + det_expt2) % 2 )
294 det_mant =
sqrt(2.0*
fabs(det_mant1*det_mant2));
296 det_mant =
sqrt(
fabs(det_mant1*det_mant2));
297 det_expt = (det_expt1+det_expt2)/2;
299 ldexp(pb_mant/det_mant,pb_expt-det_expt));
#define error(err_num, fn_name)
static Object ** v_add(void *v1)
static double v_get(void *v)
static Object ** v_resize(void *v)
void lanczos(VEC *(*A_fn)(), void *A_params, int m, VEC *x0, VEC *a, VEC *b, Real *beta2, MAT *Q)
VEC * sp_lanczos2(SPMAT *A, int m, VEC *x0, VEC *evals, VEC *err_est)
static int dbl_cmp(Real *x, Real *y)
void sp_lanczos(SPMAT *A, int m, VEC *x0, VEC *a, VEC *b, Real *beta2, MAT *Q)
static double product2(VEC *a, int k, int *expt)
VEC * trieig(VEC *, VEC *, MAT *)
VEC * lanczos2(VEC *(*A_fn)(), void *A_params, int m, VEC *x0, VEC *evals, VEC *err_est)
static double product(VEC *a, double offset, int *expt)
static Object ** m_resize(void *v)
#define set_col(mat, col, vec)
VEC * v_mltadd(VEC *, VEC *, double, VEC *)
VEC * sv_mlt(double, VEC *, VEC *)
#define MEM_STAT_REG(var, type)
static philox4x32_key_t k
VEC * sp_mv_mlt(SPMAT *A, VEC *x, VEC *out)