24 #include "mltplyCommon.h" 26 #include "wrapperMPI.h" 27 #include "mltplyMPISpin.h" 28 #include "mltplyMPISpinCore.h" 36 unsigned long int i_int,
38 double complex *tmp_v0,
39 double complex *tmp_v1
42 double complex dam_pr = 0;
44 (
int)
X->Def.InterAll_OffDiagonal[i_int][0], (
int)
X->Def.InterAll_OffDiagonal[i_int][1],
45 (
int)
X->Def.InterAll_OffDiagonal[i_int][3], (
int)
X->Def.InterAll_OffDiagonal[i_int][4],
46 (
int)
X->Def.InterAll_OffDiagonal[i_int][5], (
int)
X->Def.InterAll_OffDiagonal[i_int][7],
47 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
52 X->Large.prdct += dam_pr;
70 double complex *tmp_v0,
71 double complex *tmp_v1
74 int mask1, mask2, state1, state2, ierr, origin;
75 unsigned long int idim_max_buf, j, ioff;
77 double complex Jint, dmv, dam_pr;
79 mask1 = (int)
X->Def.Tpow[org_isite1];
80 mask2 = (
int)
X->Def.Tpow[org_isite3];
81 origin =
myrank ^ (mask1 + mask2);
83 state1 = (origin & mask1) / mask1;
84 state2 = (origin & mask2) / mask2;
86 if (state1 == org_ispin2 && state2 == org_ispin4) {
89 else if (state1 == org_ispin1 && state2 == org_ispin3) {
91 if (
X->Large.mode == M_CORR ||
X->Large.mode == M_CALCSPEC) {
97 ierr = MPI_Sendrecv(&
X->Check.idim_max, 1, MPI_UNSIGNED_LONG, origin, 0,
98 &idim_max_buf, 1, MPI_UNSIGNED_LONG, origin, 0, MPI_COMM_WORLD, &statusMPI);
100 ierr = MPI_Sendrecv(
list_1,
X->Check.idim_max + 1, MPI_UNSIGNED_LONG, origin, 0,
101 list_1buf, idim_max_buf + 1, MPI_UNSIGNED_LONG, origin, 0, MPI_COMM_WORLD, &statusMPI);
103 ierr = MPI_Sendrecv(tmp_v1,
X->Check.idim_max + 1, MPI_DOUBLE_COMPLEX, origin, 0,
104 v1buf, idim_max_buf + 1, MPI_DOUBLE_COMPLEX, origin, 0, MPI_COMM_WORLD, &statusMPI);
108 if (
X->Large.mode == M_MLTPLY ||
X->Large.mode == M_CALCSPEC) {
109 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff) \ 110 firstprivate(idim_max_buf, Jint, X) shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 111 for (j = 1; j <= idim_max_buf; j++) {
113 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
114 dmv = Jint *
v1buf[j];
116 dam_pr += conj(tmp_v1[ioff]) * dmv;
120 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff) \ 121 firstprivate(idim_max_buf, Jint, X) shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 122 for (j = 1; j <= idim_max_buf; j++) {
124 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
125 dmv = Jint *
v1buf[j];
126 dam_pr += conj(tmp_v1[ioff]) * dmv;
144 double complex *tmp_v0,
145 double complex *tmp_v1
148 int mask1, mask2, num1_up, num2_up, ierr, origin;
149 unsigned long int idim_max_buf, j, ioff, ibit_tmp;
150 MPI_Status statusMPI;
151 double complex dmv, dam_pr;
153 mask1 = (int)
X->Def.Tpow[org_isite1];
154 mask2 = (
int)
X->Def.Tpow[org_isite3];
155 if (mask1 == mask2) origin =
myrank ^ mask1;
156 else origin =
myrank ^ (mask1 + mask2);
157 num1_up = (origin & mask1) / mask1;
158 num2_up = (origin & mask2) / mask2;
160 ibit_tmp = (num1_up) ^ (num2_up);
161 if (ibit_tmp == 0)
return 0;
163 ierr = MPI_Sendrecv(&
X->Check.idim_max, 1, MPI_UNSIGNED_LONG, origin, 0,
164 &idim_max_buf, 1, MPI_UNSIGNED_LONG, origin, 0,
165 MPI_COMM_WORLD, &statusMPI);
167 ierr = MPI_Sendrecv(
list_1,
X->Check.idim_max + 1, MPI_UNSIGNED_LONG, origin, 0,
168 list_1buf, idim_max_buf + 1, MPI_UNSIGNED_LONG, origin, 0,
169 MPI_COMM_WORLD, &statusMPI);
171 ierr = MPI_Sendrecv(tmp_v1,
X->Check.idim_max + 1, MPI_DOUBLE_COMPLEX, origin, 0,
172 v1buf, idim_max_buf + 1, MPI_DOUBLE_COMPLEX, origin, 0,
173 MPI_COMM_WORLD, &statusMPI);
177 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff) \ 178 firstprivate(idim_max_buf, X) shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 179 for (j = 1; j <= idim_max_buf; j++) {
181 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
182 dmv = 0.5 *
v1buf[j];
183 dam_pr += conj(tmp_v1[ioff]) * dmv;
197 unsigned long int i_int,
199 double complex *tmp_v0,
200 double complex *tmp_v1
203 double complex dam_pr = 0;
206 (
int)
X->Def.InterAll_OffDiagonal[i_int][0], (
int)
X->Def.InterAll_OffDiagonal[i_int][1],
207 (
int)
X->Def.InterAll_OffDiagonal[i_int][3], (
int)
X->Def.InterAll_OffDiagonal[i_int][4],
208 (
int)
X->Def.InterAll_OffDiagonal[i_int][5], (
int)
X->Def.InterAll_OffDiagonal[i_int][7],
209 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
214 X->Large.prdct += dam_pr;
229 double complex tmp_J,
231 double complex *tmp_v0,
232 double complex *tmp_v1
235 int mask2, state2, ierr, origin;
236 unsigned long int mask1, idim_max_buf, j, ioff, state1, jreal, state1check;
237 MPI_Status statusMPI;
238 double complex Jint, dmv, dam_pr;
242 mask2 = (int)
X->Def.Tpow[org_isite3];
244 state2 = (origin & mask2) / mask2;
246 if (state2 == org_ispin4) {
247 state1check = (
unsigned long int) org_ispin2;
250 else if (state2 == org_ispin3) {
251 state1check = (
unsigned long int) org_ispin1;
253 if (
X->Large.mode == M_CORR ||
X->Large.mode == M_CALCSPEC) {
259 ierr = MPI_Sendrecv(&
X->Check.idim_max, 1, MPI_UNSIGNED_LONG, origin, 0,
260 &idim_max_buf, 1, MPI_UNSIGNED_LONG, origin, 0,
261 MPI_COMM_WORLD, &statusMPI);
263 ierr = MPI_Sendrecv(
list_1,
X->Check.idim_max + 1, MPI_UNSIGNED_LONG, origin, 0,
264 list_1buf, idim_max_buf + 1, MPI_UNSIGNED_LONG, origin, 0,
265 MPI_COMM_WORLD, &statusMPI);
267 ierr = MPI_Sendrecv(tmp_v1,
X->Check.idim_max + 1, MPI_DOUBLE_COMPLEX, origin, 0,
268 v1buf, idim_max_buf + 1, MPI_DOUBLE_COMPLEX, origin, 0,
269 MPI_COMM_WORLD, &statusMPI);
274 mask1 =
X->Def.Tpow[org_isite1];
277 if (
X->Large.mode == M_MLTPLY ||
X->Large.mode == M_CALCSPEC) {
278 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff, jreal, state1) \ 279 firstprivate(idim_max_buf, Jint, X, mask1, state1check, org_isite1) \ 280 shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 281 for (j = 1; j <= idim_max_buf; j++) {
285 state1 = (jreal & mask1) / mask1;
286 if (state1 == state1check) {
288 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
290 dmv = Jint *
v1buf[j];
292 dam_pr += conj(tmp_v1[ioff]) * dmv;
296 else if (
X->Large.mode == M_TOTALS) {
297 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff, jreal, state1) \ 298 firstprivate(idim_max_buf, Jint, X, mask1, state1check, org_isite1) \ 299 shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 300 for (j = 1; j <= idim_max_buf; j++) {
304 state1 = (jreal & mask1) / mask1;
305 if (state1 == state1check) {
307 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
309 dmv = Jint *
v1buf[j];
310 dmv = 0.5 *
v1buf[j];
311 dam_pr += conj(tmp_v1[ioff]) * dmv;
316 #pragma omp parallel for default(none) reduction(+:dam_pr) private(j, dmv, ioff, jreal, state1) \ 317 firstprivate(idim_max_buf, Jint, X, mask1, state1check, org_isite1) \ 318 shared(list_2_1, list_2_2, list_1buf, v1buf, tmp_v1, tmp_v0) 319 for (j = 1; j <= idim_max_buf; j++) {
323 state1 = (jreal & mask1) / mask1;
324 if (state1 == state1check) {
326 X->Large.irght,
X->Large.ilft,
X->Large.ihfbit, &ioff);
327 dmv = Jint *
v1buf[j];
328 dam_pr += conj(tmp_v1[ioff]) * dmv;
343 unsigned long int i_int,
345 double complex *tmp_v0,
346 double complex *tmp_v1
348 if (
X->Def.InterAll_OffDiagonal[i_int][1] ==
X->Def.InterAll_OffDiagonal[i_int][3] &&
349 X->Def.InterAll_OffDiagonal[i_int][5] !=
X->Def.InterAll_OffDiagonal[i_int][7]) {
352 else if (
X->Def.InterAll_OffDiagonal[i_int][1] !=
X->Def.InterAll_OffDiagonal[i_int][3] &&
353 X->Def.InterAll_OffDiagonal[i_int][5] ==
X->Def.InterAll_OffDiagonal[i_int][7]) {
366 unsigned long int i_int,
368 double complex *tmp_v0,
369 double complex *tmp_v1
371 if (
X->Def.InterAll_OffDiagonal[i_int][1] ==
X->Def.InterAll_OffDiagonal[i_int][3] &&
372 X->Def.InterAll_OffDiagonal[i_int][5] !=
X->Def.InterAll_OffDiagonal[i_int][7]) {
375 else if (
X->Def.InterAll_OffDiagonal[i_int][1] !=
X->Def.InterAll_OffDiagonal[i_int][3] &&
376 X->Def.InterAll_OffDiagonal[i_int][5] ==
X->Def.InterAll_OffDiagonal[i_int][7]) {
389 unsigned long int i_int,
391 double complex *tmp_v0,
392 double complex *tmp_v1
395 double complex dam_pr;
398 if (
X->Def.InterAll_OffDiagonal[i_int][1] ==
X->Def.InterAll_OffDiagonal[i_int][3] &&
399 X->Def.InterAll_OffDiagonal[i_int][5] !=
X->Def.InterAll_OffDiagonal[i_int][7]) {
401 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
402 X->Def.InterAll_OffDiagonal[i_int][4],
X->Def.InterAll_OffDiagonal[i_int][5],
403 X->Def.InterAll_OffDiagonal[i_int][7],
X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
405 else if (
X->Def.InterAll_OffDiagonal[i_int][1] !=
X->Def.InterAll_OffDiagonal[i_int][3] &&
406 X->Def.InterAll_OffDiagonal[i_int][5] ==
X->Def.InterAll_OffDiagonal[i_int][7]) {
408 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
409 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
410 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
414 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
415 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
416 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.InterAll_OffDiagonal[i_int][7],
417 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
419 X->Large.prdct += dam_pr;
428 unsigned long int i_int,
430 double complex *tmp_v0,
431 double complex *tmp_v1
434 double complex dam_pr;
436 if (
X->Def.InterAll_OffDiagonal[i_int][1] ==
X->Def.InterAll_OffDiagonal[i_int][3] &&
437 X->Def.InterAll_OffDiagonal[i_int][5] !=
X->Def.InterAll_OffDiagonal[i_int][7]) {
439 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
440 X->Def.InterAll_OffDiagonal[i_int][4],
X->Def.InterAll_OffDiagonal[i_int][5],
441 X->Def.InterAll_OffDiagonal[i_int][7],
X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
443 else if (
X->Def.InterAll_OffDiagonal[i_int][1] !=
X->Def.InterAll_OffDiagonal[i_int][3] &&
444 X->Def.InterAll_OffDiagonal[i_int][5] ==
X->Def.InterAll_OffDiagonal[i_int][7]) {
446 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
447 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
448 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
452 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
453 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
454 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.InterAll_OffDiagonal[i_int][7],
455 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
458 X->Large.prdct += dam_pr;
467 unsigned long int i_int,
469 double complex *tmp_v0,
470 double complex *tmp_v1
472 double complex dam_pr;
474 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
475 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
476 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.InterAll_OffDiagonal[i_int][7],
477 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
478 X->Large.prdct += dam_pr;
487 unsigned long int i_int,
489 double complex *tmp_v0,
490 double complex *tmp_v1
492 double complex dam_pr;
495 X->Def.InterAll_OffDiagonal[i_int][0],
X->Def.InterAll_OffDiagonal[i_int][1],
496 X->Def.InterAll_OffDiagonal[i_int][3],
X->Def.InterAll_OffDiagonal[i_int][4],
497 X->Def.InterAll_OffDiagonal[i_int][5],
X->Def.InterAll_OffDiagonal[i_int][7],
498 X->Def.ParaInterAll_OffDiagonal[i_int],
X, tmp_v0, tmp_v1);
500 X->Large.prdct += dam_pr;
void GC_child_CisAitCiuAiv_spin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange and Pairlifting term in Spin model + GC When both site1 and site2 are in the inter process r...
void exitMPI(int errorcode)
MPI Abortation wrapper.
double complex X_child_CisAitCjuAjv_GeneralSpin_MPIsingle(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the canonical general spin system when one of these sites is in the inter process re...
void GC_child_general_int_spin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...
double complex X_GC_child_CisAitCjuAjv_GeneralSpin_MPIsingle(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the grandcanonical general spin system when one of these site is in the inter proces...
double complex X_GC_child_CisAisCjuAjv_GeneralSpin_MPIdouble(int org_isite1, int org_ispin1, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
term in Spin model. When both site1 and site3 are in the inter process region.
void GC_child_CisAitCiuAiv_spin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange and Pairlifting term in Spin model + GC When only site2 is in the inter process region...
double complex X_GC_child_CisAitCjuAju_GeneralSpin_MPIsingle(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the grandcanonical general spin system when one of these site is in the inter proces...
long unsigned int * list_1buf
void GC_child_CisAisCjuAjv_spin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Wrapper for CisAisCjuAjv term in Spin model + GC When only site2 is in the inter process region...
void GC_child_CisAisCjuAjv_spin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Wrapper for calculating CisAisCjuAjv term in Spin model + GC When both site1 and site2 are in the int...
double complex X_child_CisAitCjuAjv_GeneralSpin_MPIdouble(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the canonical general spin system when both sites are in the inter process region...
double complex X_GC_child_CisAitCjuAjv_GeneralSpin_MPIdouble(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the grandcanonical general spin system when both site is in the inter process region...
void child_general_int_GeneralSpin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...
void GC_child_CisAitCjuAju_spin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Wrapper for CisAisCjuAjv term in Spin model + GC When only site2 is in the inter process region...
long unsigned int * list_2_1
int GetOffComp(long unsigned int *_list_2_1, long unsigned int *_list_2_2, long unsigned int _ibit, const long unsigned int _irght, const long unsigned int _ilft, const long unsigned int _ihfbit, long unsigned int *_ioffComp)
function of getting off-diagonal component
void GC_child_general_int_spin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...
void child_general_int_spin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange term in Spin model When both site1 and site2 are in the inter process region.
double complex X_child_general_int_spin_TotalS_MPIdouble(int org_isite1, int org_isite3, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange term in Spin model When both site1 and site2 are in the inter process region.
long unsigned int * list_1
void GC_child_CisAitCjuAju_spin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Wrapper for calculating CisAitCjuAju term in Spin model + GC When both site1 and site2 are in the int...
void GC_child_general_int_GeneralSpin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...
long unsigned int * list_2_2
double complex X_child_general_int_spin_MPIdouble(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange term in Spin model When both site1 and site2 are in the inter process region.
double complex X_GC_child_CisAisCjuAjv_GeneralSpin_MPIsingle(int org_isite1, int org_ispin1, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Compute term in the grandcanonical general spin system when one of these site is in the inter proces...
double complex X_child_general_int_spin_MPIsingle(int org_isite1, int org_ispin1, int org_ispin2, int org_isite3, int org_ispin3, int org_ispin4, double complex tmp_J, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
void child_general_int_spin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
Exchange term in Spin model When only site2 is in the inter process region.
int myrank
Process ID, defined in InitializeMPI()
void child_general_int_GeneralSpin_MPIsingle(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...
void GC_child_general_int_GeneralSpin_MPIdouble(unsigned long int i_int, struct BindStruct *X, double complex *tmp_v0, double complex *tmp_v1)
General interaction term in the Spin model + GC When both site1 and site2 are in the inter process re...