import java.io.*;
import visad.*;
import visad.java3d.DisplayImplJ3D;
import visad.java2d.DisplayImplJ2D;
import java.rmi.RemoteException;

class HT_xt_FD2
{   	       
  public static double T0(double x)
  {//temperature distribution at t=0 second
  double f=40*Math.sin(x*2.0*Math.PI);
  return f;
  }
  	
  public static double [][] HT_xtcoz( double L,double t, double dt,double T0[],double alpha)
  {
  //  L duvar kalınlığı
  //  t maksimum zaman
  //  dt zaman stebi 
  int nx=T0.length; //x step sayısı
  double dx=L/nx; //x steb uzunluğu
  int nt=(int)(t/dt+0.001);
  double r=alpha*dt/(dx*dx);
  if(r>0.5) System.out.println("r="+r+" is larger than 0.5");
  double T[][]=new double[nt][nx];
  for(int m=0;m<nx;m++) {T[0][m]=T0[m];} 
  for(int i=1;i<nt;i++)
  { T[i][0]=T0[0];
    T[i][nx-1]=T0[nx-1];
	for(int m=1;m<(nx-1);m++)
    { T[i][m]=r*(T[i-1][m-1]+T[i-1][m+1])+(1-2.0*r)*T[i-1][m]; 
  }
  }
  return T;
  }
  
         
  public static void main(String args[]) throws IOException,RemoteException, VisADException
  {
	  double T0[]=new double[40];
	  double L=1.0;
	  // t=0 daki T0(x) sıcaklık profili 
	  for(int m=0;m<T0.length;m++) {T0[m]=T0(L*m/40.0);}
	  T0[0]=100.0;  //x=x0 da t>0 zamanı için duvar sıcaklığı sınır şartı
	  //T0[39]=100.0; //x=xn de t>0 zamanı için duvar sıcaklığı sınır şartı
	  double t=5.0; //sn toplam zaman
	  double dt=0.03; //sn gerçek zaman adımı
	  double dtplot=0.3; //sn her bir plotta bekleme zamanı
	  double alfa=17.7e-4;
	  double x0=0.0;
	  double xn=L;
	  double a[][]=HT_xtcoz(L,t,dt,T0,alfa);
	  double b[][]=Matrix.T(a);
	  System.out.println(Matrix.toString(a));
	  timeplot p=new timeplot(a,x0,xn,dtplot,dt);
      p.start();
	  
	  //Plot3D.data(a,0.0,20.0,0.0,1.0,20,"x","t","T=f(x,t)");
  }
}