su3.h: MILC SU(3) library prototypes
See also:
/****************************** su3.h **********************************
*
Defines and subroutine declarations for SU3 simulation *
MIMD version 4 *
*
*************************************************************************/
typedef struct { complex e[3][3]; } su3_matrix;
typedef struct { complex c[3]; } su3_vector;
typedef struct{
complex m01,m02,m12;
float m00im,m11im,m22im;
float space;
} anti_hermitmat;
typedef struct { su3_vector d[4]; } wilson_vector;
typedef struct { su3_vector h[2]; } half_wilson_vector;
typedef struct { wilson_vector c[3]; } color_wilson_vector;
typedef struct { color_wilson_vector d[4]; } wilson_matrix;
#define GAMMAFIVE -1 /* some integer which is not a direction */
#define PLUS 1 /* flags for selecting M or M_adjoint */
#define MINUS -1
/* Macros to multiply complex numbers by +-1 and +-i */
#define TIMESPLUSONE(a,b) { (b).real = (a).real; (b).imag = (a).imag; }
#define TIMESMINUSONE(a,b) { (b).real = -(a).real; (b).imag = -(a).imag; }
#define TIMESPLUSI(a,b) { (b).real = -(a).imag; (b).imag = (a).real; }
#define TIMESMINUSI(a,b) { (b).real = (a).imag; (b).imag = -(a).real; }
/* random number routines */
void initialize_prn();
float myrand();
typedef struct {
/* We assume long is at least 32 bits */
unsigned long r0,r1,r2,r3,r4,r5,r6;
unsigned long multiplier,addend,ic_state;
float scale;
} double_prn;
ROUTINES FOR SU(3) MATRIX OPERATIONS:
[A.B is matrix multiplication]
void mult_su3_nn( su3_matrix *A, su3_matrix *B, su3_matrix *C)
Usage: C <- A.B
matrix multiply, no adjoints
Source files: m_mat_nn.c
m_mat_nn.alpha
m_mat_nn.m4
m_mat_nn.rs6k
m_mat_nn.t3d
void mult_su3_na( su3_matrix *A, su3_matrix *B, su3_matrix *C)
Usage: C <- A.B_adjoint
matrix multiply, second matrix is adjoint
Source files: m_mat_na.c
m_mat_na.alpha
m_mat_na.m4
m_mat_na.t3d
void mult_su3_an( su3_matrix *A, su3_matrix *B, su3_matrix *C)
Usage: C <- A_adjoint.B
matrix multiply, first matrix is adjoint
Source files: m_mat_an.c
m_mat_an.alpha
m_mat_an.m4
m_mat_an.t3d
float realtrace_su3(su3_matrix *A, su3_matrix *B)
Usage: returns Re(Tr( A_adjoint.B ))
Source file: realtr.c
complex trace_su3(su3_matrix *A)
Usage: returns (complex) Tr(A)
Source file: trace_su3.c
complex complextrace_su3(su3_matrix *A, su3_matrix *B)
Usage: returns Tr( A_adjoint*B )
Source file: complextr.c
complex det_su3(su3_matrix *A)
Usage: returns (complex) Det(A)
Source file: det_su3.c
void add_su3_matrix(su3_matrix *A, su3_matrix *B, su3_matrix *C)
Usage: C <- A + B
Source files: addmat.c
addmat.alpha
addmat.m4
addmat.t3d
void sub_su3_matrix(su3_matrix *A, su3_matrix *B, su3_matrix *C)
Usage: C <- A - B
Source file: submat.c
void scalar_mult_su3_matrix(su3_matrix *A, float s,su3_matrix *B)
Usage: B <- s*A
Source file: s_m_mat.c
void scalar_mult_add_su3_matrix(su3_matrix *A, su3_matrix *cb,
float s, su3_matrix *C)
Usage: C <- A + s*B
Source files: s_m_a_mat.c
s_m_a_mat.m4
void scalar_mult_sub_su3_matrix(su3_matrix *A, su3_matrix *B,
float s, su3_matrix *C)
Usage: C <- A - s*B
Source file: s_m_s_mat.c
void c_scalar_mult_su3mat(su3_matrix *A, complex *phase,
su3_matrix *B)
Usage: B <- phase*A
Source file: cs_m_mat.c
void c_scalar_mult_add_su3mat(su3_matrix *A, su3_matrix *B,
complex *phase, su3_matrix *C)
Usage: C <- A + phase*B
Source file: cs_m_a_mat.c
void c_scalar_mult_sub_su3mat(su3_matrix *A, su3_matrix *B,
complex *phase, su3_matrix *C)
Usage: C <- A - phase*B
Source file: cs_m_s_mat.c
void su3_adjoint(su3_matrix *A, su3_matrix *B)
Usage: B <- A_adjoint (get adjoint of an SU3 matrix)
Source file: su3_adjoint.c
void make_anti_hermitian(su3_matrix *M3, anti_hermitmat *AH3)
Usage: take the traceless and anti_hermitian part of an su3 matrix M3
and compress it into AH3
Source file: make_ahmat.c
void random_anti_hermitian(anti_hermitmat *mat_antihermit,
void *prn_pt)
Usage: loads *mat_antihermit with Gaussian random anti_hermitian matrix
Note: void *prn_pt; (passed through to myrand())
Source file: rand_ahmat.c
void uncompress_anti_hermitian(anti_hermitmat *mat_antihermit,
su3_matrix *mat_su3)
Usage: uncompresses an anti_hermitian matrix to make a 3x3 complex matrix
Source file: uncmp_ahmat.c
void compress_anti_hermitian(su3_matrix *mat_su3,
anti_hermitmat *mat_antihermit)
Usage: Make an anti_hermitmat (anti Hermitian matrix in compressed form)
from an SU3 matrix (3x3 complex matrix).
Source file: cmp_ahmat.c
void su3mat_copy(su3_matrix *A, su3_matrix *B)
Usage: B <- A
Source file: su3mat_copy.c
ROUTINES FOR su3_vector OPERATIONS ( 3 component complex ):
void c_scalar_mult_su3vec(su3_vector *v1, complex *phase,
su3_vector *v2)
Usage: v1 <- phase*v2
Source file: cs_m_vec.c
void c_scalar_mult_add_su3vec(su3_vector *v1, complex *phase,
su3_vector *v2)
Usage: multiply an su3 vector by a complex scalar and add it to another
vector: v1 <- v1 + number*v2
Source file: cs_m_a_vec.c
void c_scalar_mult_sub_su3vec(su3_vector *v1, complex *phase,
su3_vector *v2)
Usage: multiply an su3 vector by a complex scalar and subtract it from
another vector: v1 <- v1 - number*v2
Source file: cs_m_s_vec.c
void su3_projector(su3_vector *a, su3_vector *b, su3_matrix *c)
Usage: c <- a (X) b (c <- outer product of a and b)
Source file: su3_proj.c
void su3vec_copy(su3_vector *a, su3_vector*b)
Usage: b <- a
Source files: su3vec_copy.c
su3vec_copy.m4
void mult_su3_mat_vec(su3_matrix *A, su3_vector *b, su3_vector *c)
Usage: c <- A . b (matrix . vector multiply)
Source files: m_matvec.c
m_matvec.m4
void mult_su3_mat_vec_sum(su3_matrix *A, su3_vector *b, su3_vector *c)
Usage: c <- c + A . b
su3_matrix A times su3_vector b and add to another su3_vector c
Source files: m_matvec_s.c
m_matvec_s.m4
void mult_su3_mat_vec_sum_4dir(su3_matrix *A, su3_vector *b0,
su3_vector *b1, su3_vector *b2,
su3_vector *b3, su3_vector *c )
Usage: Multiply four su3_vectors by elements of an array of su3_matrices,
sum results: c <- A[0].b0 + A[1].b1 + A[2].b2 + A[3].b3
Source files: m_mv_s_4dir.alpha
m_mv_s_4dir.m4
m_mv_s_4di2.m4
m_mv_s_4dir.t3d
m_mv_s_4dir.rs6k
void mult_su3_mat_vec_nsum(su3_matrix *A, su3_vector *b, su3_vector *c)
Usage: su3_matrix times su3_vector multiply and subtract from another
su3_vector: c <- c - A . b
Source file: m_matvec_ns.c
void mult_adj_su3_mat_vec(su3_matrix *A, su3_vector *b, su3_vector *c)
Usage: c <- A_adjoint . b
Source files: m_amatvec.c
m_amatvec.alpha
m_amatvec.m4
void mult_adj_su3_mat_vec_4dir(su3_matrix *A, su3_vector *b,
su3_vector *c)
Usage: Multiply an su3_vector by adjoints of elements of an array
of su3_matrices, results in an array of su3_vectors:
c[i] <- A_adjoint[i]*b, i = 0,1,2,3
Source files: m_amv_4dir.c
m_amv_4dir.alpha
m_amv_4dir.m4
m_amv_4di2.m4
m_amv_4dir.t3d
m_amv_4dir.rs6k
void mult_adj_su3_mat_vec_sum(su3_matrix *A, su3_vector *b,
su3_vector *c)
Usage: adjoint matrix times vector multiply and add to another vector
c <- c + A_adjoint . b
Source file: m_amatvec_s.c
void mult_adj_su3_mat_vec_nsum(su3_matrix *A, su3_vector *b,
su3_vector *c)
Usage: adjoint matrix times vector multiply and subtract from another vector
c <- c - A_adjoint . b
Source file: m_amatvec_ns.c
void add_su3_vector(su3_vector *a, su3_vector *b, su3_vector *c)
Usage: c <- a + b
Source files: addvec.c
addvec.m4
void sub_su3_vector(su3_vector *a, su3_vector *b, su3_vector *c)
Usage: c <- a - b
Source files: subvec.c
subvec.m4
void sub_four_su3_vecs(su3_vector *a, su3_vector *b1,
su3_vector *b2, su3_vector *b3, su3_vector *b4)
Usage: a <- a - b1 - b2 - b3 - b4
Source files: sub4vecs.c
sub4vecs.alpha
sub4vecs.m4
sub4vecs.t3d
void scalar_mult_su3_vector(su3_vector *a, float s, su3_vector *c)
Usage: c <- s*a
Source file: s_m_vec.c
void scalar_mult_add_su3_vector(su3_vector *a, su3_vector *b, float s,
su3_vector *c)
Usage: c <- a + s*b
Source files: s_m_a_vec.c
s_m_a_vec.alpha
s_m_a_vec.m4
s_m_a_vec.t3d
void scalar_mult_sum_su3_vector(su3_vector *a, su3_vector *b, float s)
Usage: a <- a + s*b
Source files: s_m_sum_vec.c
s_m_sum_vec.m4
void scalar_mult_sub_su3_vector(su3_vector *a, su3_vector *b, float s,
su3_vector *c)
Usage: c <- a - s*b
Source file: s_m_s_vec.c
complex su3_dot(su3_vector *a, su3_vector *b)
Usage: return a.b (dot product of two su3_vectors)
Source file: su3_dot.c
float su3_rdot(su3_vector *a, su3_vector *b)
Usage: return Re(a.b) Real part (dot product of two su3_vectors)
Source files: su3_rdot.c
su3_rdot.alpha
su3_rdot.m4
su3_rdot.t3d
float magsq_su3vec(su3_vector *a;)
Usage: Usage: returns |a|^2 ( squared magnitude of an SU3 vector )
Source files: msq_su3vec.c
msq_su3vec.alpha
msq_su3vec.m4
msq_su3vec.t3d
ROUTINES FOR wilson_vectors:
void mult_mat_wilson_vec( su3_matrix *MAT, wilson_vector *src,
wilson_vector *dest)
Usage: dest <- MAT . src
Source file: m_mat_wvec.c
void mult_su3_mat_hwvec( su3_matrix *MAT, half_wilson_vector *src,
half_wilson_vector *dest)
Usage: dest <- MAT . src
Source files: m_mat_hwvec.c
m_mat_hwvec.m4
void mult_adj_mat_wilson_vec( su3_matrix *MAT, wilson_vector *src,
wilson_vector *dest)
Usage: dest <- MAT_adjoint . src
Source file: m_amat_wvec.c
void mult_adj_su3_mat_hwvec( su3_matrix *MAT, half_wilson_vector *src,
half_wilson_vector *dest)
Usage: dest <- MAT_adjoint . src
Source files: m_amat_hwvec.c
m_amat_hwve.m4
void add_wilson_vector( wilson_vector *src1, wilson_vector *src2,
wilson_vector *dest)
Usage: dest <- src1 + src2
Source file: add_wvec.c
void sub_wilson_vector( wilson_vector *src1, wilson_vector *src2,
wilson_vector *dest)
Usage: dest <- src1 - src2
Source file: sub_wvec.c
void scalar_mult_wvec( wilson_vector *src, float s,
wilson_vector *dest)
Usage: dest <- s*src
Source file: s_m_wvec.c
void scalar_mult_hwvec( half_wilson_vector *src, float s,
half_wilson_vector *dest)
Usage: dest <- s*src
Source file: s_m_hwvec.c
float magsq_wvec( wilson_vector *src)
Usage: returns |src|^2 ( squared magnitude of a wilson_vector )
Source files: msq_wvec.c
msq_wvec.m4
complex wvec_dot( wilson_vector *src1, *src2 )
Usage: returns src1 . src2
Source files: wvec_dot.c
wvec_dot.m4
float wvec_rdot(wilson_vector *a, wilson_vector *b)
Usage: returns Re( src1 . src2 )
Source file: wvec_rdot.c
wvec_rdot.m4
void scalar_mult_add_wvec( wilson_vector *src1,*src2, float s,
wilson_vector *dest)
Usage: dest <- src1 + s*src2
Source file: s_m_a_wvec.c
s_m_a_wvec.m4
void scalar_mult_addtm_wvec( wilson_vector *src1,*src2, float s,
wilson_vector *dest)
Usage: dest <- -src1 + s*src2 ("atm"="add to minus")
Source file: s_m_atm_wvec.c
void c_scalar_mult_add_wvec(wilson_vector *src1, wilson_vector *src2,
complex *phase, wilson_vector *dest)
Usage: dest <- src1 + s*src2
Source files: cs_m_a_wvec.c
cs_m_a_wvec.m4
void c_scalar_mult_add_wvec2(wilson_vector *src1, wilson_vector *src2,
complex *phase, wilson_vector *dest)
Usage: dest <- src1 + s*src2
Source file: cs_m_a_wvec2.c
void su3_projector_w(wilson_vector *a, wilson_vector *b,
su3_matrix *c)
Usage: sum over spins of outer product of A.d[s] and B.d[s]
--- a three by three complex matrix
Source file: su3_proj_w.c
void copy_wvec( wilson_vector *src, wilson_vector *dest)
Usage: dest <- src
Source file: copy_wvec.c
void clear_wvec( wilson_vector *dest)
Usage: dest <- 0.0
Source file: clear_wvec.c
void wp_shrink( wilson_vector *src, half_wilson_vector *dest,
int dir, int sign)
Usage:
if(dir = [XYZT]UP) dest <- components of src along eigenvectors
of gamma_dir with eigenvalue +1
if(dir = [XYZT]DOWN) dest <- components of src along eigenvectors
of gamma_dir with eigenvalue -1
if(sign==MINUS) switch roles of +1 and -1
Source files: wp_shrink.c
wp_shrink.m4
void wp_shrink_4dir(wilson_vector *a, half_wilson_vector *b1,
half_wilson_vector *b2, half_wilson_vector *b3,
half_wilson_vector *b4, int sign)
Usage: Shrink A in X,Y,Z,T directions respectively, results in B1-B4
Source file: wp_shrink4.c
wp_shrink4.m4
void wp_grow( half_wilson_vector *src, wilson_vector *dest,
int dir, int sign)
Usage:
if(dir = [XYZT]UP) dest <- components of src times eigenvectors
of gamma_dir with eigenvalue +1
if(dir = [XYZT]DOWN) dest <- components of src times eigenvectors
of gamma_dir with eigenvalue -1
if(sign==MINUS) switch roles of +1 and -1
Note: wp_shrink( +-dir) followed by wp_grow( +-dir) amounts to
multiplication by 1+-gamma_dir, or 1-+gamma_dir if sign=MINUS
Source file: wp_grow.c
void wp_grow_add( half_wilson_vector *src, wilson_vector *dest,
int dir, int sign)
Usage: wp_grow, and add result to previous contents of dest.
Source files: wp_grow_a.c
wp_grow_a.alpha
wp_grow_a.m4
void grow_add_four_wvecs(wilson_vector *a, half_wilson_vector *b1,
half_wilson_vector *b2, half_wilson_vector *b3,
half_wilson_vector *b4, int sign, int sum)
Usage:
If sum==0
Grow b1-b4 in X,Y,Z,T directions respectively, sum of results in A
If sum==1
Grow b1-b4 in X,Y,Z,T directions respectively, add to current A
Source file: grow4wvecs.c
grow4wvecs.m4
void mult_by_gamma( wilson_vector *src, wilson_vector *dest, int dir)
dest <- gamma[dir] . src, dir=[XYZT]UP,GAMMAFIVE
Source file: mb_gamma.c
void mult_by_gamma_left( wilson_matrix *src, wilson_matrix *dest,
int dir)
Usage: dest <- gamma[dir] . src, dir=[XYZT]UP,GAMMAFIVE
acts on first index of matrix
Source file: mb_gamma_l.c
void mult_by_gamma_right( wilson_matrix *src, wilson_matrix *dest,
int dir)
Usage: dest_ij <- gamma[dir]_ik . src_jk, dir=[XYZT]UP,GAMMAFIVE
acts on second index of matrix
Source file: mb_gamma_r.c
void dump_wilson_vec( wilson_vector *src)
Usage: print out a wilson vector
Source file: dump_wvec.c
MISCELLANEOUS ROUTINES:
float gaussian_rand_no(void *prn_pt)
Usage: returns Gaussian random number.
Note: (void *prn_pt passed to myrand())
Source file: gaussrand.c
void dumpmat(su3_matrix *m)
Usage: print out an su3_matrix
Source file: dumpmat.c
void dumpvec(su3_vector *v)
Usage: print out an su3_vector
Source file: dumpvec.c
J. E. Hetrick
[hetrick@physics.arizona.edu]
Last modified: Tue Jul 2 18:57:40 1996