10 REM PROGRAM PISTON 20 REM IMPACT USES CENTER OF MASS COORDINATES 40 DIM X(41), Y(41), U(41), V(41), CTR(41) 50 DIM A(100), B(200) 60 G = .001: MPIS = 10: KE = 0: TK0 = 273.15 70 U0 = .04: TSEC = 0: TSECMAX = 2500 75 IF NCH = 1 THEN 240 80 CLS : SCREEN 12: COLOR 10 90 LOCATE 3, 32: PRINT "MOVING MOLECULES" 100 LOCATE 5, 39: PRINT "BY" 110 LOCATE 7, 29: PRINT "STANLEY DAVID GEDZELMAN" 120 GOSUB 1580 150 LOCATE 10, 19: PRINT "THIS PROGRAM SHOWS HOW MOVING GAS MOLECULES" 160 LOCATE 11, 20: PRINT "CREATE TEMPERATURE, PRESSURE, AND DENSITY" 170 GOSUB 1580: COLOR 12 180 LOCATE 16, 5: PRINT "PARAMETERS YOU CHOOSE" 190 LOCATE 18, 5: PRINT "1. TEMPERATURE (GAS KINETIC ENERGY)" 200 LOCATE 19, 5: PRINT "2. NUMBER OF MOLECULES (GAS DENSITY)" 210 LOCATE 20, 5: PRINT "3. CHANGE OF TEMPERATURE" 220 LOCATE 21, 5: PRINT "4. CHANGE OF DENSITY" 225 GOSUB 1580 230 COLOR 9: LOCATE 25, 28: PRINT "HIT ANY KEY TO CONTINUE" 235 WHILE INKEY$ = "": WEND 240 CLS : COLOR 14 250 PRINT "SELECT INITIAL NUMBER OF MOLECULES " 260 PRINT " MINIMUM = 10 MAXIMUM = 40" 270 PRINT 280 INPUT " NUMBER OF MOLECULES = ", NMOL1 290 NMOL = NMOL1 300 PRINT "": COLOR 11: PRINT "SELECT INITIAL TEMPERATURE (KELVIN)" 310 PRINT " MINIMUM = 100 MAXIMUM = 800" 320 PRINT 330 INPUT " TEMPERATURE = ", T0: T = T0 340 VCON = SQR(T / TK0) 345 KE0 = (VCON * U0 * NMOL) ^ 2: REM INITIAL KE 350 PRINT "": COLOR 12 360 PRINT " TEMPERATURE CHANGE OPTION" 370 PRINT " TYPE 1 TO MAKE TEMPERATURE FALL" 380 PRINT " TYPE 2 TO KEEP TEMPERATURE SAME" 390 PRINT " TYPE 3 TO MAKE TEMPERATURE RISE" 400 INPUT "ENTER YOUR CHOICE = ", TCH 410 DT = 1 + (TCH - 2) / 50 420 IF DT = 1 THEN 430 ELSE 500 430 COLOR 13: PRINT "" 440 PRINT " DENSITY CHANGE OPTION" 450 PRINT " TYPE 1 TO REMOVE MOLECULES" 460 PRINT " TYPE 2 TO KEEP MOLECULES" 470 PRINT " TYPE 3 TO ADD MOLECULES" 480 INPUT "ENTER YOUR CHOICE = ", NCH 490 DN = NCH - 2 495 COLOR 9: LOCATE 25, 25: PRINT "PRESS ANY KEY TO START MOLECULES" 497 WHILE INKEY$ = "": WEND 500 CLS : COLOR 15 510 REM DRAW MOLECULES AND PISTON WALL 520 CIRCLE (100, 100), 1 530 PAINT (100, 100) 540 GET (99, 99)-(101, 101), A 550 PUT (99, 99), A, XOR 560 LINE (40, 48)-(98, 50), 5, BF 570 GET (40, 48)-(98, 50), B 580 PUT (40, 48), B, XOR 600 R = R + 1 620 RANDOMIZE R 640 LOCATE 1, 1: PRINT "TEMP = "; T0 660 LOCATE 1, 35: PRINT "NUMBER OF MOLECULES = "; NMOL 670 LOCATE 4, 3: PRINT "TIME = " 680 LOCATE 2, 1: PRINT "DENSITY = " 690 REM SET INITIAL POSITION AND SPEED OF BALLS 700 REM POSITION X HORIZONTAL, Y VERTICAL 710 REM SPEED U HORIZONTAL, V VERTICAL 720 REM YPIS IS PISTON LOCATION 730 G = G * NMOL 740 YPIS = 470 - 2 * NMOL * T / TK0 750 IF YPIS > 420 THEN YPIS = 420 760 FOR I = 1 TO 41 770 X(I) = INT(50 * RND(R)) + 295 780 U(I) = U0 * NMOL * VCON * SQR(RND(R)) 790 V(I) = U0 * NMOL * VCON * SQR(RND(R)) 800 IF RND(R) - .5 < 0 THEN U(I) = -U(I) 810 IF RND(R) - .5 < 0 THEN V(I) = -V(I) 820 IF I > NMOL THEN Y(I) = 470: GOTO 840 830 Y(I) = INT((468 - YPIS) * RND(R)) + YPIS + 3 840 NEXT I 850 FOR I = 1 TO NMOL 860 KE = KE + V(I) ^ 2 870 NEXT I 910 LINE (285, 80)-(290, 480), 2, BF 920 LINE (350, 80)-(355, 480), 2, BF 930 LINE (285, 475)-(355, 480), 2, BF 940 PUT (291, YPIS), B, XOR 950 FOR I = 1 TO NMOL 960 PUT (X(I), Y(I)), A, XOR 970 NEXT I 980 VP1 = VPIS 990 TSEC = TSEC + 1 1000 LOCATE 2, 10: PRINT CINT(350 * NMOL / (475 - YPIS)) / 100 1010 LOCATE 4, 9: PRINT TSEC 1020 FOR I = 1 TO NMOL 1030 PUT (X(I), Y(I)), A, XOR 1040 REM IF BALLS REACH SIDE WALLS REVERSE U 1050 IF X(I) > 346 THEN U(I) = -ABS(U(I)) 1060 IF X(I) < 292 THEN U(I) = ABS(U(I)) 1070 IF Y(I) < YPIS + 4 AND V(I) < VPIS THEN GOSUB 1210 1080 IF Y(I) > 471 THEN V(I) = -ABS(V(I)) 1090 X(I) = X(I) + U(I) 1100 Y(I) = Y(I) + V(I) 1110 PUT (X(I), Y(I)), A, XOR 1120 NEXT I 1130 REM PISTON MOVEMENT CALCULATIONS 1140 PUT (291, YPIS), B, XOR 1150 VPIS = VPIS + G 1160 YPIS = YPIS + (VP1 + VPIS) / 2 1165 IF YPIS < 80 THEN SOUND 100, 9: GOTO 1610 1170 PUT (291, YPIS), B, XOR 1180 IF TSEC = INT(TSEC / 5) * 5 THEN 1250 1190 GOTO 980 1200 REM PISTON IMPACTS -CENTER OF MASS COORDINATES 1210 VCG = (MPIS * VPIS + V(I)) / (MPIS + 1) 1220 V(I) = -V(I) + 2 * VCG + G / (MPIS + 1) 1230 VPIS = -VPIS + 2 * VCG 1240 RETURN 1250 IF TSEC > TSECMAX THEN 1610 1260 KE = 0 1280 FOR I = 1 TO NMOL 1300 KE = KE + U(I) ^ 2 + V(I) ^ 2 1302 IF V(I) <> 0 THEN QQ = ABS(U(I) / V(I)) ELSE QQ = 1: REM EQUIPARTITION 1304 U(I) = U(I) / QQ 1306 V(I) = V(I) * QQ 1310 NEXT I 1330 LOCATE 1, 10: PRINT CINT(T0 * KE * NMOL1 ^ 2 / (KE0 * NMOL ^ 3)) 1340 IF NMOL < 10 THEN 980 1350 IF DT = 1 THEN 1430 1360 FOR I = 1 TO NMOL 1370 U(I) = U(I) * SQR(DT) 1380 V(I) = V(I) * SQR(DT) 1390 NEXT I 1400 T = T * DT 1410 REM LOCATE 1, 8: PRINT CINT(T) 1420 GOTO 980 1430 IF DN = 0 THEN 980 1440 IF NMOL > 40 THEN 980 1450 IF DN < 0 THEN PUT (X(NMOL), Y(NMOL)), A, XOR 1460 PVCH = (NMOL + DN) / NMOL 1470 NMOL = NMOL + DN 1480 FOR I = 1 TO 40 1490 U(I) = U(I) * PVCH 1500 V(I) = V(I) * PVCH 1510 NEXT I 1520 IF DN > 0 THEN PUT (X(NMOL), Y(NMOL)), A, XOR 1530 G = G * PVCH 1540 LOCATE 1, 57: PRINT NMOL 1550 GOTO 980 1560 END 1570 REM TIME DELAY LOOP 1580 FOR I = 1 TO 20000 1590 NEXT I 1600 RETURN 1610 CLS : NCH = 1 1620 PRINT "DO YOU WANT TO DO ANOTHER EXPERIMENT?" 1630 PRINT 1640 PRINT "TYPE Y OR N " 1650 Y$ = INKEY$: IF Y$ = "Y" OR Y$ = "y" THEN 40 1660 IF Y$ = "N" OR Y$ = "n" THEN 1670 ELSE 1650 1670 CLS : LOCATE 10, 33: PRINT "THATS ALL FOLKS" 1680 END