void mult_adj_su3_mat_4vec( su3_matrix *mat, su3_vector *src, su3_vector *dest0, su3_vector *dest1, su3_vector *dest2, su3_vector *dest3 ) { mult_adj_su3_mat_vec( mat+0, src, dest0 ); mult_adj_su3_mat_vec( mat+1, src, dest1 ); mult_adj_su3_mat_vec( mat+2, src, dest2 ); mult_adj_su3_mat_vec( mat+3, src, dest3 ); }
void fuz_prop(field_offset fprop, int r0) { register int i; register site *s; int dir, k; msg_tag *tag0, *tag1; /* Save unfuzzed propagator in xxx */ copy_latvec( fprop, F_OFFSET(xxx), EVENANDODD); /* Give central value weight two */ scalar_mult_latvec( F_OFFSET(xxx), 2.0, fprop, EVENANDODD); if (r0 > 0){ for(dir=XUP;dir<=ZUP;dir++){ /* Start gathering for 'backward' link-product */ tag0 = start_gather_site(F_OFFSET(xxx), sizeof(su3_vector), dir, EVENANDODD, gen_pt[0]); /* Start 'forward' link-product */ FORALLSITES(i,s) { mult_adj_su3_mat_vec(&(s->link[dir]), &(s->xxx), &(s->ttt)); } tag1 = start_gather_site(F_OFFSET(ttt), sizeof(su3_vector), OPP_DIR(dir), EVENANDODD, gen_pt[1]); for(k=1;k<r0;k++) { wait_gather(tag0); /* copy_latvec( (field_offset)gen_pt[0], F_OFFSET(resid), EVENANDODD); */ FORALLSITES(i,s) { su3vec_copy((su3_vector *)gen_pt[0][i], &(s->resid)); } FORALLSITES(i,s) { mult_su3_mat_vec(&(s->link[dir]), &(s->resid), &(s->cg_p)); } if(k==1) { cleanup_gather(tag0); tag0 = start_gather_site(F_OFFSET(cg_p), sizeof(su3_vector), dir, EVENANDODD, gen_pt[0]); } else { restart_gather_site(F_OFFSET(cg_p), sizeof(su3_vector), dir, EVENANDODD, gen_pt[0], tag0); } wait_gather(tag1); /* copy_latvec( (field_offset)gen_pt[1], F_OFFSET(resid), EVENANDODD); */ FORALLSITES(i,s) { su3vec_copy((su3_vector *)gen_pt[1][i], &(s->resid)); }
/* Apply the symmetric shift opperator in direction "dir" * * This is the explicit version * * Covariant shifts are used */ void sym_shift(int dir, field_offset src,field_offset dest) { register int i ; register site *s ; msg_tag *tag[2]; su3_vector *tvec; tvec = (su3_vector *)malloc( sites_on_node*sizeof(su3_vector) ); tag[0] = start_gather_site( src, sizeof(su3_vector), dir, EVENANDODD ,gen_pt[0] ); FORALLSITES(i,s) { mult_adj_su3_mat_vec( &(s->link[dir]), (su3_vector *)F_PT(s,src), &(tvec[i]) ) ; }
/* Apply the symmetric shift operator in direction "dir" * * This is the explicit version * * Covariant shifts are used * * The KS phases MUST BE in the links */ static void sym_shift_field(int dir, su3_vector *src, su3_vector *dest) { register int i ; register site *s ; msg_tag *tag[2]; su3_vector *tvec = create_v_field(); tag[0] = start_gather_field( src, sizeof(su3_vector), dir, EVENANDODD, gen_pt[0] ); /* With ONE_SIDED_SHIFT defined, the shift is asymmetric */ #ifndef ONE_SIDED_SHIFT FORALLSITES(i,s) { mult_adj_su3_mat_vec( &(s->link[dir]), src+i, tvec+i ) ; }
FORALLSITES(i,s) { mult_adj_su3_mat_vec(&(s->link[dir]), &(s->resid), &(s->ttt)); }