1 #include <../../nrnconf.h> 39 static char rcsid[] =
"mfunc.c,v 1.1 1997/12/04 17:55:41 hines Exp";
49 int it_cnt,
k, max_bit;
56 #define Z(k) (((k) & 1) ? tmp : out) 72 for ( max_bit = 0; ; max_bit++ )
73 if ( (
p >> (max_bit+1)) == 0 )
77 for ( k = 0; k < max_bit; k++ )
79 m_mlt(
Z(it_cnt),
Z(it_cnt),
Z(it_cnt+1));
81 if (
p & (1 << (max_bit-1)) )
103 static MAT *wkspace, *tmp;
117 return _m_pow(tmp, -
p, wkspace, out);
143 int j,
k, l,
q, r,
s, j2max,
t;
144 double inf_norm, eqq, power2,
c,
sign;
168 if (inf_norm <= 0.0) {
176 j2max =
max(0, j2max);
180 for ( k = 1; k <= j2max; k++ )
188 for ( q = 1; eqq > eps; q++ )
189 eqq /= 16.0*(2.0*q+1.0)*(2.0*q+3.0);
195 for ( k = 1; k <=
q; k++ )
196 c1->
ve[k] = c1->
ve[k-1]*(q-k+1)/((2*q-k+1)*(
double)
k);
216 for( j = 0; j <
A->n; j++ )
222 for ( k = 0; k < s-1; k++ )
232 for ( l = 0; l <= q-
t; l++ )
235 sign = ((t+l) & 1) ? -1.0 : 1.0;
240 for (k=1; k <= r; k++)
245 for (l=0; l <
s; l++)
248 sign = ((t+l) & 1) ? -1.0 : 1.0;
264 for (k=0; k <
A->n; k++)
276 #define Z(k) ((k) & 1 ? Apow : out) 278 for( k = 1; k <= j2max; k++)
303 return _m_exp(
A,eps,out,&q_out,&j_out);
318 int j,
k, l,
q, r,
s,
t;
336 for (j=0; j < out->n; j++)
337 out->me[j][j] = a->
ve[0];
342 for (j=0; j < out->n; j++)
343 out->me[j][j] += a->
ve[0];
361 #define Z(k) ((k) & 1 ? tmp : &y0) 362 #define ZZ(k) ((k) & 1 ? tmp->ve : y0.ve) 364 for( j = 0; j <
A->n; j++)
371 for (k = 0; k < s-1; k++)
381 for ( l = 0; l <= q-
t; l++ )
384 for (k=1; k <= r; k++)
388 for (l=0; l <
s; l++)
391 if (
Z(k) == &y0)
v_copy(tmp,&y0);
double max(double a, double b)
MAT * LUfactor(MAT *A, PERM *pivot)
static Object ** m_inverse(void *v)
static Object ** v_resize(void *v)
double m_norm_inf(MAT *A)
MAT * m_poly(MAT *A, VEC *a, MAT *out)
MAT * sm_mlt(double scalar, MAT *matrix, MAT *out)
static philox4x32_key_t k
MAT * m_exp(MAT *A, double eps, MAT *out)
void __mltadd__(Real *dp1, Real *dp2, double s, int len)
PERM * px_resize(PERM *, int)
#define tracecatch(ok_part, function)
VEC * LUTsolve(MAT *LU, PERM *pivot, VEC *b, VEC *x)
MAT * _m_exp(MAT *A, double eps, MAT *out, int *q_out, int *j_out)
MAT * m_pow(MAT *A, int p, MAT *out)
static Object ** m_resize(void *v)
#define MEM_STAT_REG(var, type)
VEC * mv_mlt(MAT *A, VEC *b, VEC *out)
static Object ** m_zero(void *v)
MAT * m_mlt(MAT *A, MAT *B, MAT *OUT)
MAT * _m_pow(MAT *A, int p, MAT *tmp, MAT *out)
#define error(err_num, fn_name)
static Object ** m_ident(void *v)
MAT * m_transp(MAT *in, MAT *out)