/* * qm2.java - revised 27 Dec 07 - width 321, height 221 * @author jackord@kw.igs.net * wave pulse on a quantum string * time dependence calculated either directly from the Schrodinger Equation * or from FFSS expansion */ import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class qm2 extends Applet implements ActionListener { int kk=0; int plt=0; int first=0; // Declarations String b1s="P Dens"; Button b1=new Button(b1s); String b2s="R Comp"; Button b2=new Button(b2s); String b3s="Motion"; Button b3=new Button(b3s); Checkbox ch1=new Checkbox("FFSS"); Image bim; Graphics bgr; public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); setBackground(new Color(211, 211, 211)); ch1.setBackground(getBackground()); add(b1); b1.addActionListener(this); add(b2); b2.addActionListener(this); add(b3); b3.addActionListener(this); add(ch1); } public void paint(Graphics g) { int n, nf, nk, c, jt, del, delt; n=320; nf=320; c=30; nk=4; // Loop constants double [] yr=new double[n+1]; double [] yrr=new double[n+1]; double [] dyr=new double[n+1]; double [] yi=new double[n+1]; double [] yii=new double[n+1]; double [] dyi=new double[n+1]; double [] b=new double[n+1]; double [] d=new double[n+1]; double [] w=new double[n+1]; int [] xx=new int[n+1]; int [] yy=new int[n+1]; double dt, pi, phi, sn; pi=Math.PI; dt=n*n/4/pi/c/nf/nk/nk; // d(t/T1) * constants g.drawRect(0, 0, 320, 220); if (first==0) { bim=createImage(321, 221); // Animation buffer bgr=bim.getGraphics(); first=1; } for (int i=0; i<=n; i=i+1) { xx[i]=i; } for (int i=3*n/8; i<=5*n/8; i=i+1) { // Initial wave fcn phi=2*pi*(i-3*n/8)/(n/4); yr[i]=(1-Math.cos(phi))/2; yi[i]=-yr[i]*Math.sin(phi*nk); yr[i]=yr[i]*Math.cos(phi*nk); } if (ch1.getState()==true) { // FFSS for (int i=1; i<=n-1; i=i+1) { for (int j=1; j<=n-1; j=j+1) { sn=Math.sin(pi*i*j/n); b[i]=b[i]+yr[j]*2/n*sn; d[i]=d[i]+yi[j]*2/n*sn; } w[i]=i*i*2*pi/8/nf/16; } } else { for (int i=1; i<=n-1; i=i+1) { // Initialize dy step dyr[i]=dt*(yi[i-1]+yi[i+1]-2*yi[i]); dyi[i]=-dt*(yr[i-1]+yr[i+1]-2*yr[i]); } } if (kk>0) { jt=0; long tt=System.currentTimeMillis(); del=25; do { // Frame loop for (int i=0; i<=n; i=i+1) { if (kk==1) { // Plot prob dens... yy[i]=220-(int)(160*(yr[i]*yr[i]+yi[i]*yi[i])+.5); } else { // ...or real comp yy[i]=120-(int)(80*yr[i]+.5); } } bgr.setColor(getBackground()); // Set up plot buffer bgr.fillRect(0, 0, 320, 220); bgr.setColor(Color.blue); if (kk==1) { bgr.fillPolygon(xx, yy, n+1); // Draw filled polygon } else { bgr.drawPolyline(xx, yy, n+1); // Draw polyline } bgr.setColor(Color.black); bgr.drawRect(0, 0, 320, 220); bgr.drawString("Frm "+jt+"/"+nf, 245, 20); g.drawImage(bim, 0, 0, null); // Show plot buffer jt=jt+1; if (ch1.getState()==true) { // FFSS for (int i=0; i<=n; i=i+1) { yr[i]=0; yi[i]=0; for (int k=1; k<=n-1; k=k+2) { sn=Math.sin(pi*i*k/n); yr[i]=yr[i]+sn*b[k]*Math.cos(w[k]*jt); yi[i]=yi[i]+sn*b[k]*Math.sin(w[k]*jt); } for (int k=2; k<=n-2; k=k+2) { sn=Math.sin(pi*i*k/n); yr[i]=yr[i]-sn*d[k]*Math.sin(w[k]*jt); yi[i]=yi[i]+sn*d[k]*Math.cos(w[k]*jt); } } } else { // Schrodinger eqn for (int jj=1; jj<=c; jj=jj+1) { // Accuracy loop for (int i=1; i<=n-1; i=i+1) { // Project ahead dy/2 yrr[i]=yr[i]+dyr[i]/2; yii[i]=yi[i]+dyi[i]/2; } for (int i=1; i<=n-1; i=i+1) { dyr[i]=dt*(yii[i-1]+yii[i+1]-2*yii[i]); dyi[i]=-dt*(yrr[i-1]+yrr[i+1]-2*yrr[i]); yr[i]=yr[i]+dyr[i]; yi[i]=yi[i]+dyi[i]; } } } while (tt>System.currentTimeMillis()) { } tt=tt+del; if (jt==nf+1) { kk=0; plt=0; } } while (plt==1); } } public void actionPerformed(ActionEvent e) { // Buttons String tst; tst=e.getActionCommand(); if (b1s.equals(tst)) { kk=1; } // Prob dens if (b2s.equals(tst)) { kk=2; } // Real comp if (b3s.equals(tst)) { if (kk>0) { plt=1; } } // Motion repaint(); } }