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()