Apéndice E Programa: Modelo de Ising en Tres Dimensiones 5 CLS :SCREEN 0 10 PRINT " *********************************************" 20 PRINT 30 PRINT 40 PRINT " 3 DIMENSIONAL ISING MODEL" 50 PRINT 60 PRINT 70 PRINT " MacKeown, Newman and Reid, Jan. 1987." 80 PRINT 90 PRINT " (C) IOP Publishing Ltd. 1987." 100 PRINT 110 PRINT " *********************************************" 120 PRINT: PRINT " Hit any key to continue": PRINT 130 IF INKEY$="" THEN 130 140 DIM M(10,10,10) 150 DIM RE(100),RM(100),QE(1000),QM(1000) 160 UA$="E5F5L3D5L4U5L3BM+5,0P1,1" :REM UPWARD ARROW 170 OUA$="E5F5L3D5L4U5L3BM+5,0" :REM OPEN ARROW 180 DA$="BM+2,-4R4D5R3G5H5R3U5BM+2,+2P1,1" :REM DOWNWARD ARROW 190 ODA$="BM+2,-4R4D5R3G5H5R3U5BM+2,+2" :REM OPEN ARROW 200 REM --------------------------------------210 REM ARRANGE TO INPUT QUANTITIES H,J AND BETA 220 REM --------------------------------------230 NEQ=1000 240 NI=1 128 APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 129 250 SN=30 260 CLS:LOCATE 6,8 270 INPUT " Do you need tutorial help Use upper case everywhere! - (Y/N) ";H$: PRINT: PRINT 280 IF H$="Y" THEN GOSUB 3790 290 PRINT"3-DIMENSIONAL ISING MODEL, NXNXN ARRAY" 300 PRINT" WITH ISOLATED OR CYCLIC BOUNDARY CONDITIONS":PRINT 310 INPUT "ENTER N ( <=8), ";N:BEEP 312 IF N <=8 THEN GOTO 320 314 BEEP:BEEP:BEEP:BEEP:BEEP: GOTO 310 320 IF N=4 THEN INPUT "DO YOU WANT PICTURES? (Y/N)";L$:BEEP 340 PRINT" RESULTS AT END OF WALK WILL BE OUTPUT TO THE MONITOR" 350 INPUT "DO YOU ALSO WANT PRINTER OUTPUT? (Y/N) ";P$:BEEP 360 INPUT "ENTER J (1/0) ";J:PRINT:BEEP 370 INPUT "ENTER H (1/0) ";H:PRINT:BEEP 380 JJ=J:HH=-H 390 INPUT "DO YOU WANT ISOLATED OR PERIODIC? (ISOL/PERI)";I$ 400 PRINT "HOT START/COLD START ? " 410 INPUT "(H=HOT, C=COLD)";A$:BEEP 412 INPUT "INPUT ’BETA’ ";BETA:PRINT 420 PRINT"AT PRESENT NEQ=";NEQ,"WALKS DISCARDED BEFORE EQUILIBRIUM" 430 INPUT "DO YOU WANT TO CHANGE NEQ (Y/N)";B$ 440 IF B$="N" THEN 460 450 INPUT "NEQ= ";NEQ 460 PRINT"AT EQUILIBRIUM, SYSTEM IS INTERROGATED EVERY NI=";NI,"MCS/S" 470 INPUT "DO YOU WANT TO CHANGE NI (Y/N) ";C$ 480 IF C$="N" THEN 500 490 INPUT "NI= ";NI 500 NT=N*N*N 510 NP=NT*NI 520 PRINT"AT PRESENT TOTAL NUMBER OF INTERROGATIONS IS NN=";SN 530 INPUT "DO YOU WANT TO CHANGE NN (Y/N)";C$ 540 IF C$="N" THEN 560 550 INPUT "NN= ";SN 555 GOTO 580 560 INPUT "INPUT ’BETA’ ";BETA:PRINT 570 IF Y$="Y" THEN INPUT "OLD OR NEW STARTING CONFIG? (OLD/NEW)";T$:PRINT 580 REM ----------------------------------------590 REM 600 REM N IS SIDE OF CUBE, ARRAY M MUST 610 REM BE DECLARED OF DIM N+2,N+2,N+2 APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 130 620 REM ----------------------------------------630 PRINT 640 PRINT:PRINT:PRINT 650 PRINT " START EXECUTION" 660 PRINT " ---------------" 670 REM -----------------------------------680 REM 690 REM INITIALISATION 700 REM 710 REM -----------------------------------720 SE=0:SM=0:SS=0 730 S2=0:S3=0:S4=0:S8=0:S9=0 740 SP=0:NN=0:NA=0 750 N1=0 760 IF T$="OLD" THEN 1230: REM Using previous config. as starting one. 770 IF A$="C" THEN 880 780 REM ------------------------------------790 REM 800 REM RANDOMISING INITIAL SPIN CONFIG. 810 REM (HOT START) 820 REM 830 REM ------------------------------------840 FOR I=1 TO N: FOR J=1 TO N: FOR K=1 TO N 850 M(I,J,K)=SGN(2*RND(1)-1)*1 860 NEXT:NEXT:NEXT 870 GOTO 970 880 REM -----------------------------890 REM 900 REM COLD START - ALIGNED 910 REM M(I,J,K)=+1 920 REM 930 REM -----------------------------940 FOR I=1 TO N:FOR J=1 TO N:FOR K=1 TO N 950 M(I,J,K)=1 960 NEXT:NEXT:NEXT 970 IF I$="ISOL" THEN 1130 980 REM ------------------------------990 REM 1000 REM IMPOSING CYCLIC CONDITIONS 1010 REM 1020 REM ------------------------------- APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 131 1030 FOR I=1 TO N: FOR J=1 TO N 1040 M(I,J,0)=M(I,J,N):M(I,J,N+1)=M(I,J,1) 1050 NEXT:NEXT 1060 FOR J=1 TO N:FOR K=1 TO N 1070 M(0,J,K)=M(N,J,K):M(N+1,J,K)=M(1,J,K) 1080 NEXT:NEXT 1090 FOR K=1 TO N: FOR I=1 TO N 1100 M(I,0,K)=M(I,N,K):M(I,N+1,K)=M(I,1,K) 1110 NEXT:NEXT 1120 GOTO 1200 1130 REM ***********ISOLATED CONFIGURATION************** 1140 FOR I=1 TO N: FOR J=1 TO N: M(I,J,0)=0:M(I,J,N+1)=0 1150 NEXT:NEXT 1160 FOR J=1 TO N: FOR K=1 TO N: M(0,J,K)=0:M(N+1,J,K)=0 1170 NEXT:NEXT 1180 FOR I=1 TO N: FOR K=1 TO N: M(I,0,K)=0:M(I,N+1,K)=0 1190 NEXT:NEXT 1200 REM M=-99 MEANS NOTHING IS DRAWN (THESE VALUES DO NOT ENTER CALCULN.) 1210 FOR I=0 TO N+1: M(0,0,I)=-99: M(0,N+1,I)=-99: M(N+1,0,I)=-99 1220 M(N+1,N+1,I)=-99: NEXT I 1230 GOSUB 2490: REM INITIAL ENERGY 1240 GOSUB 2680: REM INITIAL MAGNETISATION 1250 NU=(NT+MA)/2 1260 IF JJ=0 THEN GOSUB 2780: REM INITIAL ENTROPY 1270 IF L$="Y" THEN GOSUB 3460: REM DRAW PICTURES 1280 REM --------------------------------------1290 REM 1300 REM SELECT A RANDOM POINT 1310 REM 1320 REM --------------------------------------1330 N1=N1+1 1340 IP=INT(N*RND(1)+1):JP=INT(N*RND(1)+1):KP=INT(N*RND(1)+1) 1350 MO=M(IP,JP,KP):M(IP,JP,KP)=-MO 1360 GOSUB 2900: REM CALCULATE DE 1370 DM=M(IP,JP,KP)-MO 1380 REM --------------------------------------1390 REM 1400 REM SELECT FROM PROB. DISTRIBUTION 1410 REM 1420 REM --------------------------------------- APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 132 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590 1600 1610 1620 1630 1640 1650 1660 1670 1680 1690 1700 1710 THEN 1715 1716 1720 1730 1740 1750 WALK 1760 THEN 1770 1780 1790 IF DE<= 0 THEN 1500 IF EXP(-BETA*DE) > RND(1) THEN 1500 DM=0 DE=0 CS=0 M(IP,JP,KP)=MO GOTO 1640 IF I$="ISOL" THEN 1620 REM ------------------------------------REM REM UPDATE CYCLIC BOUNDARY REM REM ------------------------------------IF IP=1 THEN M(N+1,JP,KP)=M(IP,JP,KP) IF IP=N THEN M(0,JP,KP)=M(IP,JP,KP) IF JP=1 THEN M(IP,N+1,KP)=M(IP,JP,KP) IF JP=N THEN M(IP, 0 ,KP)=M(IP,JP,KP) IF KP=1 THEN M(IP,JP,N+1)=M(IP,JP,KP) IF KP=N THEN M(IP,JP, 0 )=M(IP,JP,KP) E=E+DE: MA=MA+DM IF L$="Y" THEN GOSUB 3660: REM UPDATE PICTURE IF JJ <> 0 THEN 1680 DN=DM/2 IF DN<>0 THEN GOSUB 3010 S=S+CS: NU=NU+DN REM ---------------------REM PRINT COUNTER = NEQ REM ---------------------IF N1=NEQ PRINT " - EQUILIBRIUM ASSUMED IF L$="Y" THEN LOCATE 1,1 ELSE LOCATE ,1 PRINT N1; IF NA=NP THEN 1740 NA=NA+1:GOTO 1280 NA=1 IF L$<>"Y" THEN PRINT" NO.";N1;" E=";E;" MAGNETISATION=";MA IF L$<>"Y" THEN IF JJ=0 PRINT" S=";S IF N1<NEQ THEN 1280 NN=NN+1:REM INCRE. SAMPLE COUNT REM *********************** " APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 133 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130 2140 2145 2150 2160 2165 2170 2180 2185 REM REM TAKE SAMPLE REM REM *********************** SE=SE+E: S2=S2+E*E: S8=S8+E^4 SM=SM+MA:S3=S3+MA*MA:S9=S9+MA^4 SS=SS+S:S4=S4+S*S QE(NN)=E: QM(NN)=MA: REM STORED FOR CALCULATING CORRELATIONS IF NN<SN THEN GOTO 1280 REM --------------------------------REM REM STATISTICAL REPORT REM REM --------------------------------E=SE/NN:VE=(S2/NN-E*E)*(NN/(NN-1)) EB=S2/NN:REM E SQ BAR MA=SM/NN:VM=(S3/NN-MA*MA)*(NN/(NN-1)) S=SS/NN VS=(S4/NN-S*S)*(NN/(NN-1)) EE=SQR(VE/NN):EM=SQR(VM/NN) GOSUB 3130: REM CALCULATE CORRELATION COEFFICIENTS. IF JJ=0 THEN ES=SQR(VS/NN) IF JJ<>0 THEN GOTO 2200 MA=MA/NT:EM=EM/NT: CM=CM/NT S=S/NT:ES=ES/NT IF P$="N" THEN 2130 LPRINT"H= ";H,"J= ";JJ,"BETA= ";BETA:LPRINT LPRINT"ENERGY STD. ERROR" LPRINT E,EE LPRINT "MAGN. STD ERROR" LPRINT MA,EM LPRINT "ENTROPY STD ERROR" LPRINT S,ES LOCATE 10,8:PRINT"H= ";H,"J= ";JJ,"BETA= ";BETA:PRINT PRINT USING "Energy=+###.##";E; PRINT USING" Std Error=+##.##";EE PRINT USING " With correlns(=+##.##)";CE:PRINT PRINT USING "Magnet=+#.###";MA; PRINT USING" Std Error=+#.###";EM PRINT USING " With correlns(=+#.###)";CM:PRINT PRINT USING "Entropy=+#.###";S; PRINT USING" Std Error=+#.###";ES:PRINT APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 134 2190 GOTO 2420 2200 SV=SQR((S8/NN-EB*EB*(1-2/(NN-1)))/NN) 2210 MA=MA/NT:EM=EM/NT: CM=CM/NT:VM=VM/NT: WM=WM/NT 2220 MS=SQR(S3/NN)/NT 2230 IF P$="N" THEN 2360 2240 LPRINT "J=";JJ,"H= ";H:LPRINT 2250 LPRINT "BETA= ";BETA,"NEQ= ";NEQ:LPRINT 2260 LPRINT "ENERGY STD. ERROR" 2270 LPRINT E,EE 2280 LPRINT "VAR(E) VAR(VAR)" 2290 LPRINT VE,SV 2300 LPRINT "MAGNETISN. STD ERROR" 2310 LPRINT MA,EM 2320 LPRINT " R.M.S. MAGNETISATION" 2330 LPRINT MS 2340 LPRINT 2350 LPRINT:LPRINT:LPRINT:LPRINT:LPRINT 2360 PRINT USING "H=+#.# J=+#.# Beta=##.##"; H,JJ,BETA:PRINT 2370 PRINT USING "Energy=+###.## error ##.## (##.##)"; E,EE,CE:PRINT 2380 PRINT USING "Magnet=+#.### error #.### (#.###)"; MA,EM,CM:PRINT 2390 PRINT USING "Var(E)=#####.# (#####.#)";VE,WE:PRINT 2400 PRINT USING "Var(M)=#.### (#.###)";VM,WM:PRINT 2410 PRINT USING "RMS Mag=#.### Var(Var(E))=#####.#"; MS,SV:PRINT 2420 BEEP:INPUT"DO YOU WANT TO CONTINUE? (Y/N)";Y$ 2430 IF Y$="N" THEN 2480 2440 INPUT"DO YOU WANT TO CHANGE ONLY BETA? (Y/N)";Y$:PRINT 2450 IF Y$="Y" THEN 560 2460 T$="NEW" 2470 GOTO 360 2480 PRINT:PRINT:PRINT"EXECUTION TERMINATED !":PRINT:PRINT:STOP 2490 REM ---------------------------------------2500 REM 2510 REM SUBROUTINE 2520 REM 2530 REM CALCULATE INITIAL ENERGY OF SYSTEM 2540 REM 2550 REM ---------------------------------------2560 E1=0:E2=0 APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 135 2570 2580 2590 2600 2610 2620 2630 2640 2650 2660 2670 2680 2690 2700 2710 2720 2730 2740 2750 2760 2770 2780 2790 2800 2810 2820 2830 2840 2850 2860 2870 2880 2890 2900 2910 2920 2930 2940 2950 2960 2970 2980 IF HH=0 THEN GOTO 2610 FOR I=1 TO N: FOR J=1 TO N: FOR K=1 TO N E2=E2+M(I,J,K):NEXT:NEXT:NEXT E2=E2*HH IF JJ=0 THEN 2660 FOR I=1 TO N: FOR J=1 TO N: FOR K=1 TO N E1=E1+M(I,J,K)*(M(I-1,J,K)+M(I,J-1,K)+M(I,J,K-1)) NEXT:NEXT:NEXT E1=-JJ*E1 E=E1+E2 RETURN REM ---------------------------------------REM REM CALCULATE INITIAL MAGNETISATION REM REM ---------------------------------------MA=0 FOR I=1 TO N: FOR J=1 TO N: FOR K=1 TO N MA=MA+M(I,J,K) NEXT: NEXT: NEXT RETURN REM ---------------------------------------REM REM SUBROUTINE REM REM CALCULATE INITIAL ENTROPY REM REM ---------------------------------------S=0 IF NU=0 THEN 2890 FOR IS=2 TO NU:S=S-LOG(IS):NEXT FOR IS=NT+1-NU TO NT:S=S+LOG(IS):NEXT RETURN REM ----------------------------------------REM REM SUBROUTINE REM CALCULATE CHANGE IN ENERGY REM REM ----------------------------------------DE=M(IP+1,JP,KP)+M(IP-1,JP,KP) DE=DE+M(IP,JP+1,KP)+M(IP,JP-1,KP) DE=DE+M(IP,JP,KP+1)+M(IP,JP,KP-1) APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 136 2990 DE=-2*MO*(-JJ*DE+HH) 3000 RETURN 3010 REM ---------------------------------------3020 REM 3030 REM SUBROUTINE 3040 REM 3050 REM CALCULATE CHANGE IN ENTROPY 3060 REM 3070 REM ----------------------------------------3080 IF DN>0 THEN 3110 3090 CS=LOG(NU)-LOG(NT+1-NU) 3100 GOTO 3120 3110 CS=LOG(NT-NU)-LOG(NU+1) 3120 RETURN 3130 REM --------------------------------------------3140 REM 3150 REM CALCULATE CORRELATION COEFFICIENTS 3160 REM 3170 REM --------------------------------------------3180 CLS: CE=0: CM=0:WE=0:WM=0: REM STD. ERR/VAR ALLOWING FOR CORRELATIONS. 3190 KE=0: KM=0: KI=NN/2 3200 PRINT:PRINT " K RE(K) Z1" 3210 FOR K=1 TO KI 3220 RE(K)=0: RM(K)=0 3230 FOR I=1 TO NN-K 3240 RE(K)=RE(K)+(QE(I)-E)*(QE(I+K)-E): REM CORRELATIONS IN ENERGY 3250 RM(K)=RM(K)+(QM(I)-MA)*(QM(I+K)-MA): REM CORRELATIONS IN MAGNETISATION 3260 NEXT I 3270 RE(K)=RE(K)*2/(NN*NN) 3280 RM(K)=RM(K)*2/(NN*NN) 3290 KK=K-1 3300 Z1=2*(NN-1)*VE*SQR((2*K+1)/NN)/(NN*NN) 3310 PRINT K,RE(K),Z1 3320 IF ABS(RE(K))<Z1 THEN 3340 3330 NEXT K 3340 IF KK>NN/4 THEN RETURN: REM CORRELATIONS TOO GREAT ! 3350 IF KK=0 THEN 3400 3360 FOR K=1 TO KK 3370 KE=KE+RE(K) 3380 KM=KM+RM(K) APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 137 3390 NEXT K 3400 WE=((NN-1)*VE+NN*NN*KE)/(NN-2*KK-1) 3410 CE=SQR(WE/NN) 3420 WM=((NN-1)*VM+NN*NN*KM)/(NN-2*KK-1) 3430 CM=SQR(WM/NN) 3440 RETURN 3450 END 3460 REM -------------------------------------3470 REM 3480 REM DRAWING PICTURES ON MONITOR 3490 REM 3500 REM --------------------------------------3510 SCREEN 2: CLS: KEY OFF 3520 FOR I=0 TO 5: FOR J=0 TO 5: FOR K=0 TO 5 3530 PI=I: PJ=J: PK=K 3540 GOSUB 3570: REM DRAW INDIVIDUAL POINT 3550 NEXT: NEXT: NEXT 3560 RETURN 3570 REM 3580 REM DRAW ARROW AT PI,PJ,PK 3590 XI=20+200*(PK MOD 3)+25*PI: X1=XI-10: X2=XI+10 3600 YI=20+90*INT((PK+1)/4)+14*PJ: Y1=YI-8: Y2=YI+8 3610 IF PI=0 THEN 3640 ELSE IF PI=N+1 THEN 3640 ELSE IF PJ=0 THEN 3640 ELSE IF PJ=N+1 THEN 3640 ELSE IF PK=0 THEN 3640 ELSE IF PK=N+1 THEN 3640 3620 LINE(X1,Y1)-(X2,Y2),0,BF :PSET(XI,YI):IF M(PI,PJ,PK)=1 THEN DRAW UA$ ELSE IF M(PI,PJ,PK)=-1 THEN DRAW DA$ ELSE IF M(PI,PJ,PK)=0 THEN CIRCLE (XI,YI),7 3630 RETURN 3640 LINE(X1,Y1)-(X2,Y2),0,BF :PSET(XI,YI):IF M(PI,PJ,PK)=1 THEN DRAW OUA$ ELSE IF M(PI,PJ,PK)=-1 THEN DRAW ODA$ ELSE IF M(PI,PJ,PK)=0 THEN CIRCLE (XI,YI),7 3650 RETURN 3660 REM 3670 REM UPDATE PICTURE AT IP,JP,KP 3680 PI=IP: PJ=JP: PK=KP 3690 GOSUB 3570 3700 REM UPDATE BOUNDARY POINT 3710 IF I$="ISOL" THEN RETURN 3720 IF PI=1 THEN PI=N+1 ELSE IF PI=N THEN PI=0 3730 IF PI<>IP THEN GOSUB 3570 3740 PI=IP: IF PJ=1 THEN PJ=N+1 ELSE IF PJ=N THEN PJ=0 3750 IF PJ<>JP THEN GOSUB 3570 APÉNDICE E. PROGRAMA: MODELO DE ISING EN TRES DIMENSIONES 138 3760 3770 3780 3790 3800 3810 3820 3830 PJ=JP: IF PK=1 THEN PK=N+1 ELSE IF PK=N THEN PK=0 IF PK<>KP THEN GOSUB 3570 RETURN REM Tutorial information PRINT " If you are unfamiliar with the purpose and methods of this" PRINT " program and simply wish to test its operation, or see an" PRINT " example of its outputs the following responses to the" PRINT " various prompts which follow are suggested:"