20 #include "wrapperMPI.h" 29 int isite, NDimInterPE, SmallDim, SpinNum, ipivot, ishift, isiteMax, isiteMax0;
40 case HubbardNConserved:
51 if (NDimInterPE ==
nproc) {
65 if (NDimInterPE >
nproc) {
66 ilargeNproc = NDimInterPE;
68 ismallNproc = NDimInterPE/4;
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++)
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");
174 for (isite = X->
Def.
NsiteMPI; isite > 0; isite--) {
175 if (NDimInterPE ==
nproc) {
188 for (isite = X->
Def.
NsiteMPI; isite > 0; isite--) {
189 if (NDimInterPE >
nproc) {
190 ilargeNproc = NDimInterPE;
192 ismallNproc = NDimInterPE/2;
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) {
240 for (isite = X->
Def.
NsiteMPI; isite > 0; isite--) {
241 if (NDimInterPE >
nproc) {
242 ilargeNproc = NDimInterPE;
258 for (isite = X->
Def.
Nsite; isite < X->Def.NsiteMPI; isite++) {
271 fprintf(
stdoutMPI,
"Error ! Wrong model !\n");
287 if (ishift > 1) isiteMax0 = X->
Def.
NsiteMPI - isiteMax0 - 1 - ishift;
289 if (isiteMax0 < isiteMax) isiteMax = isiteMax0;
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;
316 fprintf(
stdoutMPI,
"\n\n###### MPI site separation summary ######\n\n");
317 fprintf(
stdoutMPI,
" INTRA process site\n");
319 for (isite = 0; isite < X->
Def.
Nsite; isite++) {
323 case HubbardNConserved:
327 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 4);
334 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 2);
345 fprintf(
stdoutMPI,
"\n INTER process site\n");
347 for (isite = X->
Def.
Nsite; isite < X->Def.NsiteMPI; isite++) {
351 case HubbardNConserved:
355 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 4);
362 fprintf(
stdoutMPI,
" %4d %4d\n", isite, 2);
373 fprintf(
stdoutMPI,
"\n Process element info\n");
374 fprintf(
stdoutMPI,
" Process Dimension Nup Ndown Nelec Total2Sz State\n");
376 for (iproc = 0; iproc <
nproc; iproc++) {
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");
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++) {
454 fprintf(
stdoutMPI,
"ERROR! Total dimension < 1\n");
471 case HubbardNConserved:
476 for (isite = 2 * X->
Def.
Nsite + 1; isite < 2 * X->Def.NsiteMPI; isite++)
480 for (isite = 1; isite < 2 * X->
Def.
NsiteMPI; isite++)
491 for (isite = X->
Def.
Nsite + 1; isite < X->Def.NsiteMPI; isite++)
498 for (isite = X->
Def.
Nsite + 1; isite < X->Def.NsiteMPI; isite++)
void exitMPI(int errorcode)
MPI Abortation wrapper.
struct DefineList Def
Definision of system (Hamiltonian) etc.
unsigned int NLocSpn
Number of local spins.
char * cErrNProcNumberGneralSpin
unsigned long int idim_max
The dimension of the Hilbert space of this process.
int Total2Sz
Total in this process.
int * LocSpn
[DefineList::NLocSpn] Flag (and size) of the local spin. malloc in setmem_def().
unsigned int Nup
Number of spin-up electrons in this process.
void CheckMPI_Summary(struct BindStruct *X)
Print infomation of MPI parallelization Modify Definelist::Tpow in the inter process region...
long unsigned int num_pivot
unsigned long int idim_maxMPI
The total dimension across process.
int iFlgScaLAPACK
ScaLAPACK mode ( only for FullDiag )
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
long unsigned int * OrgTpow
[2 * DefineList::NsiteMPI] malloc in setmem_def().
unsigned int Ndown
Number of spin-down electrons in this process.
int nproc
Number of processors, defined in InitializeMPI()
unsigned int Nsite
Number of sites in the INTRA process region.
struct BoostList Boost
For Boost.
long unsigned int * Tpow
[2 * DefineList::NsiteMPI] malloc in setmem_def().
int SumMPI_i(int idim)
MPI wrapper function to obtain sum of integer across processes.
unsigned int NsiteMPI
Total number of sites, differ from DefineList::Nsite.
long unsigned int ishift_nspin
int iFlgGeneralSpin
Flag for the general (Sz/=1/2) spin.
char * cErrNProcNumberHubbard
Error Message in CheckMPI.c.
long int * SiteToBit
[DefineList::NsiteMPI] Similar to DefineList::Tpow. For general spin.
unsigned int Ne
Number of electrons in this process.
int iCalcModel
Switch for model. 0:Hubbard, 1:Spin, 2:Kondo, 3:HubbardGC, 4:SpinGC, 5:KondoGC, 6:HubbardNConserved.
int flgBoost
Flag whether use CMA algorithm.
int myrank
Process ID, defined in InitializeMPI()
struct CheckList Check
Size of the Hilbert space.
unsigned long int SumMPI_li(unsigned long int idim)
MPI wrapper function to obtain sum of unsigned long integer across processes.
int Total2SzMPI
Total across processes.
FILE * stdoutMPI
File pointer to the standard output defined in InitializeMPI()