1 #include <../../nrnconf.h> 32 static char rcsid[] =
"zmatop.c,v 1.1 1997/12/04 17:56:12 hines Exp";
35 #define is_zero(z) ((z).re == 0.0 && (z).im == 0.0) 39 ZMAT *mat1,*mat2,*out;
45 if ( mat1->m != mat2->m || mat1->n != mat2->n )
47 if ( out==
ZMNULL || out->m != mat1->m || out->n != mat1->n )
49 m = mat1->m; n = mat1->n;
52 __zadd__(mat1->me[i],mat2->me[i],out->me[i],(
int)n);
64 ZMAT *mat1,*mat2,*out;
70 if ( mat1->m != mat2->m || mat1->n != mat2->n )
72 if ( out==
ZMNULL || out->m != mat1->m || out->n != mat1->n )
74 m = mat1->m; n = mat1->n;
77 __zsub__(mat1->me[i],mat2->me[i],out->me[i],(
int)n);
106 m =
A->m; n =
A->n; p =
B->n;
107 A_v =
A->me; B_v =
B->me;
123 for ( i=0; i<m; i++ )
124 for ( k=0; k<
n; k++ )
156 for ( i = 0; i <
A->m; i++ )
157 for ( j = 0; j <
B->m; j++ )
193 for ( k = 0; k <
A->m; k++ )
194 for ( i = 0; i <
A->n; i++ )
196 tmp.
re =
A->me[
k][
i].re;
197 tmp.
im = -
A->me[
k][
i].im;
217 if (
A->n != b->
dim )
225 A_v =
A->me; b_v = b->
ve;
226 for ( i=0; i<m; i++ )
251 if ( out==
ZMNULL || out->
m != matrix->
m || out->
n != matrix->
n )
253 m = matrix->
m; n = matrix->
n;
254 for ( i=0; i<m; i++ )
273 if (
A->m != b->
dim )
283 for ( j = 0; j < m; j++ )
284 if ( b->
ve[j].
re != 0.0 || b->
ve[j].
im != 0.0 )
310 if ( in == out && in->n != in->m )
312 in_situ = ( in == out );
313 if ( out ==
ZMNULL || out->m != in->n || out->n != in->m )
318 for ( i = 0; i < in->m; i++ )
319 for ( j = 0; j < in->n; j++ )
321 out->me[
j][
i].re = in->me[
i][
j].re;
322 out->me[
j][
i].im = - in->me[
i][
j].im;
327 for ( i = 0 ; i < in->m; i++ )
329 for ( j = 0; j <
i; j++ )
331 tmp.
re = in->me[
i][
j].re;
332 tmp.
im = in->me[
i][
j].im;
333 in->me[
i][
j].re = in->me[
j][
i].re;
334 in->me[
i][
j].im = - in->me[
j][
i].im;
335 in->me[
j][
i].re = tmp.
re;
336 in->me[
j][
i].im = - tmp.
im;
338 in->me[
i][
i].im = - in->me[
i][
i].im;
355 if (
i < 0 || j < 0 || i >=
A->m ||
j >=
A->m )
361 for ( k = lo; k <= hi; k++ )
364 A_me[
k][
i] = A_me[
k][
j];
380 if (
i < 0 || j < 0 || i >=
A->n ||
j >=
A->n )
386 for ( k = lo; k <= hi; k++ )
389 A_me[
i][
k] = A_me[
j][
k];
408 if ( A1->m != A2->m || A1->n != A2->n )
411 if ( out != A1 && out != A2 )
414 if ( s.
re == 0.0 && s.
im == 0.0 )
416 if ( s.
re == 1.0 && s.
im == 0.0 )
421 m = A1->m; n = A1->n;
422 for ( i = 0; i < m; i++ )
449 if ( ! v1 || ! v2 || ! A )
453 if ( v1->dim != A->
m || v2->dim != A-> n )
458 v2_ve = v2->ve; out_ve = out->
ve;
461 if ( alpha.
re == 0.0 && alpha.
im == 0.0 )
464 for ( i = 0; i < m; i++ )
492 if ( ! v1 || ! v2 || ! A )
496 if ( v1->dim != A->
n || A->
m != v2->dim )
501 out_ve = out->
ve; m = A->
m; n = A->
n;
502 for ( j = 0; j < m; j++ )
505 tmp.
re = v2->ve[
j].re*alpha.
re - v2->ve[
j].im*alpha.
im;
506 tmp.
im = v2->ve[
j].re*alpha.
im + v2->ve[
j].im*alpha.
re;
507 if ( tmp.
re != 0.0 || tmp.
im != 0.0 )
529 if ( col < 0 || col >= mat->
n )
534 for ( i=0; i<mat->
m; i++ )
535 vec->
ve[i] = mat->
me[i][col];
550 if ( row < 0 || row >= mat->
m )
574 if ( col < 0 || col >= mat->
n )
577 for ( i=0; i<lim; i++ )
578 mat->
me[i][col] = vec->
ve[i];
593 if ( row < 0 || row >= mat->
m )
612 for ( i = 0; i < A->
m; i++ )
ZMAT * zmam_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
ZMAT * zm_adjoint(ZMAT *in, ZMAT *out)
double max(double a, double b)
ZVEC * zvm_mltadd(ZVEC *v1, ZVEC *v2, ZMAT *A, complex alpha, ZVEC *out)
ZMAT * zswap_cols(ZMAT *A, int i, int j, int lo, int hi)
void __zmlt__(complex *zp, complex s, complex *out, int len)
#define MEMCOPY(from, to, n_items, type)
ZMAT * zmma_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
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)
ZVEC * zget_row(ZMAT *mat, int row, ZVEC *vec)
ZMAT * zset_row(ZMAT *mat, int row, ZVEC *vec)
ZMAT * zm_resize(ZMAT *A, int new_m, int new_n)
int const size_t const size_t n
ZMAT * zm_add(ZMAT *mat1, ZMAT *mat2, ZMAT *out)
ZVEC * zmv_mlt(ZMAT *A, ZVEC *b, ZVEC *out)
#define tracecatch(ok_part, function)
ZMAT * mz_mltadd(ZMAT *A1, ZMAT *A2, complex s, ZMAT *out)
ZVEC * zget_col(ZMAT *mat, int col, ZVEC *vec)
ZVEC * zmv_mltadd(ZVEC *v1, ZVEC *v2, ZMAT *A, complex alpha, ZVEC *out)
void __zsub__(complex *zp1, complex *zp2, complex *out, int len)
void __zadd__(complex *zp1, complex *zp2, complex *out, int len)
ZMAT * zm_sub(ZMAT *mat1, ZMAT *mat2, ZMAT *out)
ZMAT * zset_col(ZMAT *mat, int col, ZVEC *vec)
ZMAT * zm_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
ZVEC * zv_resize(ZVEC *x, int new_dim)
#define error(err_num, fn_name)
ZMAT * zsm_mlt(complex scalar, ZMAT *matrix, ZMAT *out)
ZMAT * zswap_rows(ZMAT *A, int i, int j, int lo, int hi)
ZVEC * zvm_mlt(ZMAT *A, ZVEC *b, ZVEC *out)
void mrandlist(a, int len)