/* ttt <- ttt - msq_x4*src (msq = mass squared) */ FORSOMEPARITY(i,s,l_parity){ #ifdef CONGRAD_TMP_VECTORS if( i < loopend-FETCH_UP ){ prefetch_VVVV( &ttt[i+FETCH_UP], &t_dest[i+FETCH_UP], (su3_vector *)F_PT(s+FETCH_UP,src), &resid[i+FETCH_UP]); } scalar_mult_add_su3_vector( &ttt[i], &t_dest[i], -msq_x4, &ttt[i] ); /* note that we go back to the site structure for src */ add_su3_vector( (su3_vector *)F_PT(s,src), &ttt[i], &resid[i] ); /* remember ttt contains -M_adjoint*M*src */ cg_p[i] = resid[i]; /* note that we go back to the site structure for src */ source_norm += (double)magsq_su3vec( (su3_vector *)F_PT(s,src) ); rsq += (double)magsq_su3vec( &resid[i] ); #else if( i < loopend-FETCH_UP ){ prefetch_VVVV( &((s+FETCH_UP)->ttt), (su3_vector *)F_PT(s+FETCH_UP,dest), (su3_vector *)F_PT(s+FETCH_UP,src), &((s+FETCH_UP)->resid)); } scalar_mult_add_su3_vector( &(s->ttt), (su3_vector *)F_PT(s,dest), -msq_x4, &(s->ttt) ); add_su3_vector( (su3_vector *)F_PT(s,src), &(s->ttt), &(s->resid) ); s->cg_p = s->resid; source_norm += (double) magsq_su3vec( (su3_vector *)F_PT(s,src) ); rsq += (double) magsq_su3vec( &(s->resid) ); #endif } END_LOOP
void ks_dirac_op( su3_vector *src, su3_vector *dst, Real mass, int parity, imp_ferm_links_t *fn){ register int i; register site *s; dslash_field( src, dst, parity, fn); FORSOMEPARITYDOMAIN(i,s,parity){ scalar_mult_add_su3_vector( dst+i, src+i, +2.0*mass, dst+i); }
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
FORSOMEPARITY(i,s,l_parity) { scalar_mult_add_su3_vector( &temp[i],&init_guess[i],msq_xm4,&temp[i] ); add_su3_vector((su3_vector *)F_PT(s,src1),&temp[i],&common_source[i] ); source_norm += (double)magsq_su3vec( &common_source[i] ); source_norm1 += (double)magsq_su3vec( (su3_vector *)F_PT(s,src1) ); /*pm_strange[i] = cg_p[i] = resid[i] = common_source[i];*/ su3vec_copy( &common_source[i],&(resid[i]) ); su3vec_copy(&(resid[i]),&(cg_p[i]) ); su3vec_copy(&(resid[i]), &pm_strange[i]); su3vec_copy(&init_guess[i],&destvec1[i] ); su3vec_copy(&init_guess[i],&destvec2[i] ); } END_LOOP
static void scalar_mult_add_latvec_field(su3_vector *a, su3_vector *b, Real s, su3_vector *c){ int i; FORALLFIELDSITES(i){ scalar_mult_add_su3_vector(a+i, b+i, s, c+i); } }