/* the "full" operators */ void Q_pm_psi_prec(spinor * const l, spinor * const k) { spinorPrecWS *ws=(spinorPrecWS*)g_precWS; _Complex double ALIGN alpha= -1.0; if(g_prec_sequence_d_dagger_d[0]!=0.0) { alpha = g_prec_sequence_d_dagger_d[0]; spinorPrecondition(l,k,ws,T,L,alpha,0,1); } else assign(l,k,VOLUME); g_mu = -g_mu; D_psi(g_spinor_field[DUM_MATRIX], l); gamma5(l, g_spinor_field[DUM_MATRIX], VOLUME); g_mu = -g_mu; if(g_prec_sequence_d_dagger_d[1]!=0.0) { alpha = g_prec_sequence_d_dagger_d[1]; spinorPrecondition(l,l,ws,T,L,alpha,0,1); } D_psi(g_spinor_field[DUM_MATRIX], l); gamma5(l, g_spinor_field[DUM_MATRIX], VOLUME); if(g_prec_sequence_d_dagger_d[2]!=0.0) { alpha = g_prec_sequence_d_dagger_d[2]; spinorPrecondition(l,l,ws,T,L,alpha,0,1); } }
void D_psi_prec(spinor * const P, spinor * const Q){ /* todo: do preconditioning */ spinorPrecWS *ws=(spinorPrecWS*)g_precWS; static _Complex double alpha = -1.0; alpha = -0.5; spinorPrecondition(P,Q,ws,T,L,alpha,0,1); D_psi(g_spinor_field[DUM_MATRIX],P); alpha = -0.5; spinorPrecondition(P,g_spinor_field[DUM_MATRIX],ws,T,L,alpha,0,1); }
void Dov_psi_prec(spinor * const P, spinor * const S) { /* todo: do preconditioning */ spinorPrecWS *ws=(spinorPrecWS*)g_precWS; static complex alpha; Dov_psi(P,S); alpha.re=-1.; alpha.im=0.0; spinorPrecondition(P,P,ws,T,L,alpha,0,1); }
void Qov_sq_psi_prec(spinor * const P, spinor * const S) { spinorPrecWS *ws=(spinorPrecWS*)g_precWS; static complex alpha={0,0}; alpha.re=ws->precExpo[0]; spinorPrecondition(P,S,ws,T,L,alpha,0,1); Dov_psi(g_spinor_field[DUM_MATRIX], P); gamma5(P, g_spinor_field[DUM_MATRIX], VOLUME); alpha.re=ws->precExpo[1]; spinorPrecondition(P,P,ws,T,L,alpha,0,1); Dov_psi(g_spinor_field[DUM_MATRIX], P); gamma5(P, g_spinor_field[DUM_MATRIX], VOLUME); alpha.re=ws->precExpo[2]; spinorPrecondition(P,P,ws,T,L,alpha,0,1); return; }
void invert_overlap(const int op_id, const int index_start) { operator * optr; void (*op)(spinor*,spinor*); static complex alpha={0,0}; spinorPrecWS *ws; optr = &operator_list[op_id]; op=&Dov_psi; /* here we need to (re)compute the kernel eigenvectors */ /* for new gauge fields */ if(g_proc_id == 0) {printf("# Not using even/odd preconditioning!\n"); fflush(stdout);} convert_eo_to_lexic(g_spinor_field[DUM_DERI], optr->sr0, optr->sr1); convert_eo_to_lexic(g_spinor_field[DUM_DERI+1], optr->prop0, optr->prop1); if(optr->solver == 13 ){ optr->iterations = sumr(g_spinor_field[DUM_DERI+1],g_spinor_field[DUM_DERI] , optr->maxiter, optr->eps_sq); } else if(optr->solver == 1 /* CG */) { gamma5(g_spinor_field[DUM_DERI+1], g_spinor_field[DUM_DERI], VOLUME); if(use_preconditioning==1 && g_precWS!=NULL){ ws=(spinorPrecWS*)g_precWS; printf("# Using preconditioning (which one?)!\n"); alpha.re=ws->precExpo[2]; spinorPrecondition(g_spinor_field[DUM_DERI+1],g_spinor_field[DUM_DERI+1],ws,T,L,alpha,0,1); /* iter = cg_her(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1], max_iter, precision, */ /* rel_prec, VOLUME, &Q_pm_psi_prec); */ optr->iterations = cg_her(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1], optr->maxiter, optr->eps_sq, optr->rel_prec, VOLUME, &Qov_sq_psi_prec); alpha.re=ws->precExpo[0]; spinorPrecondition(g_spinor_field[DUM_DERI],g_spinor_field[DUM_DERI],ws,T,L,alpha,0,1); } else { printf("# Not using preconditioning (which one?)!\n"); /* iter = cg_her(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1], max_iter, precision, */ /* rel_prec, VOLUME, &Q_pm_psi); */ optr->iterations = cg_her(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1], optr->maxiter, optr->eps_sq, optr->rel_prec, VOLUME, &Qov_sq_psi); } Qov_psi(g_spinor_field[DUM_DERI+1], g_spinor_field[DUM_DERI]); if(use_preconditioning == 1 && g_precWS!=NULL){ ws=(spinorPrecWS*)g_precWS; alpha.re=ws->precExpo[1]; spinorPrecondition(g_spinor_field[DUM_DERI+1],g_spinor_field[DUM_DERI+1],ws,T,L,alpha,0,1); } } op(g_spinor_field[4],g_spinor_field[DUM_DERI+1]); convert_eo_to_lexic(g_spinor_field[DUM_DERI], optr->sr0, optr->sr1); optr->reached_prec=diff_and_square_norm(g_spinor_field[4],g_spinor_field[DUM_DERI],VOLUME); convert_lexic_to_eo(optr->prop0, optr->prop1 , g_spinor_field[DUM_DERI+1]); return; }