10 ' 20 ' WAVE PATTERNS IN TWO DIMENSIONS 30 ' 40 '--------------------- 1/5/88 ------------------------- 50 ' 60 ' This program displays interference patterns which ' are calculated for two point sources of waves. ' The wave amplitude from each source is assumed to ' be independent of angle, and it varies as the ' inverse first power of the distance from the ' source. 110 ' 120 ' --> LIST OF PROCEDURES: <-- 130 ' 140 GOSUB 290 'INITIALIZATIONS 150 GOSUB 510 'INPUT 160 GOSUB 970 'LOOP OVER Y COORDINATE OF PLOT 170 GOSUB 1120 'PRINT OUTPUT 180 ' 190 PRINT 200 PRINT 210 INPUT "WANT TO RUN ANOTHER (Y/N)? ", AGAIN$ 220 IF AGAIN$ = "Y" OR AGAIN$ = "y" THEN 150 230 ' 240 GOSUB 1370 'HOW-TO-PRINT MESSAGE 250 END 260 ' 270 ' 280 '------------------------------------------------------ 290 'INITIALIZATIONS 300 ' 310 DIM E$(7, 101), EE$(7, 51), FLAG(7, 51), CHAR$(7) 320 RNT(101), THRES(7) 330 ' -- These data define the characters for plotting: 340 ' 350 DATA " ","I","-","X","0","#","M" 360 FOR I = 1 TO 7 370 READ CHAR$(I) 380 NEXT I 390 ' 400 ' -- These data define the intensity thresholds for 410 ' the plot: 420 DATA .005,.01,.02,.04,.08,.16,.32 430 FOR I = 1 TO 7 440 READ THRES(I) 450 NEXT I 460 WIDTH "LPT1:", 255 470 PI = 3.14159265# 480 ' 490 RETURN 500 '------------------------------------------------------ 510 'INPUT 520 ' 530 CLS 540 ' 550 PRINT "TWO VARIABLES SET SIZE OF THE PLOT IN X AND Y" 560 PRINT "XSCLE AND YSCLE MUST BE LESS THAN 1.0 FOR PRINT " MAX SIZE" 570 PRINT "WE HAVE USED .78 FOR EACH" 580 INPUT "XSCLE = "; XSCLE 590 INPUT "YSCLE = "; YSCLE 600 PRINT 610 PRINT "INPUT VALUES FOR THE FOLLOWING:" 620 PRINT 630 PRINT " SEPARATION BETWEEN SOURCES: DL" 640 PRINT " RATIO OF SOURCE STRENGTHS: RTIO" 650 PRINT " WAVELENGTH #1: L1" 660 PRINT " WAVELENGTH #2: L2" 670 PRINT " VELOCITY OF SOURCE #1: V" 680 ' 690 ' NY-MAX can be small for debugging, 700 ' 0 (standard) for running: 710 PRINT "# PRINTED LINES (0 FOR 'ALL'): NY-MAX" 720 PRINT 730 PRINT "SEPARATE INPUT VALUES WITH COMMAS, PRESS RETURN" 740 PRINT 750 NYR = 0 760 INPUT DL, RTIO, L1, L2, V, NYR 770 PRINT 780 ' 790 IF NYR <> 0 THEN NY1 = NYR 800 XSCLE = INT(51 * XSCLE) / 51 810 YSCLE = INT(31 * YSCLE) / 31 820 SCLE = (XSCLE + YSCLE) / 2 830 IF NYR = 0 THEN NY1 = INT(60 * YSCLE) + 1 840 NX1 = INT(100 * XSCLE) + 1 850 ' 860 ' -- Source #1 is given strength 1.0. 870 ' Source #2 is given strength RTIO. 880 ' 890 S1 = 1 900 ' 910 S2 = RTIO 920 'L1 = L1 + .000001 930 'L2 = L2 + .000001 940 ' 950 RETURN 960 '------------------------------------------------------ 970 'LOOP OVER Y-COORDINATE OF PLOT 980 ' 990 FOR NY = 1 TO NY1 1000 ' 1010 PRINT " > Working on line "; NY; " of "; NY1; 1020 LOCATE , 1 1030 ' 1040 GOSUB 1480 'RESULTANT INT'S RNT(NX) for all NX 1050 ' 1060 GOSUB 2040 'LINE-PLOT STRINGS ES$(RNT,THRES,CHAR$) 1070 ' 1080 NEXT NY 1090 ' 1100 RETURN 1110 '------------------------------------------------------ 1120 'PRINT OUTPUT 1130 ' 1140 OPEN "M353-P1B.DAT" FOR OUTPUT AS #1 1150 ' 1160 PRINT #1, "XSCLE = "; XSCLE 1170 PRINT #1, "YSCLE = "; YSCLE 1180 PRINT #1, "DL= "; DL 1190 PRINT #1, "RTIO= "; RTIO 1200 PRINT #1, "L1= "; L1 1210 PRINT #1, "L2= "; L2 1220 R$ = CHR$(13) 1230 PRINT #1, "V= "; V 1240 ' 1250 FOR NY = 1 TO NY1 1260 FOR NC = 2 TO 7 1270 IF FLAG(NC, NY) = 0 THEN 1290 1280 PRINT #1, EE$(NC, NY); STRING$(LEN(EE$(NC, NY)),_ CHR$(8)); 1290 NEXT NC 1300 PRINT #1, 1310 NEXT NY 1320 ' 1330 CLOSE #1 1340 ' 1350 RETURN 1360 '------------------------------------------------------ 1370 'HOW-TO-PRINT MESSAGE 1380 ' 1390 PRINT 1400 PRINT "TO PRINT OUTPUT FILE:" 1410 PRINT " Ok" 1420 PRINT " SYSTEM" 1430 PRINT " C>TYPE M353-P1B.DAT" 1440 PRINT 1450 ' 1460 RETURN 1470 '------------------------------------------------------ 1480 'CALC RESULTANT INTENSITY RNT(NX) for NX = (1,NX1) 1490 ' 1500 FOR NX = 1 TO NX1 1510 X = NX / (5 * XSCLE) - 10.2 1520 Y = NY / (3 * YSCLE) - 10.3333 1530 ' 1540 ' -- R1 and R2 are the distances from each source 1550 ' to the point (X,Y). 1560 IF S2 <> 0 THEN R2 = SQR(X ^ 2 + (Y - DL / 2) ^ 2) 1570 ' 1580 GOSUB 1850 'CALC R1(V,X,Y) 1590 ' 1600 ' -- A1 and A2 are the amplitudes of each wave 1610 ' at the point (X,Y). 1620 IF R1 = 0 THEN A1 = S1 * 2 * PI / L1 1630 IF S2 = 0 THEN A2 = 0 1640 IF S2 <> 0 AND R2 = 0 THEN A2 = S2 * 2 * PI / L2 ELSE 1650 IF R1 <> 0 THEN A1 = S1 * SIN(2 * PI * R1 / L1) / R1 1660 IF S2 <> 0 AND R2 <> 0 THEN A2=S2*SIN(2*PI*R2/L2)/R2 1670 ' 1680 ' -- RNT is the resultant intensity of the two waves ' combined (CNS is an arbitrary normalization ' constant). 1700 ' 1710 CNS = 2 / (S1 ^ 2 + S2 ^ 2) 1720 RNT(NX) = CNS * (A1 + A2) ^ 2 1730 ' 1740 ' -- If the point (X,Y) is closer than 0.7 units to ' either source, set the intensity to 0, to make a ' blank region around the location of each source. 1770 ' 1780 IF V = 0 AND R1 <= .7 THEN RNT(NX) = 0 1790 IF V = 0 AND S2 <> 0 AND R2 <= .7 THEN RNT(NX) = 0 1800 ' 1810 NEXT NX 1820 ' 1830 RETURN 1840 '------------------------------------------------------ 1850 'CALC R1(V,X,Y) 1860 ' 1870 IF V = 0 THEN R1 = SQR(X ^ 2 + (Y + DL / 2) ^ 2): RETURN 1880 ' 1890 D = 3 * V 1900 IF D > 10 THEN D = 10 1910 B = 2 * D / V ^ 2 - 2 * X 1920 C = X ^ 2 + Y ^ 2 - (D / V) ^ 2 1930 ' 1940 IF V = 1 THEN X0 = -C / B: R1 = SQR((X - X0) ^ 2 + Y ^ 2): RETURN 1950 ' 1960 A = 1 - 1 / V ^ 2 1970 DISCR = B ^ 2 - 4 * A * C: IF DISCR < 0 THEN R1 = L1: RETURN 1980 ' 1990 X0 = (-B + SQR(DISCR)) / (2 * A): IF X0 > D THEN R1 = L1: RETURN 2000 R1 = SQR((X - X0) ^ 2 + Y ^ 2) 2010 ' 2020 RETURN 2030 '------------------------------------------------------ 2040 'CALC LINE-PLOT STRINGS ES$(RNT,THRES,CHAR$) 2050 ' 2060 FOR NC = 2 TO 7 2070 FLAG(NC, NY) = 0 2080 FOR NX = 1 TO NX1 2090 E$(NC, NX) = CHAR$(1) 2100 IF RNT(NX) >= THRES(NC) THEN 2105 FLAG(NC, NY) = 1: E$(NC, NX) = CHAR$(NC) 2110 NEXT NX 2120 NEXT NC 2130 ' 2140 ' -- Construct output line. 2150 ' 2160 FOR NC = 2 TO 7 2170 EE$(NC, NY) = "" 2180 IF FLAG(NC, NY) = 0 THEN GOTO 2220 2190 FOR NX = 1 TO NX1 2200 EE$(NC, NY) = EE$(NC, NY) + E$(NC, NX) 2210 NEXT NX 2220 NEXT NC 2230 ' 2240 RETURN 2250 '-------------- END OF PROGRAM LINES ------------------