Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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;
}
Example #4
0
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 */
	}
      }
    }
  }
}