import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Event;
import java.awt.Button;
import java.awt.Window;
import java.awt.Component;
// import java.io.*;
// import java.lang.*;
import java.util.Date;
public class kdv extends Applet {
    static int IXMIN=0,IXMAX=639,IYMIN=0,IYMAX=399;
    static int N=50,ICTNO=500;
    static double XMIN=0.0,XMAX=10.0,YMIN=-1.0,YMAX=3.0;
    static double DELTA=0.01;
    static double U[][]=new double [3][51];
    static double U0[][]=
        {{-0.000151,0.000284,0.001736,0.017523,0.153226,1.147860,1.948283,
          0.768024,0.078650,0.009988,0.000952,0.000112,0.000012,0.000001,
          0.000000,0.000000,0.009064,0.015259,0.081889,0.362944,0.629628,
          0.322767,0.069772,0.014776,0.003280,0.000394,0.000248,0.000000,
          0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,0.000000,
          0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
          0.000000,0.000000,0.000000,-0.000544,0.000469,-0.000377,0.000278,
          0.000000,0.000000},
         {0.000187,0.000107,0.001436,0.015226,0.126590,1.038558,1.968805,
          0.868573,0.094202,0.011775,0.001115,0.000134,0.000014,0.000002,
          0.000000,0.000000,0.009049,0.014507,0.078994,0.353190,0.630171,
          0.332399,0.072368,0.015376,0.003389,0.000417,0.000254,0.000000,
          0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,0.000000,
          0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,
          0.000000,0.000369,-0.000482,0.000498,-0.000451,0.000371,-0.000270,
          0.000000,0.000000},
         {0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0,0.0,0.0,0.0,0.0,0.0,
          0.0,0.0}};
    static double HX=(XMAX-XMIN)/N;
    static double HT=HX*HX*HX*0.5;
    static double C1=-6*HT/HX;
    static double C2=-2*HT/HX/HX/HX*DELTA;
    boolean STOP=false;
    Button resbt,conbt,quibt;

    static int IGX(double X) {
        return (int)(IXMIN+(X-XMIN)/(XMAX-XMIN)*(IXMAX-IXMIN));
    }
    static int IGY(double Y) {
        return IYMAX-(int)(IYMIN+(Y-YMIN)/(YMAX-YMIN)*(IYMAX-IYMIN));
    }
    static int JTR(int J) {
        return (J+N+1)%(N+1);
    }
    void pause(int SEC){
        long x=0;
        while( ++x<210000*SEC);
/*        Date.getTime();
        while (Date.getTime()<x+SEC) {;
        }*/
    }
// Every Applet should have the following methods, but may be abbreviated:
    public void init(){
    	super.init();
        resbt=new Button("RESTART");
        conbt=new Button("CONTINUE");
        quibt=new Button("QUIT");
        add(resbt);
        add(conbt);
        add(quibt);
        initial_value();
    }
    public void start(){
    	super.start();
    }
    public void stop(){
    	super.stop();
    }
// can be compiled but does not work
/*    public boolean handleEvent(Event e){
	if (e.id == Event.MOUSE_DOWN){
            if (e.x>=0 && e.x<=40 && e.y>=30 && e.y<=42){
                STOP=true;
                return super.handleEvent(e);
            }
	}
        STOP=false;
	return super.handleEvent(e);
    }*/
// can be compiled but does not work
/*    public boolean mouseDown(Event evt, int x, int y){
        if (inside(x,y)){
            if (x>=0 && x<=30 && y>=60 && y<=72){
                STOP=true;
                return true;
            }
        }
        STOP=false;
        return false;
    }*/
    public boolean action(Event evt, Object arg){
//        if (getLabel()=="STOP"){
        if (evt.target==resbt) {
            initial_value(); repaint(); return true;
        } else if (evt.target==conbt) {
            repaint(); return true;
        } else if (evt.target==quibt) {
            hide(); return true;
        } else {
            return false;
        }
//            java.awt.Window.dispose();
/*      if (evt.target instanceof Button){
            String label = (String)arg;
            if (label.equals("STOP")){
                 finalize();
                 destroy();
            }*/
//        } else return false;
//        return false;
    }
    boolean checkstop(Graphics g){
        if (STOP==true){
            g.draw3DRect(0,30,40,12,false);
            return true;
        }
        return false;
    }
    void initial_value(){
        int i,j;
        for (i=0;i<=1;i++){
            for (j=0;j<=50;j++){
                U[i][j]=U0[i][j];
            }
        }
    }
    static void drawsub(Graphics g, int I) {
        int J, IX, IY, IX2, IY2;
        double X;
        X=XMIN;
        IX=IGX(X);
        IY=IGY(U[I][0]);
        for (J=1; J<=N; J++) {
            X=X+HX;
            IX2=IGX(X);
            IY2=IGY(U[I][J]);
	    g.drawLine(IX,IY,IX2,IY2);
            IX=IX2;
            IY=IY2;
        }
    }

    public void paint (Graphics g){
        int ICT;
        int I0,I1,I,J;
        Color Fore,Back;
        Fore=getForeground();
        Back=getBackground();

        g.setColor(Fore);
//        g.draw3DRect(0,30,40,12,true);
//        java.awt.Font f=new java.awt.Font("TimesRoman", java.awt.Font.PLAIN,8);
//        g.drawString("STOP",4,32);
        I1=0;
        I=1;
        g.setColor(Fore);
        drawsub(g,I);
//        pause(2);
        ICT=0;
        while (ICT<=ICTNO) {
            ICT++;
            I0=I1;
            I1=I;
            I=(I+1)%3;
            for (J=0;J<=N;J++) {
                U[I][J]=U[I0][J]
                        +C1*(U[I1][JTR(J-1)]+U[I1][JTR(J)]+U[I1][JTR(J+1)])/3
                           *(U[I1][JTR(J+1)]-U[I1][JTR(J-1)])
                        +C2*((U[I1][JTR(J+2)]-U[I1][JTR(J-2)])/2
                             -U[I1][JTR(J+1)]+U[I1][JTR(J-1)]);
            }
//          g.setXORMode(Back);
            g.setColor(Back);
            drawsub(g,I1);
            g.setColor(Fore);
            drawsub(g,I);
            g.drawLine(IGX(XMIN),IGY(0.0),IGX(XMAX),IGY(0.0));
//            pause(2);
//            if (checkstop(g)==true) break;
        }
    }
}
/* class showdata extends PrintStream {
      public void showkdv (int I){
          int J;
          println();
          for (J=0;J<=10;J++) print(kdv.U[I][J]);
      }
}*/