en otra ventana

Anuncio
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:"
Descargar