20 #include "wrapperMPI.h" 29 int isite, NDimInterPE, SmallDim, SpinNum, ipivot, ishift, isiteMax, isiteMax0;
35 X->Def.NsiteMPI =
X->Def.Nsite;
36 X->Def.Total2SzMPI =
X->Def.Total2Sz;
37 switch (
X->Def.iCalcModel) {
40 case HubbardNConserved:
50 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
51 if (NDimInterPE ==
nproc) {
64 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
65 if (NDimInterPE >
nproc) {
66 ilargeNproc = NDimInterPE;
68 ismallNproc = NDimInterPE/4;
78 switch (
X->Def.iCalcModel) {
87 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
88 SpinNum = SmallDim % 4;
94 else if (SpinNum == 2 ) {
98 else if (SpinNum == 3 ){
107 case HubbardNConserved:
113 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
114 SpinNum = SmallDim % 4;
116 if (SpinNum == 1 || SpinNum == 2 )
X->Def.Ne -= 1;
117 else if (SpinNum == 3 )
X->Def.Ne -= 2;
129 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++)
130 if (
X->Def.LocSpn[isite] !=
ITINERANT)
X->Def.NLocSpn -= 1;
132 if (
X->Def.iCalcModel == Kondo) {
134 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
135 SpinNum = SmallDim % 4;
142 else if (SpinNum == 2 ) {
146 else if (SpinNum == 3 ) {
153 fprintf(
stdoutMPI,
"\n Stop because local spin in the inter process region\n");
168 if (
X->Def.iFlgGeneralSpin ==
FALSE) {
174 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
175 if (NDimInterPE ==
nproc) {
176 X->Def.Nsite = isite;
188 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
189 if (NDimInterPE >
nproc) {
190 ilargeNproc = NDimInterPE;
192 ismallNproc = NDimInterPE/2;
201 if (
X->Def.iCalcModel == Spin) {
206 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
207 SpinNum = SmallDim % 2;
226 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
227 if (NDimInterPE ==
nproc) {
228 X->Def.Nsite = isite;
231 NDimInterPE *=
X->Def.SiteToBit[isite - 1];
240 for (isite =
X->Def.NsiteMPI; isite > 0; isite--) {
241 if (NDimInterPE >
nproc) {
242 ilargeNproc = NDimInterPE;
244 ismallNproc = NDimInterPE/
X->Def.SiteToBit[isite - 2];
247 NDimInterPE *=
X->Def.SiteToBit[isite - 1];
253 if (
X->Def.iCalcModel == Spin) {
254 X->Def.Total2SzMPI =
X->Def.Total2Sz;
258 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
259 SpinNum = SmallDim %
X->Def.SiteToBit[isite];
260 SmallDim /=
X->Def.SiteToBit[isite];
262 X->Def.Total2Sz +=
X->Def.SiteToBit[isite] - 1 - 2*SpinNum;
271 fprintf(
stdoutMPI,
"Error ! Wrong model !\n");
278 if (
X->Boost.flgBoost == 1) {
279 isiteMax =
X->Boost.W0;
281 for (ipivot = 0; ipivot <
X->Boost.num_pivot; ipivot++) {
282 isiteMax0 =
X->Boost.list_6spin_star[ipivot][1]
283 +
X->Boost.list_6spin_star[ipivot][2]
284 +
X->Boost.list_6spin_star[ipivot][3]
285 +
X->Boost.list_6spin_star[ipivot][4]
286 +
X->Boost.list_6spin_star[ipivot][5];
287 if (ishift > 1) isiteMax0 =
X->Def.NsiteMPI - isiteMax0 - 1 - ishift;
288 else isiteMax0 =
X->Def.NsiteMPI - isiteMax0 - 2;
289 if (isiteMax0 < isiteMax) isiteMax = isiteMax0;
290 if (
X->Boost.list_6spin_star[ipivot][6] == 1) ishift +=
X->Boost.ishift_nspin;
294 for (isite = 0; isite < isiteMax; isite++) NDimInterPE *= 2;
296 if (NDimInterPE <
nproc) {
297 fprintf(stderr,
"\n Error ! in ReadDefFileIdxPara.\n");
298 fprintf(stderr,
"Too many MPI processes ! It should be <= %d. \n\n", NDimInterPE);
312 int isite, iproc, SmallDim, SpinNum, Nelec;
313 unsigned long int idimMPI;
315 fprintf(
stdoutMPI,
"\n\n###### MPI site separation summary ######\n\n");
316 fprintf(
stdoutMPI,
" INTRA process site\n");
318 for (isite = 0; isite <
X->Def.Nsite; isite++) {
319 switch (
X->Def.iCalcModel) {
322 case HubbardNConserved:
326 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 4);
332 if (
X->Def.iFlgGeneralSpin ==
FALSE) {
333 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 2);
336 fprintf(
stdoutMPI,
" %4d %4ld\n", isite,
X->Def.SiteToBit[isite]);
344 fprintf(
stdoutMPI,
"\n INTER process site\n");
346 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
347 switch (
X->Def.iCalcModel) {
350 case HubbardNConserved:
354 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 4);
360 if (
X->Def.iFlgGeneralSpin ==
FALSE) {
361 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 2);
364 fprintf(
stdoutMPI,
" %4d %4ld\n", isite,
X->Def.SiteToBit[isite]);
372 fprintf(
stdoutMPI,
"\n Process element info\n");
373 fprintf(
stdoutMPI,
" Process Dimension Nup Ndown Nelec Total2Sz State\n");
375 for (iproc = 0; iproc <
nproc; iproc++) {
379 if (
myrank == iproc) idimMPI =
X->Check.idim_max;
383 if (
myrank == iproc) Nelec =
X->Def.Nup;
387 if (
myrank == iproc) Nelec =
X->Def.Ndown;
393 if (
X->Def.iCalcModel == Spin ||
X->Def.iCalcModel == SpinGC) Nelec +=
X->Def.Ndown;
399 if (
myrank == iproc) Nelec =
X->Def.Total2Sz;
406 switch (
X->Def.iCalcModel) {
409 case HubbardNConserved:
414 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
415 SpinNum = SmallDim % 4;
417 if (SpinNum == 0) fprintf(
stdoutMPI,
"00");
418 else if (SpinNum == 1) fprintf(
stdoutMPI,
"01");
419 else if (SpinNum == 2) fprintf(
stdoutMPI,
"10");
420 else if (SpinNum == 3) fprintf(
stdoutMPI,
"11");
429 if (
X->Def.iFlgGeneralSpin ==
FALSE) {
430 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
431 SpinNum = SmallDim % 2;
438 for (isite =
X->Def.Nsite; isite < X->Def.NsiteMPI; isite++) {
439 SpinNum = SmallDim % (int)
X->Def.SiteToBit[isite];
440 SmallDim /=
X->Def.SiteToBit[isite];
451 X->Check.idim_maxMPI =
SumMPI_li(
X->Check.idim_max);
452 fprintf(
stdoutMPI,
"\n Total dimension : %ld\n\n",
X->Check.idim_maxMPI);
453 if (
X->Check.idim_maxMPI < 1) {
454 fprintf(
stdoutMPI,
"ERROR! Total dimension < 1\n");
464 switch (
X->Def.iCalcModel) {
467 case HubbardNConserved:
471 X->Def.Tpow[2 *
X->Def.Nsite] = 1;
472 for (isite = 2 *
X->Def.Nsite + 1; isite < 2 * X->Def.NsiteMPI; isite++)
473 X->Def.Tpow[isite] =
X->Def.Tpow[isite - 1] * 2;
476 for (isite = 1; isite < 2 *
X->Def.NsiteMPI; isite++)
477 X->Def.OrgTpow[isite] =
X->Def.OrgTpow[isite-1]*2;
484 if (
X->Def.iFlgGeneralSpin ==
FALSE) {
486 X->Def.Tpow[
X->Def.Nsite] = 1;
487 for (isite =
X->Def.Nsite + 1; isite < X->Def.NsiteMPI; isite++)
488 X->Def.Tpow[isite] =
X->Def.Tpow[isite - 1] * 2;
493 X->Def.Tpow[
X->Def.Nsite] = 1;
494 for (isite =
X->Def.Nsite + 1; isite < X->Def.NsiteMPI; isite++)
495 X->Def.Tpow[isite] =
X->Def.Tpow[isite - 1] *
X->Def.SiteToBit[isite - 1];
void exitMPI(int errorcode)
MPI Abortation wrapper.
char * cErrNProcNumberGneralSpin
void CheckMPI_Summary(struct BindStruct *X)
Print infomation of MPI parallelization Modify Definelist::Tpow in the inter process region...
char * cErrNProcNumberSet
int CheckMPI(struct BindStruct *X)
Define the number of sites in each PE (DefineList.Nsite). Reduce the number of electrons (DefineList...
char * cErrNProcNumberSpin
int nproc
Number of processors, defined in InitializeMPI()
int SumMPI_i(int idim)
MPI wrapper function to obtain sum of integer across processes.
char * cErrNProcNumberHubbard
Error Message in CheckMPI.c.
int myrank
Process ID, defined in InitializeMPI()
unsigned long int SumMPI_li(unsigned long int idim)
MPI wrapper function to obtain sum of unsigned long integer across processes.
FILE * stdoutMPI
File pointer to the standard output defined in InitializeMPI()