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 ){ mult_su3_mat_vec( a+0,b0,c ); mult_su3_mat_vec_sum( a+1,b1,c ); mult_su3_mat_vec_sum( a+2,b2,c ); mult_su3_mat_vec_sum( a+3,b3,c ); }
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)); }
void dslash_fn_dir(su3_vector *src, su3_vector *dest, int parity, fn_links_t *fn, int dir, int fb, Real wtfat, Real wtlong) { register int i ; site *s; msg_tag *tag[2]; su3_matrix *fat = get_fatlinks(fn); su3_matrix *lng = get_lnglinks(fn); su3_vector tmp; int do_long = (lng != NULL) && (wtlong != 0.); char myname[] = "fn_shift"; if(fat == NULL) { printf("%s(%d): fat or lng member is null\n", myname, this_node); terminate(1); } if(fb > 0){ /* Shift from forward direction */ tag[0] = start_gather_field( src, sizeof(su3_vector), dir, parity, gen_pt[0] ); if(do_long) tag[1] = start_gather_field( src, sizeof(su3_vector), DIR3(dir), parity, gen_pt[1] ); wait_gather(tag[0]); if(do_long) wait_gather(tag[1]); FORSOMEPARITYDOMAIN(i,s,parity) { mult_su3_mat_vec( fat+4*i+dir, (su3_vector *)gen_pt[0][i], &tmp ); scalar_mult_add_su3_vector( dest+i, &tmp, wtfat, dest+i ) ; if(do_long){ mult_su3_mat_vec( lng+4*i+dir, (su3_vector *)gen_pt[1][i], &tmp ); scalar_mult_add_su3_vector( dest+i, &tmp, wtlong, dest+i ) ; } } END_LOOP
FORALLSITES(i,s) { mult_su3_mat_vec( &(s->link[dir]), (su3_vector *)gen_pt[0][i], (su3_vector *)F_PT(s,dest) ) ; }