1 #include <../../nrnconf.h> 38 static char rcsid[] =
"lanczos.c,v 1.1 1997/12/04 17:55:31 hines Exp";
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++ )
133 mant *=
frexp(a->
ve[i],&tmp_expt);
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++ )
276 det_mant1 =
product2(a,i,&det_expt1);
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));
VEC * sp_lanczos2(SPMAT *A, int m, VEC *x0, VEC *evals, VEC *err_est)
void lanczos(VEC *(*A_fn)(), void *A_params, int m, VEC *x0, VEC *a, VEC *b, Real *beta2, MAT *Q)
static Object ** v_resize(void *v)
static double product2(VEC *a, int k, int *expt)
static philox4x32_key_t k
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)
void sp_lanczos(SPMAT *A, int m, VEC *x0, VEC *a, VEC *b, Real *beta2, MAT *Q)
VEC * v_mltadd(VEC *, VEC *, double, VEC *)
#define set_col(mat, col, vec)
VEC * sv_mlt(double, VEC *, VEC *)
VEC * trieig(VEC *, VEC *, MAT *)
VEC * sp_mv_mlt(SPMAT *A, VEC *x, VEC *out)
static double v_get(void *v)
static Object ** v_add(void *v1)
static Object ** m_resize(void *v)
#define MEM_STAT_REG(var, type)
#define error(err_num, fn_name)
static int dbl_cmp(Real *x, Real *y)