/*********************************************************************** PROGRAMME: 3D Ising Model ( Metropolis Algorithm ) Written 11/11/00 Modified 1.Analysis by Histogram Technique K=K0 12/03/00 2.exp(-DeltaK*E) used instead 12/06/00 Dyutiman Das Dept. of Physics University of Illinois, Urbana,IL ********************************************************************* ********************************************************************* List of Integers conf Configuration in the probability matrix. L The size of the L-cube lattice. Lsq Number of spins per layer. NBin Number of bins into which each run is broken into. NPass Number of passes NPassBin Number of passes per bin NPassEq Number of equilibriation passes NSpin Number of spins (+/-). NTemp Number of Temperatures. List of Integer Arrays NbrSpin[i][j] The spin of the j-th neighbour of the i-th spin. Spin[NSpin] The Spin at i-th Lattice site List of Floating Variables dE Energy difference E Energy Esq Energy squared M Magnetic Moment Msq Moment squared T Temperature List of Floating Arrays Cv[NBins] The Heat Capacity Pr[SpinValue][Conf] The probability Array X[NBins] The Susceptibility Chi **********************************************************************/ #include #include #include"RDMG" #define L 20 /* Some of these will be read from a file */ #define Lsq L*L #define NSpin L*L*L #define NE 6*NSpin #define NBin 10 #define Nkstep 500 #define NPass 500000 #define dK 0.0001 #define Ksim 0.224 main(){ int i,j,k,NLayer,conf,intE,intM,iE,iM,kstep; int ipass,ispin,nbr,NPassEq,ibin; int Spin[NSpin],NbrLst[NSpin][6]; int H[NE+1],m[NE+1],msq[NE+1],absm[NE+1],m4[NE+1]; double dE,fE,fM,DeltaK,norm,Mnorm,K,HexpE; double fNPass,fNSpin,Pr[3][13],M,E,Msq,Esq; double Mabs,M4,dlnmsqdk,dUdk,dUdk_Max; double absmE,msqE,absm_Max,msq_Max,dlnabsmdk; double fNBin,Cv_Max,Xt_Max,Mabs_Max,Msq_Max; double spheat,suscep,dma,dmb; double avKc_Cv,avKcsq_Cv,DKc_Cv; double avKc_Xt,avKcsq_Xt,DKc_Xt; double avKc_Mabs,avKcsq_Mabs,DKc_Mabs; double avKc_Msq,avKcsq_Msq,DKc_Msq; double av_m2,av_m,D_m,av_msq2,av_msq,D_msq; double Kc_Cv[NBin],Kc_Xt[NBin],Kc_Mabs[NBin],Kc_Msq[NBin]; double Max_m[NBin],Max_msq[NBin]; FILE *ifp; /* Get the input parameters from the input file */ /* IN FACT THESE ARE IN THE ABOVE #define COMMAND */ fNBin=(float)(NBin); fNPass=(float)(NPass); fNSpin=(float)(NSpin); Mnorm=fNSpin*fNPass; NPassEq=NPass/10; /* Initialise the lattice to be Spin UP */ for(ispin=0;ispinCv_Max){ Cv_Max=spheat; Kc_Cv[ibin]=K; } if(suscep>Xt_Max){ Xt_Max=suscep; Kc_Xt[ibin]=K; } if(Mabs>Mabs_Max){ Mabs_Max=Mabs; Kc_Mabs[ibin]=K; } if(Msq>Msq_Max){ Msq_Max=Msq; Kc_Msq[ibin]=K; } if(dma>absm_Max) absm_Max=dma; if(dmb>msq_Max) msq_Max=dmb; } /* K loop ends */ Max_m[ibin]=absm_Max; Max_msq[ibin]=msq_Max; } /* Bin loop ends */ av_m=0.0; av_msq=0.0; avKc_Cv=0.0; avKcsq_Cv=0.0; avKc_Xt=0.0; avKcsq_Xt=0.0; avKc_Mabs=0.0; avKcsq_Mabs=0.0; avKc_Msq=0.0; avKcsq_Msq=0.0; for(ibin=0;ibin