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