/* ising.c Monte-Carlo-Simulation fuer das Ising-Modell. Grundprogramm in C von Fabian Braun (09.01.1998) */ #include #include #include /* Hier kommen zunaechst ein paar systemspezifische Angaben. Fuer ein Spin verwenden wir der Einfachheit halber ein Byte Speicherplatz */ /* Was ist ein Byte? */ #define BYTE char /* Wie wird ein Spin dargestellt? */ #define SPIN BYTE #define UP +1 #define DOWN -1 #define sqr(x) ((x)*(x)) /* MonteCarlo-Simulationen benoetigen ZUFALLSZAHLEN. Haeufig sind vom Compiler oder System zur Verfuegung gestellte Zufallszahlen unbrauchbar, da sie Korrelationen aufweisen. Wir verwenden daher einen einfachen brauchbaren generator. Der Generator ist entnommen aus: Numerical Recipes in C - The Art of Scientiffic Computing Second Edition W.H. Press, S.A. Teukolsky, W.T. Vetterling, B.P. Flannery Cambridge University Press 1992 Dort finden sich auch noch komplexere Generatoren. */ long idum; #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 double ran0(long *idum) { long k; double ans; *idum ^= MASK; k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } #undef IA #undef IM #undef AM #undef IQ #undef IR #undef MASK /* Hier geht's endlich los: */ /* Zunaechst definieren wir einige Programmroutinen: */ /* randomize erzeugt ein Feld mit zufaelliger Spinverteilung. Dabei wird die Anzahl der Up-Spins festgestellt. */ void randomize(int Nspins, SPIN *spin) { int j; for(j=0; j 0 ? selectedSpin-1 : Nspins-1 ); nextSpin = ( selectedSpin < Nspins-1 ? selectedSpin+1 : 0 ); /* Flippe Spin */ spin[selectedSpin] *= -1; /* Schritt 2: Berechne die Aenderungen in Energie und NspinsUp */ DeltaU = -2*K*(spin[prevSpin]*spin[selectedSpin]+ spin[selectedSpin]*spin[nextSpin]) -2*hz*spin[selectedSpin]; DeltaSpinsUp = spin[selectedSpin]; /* Schritt 3: Energiebilanz */ if(DeltaU<0) { /* Schritt akzepieren */ *U += DeltaU; *NspinsUp += DeltaSpinsUp; } else { /* Schritt 4: Nur mit Wahrscheinlichkeit akzeptieren */ prob = exp(-beta*DeltaU); if(ran0(&idum)