22 #include "wrapperMPI.h"    54   long unsigned int i,tmp_sdim;
    55   int NLocSpn,NCond,Nup,Ndown;
    56   long unsigned int u_tmp;
    57   long unsigned int tmp;
    58   long unsigned int Ns,comb_1,comb_2,comb_3,comb_sum, comb_up, comb_down;
    62   long unsigned int idimmax=0;
    63   long unsigned int idim=0;
    64   long unsigned int isite=0;
    67   if(
X->Def.iCalcModel ==Spin ||
X->Def.iCalcModel ==SpinGC )
    74   if(
X->Def.iFlgScaLAPACK == 0) {
    83     X->Def.NsiteMPI = 
X->Def.Nsite;
    84     X->Def.Total2SzMPI = 
X->Def.Total2Sz;
    89   li_malloc2(comb, Ns+1,Ns+1);
    92   switch(
X->Def.iCalcModel){
    96     for(i=0;i<2*
X->Def.Nsite;i++){
   103     if(
X->Def.iFlgGeneralSpin ==
FALSE){
   104       for(i=0;i<
X->Def.Nsite;i++){
   105     comb_sum= 2*comb_sum;     
   109       for(i=0; i<
X->Def.Nsite;i++){
   110     comb_sum=comb_sum*
X->Def.SiteToBit[i];
   116     comb_up= 
Binomial(Ns, 
X->Def.Nup, comb, Ns);
   117     comb_down= 
Binomial(Ns, 
X->Def.Ndown, comb, Ns);
   118     comb_sum=comb_up*comb_down;
   121   case HubbardNConserved:
   123     if(
X->Def.Ne > 
X->Def.Nsite){
   124       iMinup = 
X->Def.Ne-
X->Def.Nsite;
   125       iAllup = 
X->Def.Nsite;
   128     for(i=iMinup; i<= iAllup; i++){
   130       comb_down= 
Binomial(Ns, 
X->Def.Ne-i, comb, Ns);
   131       comb_sum +=comb_up*comb_down;
   150     Ndown   = 
X->Def.Ndown;
   151     NCond   = 
X->Def.Nsite-
X->Def.NLocSpn;
   152     NLocSpn = 
X->Def.NLocSpn;
   154     for(u_loc=0;u_loc<=
X->Def.Nup;u_loc++){
   155       comb_1     = 
Binomial(NLocSpn,u_loc,comb,Ns);
   156       comb_2     = 
Binomial(NCond,Nup-u_loc,comb,Ns);
   157       comb_3     = 
Binomial(NCond,Ndown+u_loc-NLocSpn,comb,Ns);
   158       comb_sum  += comb_1*comb_2*comb_3;
   163     NCond   = 
X->Def.Nsite-
X->Def.NLocSpn;
   164     NLocSpn = 
X->Def.NLocSpn;
   166     for(i=0;i<(2*NCond+NLocSpn);i++){
   167       comb_sum= 2*comb_sum;     
   172     if(
X->Def.iFlgGeneralSpin ==
FALSE){
   173       if(
X->Def.Nup+
X->Def.Ndown != 
X->Def.Nsite){
   174     fprintf(stderr, 
" 2Sz is incorrect.\n");
   178       comb_sum= 
Binomial(Ns, 
X->Def.Nup, comb, Ns);
   182       X->Def.Tpow[0]=idimmax;
   183       for(isite=0; isite<
X->Def.Nsite;isite++){
   184     idimmax=idimmax*
X->Def.SiteToBit[isite];
   185     X->Def.Tpow[isite+1]=idimmax;
   188 #pragma omp parallel for default(none) reduction(+:comb_sum) private(tmp_sz, isite) firstprivate(idimmax, X)    189       for(idim=0; idim<idimmax; idim++){
   191     for(isite=0; isite<
X->Def.Nsite;isite++){
   192       tmp_sz += 
GetLocal2Sz(isite+1,idim, 
X->Def.SiteToBit, 
X->Def.Tpow );    
   194     if(tmp_sz == 
X->Def.Total2Sz){
   204     i_free2(comb, Ns+1, Ns+1);
   210   X->Check.idim_max = comb_sum;
   211   switch(
X->Def.iCalcType) {
   213       switch (
X->Def.iCalcModel) {
   215         case HubbardNConserved:
   219           X->Check.max_mem = 5.5 * 
X->Check.idim_max * 8.0 / (pow(10, 9));
   223           X->Check.max_mem = 4.5 * 
X->Check.idim_max * 8.0 / (pow(10, 9));
   228       switch (
X->Def.iCalcModel) {
   230         case HubbardNConserved:
   234           X->Check.max_mem = (6 * 
X->Def.k_exct + 2) * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   238           X->Check.max_mem = (6 * 
X->Def.k_exct + 1.5) * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   243       switch (
X->Def.iCalcModel) {
   245         case HubbardNConserved:
   249           if (
X->Def.iFlgCalcSpec != CALCSPEC_NOT) {
   250             X->Check.max_mem = (2) * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   252             X->Check.max_mem = 4.5 * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   257           if (
X->Def.iFlgCalcSpec != CALCSPEC_NOT) {
   258             X->Check.max_mem = (2) * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   260             X->Check.max_mem = 3.5 * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   266       X->Check.max_mem = 
X->Check.idim_max * 8.0 * 
X->Check.idim_max * 8.0 / (pow(10, 9));
   269       X->Check.max_mem = (4 + 2 + 1) * 
X->Check.idim_max * 16.0 / (pow(10, 9));
   278   unsigned long int li_dim_max=
MaxMPI_li(
X->Check.idim_max);
   279   fprintf(
stdoutMPI, 
"  MAX DIMENSION idim_max=%ld \n",li_dim_max);
   280   double dmax_mem=
MaxMPI_d(
X->Check.max_mem);
   281   fprintf(
stdoutMPI, 
"  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n",dmax_mem);
   283     i_free2(comb, Ns+1, Ns+1);
   286   fprintf(fp,
"  MAX DIMENSION idim_max=%ld \n", li_dim_max);
   287   fprintf(fp,
"  APPROXIMATE REQUIRED MEMORY  max_mem=%lf GB \n", dmax_mem);
   300   switch(
X->Def.iCalcModel){
   303   case HubbardNConserved:
   306     while(tmp <= X->Def.Nsite){
   313     if(
X->Def.iFlgGeneralSpin==
FALSE){ 
   314       while(tmp <= X->Def.Nsite/2){
   325     i_free2(comb, Ns+1, Ns+1);
   328   X->Check.sdim=tmp_sdim;
   331     i_free2(comb, Ns+1, Ns+1);
   335   switch(
X->Def.iCalcModel){
   338   case HubbardNConserved:
   342     fprintf(fp,
"sdim=%ld =2^%d\n",
X->Check.sdim,
X->Def.Nsite);
   346     if(
X->Def.iFlgGeneralSpin==
FALSE){
   348       fprintf(fp,
"sdim=%ld =2^%d\n",
X->Check.sdim,
X->Def.Nsite/2);
   355   i_free2(comb, Ns+1, Ns+1);
   358   X->Def.Tpow[0]=u_tmp;
   359   switch(
X->Def.iCalcModel){
   362     for(i=1;i<=2*
X->Def.Nsite;i++){
   364       X->Def.Tpow[i]=u_tmp;
   365       fprintf(fp,
"%ld %ld \n",i,u_tmp);
   368   case HubbardNConserved:
   371     for(i=1;i<=2*
X->Def.Nsite-1;i++){
   373       X->Def.Tpow[i]=u_tmp;
   374       fprintf(fp,
"%ld %ld \n",i,u_tmp);
   378    if(
X->Def.iFlgGeneralSpin==
FALSE){
   379      for(i=1;i<=
X->Def.Nsite;i++){
   381        X->Def.Tpow[i]=u_tmp;
   382        fprintf(fp,
"%ld %ld \n",i,u_tmp);
   386      X->Def.Tpow[0]=u_tmp;
   387      fprintf(fp,
"%d %ld \n", 0, u_tmp);
   388       for(i=1;i<
X->Def.Nsite;i++){
   389     u_tmp=u_tmp*
X->Def.SiteToBit[i-1];
   390     X->Def.Tpow[i]=u_tmp;
   391     fprintf(fp,
"%ld %ld \n",i,u_tmp);
   396    if(
X->Def.iFlgGeneralSpin==
FALSE){
   397      for(i=1;i<=
X->Def.Nsite-1;i++){
   399        X->Def.Tpow[i]=u_tmp;
   400        fprintf(fp,
"%ld %ld \n",i,u_tmp);
   404      for(i=0;i<
X->Def.Nsite;i++){
   405        fprintf(fp,
"%ld %ld \n",i,
X->Def.Tpow[i]);
   411     i_free2(comb, Ns+1, Ns+1);
 int GetSplitBitForGeneralSpin(const int Nsite, long unsigned int *ihfbit, const long int *SiteToBit)
function of getting right, left and half bits corresponding to a original space. 
double MaxMPI_d(double dvalue)
MPI wrapper function to obtain maximum Double across processes. 
int childfopenMPI(const char *_cPathChild, const char *_cmode, FILE **_fp)
Only the root process open file in output/ directory. 
void CheckMPI_Summary(struct BindStruct *X)
Print infomation of MPI parallelization Modify Definelist::Tpow in the inter process region...
int check(struct BindStruct *X)
A program to check size of dimension for Hilbert-space. 
int CheckMPI(struct BindStruct *X)
Define the number of sites in each PE (DefineList.Nsite). Reduce the number of electrons (DefineList...
int GetLocal2Sz(const unsigned int isite, const long unsigned int org_bit, const long int *SiteToBit, const long unsigned int *Tpow)
get 2sz at a site for general spin 
long int Binomial(int n, int k, long int **comb, int Nsite)
unsigned long int MaxMPI_li(unsigned long int idim)
MPI wrapper function to obtain maximum unsigned long integer across processes. 
static unsigned long int mfint[7]
char * cErrNoModel
Error Message in diagonal calc.c. 
const char * cFileNameCheckMemory
const char * cFileNameCheckSdim
FILE * stdoutMPI
File pointer to the standard output defined in InitializeMPI()