import java.awt.*; import java.applet.*; //copyright 2000 M Paez, U Antioquia, R landau, OSU public class Soliton extends Applet implements Runnable { Thread runstring; private Image offScreenImage; double mxx,bxx,myy,byy; int jj; public void start() { if(runstring==null); { runstring=new Thread(this); runstring.start(); } } public void stop() { if(runstring != null){ runstring.stop(); runstring=null; } } public void run() { while(true){ repaint(); try{ Thread.sleep(1000); } catch(InterruptedException e){ } } } public void update(Graphics g) { //To avoid flicker Graphics offScreenGraphics=offScreenImage.getGraphics(); offScreenGraphics.setColor(getBackground()); offScreenGraphics.fillRect(0,0,size().width,size().height); offScreenGraphics.setColor(g.getColor()); paint(offScreenGraphics); g.drawImage(offScreenImage,0,0,this); } void coormundo(double xiz,double ysu,double xde,double yinf) { double maxx,maxy,xxfin,xxcom,yyin,yysu; maxx=600; maxy=450; xxcom=0.15*maxx; xxfin=0.75*maxx; yyin=0.8*maxy; yysu=0.2*maxy; mxx=(xxfin-xxcom)/(xde-xiz); bxx=0.5*(xxcom+xxfin-mxx*(xiz+xde)); myy=(yyin-yysu)/(yinf-ysu); byy=0.5*(yysu+yyin-myy*(yinf+ysu)); } void ejes(double xmz,double yms,double xmd,double ymi,Graphics g) { //Plots axis // La entrada esta en coordenadas 0.0 a 1.0 int i,mp,xpi,xpd,yps,ypi,xdiv,ydiv,ypcen; double yincr,xincr,yte; //char nhorz[3],nver[15]; char nver; int sig=4; ydiv=1; xpi=(int)(mxx*xmz+bxx); xpd=(int)(mxx*xmd+bxx); yps=(int)(myy*yms+byy); ypi=(int)(myy*ymi+byy); ypcen=(int)byy; g.drawLine(xpi,ypcen,xpd,ypcen); g.drawLine(xpi,2*yps,xpi,ypi); } public void init() { jj=1; offScreenImage=createImage(size().width,size().height); } public void paint(Graphics g){ Equation(g,jj); jj=jj+40; if(jj>2200)jj=1; } public void Equation(Graphics g,int jj) { double ds,dt,mu,eps,tanhy,exp2; int i, j, k,max; int peo,peye,pex,peyo; double a1,a2,a3, fac, time, u[][]; u=new double[131][3]; ds= 0.4; /* delta x */ dt= 0.1; /* delta t */; max= 2000; peo=0; peyo=0; pex=0; peye=0; /* time steps */ mu= 0.1; /* mu from KdeV equation */ eps= 0.2; /* epsilon from KdeV eq. */ for(i=0; i<131; i++) /* initial wave form */ { exp2=Math.exp(-2*(0.2*ds*i-5.0)); u[i][0] = 0.5*(1.0 - (1.0-exp2)/(1.0+exp2)); } u[0][1] =1.; /* end points */ u[0][2] =1.; u[130][1] =0.; u[130][2] =0.; fac = mu*dt/(ds*ds*ds); time = dt; for(i=1; i<130; i++) /* first time step */ { if(i==1){ coormundo(0.0,2.5,131,0.0); ejes(0.0,2.5,131,0.0,g); } a1 = eps*dt*(u[i+1][0] + u[i][0] + u[i-1][0]) / (ds*6.0); if((i>1) && (i<129)) { a2 = u[i+2][0] + 2.0*u[i-1][0] - 2.0*u[i+1][0] - u[i-2][0]; } else a2 = u[i-1][0] - u[i+1][0]; a3 = u[i+1][0]-u[i-1][0]; u[i][1] = u[i][0] - a1*a3 - fac*a2/3.; } for(j=1; j1) && (i<129)) { a2 = u[i+2][1] + 2.0*u[i-1][1] - 2.0*u[i+1][1] - u[i-2][1]; } else a2 = u[i-1][1] - u[i+1][1]; a3 = u[i+1][1] - u[i-1][1]; u[i][2] = u[i][0] - a1*a3 - 2.*fac*a2/3.; } for(k=0; k<131; k++) /* move one step ahead */ { u[k][0] = u[k][1]; u[k][1] = u[k][2]; } //if((j%200)==0) /* plot every 200th step */ if(j==jj) { for(k=0; k<131; k++) { if(k>0){ //fprintf(output, "%f\n", u[k][2]); peo=(int)(mxx*(k-1)+bxx); peyo=(int)(myy*u[k-1][2]+byy); pex=(int)(mxx*k+bxx); peye=(int)(myy*u[k][2]+byy); g.drawLine(peo,peyo,pex,peye); } }//for k } //if }//for j } //rutine }//class