10 REM RANDOM CRYSTALLIZATION 20 REM BY MARK ZIMMERMAN 30 REM 40 REM ILLUSTRATES THE MOTION OF ATOMS 50 REM IN A MINIATURE CRYSTAL AT A 60 REM CHOSE TEMPERATURE. 70 REM 80 REM CHANCE TO MOVE IS 82 REMP=EXP(-ENERGYNEW-ENERGYOLD)/TEMP)) 90 REM 100 REM ENERGY IS SIMPLY -1*NUMBER OF 110 REM ADJACENT ATOMS. 120 REM 130 REM ACTION TAKES PLACE INSIDE OF A 140 REM BOX OF NON-MOVING ATOMS. 150 REM 190 REM 200 DEF FNR(J)=1+INT(J*RND(1)) 220 DIM XY(11,11):PRINTCHR$(142)"":POKE53280,6 240 N=0:INPUT"[147]TEMPERATURE ";T 260 INPUT"NUMBER OF ATOMS (1-99)";A 265 IFA<1ORA>99THENPRINT"?REDO PLEASE..":GOTO260 270 PRINT"[147]" 280 GOSUB8000 300 GOSUB9000 400 GOSUB2000 500 GOSUB3000 600 P=EXP(-(EN-E)/T) 700 N=N+1 800 IFRND(1)>PTHEN400 900 XY(X,Y)=0:XY(XN,YN)=1:GOTO300 1999 REM 2000 REM PICK RANDOM ATOM 2010 IFPEEK(198)<>0THEN63000 2020 X=FNR(10):Y=FNR(10):IFXY(X,Y)=0THEN2020 2025 IFPEEK(198)<>0THEN63000 2040 IFXY(X+1,Y)=1ANDXY(X-1,Y)=1ANDXY(X,Y+1)=1ANDXY(X,Y-1)=1THEN2020 2060 REM NOW PICK A HOLE 2080 R=RND(1):IFR<.25THENXN=X-1:YN=Y:GOTO2200 2100 IFR<.5THENXN=X+1:YN=Y:GOTO2200 2120 IFR<.75THENXN=X:YN=Y-1:GOTO2200 2140 XN=X:YN=Y+1 2200 IFXY(XN,YN)=1THEN2080 2300 RETURN 2999 REM 3000 REM CALC ENERGY OF ATOM 3020 E=-XY(X-1,Y)-XY(X+1,Y)-XY(X,Y-1)-XY(X,Y+1) 3040 EN=-XY(XN-1,YN)-XY(XN+1,Y)-XY(XN,YN-1)-XY(XN,YN+1)+1 3100 RETURN 7999 REM 8000 REM INIT CONFIGURATION 8020 PRINT"INITIALIZING ATOMS IN BOX" 8040 FORI=1TOA 8060 X=FNR(10):Y=FNR(10):PRINT"."; 8080 IFXY(X,Y)=1THEN8060 8100 XY(X,Y)=1:NEXT I 8200 REM FILL IN BOUNDARY 8220 FORI=0TO11:XY(0,I)=1:XY(11,I)=1:XY(I,0)=1:XY(I,11)=1:NEXT:PRINT"[147]" 8300 RETURN 8999 REM 9000 REM DISPLAY CONFIGURATION 9010 IFPEEK(198)<>0THEN63000 9020 PRINT"":PRINT"N="N 9040 FORI=1TO10:PRINTSPC(10):FORJ=1TO10 9060 IFXY(I,J)=1THENPRINT""CHR$(209)"[144]"; 9062 IFXY(I,J)=0THENPRINT"[144][214]"; 9080 NEXTJ 9100 PRINT 9120 NEXT I 9130 PRINT"PRESS A KEY TO EXIT" 9140 RETURN 63000 REM DO AGAIN OR LEAVE? 63010 PRINT"[147] DO YOU WISH TO TRY AGAIN?" 63020 POKE198,0:WAIT198,1:GETA$ 63030 IFA$<>"Y"ANDA$<>"N"THENPOKE53280,RND(1)*15:GOTO63010 63040 IFA$="Y"THENFORI=1TO10:FORJ=1TO10:XY(I,J)=0:NEXTJ,I:GOTO240 63050 : 63060 PRINT"[147]LOAD"CHR$(34)"PAYLOAD"CHR$(34)",8":PRINT"RUN" 63070 POKE631,13:POKE632,13:POKE198,2:END