1 #include <../../nrnconf.h>
42 static char rcsid[] =
"zqrfctr.c,v 1.1 1997/12/04 17:56:15 hines Exp";
50 #define is_zero(z) ((z).re == 0.0 && (z).im == 0.0)
53 #define sign(x) ((x) > 0.0 ? 1 : ((x) < 0.0 ? -1 : 0 ))
75 limit =
min(
A->m,
A->n);
76 if (
diag->dim < limit )
82 for (
k=0;
k<limit;
k++ )
110 Real maxgamma, sum, tmp;
113 if ( !
A || !
diag || ! px )
115 limit =
min(
A->m,
A->n);
116 if (
diag->dim < limit || px->
size !=
A->n )
127 for (
j=0;
j<
A->n;
j++ )
131 for (
i=0;
i<
A->m;
i++ )
136 for (
k=0;
k<limit;
k++ )
139 i_max =
k; maxgamma = gamma->
ve[
k];
140 for (
i=
k+1;
i<
A->n;
i++ )
143 if ( gamma->
ve[
i] > maxgamma )
144 { maxgamma = gamma->
ve[
i]; i_max =
i; }
151 gamma->
ve[
k] = gamma->
ve[i_max];
152 gamma->
ve[i_max] = tmp;
158 for (
i=0;
i<
A->m;
i++ )
161 A->me[
i][
k] =
A->me[
i][i_max];
162 A->me[
i][i_max] = ztmp;
177 for (
j=
k+1;
j<
A->n;
j++ )
193 Real beta, r_ii, tmp_val;
195 limit =
min(QR->m,QR->n);
197 if ( ! QR || !
diag || ! b )
199 if (
diag->dim < limit || b->
dim != QR->m )
208 for (
k = 0 ;
k < limit ;
k++ )
214 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
233 Real beta, r_ii, tmp_val;
236 limit =
min(QR->m,QR->n);
237 if ( ! QR || !
diag )
239 if (
diag->dim < limit )
248 for (
i=0;
i<QR->m ;
i++ )
251 for (
j=0;
j<QR->m ;
j++ )
253 tmp1->
ve[
i].
re = 1.0;
256 for (
j=limit-1;
j>=0;
j-- )
259 r_ii =
zabs(tmp2->ve[
j]);
260 tmp2->ve[
j] =
diag->ve[
j];
262 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
285 for (
i=1;
i<QR->m;
i++ )
286 for (
j=0;
j<QR->n &&
j<
i;
j++ )
287 Rout->me[
i][
j].re = Rout->me[
i][
j].im = 0.0;
301 if ( ! QR || !
diag || ! b )
303 limit =
min(QR->m,QR->n);
304 if (
diag->dim < limit || b->
dim != QR->m )
325 Real beta, r_ii, tmp_val;
328 if ( ! QR || !
diag || ! b )
330 limit =
min(QR->m,QR->n);
331 if (
diag->dim < limit || b->
dim != QR->n )
340 printf(
"zQRAsolve: tmp->dim = %d, x->dim = %d\n", tmp->
dim, x->
dim);
343 for (
j=limit-1;
j>=0;
j-- )
350 beta = ( tmp_val == 0.0 ) ? 0.0 : 1.0/tmp_val;
366 if ( ! QR || !
diag || ! pivot || ! b )
368 if ( (QR->m >
diag->dim && QR->n >
diag->dim) || QR->n != pivot->
size )
387 limit =
min(U->m,U->n);
388 if ( limit != x->
dim )
393 for (
i = 0;
i < limit;
i++ )
409 limit =
min(U->m,U->n);
413 for (
i = limit-1;
i >= 0;
i-- )
436 Real norm, norm1, norm2, tmp1, tmp2;
443 limit =
min(QR->m,QR->n);
444 for (
i = 0;
i < limit;
i++ )
453 for (
i = 0;
i < limit;
i++ )
455 sum.
re = sum.
im = 0.0;
456 for (
j = 0;
j <
i;
j++ )
465 sum.
re += sum.
re / norm1;
466 sum.
im += sum.
im / norm1;
474 for (
i = 0;
i < 3;
i++ )
487 for (
i = limit-1;
i >= 0;
i-- )
489 sum.
re = sum.
im = 0.0;
490 for (
j =
i+1;
j < limit;
j++ )
494 tmp =
zdiv(sum,QR->me[
i][
i]);
511 for (
i = 0;
i < 3;
i++ )
#define error(err_num, fn_name)
#define tracecatch(ok_part, function)
static Object ** v_resize(void *v)
PERM * px_transp(PERM *px, u_int i, u_int j)
#define MEM_STAT_REG(var, type)
static philox4x32_key_t k
complex zmake(double real, double imag)
complex zdiv(complex z1, complex z2)
complex zmlt(complex z1, complex z2)
complex zsub(complex z1, complex z2)
complex zadd(complex z1, complex z2)
ZVEC * zhhvec(ZVEC *vec, int i0, Real *beta, ZVEC *out, complex *newval)
ZMAT * zhhtrcols(ZMAT *M, int i0, int j0, ZVEC *hh, double beta)
ZVEC * zhhtrvec(ZVEC *hh, double beta, int i0, ZVEC *in, ZVEC *out)
complex __zip__(complex *zp1, complex *zp2, int len, int flag)
void __zmltadd__(complex *zp1, complex *zp2, complex s, int len, int flag)
ZMAT * zset_col(ZMAT *mat, int col, ZVEC *vec)
ZVEC * zget_col(ZMAT *mat, int col, ZVEC *vec)
ZVEC * zUAsolve(ZMAT *U, ZVEC *b, ZVEC *out, double diag)
ZVEC * zUsolve(ZMAT *matrix, ZVEC *b, ZVEC *out, double diag)
ZVEC * zv_mlt(complex scalar, ZVEC *vector, ZVEC *out)
ZVEC * zv_resize(ZVEC *x, int new_dim)
ZVEC * pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out)
ZMAT * zm_resize(ZMAT *A, int new_m, int new_n)
ZVEC * zUmlt(ZMAT *U, ZVEC *x, ZVEC *out)
ZMAT * zQRCPfactor(ZMAT *A, ZVEC *diag, PERM *px)
ZVEC * zUAmlt(ZMAT *U, ZVEC *x, ZVEC *out)
ZVEC * _zQsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x, ZVEC *tmp)
ZMAT * zmakeR(ZMAT *QR, ZMAT *Rout)
ZMAT * zmakeQ(ZMAT *QR, ZVEC *diag, ZMAT *Qout)
ZVEC * zQRAsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x)
ZMAT * zQRfactor(ZMAT *A, ZVEC *diag)
double zQRcondest(ZMAT *QR)
ZVEC * zQRsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x)
ZVEC * zQRCPsolve(ZMAT *QR, ZVEC *diag, PERM *pivot, ZVEC *b, ZVEC *x)