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

class HT_xt_FDA
{ public static double [] thomas(double a[][],double b[])
  {
  //3 band matrix
  int n=a.length;
  double f[]=new double[n];
  double e[]=new double[n];
  double g[]=new double[n];
  double x[]=new double[n];
  for(int i=0;i<n;i++)     {f[i]=a[i][i];}
  for(int i=0;i<(n-1);i++) {g[i]=a[i][i+1];}
  for(int i=0;i<(n-1);i++) {e[i+1]=a[i+1][i];}
  for(int k=1;k<n;k++)
     {e[k]=e[k]/f[k-1];
      f[k]=f[k]-e[k]*g[k-1];
     }
  for(int k=1;k<n;k++)
     {b[k]=b[k]-e[k]*b[k-1];
     }
  x[n-1]=b[n-1]/f[n-1];   
  for(int k=(n-2);k>=0;k--)
      {x[k]=(b[k]-g[k]*x[k+1])/f[k];}
  return x;      
  }
  public static double [][] q(double k, double dx,double T[][])
  {int nx=T[0].length;
   int nt=T.length;
   double qi[][]=new double[nt][nx-1];
     for(int p=0;p<nt;p++)
     {  for(int m=1;m<nx;m++)
        { qi[p][m-1]=-k*(T[p][m]-T[p][m-1])/dx;}
     }
     return qi;
  }
 	       	
  public static double [][] HT_xtcoz(double fi, double L,double t, double dt,double T0[],double alpha,double T1,double T2)
  {
  //  L duvar kalınlığı
  //  t maksimum zaman
  //  dt zaman stebi   
  //  T1 x=0 t>=0 boundary temperature
  //  T2 x=L t>=0 boundary temperature 
  int nx=T0.length; //x step sayısı
  //System.out.println(nx="+nx)
  double A[][]=new double[nx][nx];
  double B[]=new double[nx];
  double dx=L/(nx-1); //x steb uzunluğu
  int nt=(int)(t/dt+0.001);
  double Fo=alpha*dt/(dx*dx);
  double T[][]=new double[nt+1][nx];
  for(int m=0;m<nx;m++) {T[0][m]=T0[m];} 
  for(int p=0;p<nt;p++)
  { //t>0 wall temperatures
    for(int i=0;i<nx;i++)
    {for(int j=0;j<nx;j++)
       {A[i][j]=0;}
       B[i]=0;
    }
	for(int m=0;m<nx;m++)
    { 
	  if(m==0) B[m]=(1.0-2.0*Fo*fi)*T[p][m]+fi*Fo*T[p][m+1]+Fo*T1;
	  else if(m==(nx-1)) B[m]=fi*Fo*T[p][m-1]+(1.0-2.0*Fo*fi)*T[p][m]+Fo*T2;
	  else  B[m]=fi*Fo*T[p][m-1]+(1.0-2.0*Fo*fi)*T[p][m]+fi*Fo*T[p][m+1];
	  if(m==0) 
	  {A[m][m]=(2.0*Fo*(1.0-fi)+1);A[m][m+1]=-(1.0-fi)*Fo;}
	  else if(m==(nx-1)) 
	  {A[m][m]=(2.0*Fo*(1.0-fi)+1);A[m][m-1]=-(1.0-fi)*Fo;}
	  else
	  {A[m][m]=(2.0*Fo*(1.0-fi)+1);A[m][m-1]=-(1.0-fi)*Fo;A[m][m+1]=-(1.0-fi)*Fo;}
    }
    T[p+1]=thomas(A,B);
  }
  return T;
  }
       
  public static void main(String args[]) throws IOException,RemoteException, VisADException
  {
	  double T0[]=new double[81];
	  double L=0.1;
	  // t=0 daki T0(x) sıcaklık profili 
	  int N=T0.length;
	  for(int m=0;m<N;m++) {T0[m]=125.0;}
	  double T1=25.0;  //x=0 da t>0 zamanı için duvar sıcaklığı sınır şartı
	  double T2=50.0;  //x=L de t>0 zamanı için duvar sıcaklığı sınır şartı
	  double t=3600.0; //sn toplam zaman
	  double dt=10.0; //sn gerçek zaman adımı
	  double dtplot=0.3; //sn her bir plotta bekleme zamanı
	  double alpha=5e-7;
	  double x0=0.0;
	   double xn=L;
	  double fi=0.5;
	  double k=50.0;
	  double dx=L/T0.length;
	  double T[][]=HT_xtcoz(fi,L,t,dt,T0,alpha,T1,T2);
	  double b[][]=Matrix.T(T);
	  double q[][]=q(k,dx,T);
	  timeplot_n p=new timeplot_n(T,x0,xn,dtplot,dt);
	  //timeplot p=new timeplot(q,x0,xn,dtplot,dt);
      p.start();
  }
}