A program to check size of dimension for Hilbert-space.
add function of calculating Hilbert space for canonical ensemble.
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 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()