spinor random_spinor(void) { spinor s; s.s0=random_su3_vector(); s.s1=random_su3_vector(); s.s2=random_su3_vector(); s.s3=random_su3_vector(); _vector_mul(s.s0,0.5,s.s0); _vector_mul(s.s1,0.5,s.s1); _vector_mul(s.s2,0.5,s.s2); _vector_mul(s.s3,0.5,s.s3); return(s); }
su3 random_su3(void) { double norm,fact; complex z; su3_vector z1,z2,z3; su3 u; /* z1=random_su3_vector(); */ z1=unif_su3_vector(); for (;;) { /* z2=random_su3_vector(); */ z2=unif_su3_vector(); z.re=_vector_prod_re(z1,z2); z.im=_vector_prod_im(z1,z2); _vector_project(z2,z,z1); norm=_vector_prod_re(z2,z2); norm=sqrt(norm); if (1.0!=(1.0+norm)) break; } fact=1.0/norm; _vector_mul(z2,fact,z2); z3.c0.re= (z1.c1.re*z2.c2.re-z1.c1.im*z2.c2.im) -(z1.c2.re*z2.c1.re-z1.c2.im*z2.c1.im); z3.c0.im=-(z1.c1.re*z2.c2.im+z1.c1.im*z2.c2.re) +(z1.c2.re*z2.c1.im+z1.c2.im*z2.c1.re); z3.c1.re= (z1.c2.re*z2.c0.re-z1.c2.im*z2.c0.im) -(z1.c0.re*z2.c2.re-z1.c0.im*z2.c2.im); z3.c1.im=-(z1.c2.re*z2.c0.im+z1.c2.im*z2.c0.re) +(z1.c0.re*z2.c2.im+z1.c0.im*z2.c2.re); z3.c2.re= (z1.c0.re*z2.c1.re-z1.c0.im*z2.c1.im) -(z1.c1.re*z2.c0.re-z1.c1.im*z2.c0.im); z3.c2.im=-(z1.c0.re*z2.c1.im+z1.c0.im*z2.c1.re) +(z1.c1.re*z2.c0.im+z1.c1.im*z2.c0.re); u.c00=z1.c0; u.c01=z1.c1; u.c02=z1.c2; u.c10=z2.c0; u.c11=z2.c1; u.c12=z2.c2; u.c20=z3.c0; u.c21=z3.c1; u.c22=z3.c2; return(u); }
extern void jacobi_source(spinor_dble *sd, srcdef src, int idirac, int icolor) { int i = 0, ix = 0, iy = 0, n = 0, mu = 0, my_rank, ip1 = 0, ip2 = 0, iw = 0; su3_dble *up, *um; spinor_dble *chi, *psi, *phi, **wsd0, **wsd1, **wsd2, *p, *(*p0)[NSPIN]; const spinor_dble sd0 = { { { 0.0 } } }; double zw[18] = { 0 }, d; double norm = 1. / (1. + 6. * src.kappa); MPI_Status status1; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); p0 = amalloc(3 * sizeof(*p0), 3); p = amalloc(3 * NSPIN * sizeof(spinor_dble), ALIGN); for (i = 0; i < 3; i++) { for (ix = 0; ix < NSPIN; ix++) { p0[i][ix] = p; *p = sd0; p += 1; } } wsd0 = &(p0[0][0]); wsd1 = &(p0[1][0]); wsd2 = &(p0[2][0]); message("sourceposition = (%d, %d, %d, %d)\n", src.pos[0], src.pos[1], src.pos[2], src.pos[3]); for (n = 0; n < src.n; n++) { if (n > 0) { for (ix = 0; ix < VOLUME; ix++) *wsd0[ix] = *wsd2[ix]; } for (ix = 0; ix < VOLUME; ix++) { if (coords[ix].t == src.pos[0]) { phi = wsd1[ix]; if (n == 0) *wsd2[ix] = sd[ix]; psi = wsd2[ix]; for (mu = 1; mu < 4; mu++) { iy = idn[ix][mu]; if ((iy >= VOLUME) && (iy < (VOLUME + BNDRY))) { ip1 = npr[2 * mu]; ip2 = npr[2 * mu + 1]; iw = map[iy - VOLUME]; if (n == 0) *wsd0[iw] = sd[iw]; *phi = *wsd0[iw]; chi = wsd1[iw]; um = pud_sm1[iw][mu]; MPI_Sendrecv((double*) (um), 18, MPI_DOUBLE, ip2, 37, zw, 18, MPI_DOUBLE, ip1, 37, MPI_COMM_WORLD, &status1); um = (su3_dble*) zw; MPI_Sendrecv((double*) (phi), 24, MPI_DOUBLE, ip2, 37, (double*) (chi), 24, MPI_DOUBLE, ip1, 37, MPI_COMM_WORLD, &status1); } else { um = pud_sm1[iy][mu]; if (n == 0) *wsd0[iy] = sd[iy]; chi = wsd0[iy]; } _su3_inverse_multiply((*phi).c1, (*um), (*chi).c1); _su3_inverse_multiply((*phi).c2, (*um), (*chi).c2); _su3_inverse_multiply((*phi).c3, (*um), (*chi).c3); _su3_inverse_multiply((*phi).c4, (*um), (*chi).c4); _vector_add_assign((*psi).c1, (*phi).c1); _vector_add_assign((*psi).c2, (*phi).c2); _vector_add_assign((*psi).c3, (*phi).c3); _vector_add_assign((*psi).c4, (*phi).c4); iy = iup[ix][mu]; if ((iy >= VOLUME) && (iy < (VOLUME + BNDRY))) { ip1 = npr[2 * mu]; ip2 = npr[2 * mu + 1]; iw = map[iy - VOLUME]; if (n == 0) *wsd0[iw] = sd[iw]; *phi = *wsd0[iw]; chi = wsd1[iw]; MPI_Sendrecv((double*) (phi), 24, MPI_DOUBLE, ip1, 37, (double*) (chi), 24, MPI_DOUBLE, ip2, 37, MPI_COMM_WORLD, &status1); } else { if (n == 0) *wsd0[iy] = sd[iy]; chi = wsd0[iy]; } up = pud_sm1[ix][mu]; _su3_multiply((*phi).c1, (*up), (*chi).c1); _su3_multiply((*phi).c2, (*up), (*chi).c2); _su3_multiply((*phi).c3, (*up), (*chi).c3); _su3_multiply((*phi).c4, (*up), (*chi).c4); _vector_add_assign((*psi).c1, (*phi).c1); _vector_add_assign((*psi).c2, (*phi).c2); _vector_add_assign((*psi).c3, (*phi).c3); _vector_add_assign((*psi).c4, (*phi).c4); } _vector_mul((*psi).c1, src.kappa, (*psi).c1); _vector_mul((*psi).c2, src.kappa, (*psi).c2); _vector_mul((*psi).c3, src.kappa, (*psi).c3); _vector_mul((*psi).c4, src.kappa, (*psi).c4); if (n == 0) *wsd1[ix] = sd[ix]; else *wsd1[ix] = *wsd0[ix]; phi = wsd1[ix]; _vector_add_assign((*psi).c1, (*phi).c1); _vector_add_assign((*psi).c2, (*phi).c2); _vector_add_assign((*psi).c3, (*phi).c3); _vector_add_assign((*psi).c4, (*phi).c4); _spinor_mul(*(psi),norm, (*psi)); } } if(n == (src.n - 1)) { for(ix = 0; ix < VOLUME; ix++) { sd[ix] = *wsd2[ix]; _spinor_mul(sd[ix],1./(sqrt((double)(src.n*VOLUME*NPROC))),sd[ix]); } d = norm_square_dble(VOLUME, 1, sd); message("norm of the jacobi-smeared vector %.2e\n", sqrt(d)); } } SourceRadius(src, sd); /* SourceMom4(src, sd); */ afree(p); afree(p0[0][0]); afree(p0[0]); afree(p0); p0 = NULL; }
void spinor_fft_transpose_xp_t(spinor *fieldout,spinor* fieldin,int dim0,int dim1,int forward,double mulp){ int LXYZ=LX*LY*LZ; int xyz,tp,xp,t; spinor *spin1,*spin2; if(forward == TRUE){ for(tp=0;tp<dim0;tp++){ for(xp=0;xp<dim1;xp++){ for(t=0;t<T;t++){ spin1=fieldin + LXYZ * ((tp * dim1 + xp ) * T + t ); /** ^ ^ ^ ^ * \ \ / | * \ \ / / * \ \ / / * \ X / * \ / \ / * \ / \ / * \/ X * /\ / \ * / \ / \ * / \/ \ * / /\ \ * / / \ \ * / / \ \ * / / \ | * V V V V */ spin2=fieldout + LXYZ * ((tp * T + t ) * dim1 + xp ); for(xyz=0;xyz<LXYZ;xyz++){ memcpy(spin2+xyz,spin1+xyz,sizeof(spinor)); _vector_mul((spin2+xyz)->s0,mulp,(spin2+xyz)->s0); _vector_mul((spin2+xyz)->s1,mulp,(spin2+xyz)->s1); _vector_mul((spin2+xyz)->s2,mulp,(spin2+xyz)->s2); _vector_mul((spin2+xyz)->s3,mulp,(spin2+xyz)->s3); } /* optionally multiply with mulp */ } } } } else { for(tp=0;tp<dim0;tp++){ for(xp=0;xp<dim1;xp++){ for(t=0;t<T;t++){ spin1=fieldin + LXYZ * ((tp * T + t ) * dim1 + xp ); /** ^ ^ ^ ^ * \ \ / | * \ \ / / * \ \ / / * \ X / * \ / \ / * \ / \ / * \/ X * /\ / \ * / \ / \ * / \/ \ * / /\ \ * / / \ \ * / / \ \ * / / \ | * V V V V */ spin2=fieldout + LXYZ * ((tp * dim1 + xp ) * T + t ); for(xyz=0;xyz<LXYZ;xyz++){ memcpy(spin2+xyz,spin1+xyz,sizeof(spinor)); _vector_mul((spin2+xyz)->s0,mulp,(spin2+xyz)->s0); _vector_mul((spin2+xyz)->s1,mulp,(spin2+xyz)->s1); _vector_mul((spin2+xyz)->s2,mulp,(spin2+xyz)->s2); _vector_mul((spin2+xyz)->s3,mulp,(spin2+xyz)->s3); } /* optionally multiply with mulp */ } } } } }