/benchmarks/tensors/dibaryon/reference/qblocks_2pt.c

https://github.com/Tiramisu-Compiler/tiramisu · C · 1533 lines · 1447 code · 42 blank · 44 comment · 264 complexity · 89bec7f30e4698cf7bc6e3ff1caf59a3 MD5 · raw file

Large files are truncated click here to view the full file

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <complex.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include <sys/time.h>
  7. #include "qblocks_2pt.h" /* DEPS */
  8. #include "tiramisu_wrapper.h"
  9. /* index functions */
  10. int index_2d(int a, int b, int length2) {
  11. return b +length2*( a );
  12. }
  13. int index_3d(int a, int b, int c, int length2, int length3) {
  14. return c +length3*( b +length2*( a ));
  15. }
  16. int index_4d(int a, int b, int c, int d, int length2, int length3, int length4) {
  17. return d +length4*( c +length3*( b +length2*( a )));
  18. }
  19. int prop_index(int q, int t, int c1, int s1, int c2, int s2, int y, int x, int Nc, int Ns, int Vsrc, int Vsnk, int Nt) {
  20. //return x +Vsnk*( y +Vsrc*( s2 +Ns*( c2 +Nc*( s1 +Ns*( c1 +Nc*( t +Nt* q ))))));
  21. return y +Vsrc*( x +Vsnk*( s1 +Ns*( c1 +Nc*( s2 +Ns*( c2 +Nc*( t +Nt* q ))))));
  22. }
  23. int Q_index(int t, int c1, int s1, int c2, int s2, int x1, int c3, int s3, int y, int Nc, int Ns, int Vsrc, int Vsnk) {
  24. return y +Vsrc*( s3 +Ns*( c3 +Nc*( x1 +Vsnk*( s2 +Ns*( c2 +Nc*( s1 +Ns*( c1 +Nc*( t ))))))));
  25. }
  26. int Blocal_index(int t, int c1, int s1, int c2, int s2, int x, int c3, int s3, int m, int Nc, int Ns, int Vsnk, int Nsrc) {
  27. return m +Nsrc*( s3 +Ns*( c3 +Nc*( x +Vsnk*( s2 +Ns*( c2 +Nc*( s1 +Ns*( c1 +Nc*( t ))))))));
  28. }
  29. int Bdouble_index(int t, int c1, int s1, int c2, int s2, int x1, int c3, int s3, int x2, int m, int Nc, int Ns, int Vsnk, int Nsrc) {
  30. return m +Nsrc*( x2 +Vsnk*( s3 +Ns*( c3 +Nc*( x1 +Vsnk*( s2 +Ns*( c2 +Nc*( s1 +Ns*( c1 +Nc*( t )))))))));
  31. }
  32. void error_msg(char *msg)
  33. {
  34. printf("\n\033[1;31mError! %s.\033[0m\n", msg);
  35. exit(1);
  36. }
  37. double rtclock()
  38. {
  39. struct timeval Tp;
  40. gettimeofday(&Tp, NULL);
  41. return (Tp.tv_sec + Tp.tv_usec * 1.0e-6);
  42. }
  43. void make_local_block(double* Blocal_re,
  44. double* Blocal_im,
  45. const double* prop_re,
  46. const double* prop_im,
  47. const int* color_weights,
  48. const int* spin_weights,
  49. const double* weights,
  50. const double* psi_re,
  51. const double* psi_im,
  52. const int Nc,
  53. const int Ns,
  54. const int Vsrc,
  55. const int Vsnk,
  56. const int Nt,
  57. const int Nw,
  58. const int Nq,
  59. const int Nsrc) {
  60. /* loop indices */
  61. int iCprime, iSprime, jCprime, jSprime, kCprime, kSprime, iC, iS, jC, jS, kC, kS, x, t, y, wnum, m;
  62. /* subexpressions */
  63. double prop_prod_02_re;
  64. double prop_prod_02_im;
  65. double prop_prod_re;
  66. double prop_prod_im;
  67. /* initialize */
  68. for (t=0; t<Nt; t++) {
  69. for (iCprime=0; iCprime<Nc; iCprime++) {
  70. for (iSprime=0; iSprime<Ns; iSprime++) {
  71. for (kCprime=0; kCprime<Nc; kCprime++) {
  72. for (kSprime=0; kSprime<Ns; kSprime++) {
  73. for (x=0; x<Vsnk; x++) {
  74. for (jCprime=0; jCprime<Nc; jCprime++) {
  75. for (jSprime=0; jSprime<Ns; jSprime++) {
  76. for (m=0; m<Nsrc; m++) {
  77. Blocal_re[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,x,jCprime,jSprime,m ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  78. Blocal_im[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,x,jCprime,jSprime,m ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. }
  88. /* build local (no quark exchange) block */
  89. for (wnum=0; wnum<Nw; wnum++) {
  90. iC = color_weights[index_2d(wnum,0, Nq)];
  91. iS = spin_weights[index_2d(wnum,0, Nq)];
  92. jC = color_weights[index_2d(wnum,1, Nq)];
  93. jS = spin_weights[index_2d(wnum,1, Nq)];
  94. kC = color_weights[index_2d(wnum,2, Nq)];
  95. kS = spin_weights[index_2d(wnum,2, Nq)];
  96. for (t=0; t<Nt; t++) {
  97. for (iCprime=0; iCprime<Nc; iCprime++) {
  98. for (iSprime=0; iSprime<Ns; iSprime++) {
  99. for (kCprime=0; kCprime<Nc; kCprime++) {
  100. for (kSprime=0; kSprime<Ns; kSprime++) {
  101. for (x=0; x<Vsnk; x++) {
  102. for (y=0; y<Vsrc; y++) {
  103. prop_prod_02_re = weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  104. prop_prod_02_im = weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  105. for (jCprime=0; jCprime<Nc; jCprime++) {
  106. for (jSprime=0; jSprime<Ns; jSprime++) {
  107. prop_prod_re = prop_prod_02_re * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_prod_02_im * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  108. prop_prod_im = prop_prod_02_re * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_prod_02_im * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  109. for (m=0; m<Nsrc; m++) {
  110. Blocal_re[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,x,jCprime,jSprime,m ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,m ,Nsrc)] * prop_prod_re - psi_im[index_2d(y,m ,Nsrc)] * prop_prod_im;
  111. Blocal_im[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,x,jCprime,jSprime,m ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,m ,Nsrc)] * prop_prod_im + psi_im[index_2d(y,m ,Nsrc)] * prop_prod_re;
  112. }
  113. }
  114. }
  115. }
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. }
  123. }
  124. void make_local_snk_block(double* Blocal_re,
  125. double* Blocal_im,
  126. const double* prop_re,
  127. const double* prop_im,
  128. const int* color_weights,
  129. const int* spin_weights,
  130. const double* weights,
  131. const double* psi_re,
  132. const double* psi_im,
  133. const int Nc,
  134. const int Ns,
  135. const int Vsrc,
  136. const int Vsnk,
  137. const int Nt,
  138. const int Nw,
  139. const int Nq,
  140. const int Nsnk) {
  141. /* loop indices */
  142. int iCprime, iSprime, jCprime, jSprime, kCprime, kSprime, iC, iS, jC, jS, kC, kS, x, t, y, wnum, n;
  143. /* subexpressions */
  144. double prop_prod_02_re;
  145. double prop_prod_02_im;
  146. double prop_prod_re;
  147. double prop_prod_im;
  148. /* initialize */
  149. for (t=0; t<Nt; t++) {
  150. for (iCprime=0; iCprime<Nc; iCprime++) {
  151. for (iSprime=0; iSprime<Ns; iSprime++) {
  152. for (kCprime=0; kCprime<Nc; kCprime++) {
  153. for (kSprime=0; kSprime<Ns; kSprime++) {
  154. for (y=0; y<Vsrc; y++) {
  155. for (jCprime=0; jCprime<Nc; jCprime++) {
  156. for (jSprime=0; jSprime<Ns; jSprime++) {
  157. for (n=0; n<Nsnk; n++) {
  158. Blocal_re[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,y,jCprime,jSprime,n ,Nc,Ns,Vsrc,Nsnk)] = 0.0;
  159. Blocal_im[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,y,jCprime,jSprime,n ,Nc,Ns,Vsrc,Nsnk)] = 0.0;
  160. }
  161. }
  162. }
  163. }
  164. }
  165. }
  166. }
  167. }
  168. }
  169. /* build local (no quark exchange) block */
  170. for (wnum=0; wnum<Nw; wnum++) {
  171. iC = color_weights[index_2d(wnum,0, Nq)];
  172. iS = spin_weights[index_2d(wnum,0, Nq)];
  173. jC = color_weights[index_2d(wnum,1, Nq)];
  174. jS = spin_weights[index_2d(wnum,1, Nq)];
  175. kC = color_weights[index_2d(wnum,2, Nq)];
  176. kS = spin_weights[index_2d(wnum,2, Nq)];
  177. for (t=0; t<Nt; t++) {
  178. for (iCprime=0; iCprime<Nc; iCprime++) {
  179. for (iSprime=0; iSprime<Ns; iSprime++) {
  180. for (kCprime=0; kCprime<Nc; kCprime++) {
  181. for (kSprime=0; kSprime<Ns; kSprime++) {
  182. for (y=0; y<Vsrc; y++) {
  183. for (x=0; x<Vsnk; x++) {
  184. prop_prod_02_re = weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  185. prop_prod_02_im = weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  186. for (jCprime=0; jCprime<Nc; jCprime++) {
  187. for (jSprime=0; jSprime<Ns; jSprime++) {
  188. prop_prod_re = prop_prod_02_re * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_prod_02_im * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  189. prop_prod_im = prop_prod_02_re * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_prod_02_im * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  190. for (n=0; n<Nsnk; n++) {
  191. Blocal_re[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,y,jCprime,jSprime,n ,Nc,Ns,Vsrc,Nsnk)] += psi_re[index_2d(x,n ,Nsnk)] * prop_prod_re - psi_im[index_2d(x,n ,Nsnk)] * prop_prod_im;
  192. Blocal_im[Blocal_index(t,iCprime,iSprime,kCprime,kSprime,y,jCprime,jSprime,n ,Nc,Ns,Vsrc,Nsnk)] += psi_re[index_2d(x,n ,Nsnk)] * prop_prod_im + psi_im[index_2d(x,n ,Nsnk)] * prop_prod_re;
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }
  204. }
  205. void make_single_block(double* Bsingle_re,
  206. double* Bsingle_im,
  207. const double* prop_re,
  208. const double* prop_im,
  209. const int* color_weights,
  210. const int* spin_weights,
  211. const double* weights,
  212. const double* psi_re,
  213. const double* psi_im,
  214. const int Nc,
  215. const int Ns,
  216. const int Vsrc,
  217. const int Vsnk,
  218. const int Nt,
  219. const int Nw,
  220. const int Nq,
  221. const int Nsrc) {
  222. /* indices */
  223. int iCprime, iSprime, jCprime, jSprime, kCprime, kSprime, iC, iS, jC, jS, kC, kS, x, x1, x2, t, y, wnum, m;
  224. /* subexpressions */
  225. double prop_prod_re;
  226. double prop_prod_im;
  227. double* Q02_re = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  228. double* Q02_im = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  229. /* initialize */
  230. for (t=0; t<Nt; t++) {
  231. for (iCprime=0; iCprime<Nc; iCprime++) {
  232. for (iSprime=0; iSprime<Ns; iSprime++) {
  233. for (kCprime=0; kCprime<Nc; kCprime++) {
  234. for (kSprime=0; kSprime<Ns; kSprime++) {
  235. for (x1=0; x1<Vsnk; x1++) {
  236. for (m=0; m<Nsrc; m++) {
  237. for (jCprime=0; jCprime<Nc; jCprime++) {
  238. for (jSprime=0; jSprime<Ns; jSprime++) {
  239. for (x2=0; x2<Vsnk; x2++) {
  240. Bsingle_re[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,m ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  241. Bsingle_im[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,m ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  242. }
  243. }
  244. }
  245. }
  246. for (jC=0; jC<Nc; jC++) {
  247. for (jS=0; jS<Ns; jS++) {
  248. for (y=0; y<Vsrc; y++) {
  249. Q02_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  250. Q02_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. }
  258. }
  259. }
  260. /* build diquarks */
  261. for (wnum=0; wnum<Nw; wnum++) {
  262. iC = color_weights[index_2d(wnum,0, Nq)];
  263. iS = spin_weights[index_2d(wnum,0, Nq)];
  264. jC = color_weights[index_2d(wnum,1, Nq)];
  265. jS = spin_weights[index_2d(wnum,1, Nq)];
  266. kC = color_weights[index_2d(wnum,2, Nq)];
  267. kS = spin_weights[index_2d(wnum,2, Nq)];
  268. for (t=0; t<Nt; t++) {
  269. for (iCprime=0; iCprime<Nc; iCprime++) {
  270. for (iSprime=0; iSprime<Ns; iSprime++) {
  271. for (kCprime=0; kCprime<Nc; kCprime++) {
  272. for (kSprime=0; kSprime<Ns; kSprime++) {
  273. for (y=0; y<Vsrc; y++) {
  274. for (x=0; x<Vsnk; x++) {
  275. Q02_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  276. Q02_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * ( (prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,iCprime,iSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  277. }
  278. }
  279. }
  280. }
  281. }
  282. }
  283. }
  284. }
  285. /* build q2-exchange block */
  286. for (t=0; t<Nt; t++) {
  287. for (iCprime=0; iCprime<Nc; iCprime++) {
  288. for (iSprime=0; iSprime<Ns; iSprime++) {
  289. for (kCprime=0; kCprime<Nc; kCprime++) {
  290. for (kSprime=0; kSprime<Ns; kSprime++) {
  291. for (x1=0; x1<Vsnk; x1++) {
  292. for (jC=0; jC<Nc; jC++) {
  293. for (jS=0; jS<Ns; jS++) {
  294. for (jCprime=0; jCprime<Nc; jCprime++) {
  295. for (jSprime=0; jSprime<Ns; jSprime++) {
  296. for (y=0; y<Vsrc; y++) {
  297. for (x2=0; x2<Vsnk; x2++) {
  298. prop_prod_re = Q02_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] - Q02_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  299. prop_prod_im = Q02_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] + Q02_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  300. for (m=0; m<Nsrc; m++) {
  301. Bsingle_re[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,m ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,m ,Nsrc)] * prop_prod_re - psi_im[index_2d(y,m ,Nsrc)] * prop_prod_im;
  302. Bsingle_im[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,m ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,m ,Nsrc)] * prop_prod_im + psi_im[index_2d(y,m ,Nsrc)] * prop_prod_re;
  303. }
  304. }
  305. }
  306. }
  307. }
  308. }
  309. }
  310. }
  311. }
  312. }
  313. }
  314. }
  315. }
  316. free(Q02_re);
  317. free(Q02_im);
  318. }
  319. void make_double_block(double* Bdouble_re,
  320. double* Bdouble_im,
  321. const double* prop_re,
  322. const double* prop_im,
  323. const int* color_weights,
  324. const int* spin_weights,
  325. const double* weights,
  326. const double* psi_re,
  327. const double* psi_im,
  328. const int Nc,
  329. const int Ns,
  330. const int Vsrc,
  331. const int Vsnk,
  332. const int Nt,
  333. const int Nw,
  334. const int Nq,
  335. const int Nsrc) {
  336. /* indices */
  337. int iCprime, iSprime, jCprime, jSprime, kCprime, kSprime, iC, iS, jC, jS, kC, kS, x, x1, x2, t, y, wnum, n;
  338. /* subexpressions */
  339. double prop_prod_re;
  340. double prop_prod_im;
  341. double* Q12_re = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  342. double* Q12_im = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  343. double* Q01_re = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  344. double* Q01_im = malloc(Nt * Nc * Ns * Nc * Ns * Vsnk * Nc * Ns * Vsrc * sizeof (double));
  345. /* initialize */
  346. for (t=0; t<Nt; t++) {
  347. for (iCprime=0; iCprime<Nc; iCprime++) {
  348. for (iSprime=0; iSprime<Ns; iSprime++) {
  349. for (kCprime=0; kCprime<Nc; kCprime++) {
  350. for (kSprime=0; kSprime<Ns; kSprime++) {
  351. for (x1=0; x1<Vsnk; x1++) {
  352. for (n=0; n<Nsrc; n++) {
  353. for (jCprime=0; jCprime<Nc; jCprime++) {
  354. for (jSprime=0; jSprime<Ns; jSprime++) {
  355. for (x2=0; x2<Vsnk; x2++) {
  356. Bdouble_re[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,n ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  357. Bdouble_im[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,n ,Nc,Ns,Vsnk,Nsrc)] = 0.0;
  358. }
  359. }
  360. }
  361. }
  362. for (jC=0; jC<Nc; jC++) {
  363. for (jS=0; jS<Ns; jS++) {
  364. for (y=0; y<Vsrc; y++) {
  365. Q12_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  366. Q12_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  367. Q01_re[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  368. Q01_im[Q_index(t,iCprime,iSprime,kCprime,kSprime,x1,jC,jS,y ,Nc,Ns,Vsrc,Vsnk)] = 0.0;
  369. }
  370. }
  371. }
  372. }
  373. }
  374. }
  375. }
  376. }
  377. }
  378. /* build diquarks */
  379. for (wnum=0; wnum<Nw; wnum++) {
  380. iC = color_weights[index_2d(wnum,0, Nq)];
  381. iS = spin_weights[index_2d(wnum,0, Nq)];
  382. jC = color_weights[index_2d(wnum,1, Nq)];
  383. jS = spin_weights[index_2d(wnum,1, Nq)];
  384. kC = color_weights[index_2d(wnum,2, Nq)];
  385. kS = spin_weights[index_2d(wnum,2, Nq)];
  386. for (t=0; t<Nt; t++) {
  387. for (jCprime=0; jCprime<Nc; jCprime++) {
  388. for (jSprime=0; jSprime<Ns; jSprime++) {
  389. for (kCprime=0; kCprime<Nc; kCprime++) {
  390. for (kSprime=0; kSprime<Ns; kSprime++) {
  391. for (y=0; y<Vsrc; y++) {
  392. for (x=0; x<Vsnk; x++) {
  393. Q12_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * (prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]);
  394. Q12_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * (prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(2,t,kC,kS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]);
  395. Q01_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x,kC,kS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]);
  396. Q01_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x,kC,kS,y ,Nc,Ns,Vsrc,Vsnk)] += weights[wnum] * (prop_re[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_im[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + prop_im[prop_index(0,t,iC,iS,kCprime,kSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * prop_re[prop_index(1,t,jC,jS,jCprime,jSprime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]);
  397. }
  398. }
  399. }
  400. }
  401. }
  402. }
  403. }
  404. }
  405. /* build q2-exchange block */
  406. for (t=0; t<Nt; t++) {
  407. for (jCprime=0; jCprime<Nc; jCprime++) {
  408. for (jSprime=0; jSprime<Ns; jSprime++) {
  409. for (kCprime=0; kCprime<Nc; kCprime++) {
  410. for (kSprime=0; kSprime<Ns; kSprime++) {
  411. for (x1=0; x1<Vsnk; x1++) {
  412. for (iC=0; iC<Nc; iC++) {
  413. for (iS=0; iS<Ns; iS++) {
  414. for (iCprime=0; iCprime<Nc; iCprime++) {
  415. for (iSprime=0; iSprime<Ns; iSprime++) {
  416. for (y=0; y<Vsrc; y++) {
  417. for (x2=0; x2<Vsnk; x2++) {
  418. prop_prod_re = Q12_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] - Q12_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  419. prop_prod_im = Q12_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(0,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] + Q12_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(0,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  420. prop_prod_re -= Q01_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(2,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] - Q01_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(2,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  421. prop_prod_im -= Q01_re[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_im[prop_index(2,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)] + Q01_im[Q_index(t,jCprime,jSprime,kCprime,kSprime,x1,iC,iS,y ,Nc,Ns,Vsrc,Vsnk)] * prop_re[prop_index(2,t,iC,iS,iCprime,iSprime,y,x2 ,Nc,Ns,Vsrc,Vsnk,Nt)];
  422. for (n=0; n<Nsrc; n++) {
  423. Bdouble_re[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,n ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,n ,Nsrc)] * prop_prod_re - psi_im[index_2d(y,n ,Nsrc)] * prop_prod_im;
  424. Bdouble_im[Bdouble_index(t,iCprime,iSprime,kCprime,kSprime,x1,jCprime,jSprime,x2,n ,Nc,Ns,Vsnk,Nsrc)] += psi_re[index_2d(y,n ,Nsrc)] * prop_prod_im + psi_im[index_2d(y,n ,Nsrc)] * prop_prod_re;
  425. }
  426. }
  427. }
  428. }
  429. }
  430. }
  431. }
  432. }
  433. }
  434. }
  435. }
  436. }
  437. }
  438. free(Q12_re);
  439. free(Q12_im);
  440. free(Q01_re);
  441. free(Q01_im);
  442. }
  443. void make_dibaryon_correlator(double* C_re,
  444. double* C_im,
  445. const double* B1_Blocal_re,
  446. const double* B1_Blocal_im,
  447. const double* B1_Bsingle_re,
  448. const double* B1_Bsingle_im,
  449. const double* B1_Bdouble_re,
  450. const double* B1_Bdouble_im,
  451. const double* B2_Blocal_re,
  452. const double* B2_Blocal_im,
  453. const double* B2_Bsingle_re,
  454. const double* B2_Bsingle_im,
  455. const double* B2_Bdouble_re,
  456. const double* B2_Bdouble_im,
  457. const int* perms,
  458. const int* sigs,
  459. const double overall_weight,
  460. const int* snk_color_weights,
  461. const int* snk_spin_weights,
  462. const double* snk_weights,
  463. const double* snk_psi_re,
  464. const double* snk_psi_im,
  465. const int Nc,
  466. const int Ns,
  467. const int Vsrc,
  468. const int Vsnk,
  469. const int Nt,
  470. const int Nw,
  471. const int Nq,
  472. const int Nsrc,
  473. const int Nsnk,
  474. const int Nperms) {
  475. /* indices */
  476. int iC1,iS1,jC1,jS1,kC1,kS1,iC2,iS2,jC2,jS2,kC2,kS2,x1,x2,t,wnum,nperm,b,n,m;
  477. int Nb = 2;
  478. int Nw2 = Nw*Nw;
  479. double term_re, term_im, new_term_re, new_term_im;
  480. /* build dibaryon */
  481. int snk_1_nq[Nb];
  482. int snk_2_nq[Nb];
  483. int snk_3_nq[Nb];
  484. int snk_1_b[Nb];
  485. int snk_2_b[Nb];
  486. int snk_3_b[Nb];
  487. int snk_1[Nb];
  488. int snk_2[Nb];
  489. int snk_3[Nb];
  490. for (nperm=0; nperm<Nperms; nperm++) {
  491. for (b=0; b<Nb; b++) {
  492. snk_1[b] = perms[index_2d(nperm,Nq*b+0 ,2*Nq)] - 1;
  493. snk_2[b] = perms[index_2d(nperm,Nq*b+1 ,2*Nq)] - 1;
  494. snk_3[b] = perms[index_2d(nperm,Nq*b+2 ,2*Nq)] - 1;
  495. snk_1_b[b] = (snk_1[b] - snk_1[b] % Nq) / Nq;
  496. snk_2_b[b] = (snk_2[b] - snk_2[b] % Nq) / Nq;
  497. snk_3_b[b] = (snk_3[b] - snk_3[b] % Nq) / Nq;
  498. snk_1_nq[b] = snk_1[b] % Nq;
  499. snk_2_nq[b] = snk_2[b] % Nq;
  500. snk_3_nq[b] = snk_3[b] % Nq;
  501. }
  502. for (wnum=0; wnum< Nw2; wnum++) {
  503. iC1 = snk_color_weights[index_3d(snk_1_b[0],wnum,snk_1_nq[0] ,Nw2,Nq)];
  504. iS1 = snk_spin_weights[index_3d(snk_1_b[0],wnum,snk_1_nq[0] ,Nw2,Nq)];
  505. jC1 = snk_color_weights[index_3d(snk_2_b[0],wnum,snk_2_nq[0] ,Nw2,Nq)];
  506. jS1 = snk_spin_weights[index_3d(snk_2_b[0],wnum,snk_2_nq[0] ,Nw2,Nq)];
  507. kC1 = snk_color_weights[index_3d(snk_3_b[0],wnum,snk_3_nq[0] ,Nw2,Nq)];
  508. kS1 = snk_spin_weights[index_3d(snk_3_b[0],wnum,snk_3_nq[0] ,Nw2,Nq)];
  509. iC2 = snk_color_weights[index_3d(snk_1_b[1],wnum,snk_1_nq[1] ,Nw2,Nq)];
  510. iS2 = snk_spin_weights[index_3d(snk_1_b[1],wnum,snk_1_nq[1] ,Nw2,Nq)];
  511. jC2 = snk_color_weights[index_3d(snk_2_b[1],wnum,snk_2_nq[1] ,Nw2,Nq)];
  512. jS2 = snk_spin_weights[index_3d(snk_2_b[1],wnum,snk_2_nq[1] ,Nw2,Nq)];
  513. kC2 = snk_color_weights[index_3d(snk_3_b[1],wnum,snk_3_nq[1] ,Nw2,Nq)];
  514. kS2 = snk_spin_weights[index_3d(snk_3_b[1],wnum,snk_3_nq[1] ,Nw2,Nq)];
  515. for (t=0; t<Nt; t++) {
  516. for (x1=0; x1<Vsnk; x1++) {
  517. for (x2=0; x2<Vsnk; x2++) {
  518. for (m=0; m<Nsrc; m++) {
  519. term_re = sigs[nperm] * overall_weight * snk_weights[wnum];
  520. term_im = 0.0;
  521. for (b=0; b<Nb; b++) {
  522. if ((snk_1_b[b] == 0) && (snk_2_b[b] == 0) && (snk_3_b[b] == 0)) {
  523. new_term_re = term_re * B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)];
  524. new_term_im = term_re * B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)];
  525. }
  526. else if ((snk_1_b[b] == 1) && (snk_2_b[b] == 1) && (snk_3_b[b] == 1)) {
  527. new_term_re = term_re * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)];
  528. new_term_im = term_re * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)];
  529. }
  530. else if ((snk_1_b[b] == 0) && (snk_3_b[b] == 0)) {
  531. new_term_re = term_re * B1_Bsingle_re[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B1_Bsingle_im[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)];
  532. new_term_im = term_re * B1_Bsingle_im[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B1_Bsingle_re[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)];
  533. }
  534. else if ((snk_1_b[b] == 1) && (snk_3_b[b] == 1)) {
  535. new_term_re = term_re * B2_Bsingle_re[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B2_Bsingle_im[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)];
  536. new_term_im = term_re * B2_Bsingle_im[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B2_Bsingle_re[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)];
  537. }
  538. else if (((snk_1_b[b] == 0) && (snk_2_b[b] == 0)) || ((snk_2_b[b] == 0) && (snk_3_b[b] == 0))) {
  539. new_term_re = term_re * B1_Bdouble_re[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B1_Bdouble_im[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)];
  540. new_term_im = term_re * B1_Bdouble_im[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B1_Bdouble_re[Bdouble_index(t,iC1,iS1,kC1,kS1,x1,jC1,jS1,x2,m ,Nc,Ns,Vsnk,Nsrc)];
  541. }
  542. else if (((snk_1_b[b] == 1) && (snk_2_b[b] == 1)) || ((snk_2_b[b] == 1) && (snk_3_b[b] == 1))) {
  543. new_term_re = term_re * B2_Bdouble_re[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)] - term_im * B2_Bdouble_im[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)];
  544. new_term_im = term_re * B2_Bdouble_im[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)] + term_im * B2_Bdouble_re[Bdouble_index(t,iC2,iS2,kC2,kS2,x2,jC2,jS2,x1,m ,Nc,Ns,Vsnk,Nsrc)];
  545. }
  546. term_re = new_term_re;
  547. term_im = new_term_im;
  548. }
  549. for (n=0; n<Nsnk; n++) {
  550. C_re[index_3d(m,n,t,Nsnk,Nt)] += snk_psi_re[index_3d(x1,x2,n ,Vsnk,Nsnk)] * term_re - snk_psi_im[index_3d(x1,x2,n ,Vsnk,Nsnk)] * term_im;
  551. C_im[index_3d(m,n,t,Nsnk,Nt)] += snk_psi_re[index_3d(x1,x2,n ,Vsnk,Nsnk)] * term_im + snk_psi_im[index_3d(x1,x2,n ,Vsnk,Nsnk)] * term_re;
  552. }
  553. }
  554. }
  555. }
  556. }
  557. }
  558. }
  559. }
  560. void make_dibaryon_hex_correlator(double* C_re,
  561. double* C_im,
  562. const double* B1_Blocal_re,
  563. const double* B1_Blocal_im,
  564. const double* B2_Blocal_re,
  565. const double* B2_Blocal_im,
  566. const int* perms,
  567. const int* sigs,
  568. const double overall_weight,
  569. const int* snk_color_weights,
  570. const int* snk_spin_weights,
  571. const double* snk_weights,
  572. const double* hex_snk_psi_re,
  573. const double* hex_snk_psi_im,
  574. const int Nc,
  575. const int Ns,
  576. const int Vsrc,
  577. const int Vsnk,
  578. const int Nt,
  579. const int Nw,
  580. const int Nq,
  581. const int Nsrc,
  582. const int NsnkHex,
  583. const int Nperms) {
  584. /* indices */
  585. int iC1,iS1,jC1,jS1,kC1,kS1,iC2,iS2,jC2,jS2,kC2,kS2,x,t,wnum,nperm,b,n,m;
  586. int Nb = 2;
  587. int Nw2 = Nw*Nw;
  588. double term_re, term_im;
  589. /* build dibaryon */
  590. int snk_1_nq[Nb];
  591. int snk_2_nq[Nb];
  592. int snk_3_nq[Nb];
  593. int snk_1_b[Nb];
  594. int snk_2_b[Nb];
  595. int snk_3_b[Nb];
  596. int snk_1[Nb];
  597. int snk_2[Nb];
  598. int snk_3[Nb];
  599. for (nperm=0; nperm<Nperms; nperm++) {
  600. for (b=0; b<Nb; b++) {
  601. snk_1[b] = perms[index_2d(nperm,Nq*b+0 ,2*Nq)] - 1;
  602. snk_2[b] = perms[index_2d(nperm,Nq*b+1 ,2*Nq)] - 1;
  603. snk_3[b] = perms[index_2d(nperm,Nq*b+2 ,2*Nq)] - 1;
  604. snk_1_b[b] = (snk_1[b] - snk_1[b] % Nq) / Nq;
  605. snk_2_b[b] = (snk_2[b] - snk_2[b] % Nq) / Nq;
  606. snk_3_b[b] = (snk_3[b] - snk_3[b] % Nq) / Nq;
  607. snk_1_nq[b] = snk_1[b] % Nq;
  608. snk_2_nq[b] = snk_2[b] % Nq;
  609. snk_3_nq[b] = snk_3[b] % Nq;
  610. }
  611. for (wnum=0; wnum< Nw2; wnum++) {
  612. iC1 = snk_color_weights[index_3d(snk_1_b[0],wnum,snk_1_nq[0] ,Nw2,Nq)];
  613. iS1 = snk_spin_weights[index_3d(snk_1_b[0],wnum,snk_1_nq[0] ,Nw2,Nq)];
  614. jC1 = snk_color_weights[index_3d(snk_2_b[0],wnum,snk_2_nq[0] ,Nw2,Nq)];
  615. jS1 = snk_spin_weights[index_3d(snk_2_b[0],wnum,snk_2_nq[0] ,Nw2,Nq)];
  616. kC1 = snk_color_weights[index_3d(snk_3_b[0],wnum,snk_3_nq[0] ,Nw2,Nq)];
  617. kS1 = snk_spin_weights[index_3d(snk_3_b[0],wnum,snk_3_nq[0] ,Nw2,Nq)];
  618. iC2 = snk_color_weights[index_3d(snk_1_b[1],wnum,snk_1_nq[1] ,Nw2,Nq)];
  619. iS2 = snk_spin_weights[index_3d(snk_1_b[1],wnum,snk_1_nq[1] ,Nw2,Nq)];
  620. jC2 = snk_color_weights[index_3d(snk_2_b[1],wnum,snk_2_nq[1] ,Nw2,Nq)];
  621. jS2 = snk_spin_weights[index_3d(snk_2_b[1],wnum,snk_2_nq[1] ,Nw2,Nq)];
  622. kC2 = snk_color_weights[index_3d(snk_3_b[1],wnum,snk_3_nq[1] ,Nw2,Nq)];
  623. kS2 = snk_spin_weights[index_3d(snk_3_b[1],wnum,snk_3_nq[1] ,Nw2,Nq)];
  624. for (t=0; t<Nt; t++) {
  625. for (x=0; x<Vsnk; x++) {
  626. for (m=0; m<Nsrc; m++) {
  627. term_re = sigs[nperm] * overall_weight * snk_weights[wnum] * (B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,x,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,x,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)] - B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,x,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,x,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)]);
  628. term_im = sigs[nperm] * overall_weight * snk_weights[wnum] * (B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,x,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,x,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)] + B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,x,jC1,jS1,m ,Nc,Ns,Vsnk,Nsrc)] * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,x,jC2,jS2,m ,Nc,Ns,Vsnk,Nsrc)]);
  629. for (n=0; n<NsnkHex; n++) {
  630. C_re[index_3d(m,n,t ,NsnkHex,Nt)] += hex_snk_psi_re[index_2d(x,n ,NsnkHex)] * term_re - hex_snk_psi_im[index_2d(x,n ,NsnkHex)] * term_im;
  631. C_im[index_3d(m,n,t ,NsnkHex,Nt)] += hex_snk_psi_re[index_2d(x,n ,NsnkHex)] * term_im + hex_snk_psi_im[index_2d(x,n ,NsnkHex)] * term_re;
  632. }
  633. }
  634. }
  635. }
  636. }
  637. }
  638. }
  639. void make_hex_dibaryon_correlator(double* C_re,
  640. double* C_im,
  641. const double* B1_Blocal_re,
  642. const double* B1_Blocal_im,
  643. const double* B2_Blocal_re,
  644. const double* B2_Blocal_im,
  645. const int* perms,
  646. const int* sigs,
  647. const double overall_weight,
  648. const int* src_color_weights,
  649. const int* src_spin_weights,
  650. const double* src_weights,
  651. const double* hex_src_psi_re,
  652. const double* hex_src_psi_im,
  653. const int Nc,
  654. const int Ns,
  655. const int Vsrc,
  656. const int Vsnk,
  657. const int Nt,
  658. const int Nw,
  659. const int Nq,
  660. const int NsrcHex,
  661. const int Nsnk,
  662. const int Nperms) {
  663. /* indices */
  664. int iC1,iS1,jC1,jS1,kC1,kS1,iC2,iS2,jC2,jS2,kC2,kS2,x,t,wnum,nperm,b,n,m,y;
  665. int Nb = 2;
  666. int Nw2 = Nw*Nw;
  667. double term_re, term_im;
  668. /* build dibaryon */
  669. int src_1_nq[Nb];
  670. int src_2_nq[Nb];
  671. int src_3_nq[Nb];
  672. int src_1_b[Nb];
  673. int src_2_b[Nb];
  674. int src_3_b[Nb];
  675. int src_1[Nb];
  676. int src_2[Nb];
  677. int src_3[Nb];
  678. for (nperm=0; nperm<Nperms; nperm++) {
  679. for (b=0; b<Nb; b++) {
  680. src_1[b] = perms[index_2d(nperm,Nq*b+0 ,2*Nq)] - 1;
  681. src_2[b] = perms[index_2d(nperm,Nq*b+1 ,2*Nq)] - 1;
  682. src_3[b] = perms[index_2d(nperm,Nq*b+2 ,2*Nq)] - 1;
  683. src_1_b[b] = (src_1[b] - src_1[b] % Nq) / Nq;
  684. src_2_b[b] = (src_2[b] - src_2[b] % Nq) / Nq;
  685. src_3_b[b] = (src_3[b] - src_3[b] % Nq) / Nq;
  686. src_1_nq[b] = src_1[b] % Nq;
  687. src_2_nq[b] = src_2[b] % Nq;
  688. src_3_nq[b] = src_3[b] % Nq;
  689. }
  690. for (wnum=0; wnum< Nw2; wnum++) {
  691. iC1 = src_color_weights[index_3d(src_1_b[0],wnum,src_1_nq[0] ,Nw2,Nq)];
  692. iS1 = src_spin_weights[index_3d(src_1_b[0],wnum,src_1_nq[0] ,Nw2,Nq)];
  693. jC1 = src_color_weights[index_3d(src_2_b[0],wnum,src_2_nq[0] ,Nw2,Nq)];
  694. jS1 = src_spin_weights[index_3d(src_2_b[0],wnum,src_2_nq[0] ,Nw2,Nq)];
  695. kC1 = src_color_weights[index_3d(src_3_b[0],wnum,src_3_nq[0] ,Nw2,Nq)];
  696. kS1 = src_spin_weights[index_3d(src_3_b[0],wnum,src_3_nq[0] ,Nw2,Nq)];
  697. iC2 = src_color_weights[index_3d(src_1_b[1],wnum,src_1_nq[1] ,Nw2,Nq)];
  698. iS2 = src_spin_weights[index_3d(src_1_b[1],wnum,src_1_nq[1] ,Nw2,Nq)];
  699. jC2 = src_color_weights[index_3d(src_2_b[1],wnum,src_2_nq[1] ,Nw2,Nq)];
  700. jS2 = src_spin_weights[index_3d(src_2_b[1],wnum,src_2_nq[1] ,Nw2,Nq)];
  701. kC2 = src_color_weights[index_3d(src_3_b[1],wnum,src_3_nq[1] ,Nw2,Nq)];
  702. kS2 = src_spin_weights[index_3d(src_3_b[1],wnum,src_3_nq[1] ,Nw2,Nq)];
  703. for (t=0; t<Nt; t++) {
  704. for (y=0; y<Vsrc; y++) {
  705. for (n=0; n<Nsnk; n++) {
  706. term_re = sigs[nperm] * overall_weight * src_weights[wnum] * (B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,y,jC1,jS1,n ,Nc,Ns,Vsrc,Nsnk)] * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,y,jC2,jS2,n ,Nc,Ns,Vsrc,Nsnk)] - B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,y,jC1,jS1,n ,Nc,Ns,Vsrc,Nsnk)] * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,y,jC2,jS2,n ,Nc,Ns,Vsrc,Nsnk)]);
  707. term_im = sigs[nperm] * overall_weight * src_weights[wnum] * (B1_Blocal_re[Blocal_index(t,iC1,iS1,kC1,kS1,y,jC1,jS1,n ,Nc,Ns,Vsrc,Nsnk)] * B2_Blocal_im[Blocal_index(t,iC2,iS2,kC2,kS2,y,jC2,jS2,n ,Nc,Ns,Vsrc,Nsnk)] + B1_Blocal_im[Blocal_index(t,iC1,iS1,kC1,kS1,y,jC1,jS1,n ,Nc,Ns,Vsrc,Nsnk)] * B2_Blocal_re[Blocal_index(t,iC2,iS2,kC2,kS2,y,jC2,jS2,n ,Nc,Ns,Vsrc,Nsnk)]);
  708. for (m=0; m<NsrcHex; m++) {
  709. C_re[index_3d(m,n,t ,Nsnk,Nt)] += hex_src_psi_re[index_2d(y,m, NsrcHex)] * term_re - hex_src_psi_im[index_2d(y,m, NsrcHex)] * term_im;
  710. C_im[index_3d(m,n,t ,Nsnk,Nt)] += hex_src_psi_re[index_2d(y,m, NsrcHex)] * term_im + hex_src_psi_im[index_2d(y,m, NsrcHex)] * term_re;
  711. }
  712. }
  713. }
  714. }
  715. }
  716. }
  717. }
  718. void make_hex_correlator(double* C_re,
  719. double* C_im,
  720. const double* B1_prop_re,
  721. const double* B1_prop_im,
  722. const double* B2_prop_re,
  723. const double* B2_prop_im,
  724. const int* perms,
  725. const int* sigs,
  726. const int* B1_src_color_weights,
  727. const int* B1_src_spin_weights,
  728. const double* B1_src_weights,
  729. const int* B2_src_color_weights,
  730. const int* B2_src_spin_weights,
  731. const double* B2_src_weights,
  732. const double overall_weight,
  733. const int* snk_color_weights,
  734. const int* snk_spin_weights,
  735. const double* snk_weights,
  736. const double* hex_src_psi_re,
  737. const double* hex_src_psi_im,
  738. const double* hex_snk_psi_re,
  739. const double* hex_snk_psi_im,
  740. const int Nc,
  741. const int Ns,
  742. const int Vsrc,
  743. const int Vsnk,
  744. const int Nt,
  745. const int Nw,
  746. const int Nq,
  747. const int NsrcHex,
  748. const int NsnkHex,
  749. const int Nperms) {
  750. /* indices */
  751. int x,t,wnum,nperm,b,n,m,y,wnumprime;
  752. int iC1prime,iS1prime,jC1prime,jS1prime,kC1prime,kS1prime,iC2prime,iS2prime,jC2prime,jS2prime,kC2prime,kS2prime;
  753. int iC1,iS1,jC1,jS1,kC1,kS1,iC2,iS2,jC2,jS2,kC2,kS2;
  754. int Nb = 2;
  755. int Nw2 = Nw*Nw;
  756. double B1_prop_prod_02_re, B1_prop_prod_02_im, B1_prop_prod_re, B1_prop_prod_im, B2_prop_prod_02_re, B2_prop_prod_02_im, B2_prop_prod_re, B2_prop_prod_im;
  757. double prop_prod_re, prop_prod_im, new_prop_prod_re, new_prop_prod_im;
  758. /* build dibaryon */
  759. int snk_1_nq[Nb];
  760. int snk_2_nq[Nb];
  761. int snk_3_nq[Nb];
  762. int snk_1_b[Nb];
  763. int snk_2_b[Nb];
  764. int snk_3_b[Nb];
  765. int snk_1[Nb];
  766. int snk_2[Nb];
  767. int snk_3[Nb];
  768. for (nperm=0; nperm<Nperms; nperm++) {
  769. for (b=0; b<Nb; b++) {
  770. snk_1[b] = perms[index_2d(nperm,Nq*b+0 ,2*Nq)] - 1;
  771. snk_2[b] = perms[index_2d(nperm,Nq*b+1 ,2*Nq)] - 1;
  772. snk_3[b] = perms[index_2d(nperm,Nq*b+2 ,2*Nq)] - 1;
  773. snk_1_b[b] = (snk_1[b] - snk_1[b] % Nq) / Nq;
  774. snk_2_b[b] = (snk_2[b] - snk_2[b] % Nq) / Nq;
  775. snk_3_b[b] = (snk_3[b] - snk_3[b] % Nq) / Nq;
  776. snk_1_nq[b] = snk_1[b] % Nq;
  777. snk_2_nq[b] = snk_2[b] % Nq;
  778. snk_3_nq[b] = snk_3[b] % Nq;
  779. }
  780. for (wnumprime=0; wnumprime< Nw2; wnumprime++) {
  781. iC1prime = snk_color_weights[index_3d(snk_1_b[0],wnumprime,snk_1_nq[0] ,Nw2,Nq)];
  782. iS1prime = snk_spin_weights[index_3d(snk_1_b[0],wnumprime,snk_1_nq[0] ,Nw2,Nq)];
  783. jC1prime = snk_color_weights[index_3d(snk_2_b[0],wnumprime,snk_2_nq[0] ,Nw2,Nq)];
  784. jS1prime = snk_spin_weights[index_3d(snk_2_b[0],wnumprime,snk_2_nq[0] ,Nw2,Nq)];
  785. kC1prime = snk_color_weights[index_3d(snk_3_b[0],wnumprime,snk_3_nq[0] ,Nw2,Nq)];
  786. kS1prime = snk_spin_weights[index_3d(snk_3_b[0],wnumprime,snk_3_nq[0] ,Nw2,Nq)];
  787. iC2prime = snk_color_weights[index_3d(snk_1_b[1],wnumprime,snk_1_nq[1] ,Nw2,Nq)];
  788. iS2prime = snk_spin_weights[index_3d(snk_1_b[1],wnumprime,snk_1_nq[1] ,Nw2,Nq)];
  789. jC2prime = snk_color_weights[index_3d(snk_2_b[1],wnumprime,snk_2_nq[1] ,Nw2,Nq)];
  790. jS2prime = snk_spin_weights[index_3d(snk_2_b[1],wnumprime,snk_2_nq[1] ,Nw2,Nq)];
  791. kC2prime = snk_color_weights[index_3d(snk_3_b[1],wnumprime,snk_3_nq[1] ,Nw2,Nq)];
  792. kS2prime = snk_spin_weights[index_3d(snk_3_b[1],wnumprime,snk_3_nq[1] ,Nw2,Nq)];
  793. for (t=0; t<Nt; t++) {
  794. for (y=0; y<Vsrc; y++) {
  795. for (x=0; x<Vsnk; x++) {
  796. B1_prop_prod_re = 0;
  797. B1_prop_prod_im = 0;
  798. for (wnum=0; wnum<Nw; wnum++) {
  799. iC1 = B1_src_color_weights[index_2d(wnum,0, Nq)];
  800. iS1 = B1_src_spin_weights[index_2d(wnum,0, Nq)];
  801. jC1 = B1_src_color_weights[index_2d(wnum,1, Nq)];
  802. jS1 = B1_src_spin_weights[index_2d(wnum,1, Nq)];
  803. kC1 = B1_src_color_weights[index_2d(wnum,2, Nq)];
  804. kS1 = B1_src_spin_weights[index_2d(wnum,2, Nq)];
  805. B1_prop_prod_02_re = B1_src_weights[wnum] * ( (B1_prop_re[prop_index(0,t,iC1,iS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_re[prop_index(2,t,kC1,kS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B1_prop_im[prop_index(0,t,iC1,iS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_im[prop_index(2,t,kC1,kS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (B1_prop_re[prop_index(0,t,iC1,iS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_re[prop_index(2,t,kC1,kS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B1_prop_im[prop_index(0,t,iC1,iS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_im[prop_index(2,t,kC1,kS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  806. B1_prop_prod_02_im = B1_src_weights[wnum] * ( (B1_prop_re[prop_index(0,t,iC1,iS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_im[prop_index(2,t,kC1,kS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B1_prop_im[prop_index(0,t,iC1,iS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_re[prop_index(2,t,kC1,kS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (B1_prop_re[prop_index(0,t,iC1,iS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_im[prop_index(2,t,kC1,kS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B1_prop_im[prop_index(0,t,iC1,iS1,kC1prime,kS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B1_prop_re[prop_index(2,t,kC1,kS1,iC1prime,iS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  807. B1_prop_prod_re += B1_prop_prod_02_re * B1_prop_re[prop_index(1,t,jC1,jS1,jC1prime,jS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B1_prop_prod_02_im * B1_prop_im[prop_index(1,t,jC1,jS1,jC1prime,jS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  808. B1_prop_prod_im += B1_prop_prod_02_re * B1_prop_im[prop_index(1,t,jC1,jS1,jC1prime,jS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B1_prop_prod_02_im * B1_prop_re[prop_index(1,t,jC1,jS1,jC1prime,jS1prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  809. }
  810. B2_prop_prod_re = 0;
  811. B2_prop_prod_im = 0;
  812. for (wnum=0; wnum<Nw; wnum++) {
  813. iC2 = B2_src_color_weights[index_2d(wnum,0, Nq)];
  814. iS2 = B2_src_spin_weights[index_2d(wnum,0, Nq)];
  815. jC2 = B2_src_color_weights[index_2d(wnum,1, Nq)];
  816. jS2 = B2_src_spin_weights[index_2d(wnum,1, Nq)];
  817. kC2 = B2_src_color_weights[index_2d(wnum,2, Nq)];
  818. kS2 = B2_src_spin_weights[index_2d(wnum,2, Nq)];
  819. B2_prop_prod_02_re = B2_src_weights[wnum] * ( (B2_prop_re[prop_index(0,t,iC2,iS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_re[prop_index(2,t,kC2,kS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B2_prop_im[prop_index(0,t,iC2,iS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_im[prop_index(2,t,kC2,kS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (B2_prop_re[prop_index(0,t,iC2,iS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_re[prop_index(2,t,kC2,kS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B2_prop_im[prop_index(0,t,iC2,iS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_im[prop_index(2,t,kC2,kS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  820. B2_prop_prod_02_im = B2_src_weights[wnum] * ( (B2_prop_re[prop_index(0,t,iC2,iS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_im[prop_index(2,t,kC2,kS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B2_prop_im[prop_index(0,t,iC2,iS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_re[prop_index(2,t,kC2,kS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) - (B2_prop_re[prop_index(0,t,iC2,iS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_im[prop_index(2,t,kC2,kS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B2_prop_im[prop_index(0,t,iC2,iS2,kC2prime,kS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] * B2_prop_re[prop_index(2,t,kC2,kS2,iC2prime,iS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)]) );
  821. B2_prop_prod_re += B2_prop_prod_02_re * B2_prop_re[prop_index(1,t,jC2,jS2,jC2prime,jS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] - B2_prop_prod_02_im * B2_prop_im[prop_index(1,t,jC2,jS2,jC2prime,jS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  822. B2_prop_prod_im += B2_prop_prod_02_re * B2_prop_im[prop_index(1,t,jC2,jS2,jC2prime,jS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)] + B2_prop_prod_02_im * B2_prop_re[prop_index(1,t,jC2,jS2,jC2prime,jS2prime,y,x ,Nc,Ns,Vsrc,Vsnk,Nt)];
  823. }
  824. prop_prod_re = overall_weight * sigs[nperm] * snk_weights[wnumprime] * ( B1_prop_prod_re * B2_prop_prod_re - B1_prop_prod_im * B2_prop_prod_im );
  825. prop_prod_im = overall_weigh