21 #include "wrapperMPI.h"    41         long unsigned int ihfbit,
    43         long unsigned int *list_1_,
    44         long unsigned int *list_2_1_,
    45         long unsigned int *list_2_2_,
    46         long unsigned int *list_jb_
    65  long unsigned int *list_1_,
    66  long unsigned int *list_2_1_,
    67  long unsigned int *list_2_2_
    72   long unsigned int *HilbertNumToSz;
    73   long unsigned int i,icnt; 
    74   long unsigned int ib,jb;
    77   long unsigned int div;
    78   long unsigned int num_up,num_down;
    79   long unsigned int irght,ilft,ihfbit;
    82   unsigned int  all_up,all_down,tmp_res,num_threads;
    83   long unsigned int tmp_1,tmp_2,tmp_3;
    88   unsigned int N_all_up, N_all_down;
    90   long unsigned int num_loc, div_down;
    91   unsigned int num_loc_up;
    96   long unsigned int i_max=0;
    98   long unsigned int div_up;
   101   long int *list_2_1_Sz;
   102   long int *list_2_2_Sz;
   103   if(
X->Def.iFlgGeneralSpin==
TRUE){
   104     li_malloc1(list_2_1_Sz, 
X->Check.sdim+2);
   105     li_malloc1(list_2_2_Sz,(
X->Def.Tpow[
X->Def.Nsite-1]*
X->Def.SiteToBit[
X->Def.Nsite-1]/
X->Check.sdim)+2);
   106     for(j=0; j<
X->Check.sdim+2;j++){
   109     for(j=0; j< (
X->Def.Tpow[
X->Def.Nsite-1]*
X->Def.SiteToBit[
X->Def.Nsite-1]/
X->Check.sdim)+2; j++){
   115   long unsigned int *list_jb;
   116   lui_malloc1(list_jb,
X->Large.SizeOflistjb);
   117   for(i=0; i<
X->Large.SizeOflistjb; i++){
   123   long unsigned int tmp_i,tmp_j,tmp_pow,max_tmp_i;
   124   long unsigned int ia,ja;
   125   long unsigned int ibpatn=0;
   128   int iSpnup, iMinup,iAllup;
   135   if(
X->Check.idim_max!=0){
   136   switch(
X->Def.iCalcModel){
   138   case HubbardNConserved:
   155     if(
X->Def.iFlgGeneralSpin==
FALSE){
   161           idim *= 
X->Def.SiteToBit[j];
   166   li_malloc2(comb, 
X->Def.Nsite+1,
X->Def.Nsite+1);
   167   i_max=
X->Check.idim_max;
   169   switch(
X->Def.iCalcModel){
   170   case HubbardNConserved:
   175     if(
X->Def.iFlgGeneralSpin==
FALSE){
   179       X->Large.irght=irght;
   181       X->Large.ihfbit=ihfbit;
   185       ihfbit=
X->Check.sdim;
   197     if(
Read_sz(
X, irght, ilft, ihfbit, &i_max)!=0){
   204     num_threads  = omp_get_max_threads();
   209     fprintf(fp, 
"num_threads==%d\n",num_threads);
   216     switch(
X->Def.iCalcModel){
   218       icnt = 
X->Def.Tpow[2*
X->Def.Nsite-1]*2+0;
   222       if(
X->Def.iFlgGeneralSpin==
FALSE){
   223         icnt = 
X->Def.Tpow[
X->Def.Nsite-1]*2+0;
   226         icnt = 
X->Def.Tpow[
X->Def.Nsite-1]*
X->Def.SiteToBit[
X->Def.Nsite-1];
   234       for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){ 
   240       for(ib=0;ib<
X->Check.sdim;ib++){
   244         for(j=(
X->Def.Nsite+1)/2; j< X->Def.Nsite ;j++){
   245           div_up    = i & 
X->Def.Tpow[2*j];
   246           div_up    = div_up/
X->Def.Tpow[2*j];
   247           div_down  = i & 
X->Def.Tpow[2*j+1];
   248           div_down  = div_down/
X->Def.Tpow[2*j+1];
   250             if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
   251               icheck_loc= icheck_loc;
   254               icheck_loc   = icheck_loc*(div_up^div_down);
   259           if(
X->Def.Nsite%2==1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT){
   260             jb +=
X->Def.Tpow[
X->Def.Nsite-1-(
X->Def.NLocSpn-num_loc)];
   262             jb +=
X->Def.Tpow[
X->Def.Nsite-(
X->Def.NLocSpn-num_loc)];
   268 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N2, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)   269       for(ib=0;ib<
X->Check.sdim;ib++){
   275       hacker = 
X->Def.read_hacker;
   279         for(ib=0;ib<
X->Check.sdim;ib++){ 
   284           for(j=0;j<=N2-2;j+=2){ 
   285             div=i & 
X->Def.Tpow[j];
   286             div=div/
X->Def.Tpow[j];
   290           for(j=1;j<=N2-1;j+=2){ 
   291             div=i & 
X->Def.Tpow[j];
   292             div=div/
X->Def.Tpow[j];
   296           tmp_res  = 
X->Def.Nsite%2; 
   297           all_up   = (
X->Def.Nsite+tmp_res)/2;
   298           all_down = (
X->Def.Nsite-tmp_res)/2;
   300           tmp_1 = 
Binomial(all_up,
X->Def.Nup-num_up,comb,all_up);
   301           tmp_2 = 
Binomial(all_down,
X->Def.Ndown-num_down,comb,all_down);
   310         for(ib=0;ib<
X->Check.sdim;ib++){
   311           icnt+=
child_omp_sz(ib,ihfbit, 
X, list_1_, list_2_1_, list_2_2_, list_jb);
   318         for(ib=0;ib<
X->Check.sdim;ib++){
   323           for(j=0;j<=N2-2;j+=2){
   324             div=i & 
X->Def.Tpow[j];
   325             div=div/
X->Def.Tpow[j];
   329           for(j=1;j<=N2-1;j+=2){
   330             div=i & 
X->Def.Tpow[j];
   331             div=div/
X->Def.Tpow[j];
   335           tmp_res  = 
X->Def.Nsite%2; 
   336           all_up   = (
X->Def.Nsite+tmp_res)/2;
   337           all_down = (
X->Def.Nsite-tmp_res)/2;
   339           tmp_1 = 
Binomial(all_up,
X->Def.Nup-num_up,comb,all_up);
   340           tmp_2 = 
Binomial(all_down,
X->Def.Ndown-num_down,comb,all_down);
   349 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)   350         for(ib=0;ib<
X->Check.sdim;ib++){
   356         fprintf(stderr, 
"Error: CalcHS in ModPara file must be 0 or 1 for Hubbard model.");
   360     case HubbardNConserved:
   361       hacker = 
X->Def.read_hacker;
   368         if(
X->Def.Ne > 
X->Def.Nsite){
   369           iMinup = 
X->Def.Ne-
X->Def.Nsite;
   370           iAllup = 
X->Def.Nsite;
   372         for(ib=0;ib<
X->Check.sdim;ib++){
   376           for(j=0;j<=N2-2;j+=2){
   377             div=i & 
X->Def.Tpow[j];
   378             div=div/
X->Def.Tpow[j];
   382           for(j=1;j<=N2-1;j+=2){
   383             div=i & 
X->Def.Tpow[j];
   384             div=div/
X->Def.Tpow[j];
   387           tmp_res  = 
X->Def.Nsite%2; 
   388           all_up   = (
X->Def.Nsite+tmp_res)/2;
   389           all_down = (
X->Def.Nsite-tmp_res)/2;
   391           for(iSpnup=iMinup; iSpnup<= iAllup; iSpnup++){
   392             tmp_1 = 
Binomial(all_up, iSpnup-num_up,comb,all_up);
   393             tmp_2 = 
Binomial(all_down, 
X->Def.Ne-iSpnup-num_down,comb,all_down);
   402 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N2, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)    403         for(ib=0;ib<
X->Check.sdim;ib++){
   404           icnt+=
child_omp_sz(ib,ihfbit, 
X,list_1_, list_2_1_, list_2_2_, list_jb);
   414         if(
X->Def.Ne > 
X->Def.Nsite){
   415           iMinup = 
X->Def.Ne-
X->Def.Nsite;
   416           iAllup = 
X->Def.Nsite;
   418         for(ib=0;ib<
X->Check.sdim;ib++){
   422           for(j=0;j<=N2-2;j+=2){
   423             div=i & 
X->Def.Tpow[j];
   424             div=div/
X->Def.Tpow[j];
   428           for(j=1;j<=N2-1;j+=2){
   429             div=i & 
X->Def.Tpow[j];
   430             div=div/
X->Def.Tpow[j];
   433           tmp_res  = 
X->Def.Nsite%2; 
   434           all_up   = (
X->Def.Nsite+tmp_res)/2;
   435           all_down = (
X->Def.Nsite-tmp_res)/2;
   437           for(iSpnup=iMinup; iSpnup<= iAllup; iSpnup++){
   438             tmp_1 = 
Binomial(all_up, iSpnup-num_up,comb,all_up);
   439             tmp_2 = 
Binomial(all_down, 
X->Def.Ne-iSpnup-num_down,comb,all_down);
   448 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N2, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)    449         for(ib=0;ib<
X->Check.sdim;ib++){
   456         fprintf(stderr, 
"Error: CalcHS in ModPara file must be 0 or 1 for Hubbard model.");
   462       N_all_up   = 
X->Def.Nup;
   463       N_all_down = 
X->Def.Ndown;
   468       for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){
   474       for(ib=0;ib<
X->Check.sdim;ib++){ 
   481         for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){
   482           div_up    = i & 
X->Def.Tpow[2*j];
   483           div_up    = div_up/
X->Def.Tpow[2*j];
   484           div_down  = i & 
X->Def.Tpow[2*j+1];
   485           div_down  = div_down/
X->Def.Tpow[2*j+1];
   488             num_down += div_down;  
   491             num_down += div_down;
   492             if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){ 
   493               icheck_loc= icheck_loc;
   494               ihfSpinDown=div_down;
   499               icheck_loc   = icheck_loc*(div_up^div_down);
   505           tmp_res  = 
X->Def.Nsite%2; 
   506           all_loc =  
X->Def.NLocSpn-num_loc; 
   507           all_up   = (
X->Def.Nsite+tmp_res)/2-all_loc;
   508           all_down = (
X->Def.Nsite-tmp_res)/2-all_loc;
   509           if(
X->Def.Nsite%2==1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT){
   510             all_up   = (
X->Def.Nsite)/2-all_loc;
   511             all_down = (
X->Def.Nsite)/2-all_loc;
   514           for(num_loc_up=0; num_loc_up <= all_loc; num_loc_up++){
   515             tmp_1 = 
Binomial(all_loc, num_loc_up, comb, all_loc);
   516             if( 
X->Def.Nsite%2==1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT){
   518                 tmp_2 = 
Binomial(all_up, 
X->Def.Nup-num_up-num_loc_up, comb, all_up);
   519                 tmp_3 = 
Binomial(all_down, 
X->Def.Ndown-num_down-(all_loc-num_loc_up), comb, all_down);
   522                 tmp_2 = 
Binomial(all_up, 
X->Def.Nup-num_up-num_loc_up, comb, all_up);
   523                 tmp_3 = 
Binomial(all_down, 
X->Def.Ndown-num_down-(all_loc-num_loc_up), comb, all_down);
   527               tmp_2 = 
Binomial(all_up, 
X->Def.Nup-num_up-num_loc_up, comb, all_up);
   528               tmp_3 = 
Binomial(all_down, 
X->Def.Ndown-num_down-(all_loc-num_loc_up), comb, all_down);
   530             jb   += tmp_1*tmp_2*tmp_3;
   539       hacker = 
X->Def.read_hacker;
   542 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N2, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)   543         for(ib=0;ib<
X->Check.sdim;ib++){
   548 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N2, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)   549         for(ib=0;ib<
X->Check.sdim;ib++){
   557       if(
X->Def.iFlgGeneralSpin==
FALSE){
   558         hacker = 
X->Def.read_hacker;
   567           while(tmp_pow < X->Def.Tpow[
X->Def.Ne]){
   572           if(
X->Def.Nsite%2==0){
   573             max_tmp_i = 
X->Check.sdim*
X->Check.sdim;
   575             max_tmp_i = 
X->Check.sdim*
X->Check.sdim*2-1;
   577           while(tmp_i<max_tmp_i){
   591             list_2_1_[ia] = ja+1;
   592             list_2_2_[ib] = jb+1;
   593             tmp_j = 
snoob(tmp_i);
   599         }
else if(hacker  ==  1){
   601           for(ib=0;ib<
X->Check.sdim;ib++){
   606               div_up = i & 
X->Def.Tpow[j];
   607               div_up = div_up/
X->Def.Tpow[j];
   610             all_up   = (
X->Def.Nsite+1)/2;
   611             tmp_1 = 
Binomial(all_up,
X->Def.Ne-num_up,comb,all_up);
   619 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N, X, list_1_, list_2_1_, list_2_2_, list_jb)   620           for(ib=0;ib<
X->Check.sdim;ib++){
   625         }
else if(hacker  ==  0){
   627           for(ib=0;ib<
X->Check.sdim;ib++){
   632               div_up = i & 
X->Def.Tpow[j];
   633               div_up = div_up/
X->Def.Tpow[j];
   636             all_up   = (
X->Def.Nsite+1)/2;
   637             tmp_1 = 
Binomial(all_up,
X->Def.Ne-num_up,comb,all_up);
   645 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ihfbit, N, X) shared(list_1_, list_2_1_, list_2_2_, list_jb)   646           for(ib=0;ib<
X->Check.sdim;ib++){
   651           fprintf(stderr, 
"Error: CalcHS in ModPara file must be -1 or 0 or 1 for Spin model.");
   655         unsigned int Max2Sz=0;
   656         unsigned int irghtsite=1;
   657         long unsigned int itmpSize=1;
   659         for(j=0; j<
X->Def.Nsite; j++){
   660           itmpSize *= 
X->Def.SiteToBit[j];
   661           if(itmpSize==ihfbit){
   666         for(j=0; j<
X->Def.Nsite; j++){
   667           Max2Sz += 
X->Def.LocSpn[j];
   670         lui_malloc1(HilbertNumToSz, 2*Max2Sz+1);
   671         for(ib=0; ib<2*Max2Sz+1; ib++){
   672           HilbertNumToSz[ib]=0;
   675         for(ib =0; ib<ihfbit; ib++){
   677           for(j=1; j<= irghtsite; j++){
   680           list_2_1_Sz[ib]=i2Sz;
   681           HilbertNumToSz[i2Sz+Max2Sz]++;
   684         long unsigned int ilftdim=(
X->Def.Tpow[
X->Def.Nsite-1]*
X->Def.SiteToBit[
X->Def.Nsite-1])/ihfbit;
   685         for(ib=0;ib<ilftdim;ib++){
   688           for(j=1;j<=(N-irghtsite); j++){
   691           list_2_2_Sz[ib]=i2Sz;
   692           if((
X->Def.Total2Sz- i2Sz +(
int)Max2Sz)>=0 && (
X->Def.Total2Sz- i2Sz) <= (
int)Max2Sz){
   693             jb += HilbertNumToSz[
X->Def.Total2Sz- i2Sz +Max2Sz];
   701 #pragma omp parallel for default(none) reduction(+:icnt) private(ib) firstprivate(ilftdim, ihfbit,  X)  shared(list_1_, list_2_1_, list_2_2_, list_2_1_Sz, list_2_2_Sz,list_jb)   702         for(ib=0;ib<ilftdim; ib++){
   706         i_free1(HilbertNumToSz, 2*Max2Sz+1);    
   721   if(
X->Def.iFlgCalcSpec == CALCSPEC_NOT){
   722     if(
X->Def.iCalcModel==HubbardNConserved){
   723       X->Def.iCalcModel=Hubbard;
   729   if(i_max!=
X->Check.idim_max){
   730     fprintf(stderr, 
"%s", 
cErrSz);
   741   i_free2(comb, 
X->Def.Nsite+1,
X->Def.Nsite+1);
   746     if(
X->Def.iFlgGeneralSpin==
TRUE){
   767 long int Binomial(
int n,
int k,
long int **comb,
int Nsite){
   774   else if(n<0 || k<0 || n<k){
   778   for(tmp_i=0;tmp_i<=Nsite;tmp_i++){
   779     for(tmp_j=0;tmp_j<=Nsite;tmp_j++){
   780       comb[tmp_i][tmp_j] = 0;
   787   for(tmp_i=2;tmp_i<=n;tmp_i++){
   788     for(tmp_j=0;tmp_j<=tmp_i;tmp_j++){
   790         comb[tmp_i][tmp_j] = 1;
   791       }
else if(tmp_j==tmp_i){
   792         comb[tmp_i][tmp_j] = 1;
   794         comb[tmp_i][tmp_j] = comb[tmp_i-1][tmp_j-1]+comb[tmp_i-1][tmp_j];
   817                  long unsigned int ib,    
   818                  long unsigned int ihfbit, 
   820                  long unsigned int *list_1_, 
   821                  long unsigned int *list_2_1_,
   822                  long unsigned int *list_2_2_,
   823                  long unsigned int *list_jb_ 
   826   long unsigned int i,j; 
   827   long unsigned int ia,ja,jb;
   828   long unsigned int div_down, div_up;
   829   long unsigned int num_up,num_down;
   830   long unsigned int tmp_num_up,tmp_num_down;
   837   for(j=0;j< 
X->Def.Nsite ;j++){
   838     div_up    = i & 
X->Def.Tpow[2*j];
   839     div_up    = div_up/
X->Def.Tpow[2*j];
   840     div_down  = i & 
X->Def.Tpow[2*j+1];
   841     div_down  = div_down/
X->Def.Tpow[2*j+1];
   843     num_down += div_down;
   848   tmp_num_down = num_down;
   850   if(
X->Def.iCalcModel==Hubbard){
   851     for(ia=0;ia<
X->Check.sdim;ia++){
   854       num_down =  tmp_num_down;
   856       for(j=0;j<
X->Def.Nsite;j++){
   857         div_up    = i & 
X->Def.Tpow[2*j];
   858         div_up    = div_up/
X->Def.Tpow[2*j];
   859         div_down  = i & 
X->Def.Tpow[2*j+1];
   860         div_down  = div_down/
X->Def.Tpow[2*j+1];
   862         num_down += div_down;
   864       if(num_up == 
X->Def.Nup && num_down == 
X->Def.Ndown){
   865         list_1_[ja+jb]=ia+ib*ihfbit;
   872   else if(
X->Def.iCalcModel==HubbardNConserved){
   873     for(ia=0;ia<
X->Check.sdim;ia++){
   876       num_down =  tmp_num_down;
   878       for(j=0;j<
X->Def.Nsite;j++){
   879         div_up    = i & 
X->Def.Tpow[2*j];
   880         div_up    = div_up/
X->Def.Tpow[2*j];
   881         div_down  = i & 
X->Def.Tpow[2*j+1];
   882         div_down  = div_down/
X->Def.Tpow[2*j+1];
   884         num_down += div_down;
   886       if( (num_up+num_down) == 
X->Def.Ne){
   887         list_1_[ja+jb]=ia+ib*ihfbit;
   913                         long unsigned int ihfbit,
   915                         long unsigned int *list_1_,
   916                         long unsigned int *list_2_1_,
   917                         long unsigned int *list_2_2_,
   918                         long unsigned int *list_jb_
   921   long unsigned int i,j; 
   922   long unsigned int ia,ja,jb;
   923   long unsigned int div_down, div_up;
   924   long unsigned int num_up,num_down;
   925   long unsigned int tmp_num_up,tmp_num_down;
   932   for(j=0;j< 
X->Def.Nsite ;j++){
   933     div_up    = i & 
X->Def.Tpow[2*j];
   934     div_up    = div_up/
X->Def.Tpow[2*j];
   935     div_down  = i & 
X->Def.Tpow[2*j+1];
   936     div_down  = div_down/
X->Def.Tpow[2*j+1];
   938     num_down += div_down;
   943   tmp_num_down = num_down;
   945   if(
X->Def.iCalcModel==Hubbard){
   946     if(tmp_num_up <= X->Def.Nup && tmp_num_down <= X->Def.Ndown){ 
   947       ia = 
X->Def.Tpow[
X->Def.Nup+
X->Def.Ndown-tmp_num_up-tmp_num_down]-1;
   948       if(ia < X->Check.sdim){
   950         num_down =  tmp_num_down;
   951         for(j=0;j<
X->Def.Nsite;j++){
   952           div_up    = ia & 
X->Def.Tpow[2*j];
   953           div_up    = div_up/
X->Def.Tpow[2*j];
   954           div_down  = ia & 
X->Def.Tpow[2*j+1];
   955           div_down  = div_down/
X->Def.Tpow[2*j+1];
   957           num_down += div_down;
   959         if(num_up == 
X->Def.Nup && num_down == 
X->Def.Ndown){
   960           list_1_[ja+jb]=ia+ib*ihfbit;
   967           while(ia < X->Check.sdim){
   969             num_down =  tmp_num_down;
   970             for(j=0;j<
X->Def.Nsite;j++){
   971               div_up    = ia & 
X->Def.Tpow[2*j];
   972               div_up    = div_up/
X->Def.Tpow[2*j];
   973               div_down  = ia & 
X->Def.Tpow[2*j+1];
   974               div_down  = div_down/
X->Def.Tpow[2*j+1];
   976               num_down += div_down;
   978             if(num_up == 
X->Def.Nup && num_down == 
X->Def.Ndown){
   979               list_1_[ja+jb]=ia+ib*ihfbit;
   990   else if(
X->Def.iCalcModel==HubbardNConserved){
   991     if(tmp_num_up+tmp_num_down <= X->Def.Ne){ 
   992       ia = 
X->Def.Tpow[
X->Def.Ne-tmp_num_up-tmp_num_down]-1;
   993       if(ia < X->Check.sdim){
   994         list_1_[ja+jb]=ia+ib*ihfbit;
  1000           while(ia < X->Check.sdim){
  1001             list_1_[ja+jb]=ia+ib*ihfbit;
  1030                        long unsigned int ib,        
  1031                        long unsigned int ihfbit,    
  1033                        long unsigned int *list_1_,  
  1034                        long unsigned int *list_2_1_,
  1035                        long unsigned int *list_2_2_,
  1036                        long unsigned int *list_jb_  
  1039   long unsigned int i,j; 
  1040   long unsigned int ia,ja,jb;
  1041   long unsigned int div_down, div_up;
  1042   long unsigned int num_up,num_down;
  1043   long unsigned int tmp_num_up,tmp_num_down;
  1052   for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){
  1053     div_up    = i & 
X->Def.Tpow[2*j];
  1054     div_up    = div_up/
X->Def.Tpow[2*j];
  1055     div_down  = i & 
X->Def.Tpow[2*j+1];
  1056     div_down  = div_down/
X->Def.Tpow[2*j+1];
  1060       num_down += div_down;  
  1063       num_down += div_down;
  1064       if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1065         icheck_loc= icheck_loc;
  1068         icheck_loc   = icheck_loc*(div_up^div_down);
  1074   tmp_num_up   = num_up;
  1075   tmp_num_down = num_down;
  1077     for(ia=0;ia<
X->Check.sdim;ia++){
  1079       num_up =  tmp_num_up;
  1080       num_down =  tmp_num_down;
  1082       for(j=0;j<(
X->Def.Nsite+1)/2;j++){
  1083         div_up    = i & 
X->Def.Tpow[2*j];
  1084         div_up    = div_up/
X->Def.Tpow[2*j];
  1085         div_down  = i & 
X->Def.Tpow[2*j+1];
  1086         div_down  = div_down/
X->Def.Tpow[2*j+1];
  1090           num_down += div_down;  
  1093           num_down += div_down;  
  1094           if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1095             icheck_loc= icheck_loc;
  1098             icheck_loc   = icheck_loc*(div_up^div_down);
  1103       if(icheck_loc == 1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT && 
X->Def.Nsite%2==1){
  1104         div_up    = ia & 
X->Def.Tpow[
X->Def.Nsite-1];
  1105         div_up    = div_up/
X->Def.Tpow[
X->Def.Nsite-1];
  1106         div_down  = (ib*ihfbit) & 
X->Def.Tpow[
X->Def.Nsite];
  1107         div_down  = div_down/
X->Def.Tpow[
X->Def.Nsite];
  1108         icheck_loc= icheck_loc*(div_up^div_down);
  1111       if(num_up == 
X->Def.Nup && num_down == 
X->Def.Ndown && icheck_loc==1){
  1112         list_1_[ja+jb]=ia+ib*ihfbit;
  1142                        long unsigned int ib,
  1143                        long unsigned int ihfbit,
  1145                        long unsigned int *list_1_,
  1146                        long unsigned int *list_2_1_,
  1147                        long unsigned int *list_2_2_,
  1148                        long unsigned int *list_jb_
  1151   long unsigned int i,j; 
  1152   long unsigned int ia,ja,jb;
  1153   long unsigned int div_down, div_up;
  1154   long unsigned int num_up,num_down;
  1155   long unsigned int tmp_num_up,tmp_num_down;
  1164   for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){
  1165     div_up    = i & 
X->Def.Tpow[2*j];
  1166     div_up    = div_up/
X->Def.Tpow[2*j];
  1167     div_down  = i & 
X->Def.Tpow[2*j+1];
  1168     div_down  = div_down/
X->Def.Tpow[2*j+1];
  1172       num_down += div_down;  
  1175       num_down += div_down;
  1176       if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1177         icheck_loc= icheck_loc;
  1180         icheck_loc   = icheck_loc*(div_up^div_down);
  1186   tmp_num_up   = num_up;
  1187   tmp_num_down = num_down;
  1190     ia = 
X->Def.Tpow[
X->Def.Nup+
X->Def.Ndown-tmp_num_up-tmp_num_down]-1;
  1194     while(ia < X->Check.sdim && ia!=0){
  1198         num_up   =  tmp_num_up;
  1199         num_down =  tmp_num_down;
  1201         for(j=0;j<(
X->Def.Nsite+1)/2;j++){
  1202           div_up    = i & 
X->Def.Tpow[2*j];
  1203           div_up    = div_up/
X->Def.Tpow[2*j];
  1204           div_down  = i & 
X->Def.Tpow[2*j+1];
  1205           div_down  = div_down/
X->Def.Tpow[2*j+1];
  1209             num_down += div_down;  
  1212             num_down += div_down;  
  1213             if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1214               icheck_loc= icheck_loc;
  1217               icheck_loc   = icheck_loc*(div_up^div_down);
  1222         if(icheck_loc == 1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT && 
X->Def.Nsite%2==1){
  1223           div_up    = ia & 
X->Def.Tpow[
X->Def.Nsite-1];
  1224           div_up    = div_up/
X->Def.Tpow[
X->Def.Nsite-1];
  1225           div_down  = (ib*ihfbit) & 
X->Def.Tpow[
X->Def.Nsite];
  1226           div_down  = div_down/
X->Def.Tpow[
X->Def.Nsite];
  1227           icheck_loc= icheck_loc*(div_up^div_down);
  1230         if(num_up == 
X->Def.Nup && num_down == 
X->Def.Ndown && icheck_loc==1){
  1232           list_1_[ja+jb]=ia+ib*ihfbit;
  1262                          long unsigned int ib,  
  1263                          long unsigned int ihfbit,
  1265                          long unsigned int *list_1_, 
  1266                          long unsigned int *list_2_1_,
  1267                          long unsigned int *list_2_2_,
  1268                          long unsigned int *list_jb_
  1271   long unsigned int i,j; 
  1272   long unsigned int ia,ja,jb;
  1273   long unsigned int div_down, div_up;
  1279   for(j=
X->Def.Nsite/2; j< X->Def.Nsite ;j++){
  1280     div_up    = i & 
X->Def.Tpow[2*j];
  1281     div_up    = div_up/
X->Def.Tpow[2*j];
  1282     div_down  = i & 
X->Def.Tpow[2*j+1];
  1283     div_down  = div_down/
X->Def.Tpow[2*j+1];
  1285       if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1286         icheck_loc= icheck_loc;
  1289         icheck_loc   = icheck_loc*(div_up^div_down);
  1296     for(ia=0;ia<
X->Check.sdim;ia++){
  1299       for(j=0;j<(
X->Def.Nsite+1)/2;j++){
  1300         div_up    = i & 
X->Def.Tpow[2*j];
  1301         div_up    = div_up/
X->Def.Tpow[2*j];
  1302         div_down  = i & 
X->Def.Tpow[2*j+1];
  1303         div_down  = div_down/
X->Def.Tpow[2*j+1];    
  1305           if(
X->Def.Nsite%2==1 && j==(
X->Def.Nsite/2)){
  1306             icheck_loc= icheck_loc;
  1309             icheck_loc   = icheck_loc*(div_up^div_down);
  1314       if(icheck_loc == 1 && 
X->Def.LocSpn[
X->Def.Nsite/2] != 
ITINERANT && 
X->Def.Nsite%2==1){
  1315         div_up    = ia & 
X->Def.Tpow[
X->Def.Nsite-1];
  1316         div_up    = div_up/
X->Def.Tpow[
X->Def.Nsite-1];
  1317         div_down  = (ib*ihfbit) & 
X->Def.Tpow[
X->Def.Nsite];
  1318         div_down  = div_down/
X->Def.Tpow[
X->Def.Nsite];
  1319         icheck_loc= icheck_loc*(div_up^div_down);
  1323         list_1_[ja+jb]=ia+ib*ihfbit;
  1351                       long unsigned int ib, 
  1352                       long unsigned int ihfbit,
  1355                       long unsigned int *list_1_,
  1356                       long unsigned int *list_2_1_,
  1357                       long unsigned int *list_2_2_,
  1358                       long unsigned int *list_jb_
  1361   long unsigned int i,j,div; 
  1362   long unsigned int ia,ja,jb;
  1363   long unsigned int num_up;
  1364   unsigned int tmp_num_up;
  1370     div=i & 
X->Def.Tpow[j];
  1371     div=div/
X->Def.Tpow[j];
  1375   tmp_num_up   = num_up;
  1377   for(ia=0;ia<ihfbit;ia++){
  1379     num_up =  tmp_num_up;
  1381       div=i & 
X->Def.Tpow[j];
  1382       div=div/
X->Def.Tpow[j];
  1386     if(num_up == 
X->Def.Ne){
  1387       list_1_[ja+jb]=ia+ib*ihfbit;
  1415                              long unsigned int ib, 
  1416                              long unsigned int ihfbit,
  1419                              long unsigned int *list_1_,
  1420                              long unsigned int *list_2_1_,
  1421                              long unsigned int *list_2_2_,
  1422                              long unsigned int *list_jb_
  1425   long unsigned int i,j,div; 
  1426   long unsigned int ia,ja,jb;
  1427   long unsigned int num_up;
  1428   unsigned int tmp_num_up;
  1434     div=i & 
X->Def.Tpow[j];
  1435     div=div/
X->Def.Tpow[j];
  1439   tmp_num_up   = num_up;
  1442   if(tmp_num_up<=X->Def.Ne && (
X->Def.Ne-tmp_num_up)<= 
X->Def.Nsite-1){ 
  1443     ia = 
X->Def.Tpow[
X->Def.Ne-tmp_num_up]-1;
  1445       list_1_[ja+jb] = ia+ib*ihfbit;
  1446       list_2_1_[ia]  = ja+1;
  1447       list_2_2_[ib]  = jb+1;
  1454           list_1_[ja+jb]    = ia+ib*ihfbit;
  1455           list_2_1_[ia]     = ja+1;
  1456           list_2_2_[ib]     = jb+1;
  1484                              long unsigned int ib, 
  1485                              long unsigned int ihfbit,
  1487                              long unsigned int *list_1_,
  1488                              long unsigned int *list_2_1_,
  1489                              long unsigned int *list_2_2_,
  1490                              long int *list_2_1_Sz_,
  1491                              long int *list_2_2_Sz_,
  1492                              long unsigned int *list_jb_
  1495   long unsigned int ia,ja,jb;  
  1496   int list_2_2_Sz_ib=0;
  1499   list_2_2_Sz_ib =list_2_2_Sz_[ib];
  1501   for(ia=0;ia<ihfbit;ia++){
  1502     tmp_2Sz=list_2_1_Sz_[ia]+list_2_2_Sz_ib;
  1503     if(tmp_2Sz == 
X->Def.Total2Sz){
  1504       list_1_[ja+jb]=ia+ib*ihfbit;
  1530  const long unsigned int irght,
  1531  const long unsigned int ilft,
  1532  const long unsigned int ihfbit,
  1533  long unsigned int *i_max
  1540   long unsigned int icnt=0; 
  1541   long unsigned int ia,ib;
  1542   long unsigned int ja=0;
  1543   long unsigned int jb=0;
  1544   long unsigned int ibpatn=0;
  1545   long unsigned int dam; 
  1550   switch(
X->Def.iCalcModel){
  1558     sprintf(sdt,
"ListForKondo_Ns%d_Ncond%d.dat",
X->Def.Nsite,
X->Def.Ne);
  1575     while(NULL != 
fgetsMPI(buf,
sizeof(buf),fp)){  
 
void exitMPI(int errorcode)
MPI Abortation wrapper. 
const char * cProStartCalcSz
const char * cOMPSzFinish
int child_omp_sz_spin(long unsigned int ib, long unsigned int ihfbit, unsigned int N, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
calculating restricted Hilbert space for spin-1/2 systems 
int sz(struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_)
generating Hilbert space 
int child_omp_sz_GeneralSpin(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long int *list_2_1_Sz_, long int *list_2_2_Sz_, long unsigned int *list_jb_)
calculating restricted Hilbert space for general spin systems (S>1/2) 
int childfopenMPI(const char *_cPathChild, const char *_cmode, FILE **_fp)
Only the root process open file in output/ directory. 
const char * cStateLocSpin
const char * cFileNameErrorSz
int child_omp_sz_KondoGC(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
int Read_sz(struct BindStruct *X, const long unsigned int irght, const long unsigned int ilft, const long unsigned int ihfbit, long unsigned int *i_max)
reading the list of the restricted Hilbert space 
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)
int child_omp_sz_Kondo(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
calculating restricted Hilbert space for Kondo systems 
int child_omp_sz_hacker(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
efficient version of calculating restricted Hilbert space for Hubbard systems using snoob details of ...
const char * cFileNameListModel
const char * cStateNupNdown
char * cErrSz
Error Message in sz.c. 
int child_omp_sz_spin_hacker(long unsigned int ib, long unsigned int ihfbit, unsigned int N, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
efficient version of calculating restricted Hilbert space for spin-1/2 systems details of snoob is fo...
const char * cReadSzStart
int GetSplitBitByModel(const int Nsite, const int iCalcModel, long unsigned int *irght, long unsigned int *ilft, long unsigned int *ihfbit)
function of splitting original bit into right and left spaces. 
long unsigned int * list_2_1
long unsigned int * list_1
const char * cFileNameSzTimeKeep
const char * cFileNameTimeKeep
long unsigned int * list_2_2
int child_omp_sz_Kondo_hacker(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
calculating restricted Hilbert space for Kondo-GC systems 
const char * cProEndCalcSz
char * cErrSz_NoFile_Show
char * fgetsMPI(char *InputString, int maxcount, FILE *fp)
MPI file I/O (get a line, fgets) wrapper. Only the root node (myrank = 0) reads and broadcast string...
int child_omp_sz(long unsigned int ib, long unsigned int ihfbit, struct BindStruct *X, long unsigned int *list_1_, long unsigned int *list_2_1_, long unsigned int *list_2_2_, long unsigned int *list_jb_)
calculating restricted Hilbert space for Hubbard systems 
unsigned long int snoob(unsigned long int x)
"finding the next higher number after a given number that has the same number of 1-bits" This method ...
int TimeKeeper(struct BindStruct *X, const char *cFileName, const char *cTimeKeeper_Message, const char *cWriteType)
Functions for writing a time log. 
FILE * stdoutMPI
File pointer to the standard output defined in InitializeMPI()