PROGRAM maxwell! implementation of Yee-Visscher algorithmLIBRARY "csgraphics"PUBLIC E(0 to 21,0 to 21,0 to 21,3),B(0 to 21,0 to 21,0 to 21,3)PUBLIC j(0 to 21,0 to 21,0 to 21,3)PUBLIC n(3),dt,dlPUBLIC mid,fpi,dl_1CALL initial(escale,bscale,jscale)CALL screen(#1,#2,#3)DO  CALL current(t)  CALL newE  CALL newB  CALL plotfields(escale,bscale,jscale,#1,#2,#3)  DO  LOOP until key input  GET KEY kLOOP until k = ord("s")ENDSUB initial(escale,bscale,jscale)   DECLARE PUBLIC E(,,,),B(,,,)   DECLARE PUBLIC n(),dt   DECLARE PUBLIC mid,fpi,dl_1   LET dt = 0.03   LET n(1) = 8   LET n(2) = 8   LET n(3) = 8   LET mid = n(1)/2   LET dl = 0.1   LET dl_1 = 1/dl   LET fpi = 4*pi   LET escale = dl/(4*pi*dt)   LET bscale = escale*dl/dt   LET jscale = 1   FOR x = 1 to n(1)     FOR y = 1 to n(2)       FOR z = 1 to n(3)         FOR comp = 1 to 3           LET E(x,y,z,comp) = 0           LET B(x,y,z,comp) = 0         NEXT comp       NEXT z     NEXT y   NEXT xEND SUBSUB current(t)   DECLARE PUBLIC j(,,,),n(),mid   ! steady current loop in x-y plane turned on at t = 0 and left on   LET j(mid,mid,mid,2) = 1   LET j(mid,mid,mid,1) = -1   LET j(mid-1,mid,mid,2) = -1   LET j(mid,mid-1,mid,1) = 1END SUBSUB newE   ! E defined at the faces   DECLARE PUBLIC E(,,,),B(,,,),j(,,,)   DECLARE PUBLIC n(),dt,dl_1,fpi   FOR x = 1 to n(1)     FOR y = 1 to n(2)       FOR z = 1 to n(3)         LET curlBx = B(x,y,z,2)+B(x,y+1,z,3)-B(x,y,z+1,2)-B(x,y,z,3)         LET curlBx = curlBx*dl_1         LET E(x,y,z,1) = E(x,y,z,1) + dt*(curlBx - fpi*j(x,y,z,1))         LET curlBy = B(x,y,z,3)-B(x,y,z,1)+B(x,y,z+1,1)-B(x+1,y,z,3)         LET curlBy = curlBy*dl_1         LET E(x,y,z,2) = E(x,y,z,2) + dt*(curlBy - fpi*j(x,y,z,2))         LET curlBz = B(x,y,z,1)+B(x+1,y,z,2)-B(x,y+1,z,1)-B(x,y,z,2)         LET curlBz = curlBz*dl_1         LET E(x,y,z,3) = E(x,y,z,3) + dt*(curlBz - fpi*j(x,y,z,3))       NEXT z     NEXT y   NEXT xEND SUBSUB newB   ! B defined at the edges   DECLARE PUBLIC E(,,,),B(,,,)   DECLARE PUBLIC n(),dt,dl_1   FOR x = 1 to n(1)     FOR y = 1 to n(2)       FOR z = 1 to n(3)         LET curlEx = E(x,y,z,3)-E(x,y,z,2)-E(x,y-1,z,3)+E(x,y,z-1,2)         LET curlEx = curlEx*dl_1         LET B(x,y,z,1) = B(x,y,z,1) - curlEx*dt         LET curlEy = E(x,y,z,1)-E(x,y,z,3)-E(x,y,z-1,1)+E(x-1,y,z,3)         LET curlEy = curlEy*dl_1         LET B(x,y,z,2) = B(x,y,z,2) - curlEy*dt         LET curlEz = E(x,y,z,2)-E(x,y,z,1)-E(x-1,y,z,2)+E(x,y-1,z,1)         LET curlEz = curlEz*dl_1         LET B(x,y,z,3) = B(x,y,z,3) - curlEz*dt       NEXT z     NEXT y   NEXT xEND SUBSUB screen(#1,#2,#3)   DECLARE PUBLIC n()   LET L = n(1)   CALL compute_aspect_ratio(L+1,xwin,ywin)   SET BACKGROUND COLOR "black"   OPEN #1: screen 0,.5,0,.5   SET WINDOW 0,xwin,0,ywin   SET COLOR "white"   OPEN #2: screen 0.5,1,0.5,1   SET WINDOW 0,xwin,0,ywin   SET COLOR "white"   OPEN #3: screen 0.5,1,0,0.5   SET WINDOW 0,xwin,0,ywin   SET COLOR "white"   OPEN #4: screen 0,0.5,0.5,1   SET COLOR "white"   SET CURSOR 1,1   PRINT "Type s to stop"   PRINT   PRINT "Type any other key for next time step"END SUBSUB plotfields(escale,bscale,jscale,#1,#2,#3)   DECLARE PUBLIC E(,,,),B(,,,),j(,,,)   DECLARE PUBLIC n(),dt,mid   WINDOW #1   CLEAR   PRINT "E(x,y)"   FOR x = 1 to n(1)     FOR y = 1 to n(2)       CALL plotarrow(E(x,y,mid,1),x,y,escale,0,0.5,0,pi)       CALL plotarrow(E(x,y,mid,2),x,y,escale,0.5,0,pi/2,3*pi/2)     NEXT y   NEXT x   WINDOW #2   CLEAR   PRINT "B(x,z)"   FOR x = 1 to n(1)     FOR z = 1 to n(3)       CALL plotarrow(B(x,mid,z,1),x,z,bscale,0.5,0,0,pi)       CALL plotarrow(B(x,mid,z,3),x,z,bscale,0,0.5,pi/2,3*pi/2)     NEXT z   NEXT x   WINDOW #3   CLEAR   PRINT "j(x,y)"   FOR x = 1 to n(1)     FOR y = 1 to n(2)       CALL plotarrow(j(x,y,mid,1),x,y,jscale,0,0.5,0,pi)       CALL plotarrow(j(x,y,mid,2),x,y,jscale,0.5,0,pi/2,3*pi/2)     NEXT y   NEXT xEND SUBSUB plotarrow(V,x,y,scale,shiftx,shifty,angle1,angle2)   IF V > 0 then      DRAW arrow(V/scale) with rotate(angle1)*shift(x+shiftx,y+shifty)   ELSE IF V < 0 then      DRAW arrow(-V/scale) with rotate(angle2)*shift(x+shiftx,y+shifty)   END IFEND SUBPICTURE arrow(x)   SET COLOR "yellow"   PLOT LINES: -0.25*x,0;0.25*x,0;0.12*x,0.12*x   PLOT LINES: 0.25*x,0;0.12*x,-0.12*x   SET COLOR "white"END PICTURE