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++ )
87 zhhvec(tmp1,k,&beta,tmp1,&
A->me[k][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;
169 zhhvec(tmp1,k,&beta,tmp1,&
A->me[k][k]);
170 diag->
ve[
k] = tmp1->
ve[
k];
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++ )
213 tmp_val = (r_ii*
zabs(diag->
ve[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++ )
252 tmp1->
ve[j].
re = tmp1->
ve[j].
im = 0.0;
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];
261 tmp_val = (r_ii*
zabs(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-- )
349 tmp_val = (r_ii*
zabs(diag->
ve[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;
469 y->
ve[
i] =
zdiv(sum,QR->me[i][i]);
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++ )
ZVEC * zQRCPsolve(ZMAT *QR, ZVEC *diag, PERM *pivot, ZVEC *b, ZVEC *x)
ZVEC * zQRsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x)
ZMAT * zmakeQ(ZMAT *QR, ZVEC *diag, ZMAT *Qout)
static Object ** v_resize(void *v)
complex zmake(double real, double imag)
ZVEC * pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out)
ZMAT * zQRfactor(ZMAT *A, ZVEC *diag)
ZMAT * zhhtrcols(ZMAT *M, int i0, int j0, ZVEC *hh, double beta)
double zQRcondest(ZMAT *QR)
void __zmltadd__(complex *zp1, complex *zp2, complex s, int len, int flag)
static philox4x32_key_t k
complex __zip__(complex *zp1, complex *zp2, int len, int flag)
complex zmlt(complex z1, complex z2)
PERM * px_transp(PERM *px, u_int i, u_int j)
complex zadd(complex z1, complex z2)
ZMAT * zm_resize(ZMAT *A, int new_m, int new_n)
ZVEC * zUAsolve(ZMAT *U, ZVEC *b, ZVEC *out, double diag)
ZVEC * _zQsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x, ZVEC *tmp)
#define tracecatch(ok_part, function)
ZVEC * zget_col(ZMAT *mat, int col, ZVEC *vec)
ZVEC * zUAmlt(ZMAT *U, ZVEC *x, ZVEC *out)
ZVEC * zhhvec(ZVEC *vec, int i0, Real *beta, ZVEC *out, complex *newval)
ZMAT * zset_col(ZMAT *mat, int col, ZVEC *vec)
ZMAT * zmakeR(ZMAT *QR, ZMAT *Rout)
ZVEC * zv_resize(ZVEC *x, int new_dim)
ZVEC * zhhtrvec(ZVEC *hh, double beta, int i0, ZVEC *in, ZVEC *out)
ZMAT * zQRCPfactor(ZMAT *A, ZVEC *diag, PERM *px)
#define MEM_STAT_REG(var, type)
ZVEC * zUmlt(ZMAT *U, ZVEC *x, ZVEC *out)
complex zdiv(complex z1, complex z2)
ZVEC * zUsolve(ZMAT *matrix, ZVEC *b, ZVEC *out, double diag)
#define error(err_num, fn_name)
ZVEC * zv_mlt(complex scalar, ZVEC *vector, ZVEC *out)
ZVEC * zQRAsolve(ZMAT *QR, ZVEC *diag, ZVEC *b, ZVEC *x)
complex zsub(complex z1, complex z2)