18 #if defined USE_GROUP_SU3
26 #elif defined USE_GROUP_SU2
39 #if defined USE_GROUP_SU_N
46 const int Nvol = v1.
nvol();
49 assert(Nvol == v2.
nvol());
50 assert(v1.
nex() == 1);
51 assert(v2.
nex() == 1);
53 const double *w1 = v1.
ptr(0);
54 const double *w2 = v2.
ptr(0);
58 for (
int id = 0;
id < ND; ++id) {
60 id2[id] = gm_sink.
index(
id) * NC2;
65 for (
int id = 0;
id < ND; ++id) {
71 for (
int ss = 0; ss < Nvol_s; ++ss) {
72 int site = NCD2 * (ss + time * Nvol_s);
74 for (
int cc = 0; cc <
NC; ++cc) {
75 for (
int id = 0;
id < ND; ++id) {
76 int ic1_r = 2 * cc + id1[id] + site;
77 int ic2_r = 2 * cc + id2[id] + site;
79 int ic1_i = 2 * cc + 1 + id1[id] + site;
80 int ic2_i = 2 * cc + 1 + id2[id] + site;
82 c_r[id] += w1[ic2_r] * w2[ic1_r]
83 + w1[ic2_i] * w2[ic1_i];
85 c_i[id] += -w1[ic2_r] * w2[ic1_i]
86 + w1[ic2_i] * w2[ic1_r];
91 corr = cmplx(0.0, 0.0);
92 for (
int id = 0;
id < ND; ++id) {
93 corr += gm_sink.
value(
id) * cmplx(c_r[
id], c_i[
id]);
100 const std::vector<int>& momentum_sink,
102 const std::vector<int>& source_position,
106 #if defined USE_GROUP_SU_N
113 const int Nvol = v1.
nvol();
122 assert(Nvol == v2.
nvol());
123 assert(v1.
nex() == 1);
124 assert(v2.
nex() == 1);
125 assert(momentum_sink.size() == ND - 1);
127 const double *w1 = v1.
ptr(0);
128 const double *w2 = v2.
ptr(0);
132 for (
int id = 0;
id < ND; ++id) {
134 id2[id] = gm_sink.
index(
id) * NC2;
139 for (
int id = 0;
id < ND; ++id) {
144 static const double PI = 4.0 * atan(1.0);
145 std::vector<double> p_unit(ND - 1);
146 p_unit[0] = (2.0 * PI / Lx) * momentum_sink[0];
147 p_unit[1] = (2.0 * PI / Ly) * momentum_sink[1];
148 p_unit[2] = (2.0 * PI / Lz) * momentum_sink[2];
150 std::vector<int> ipe(ND - 1);
156 for (
int ss = 0; ss < Nvol_s; ++ss) {
157 int site = NCD2 * (ss + time * Nvol_s);
160 int y = ss % (Nx * Ny) / Nx;
161 int z = ss % (Nx * Ny * Nz) / (Nx * Ny);
163 int x_global = x + ipe[0] * Nx;
164 int y_global = y + ipe[1] * Ny;
165 int z_global = z + ipe[2] * Nz;
167 double p_x = p_unit[0] * (x_global - source_position[0]);
168 double p_y = p_unit[1] * (y_global - source_position[1]);
169 double p_z = p_unit[2] * (z_global - source_position[2]);
171 double cos_p_xyz = cos(p_x + p_y + p_z);
172 double sin_p_xyz = sin(p_x + p_y + p_z);
174 for (
int cc = 0; cc <
NC; ++cc) {
175 for (
int id = 0;
id < ND; ++id) {
176 int ic1_r = 2 * cc + id1[id] + site;
177 int ic2_r = 2 * cc + id2[id] + site;
179 int ic1_i = 2 * cc + 1 + id1[id] + site;
180 int ic2_i = 2 * cc + 1 + id2[id] + site;
182 double w1_w2_r = w1[ic2_r] * w2[ic1_r] + w1[ic2_i] * w2[ic1_i];
183 double w1_w2_i = -w1[ic2_r] * w2[ic1_i] + w1[ic2_i] * w2[ic1_r];
186 c_r[id] += w1_w2_r * cos_p_xyz - w1_w2_i * sin_p_xyz;
187 c_i[id] += w1_w2_r * sin_p_xyz + w1_w2_i * cos_p_xyz;
192 corr = cmplx(0.0, 0.0);
193 for (
int id = 0;
id < ND; ++id) {
194 corr += gm_sink.
value(
id) * cmplx(c_r[
id], c_i[
id]);
206 #if defined USE_GROUP_SU3
207 const int Nvol = v1.
nvol();
210 assert(Nvol == v2.
nvol());
211 assert(Nvol == v3.
nvol());
212 assert(v1.
nex() == 1);
213 assert(v2.
nex() == 1);
214 assert(v3.
nex() == 1);
216 const double *w1 = v1.
ptr(0);
217 const double *w2 = v2.
ptr(0);
218 const double *w3 = v3.
ptr(0);
222 for (
int id = 0;
id < ND; ++id) {
224 id2[id] = gm_sink.
index(
id) * NC2;
226 int id3 = i_alpha * NC2;
230 for (
int id = 0;
id < ND; ++id) {
236 for (
int ss = 0; ss < Nvol_s; ++ss) {
237 int site = NCD2 * (ss + time * Nvol_s);
239 for (
int id = 0;
id < ND; ++id) {
240 int ic11_r = C1 + id1[id] + site;
241 int ic22_r = C2 + id2[id] + site;
242 int ic33_r = C3 + id3 + site;
244 int ic11_i = C1 + 1 + id1[id] + site;
245 int ic22_i = C2 + 1 + id2[id] + site;
246 int ic33_i = C3 + 1 + id3 + site;
248 int ic21_r = C2 + id1[id] + site;
249 int ic32_r = C3 + id2[id] + site;
250 int ic13_r = C1 + id3 + site;
252 int ic21_i = C2 + 1 + id1[id] + site;
253 int ic32_i = C3 + 1 + id2[id] + site;
254 int ic13_i = C1 + 1 + id3 + site;
256 int ic31_r = C3 + id1[id] + site;
257 int ic12_r = C1 + id2[id] + site;
258 int ic23_r = C2 + id3 + site;
260 int ic31_i = C3 + 1 + id1[id] + site;
261 int ic12_i = C1 + 1 + id2[id] + site;
262 int ic23_i = C2 + 1 + id3 + site;
265 c_r[id] += (w1[ic11_r] * w2[ic22_r] - w1[ic11_i] * w2[ic22_i]) * w3[ic33_r]
266 - (w1[ic11_r] * w2[ic22_i] + w1[ic11_i] * w2[ic22_r]) * w3[ic33_i];
267 c_i[id] += (w1[ic11_r] * w2[ic22_r] - w1[ic11_i] * w2[ic22_i]) * w3[ic33_i]
268 + (w1[ic11_r] * w2[ic22_i] + w1[ic11_i] * w2[ic22_r]) * w3[ic33_r];
270 c_r[id] += (w1[ic21_r] * w2[ic32_r] - w1[ic21_i] * w2[ic32_i]) * w3[ic13_r]
271 - (w1[ic21_r] * w2[ic32_i] + w1[ic21_i] * w2[ic32_r]) * w3[ic13_i];
272 c_i[id] += (w1[ic21_r] * w2[ic32_r] - w1[ic21_i] * w2[ic32_i]) * w3[ic13_i]
273 + (w1[ic21_r] * w2[ic32_i] + w1[ic21_i] * w2[ic32_r]) * w3[ic13_r];
275 c_r[id] += (w1[ic31_r] * w2[ic12_r] - w1[ic31_i] * w2[ic12_i]) * w3[ic23_r]
276 - (w1[ic31_r] * w2[ic12_i] + w1[ic31_i] * w2[ic12_r]) * w3[ic23_i];
277 c_i[id] += (w1[ic31_r] * w2[ic12_r] - w1[ic31_i] * w2[ic12_i]) * w3[ic23_i]
278 + (w1[ic31_r] * w2[ic12_i] + w1[ic31_i] * w2[ic12_r]) * w3[ic23_r];
280 c_r[id] -= (w1[ic31_r] * w2[ic22_r] - w1[ic31_i] * w2[ic22_i]) * w3[ic13_r]
281 - (w1[ic31_r] * w2[ic22_i] + w1[ic31_i] * w2[ic22_r]) * w3[ic13_i];
282 c_i[id] -= (w1[ic31_r] * w2[ic22_r] - w1[ic31_i] * w2[ic22_i]) * w3[ic13_i]
283 + (w1[ic31_r] * w2[ic22_i] + w1[ic31_i] * w2[ic22_r]) * w3[ic13_r];
285 c_r[id] -= (w1[ic21_r] * w2[ic12_r] - w1[ic21_i] * w2[ic12_i]) * w3[ic33_r]
286 - (w1[ic21_r] * w2[ic12_i] + w1[ic21_i] * w2[ic12_r]) * w3[ic33_i];
287 c_i[id] -= (w1[ic21_r] * w2[ic12_r] - w1[ic21_i] * w2[ic12_i]) * w3[ic33_i]
288 + (w1[ic21_r] * w2[ic12_i] + w1[ic21_i] * w2[ic12_r]) * w3[ic33_r];
290 c_r[id] -= (w1[ic11_r] * w2[ic32_r] - w1[ic11_i] * w2[ic32_i]) * w3[ic23_r]
291 - (w1[ic11_r] * w2[ic32_i] + w1[ic11_i] * w2[ic32_r]) * w3[ic23_i];
292 c_i[id] -= (w1[ic11_r] * w2[ic32_r] - w1[ic11_i] * w2[ic32_i]) * w3[ic23_i]
293 + (w1[ic11_r] * w2[ic32_i] + w1[ic11_i] * w2[ic32_r]) * w3[ic23_r];
297 corr = cmplx(0.0, 0.0);
298 for (
int id = 0;
id < ND; ++id) {
299 corr += gm_sink.
value(
id) * cmplx(c_r[
id], c_i[
id]);
301 #endif // (USE_GROUP_SU3)
const double * ptr(const int jin, const int site, const int jex) const
void contract_at_t(dcomplex &corr, const GammaMatrix &gm_sink, const Field_F &v1, const Field_F &v2, const int time)
Contraction of hadron for 4-spinor fermion.
static int ipe(const int dir)
logical coordinate of current proc.
Wilson-type fermion field.
dcomplex value(int row) const