import javax.swing.JOptionPane;
import java.util.Locale;

public class kanatliisidegistirici5
{ // düz sürekli kanatlı ısı değiştiricisi (kondenser)
  refrigerant sicak_sivi; // soğuk sıvı (boru içi)
  Gmix soguk_sivi;        // sıcak sıvı (boru dışı)
  steam st1;
  String g[];   // karışmdaki gaz isimleri
  double gn[];  // karışımdaki gaz mol sayıları (karışım %leri)
  int nkanat;
  double Fp;    // kanatlar arası mesafe
  double delta; // kanat kalınlığı
  double hf;    // kanat yüksekliği
  int n_sira;   // sıra sayısı (dikey)
  int n_boru;   // bir sıradaki boru sayısı (yatay)
  double eps;   // yüzey pürüzlülüğü
  double di;    // boru iç çapı
  double dout;  // boru dış çapı
  double fi;     //geometric factor
  double Pt;     // borular arası dikey mesafe
  double Pl;     // borular arası yatay mesafe
  double XL,XM;  // kanat arası mesafe geometrik parametreler
  double Req;    // eşdeğer yarıçap
  double Dh;     // hidrolik yarıçap
  double Dc;     // yakalık dahil boru çapı 
  double dP;     // basınç düşümü
  double Uortalama;
  double Cportalama;
  double G;      //kütlesel debi/alan
  double L; //kanat genişliği
  double W; //kanal genişliği
  double H; //kanal yüksekliği
  double sigma; // alan oranı =A/A0
  double eod;      // eps/di
  double Tsoguk[];
  double Tsicak[];
  double x[];      // ısı değiştirici boru boy koordinatı
  double Q;        // ısı transferi
  double Qlmtd;    // ısı transferi LMTD metodu
  double LMTD;
  double KL;       // yerel basınç düşüş katsayısı
  double A;        // ön yüzey giriş alanı
  double As;       // boru ön yüzey serbest akış oranı
  double Aboru;    // boru yüzey alanı
  double msoguk;   // soğuk akışkan debisi
 double Vsoguk;    //soguk gaz hızı m/s
 double msicak;    // sicak akışkan debisi
 double Ric,Rdis;  // Boru yüzeyi ısıl direnç katsayıları
 double kboru;     // boru ve kanat ısı iletim katsayısı
 double dL;        // sonlu farklar boru bölünüm sayısı
 int n_finite;     // sonlu farklar step sayısı
 double Lboru;     //boru boyu
 double rosicak;   // baca giriş sıcaklığı
 double r;         // boru dış yarıçapı
 double P;         //soğutucu akışkan basıncı kPa
 double xs;         //soğutucu akışkan fazı x<0 sıvı, 0<=x<=1 karışım x>1 gaz
                   //giriş gaz fazında (kondenser)
//-------- Çıktı değerleri ---------
// r[0] P Basınç kPa
// r[1] t Sıcaklık derece C
// r[2] v Özgül hacim m^3/kg
// r[3] h KJ/kg 
// r[4] u KJ/kg
// r[5] s KJ/kgK
// r[6] x kg buhar/kg toplam
// r[7] ro yoğunluk kg/m^3                                      
 public kanatliisidegistirici5(String isicak_sivi,double Pi,
 String isoguk_sivi,String gi[],double gni[],
 double deltai,double Fpi,double sigmai,int n_sirai,int n_borui,double epsi,
 double dii, double douti, double Li, double Wi, double Hi,double Vsoguki,
 double msicaki,double Kboru, double Rici, double Rdisi,double KLi,double dLi)
 {sicak_sivi=new refrigerant(isicak_sivi);
  P=Pi;
  soguk_sivi=new Gmix(isoguk_sivi,gi,gni);
  st1=new steam();
  double nsteam=0;
  for(int i=0;i<gi.length;i++)
  {if(gi[i].equals("h2o")) nsteam=gni[i];}
  sigma=sigmai;
  delta=deltai;
  n_sira=n_sirai;
  n_boru=n_borui;
  Fp=Fpi;  
  eps=epsi;
  di=dii;
  dout=douti;
  L=Li;
  W=Wi;
  H=Hi;
  nkanat=(int)(L/Fp);
  Pt=(H/n_sira);
  Pl=(W/n_boru);
  dL=dLi;
  KL=KLi;
  n_finite=(int)(L/dL+0.0001);
  Tsoguk=new double[n_finite*n_sira+1]; 
  // borunun seri olarak bağlandığını kabul etti
  Tsicak=new double[n_finite*n_sira+1];  //her sırada sıcaklık sabit
  x=new double[n_finite*n_sira+1]; //sıcaklık koordinatı
  Q=0;
  Vsoguk=Vsoguki;
  kboru=209; //Aliminium W/mK
  msicak=msicaki;
  XL=Math.sqrt(Pt*Pt/4+Pl*Pl)/2.0;
  XM=Pl/2.0;
  r=dout/2.0;
  Req=1.27*XM*Math.sqrt(XL/XM-0.3);
  fi=(Req/r-1)*(1.0+0.35*(Req/r));
  Dc=dout+2*delta;
  Dh=2.0*Req;
  //A=W*H;
  As=L*H*sigma;
  // msicak eksoz sıcaklığından hesaplanacak
  } //end of constructor class 
  // eps     : pipe equivalent roughness m
  //          -------------------------------------------
  //          value of equivalent roughness for some pipes:
  //          Pipe             equivalent rougness m
  //          -------------    ---------------------
  //          Riveted steel    0.9e-3 - 9e-3
  //          Concrete         0.3e-3 - 3e-3
  //          Wood stave       0.18e-3 - 0.9 e-3
  //          Cast iron        0.26e-3
  //          Galvanised iron  0.15e-3
  //          Commercial steel 0.045e-3
  //          wrought iron     0.045e-3
  //          drawn tubing     0.0015e-3
  //          Plastic,glass    0.0 (smooth)
  //          -------------------------------------------
// boru içi 
 public double f(double Re)
 {
 //Haaland equation
 //double f1=-1.8*Math.log10(Math.pow((eod/3.7),1.11)+6.9/ Re);
 //f1=1.0/(f1*f1);
 
 //Swamee-Jain equation
 //double A=Math.log10(eod/3.7+5.74/Math.pow(Re,0.9));
 //double f1=0.25/(A*A);

 //Serghides equation
 //double A1=-2.0*Math.log10(eod/3.7+12.0/Re);
 //double B1=-2.0*Math.log10(eod/3.7+2.51*A1/Re);
 //double C1=-2.0*Math.log10(eod/3.7+2.51*B1/Re);
 //double f1=A1-((B1-A1)*(B1-A1))/(C1-2.0*B1+A1);
 //f1=1.0/(f1*f1);
 //System.out.println("Sergides equation f1="+f1);
 //Goudar equation 
 double a=2/Math.log(10);
 double b=eod/3.7;
 double d=Math.log(10.0)/5.02*Re;
 double s=b*d+Math.log(d);
 double q=Math.pow(s,(s/(s+1)));
 double g=b*d+Math.log(d/q);
 double z=Math.log(q/g);
 double dLA=(g/(g+1))*z;
 double dCFA=dLA*(1+z/2.0/((g+1)*(g+1)+(z/3)*(2.0*g-1)));
 double f1=a*(Math.log(d/q)+dCFA);
 f1=1.0/(f1*f1);
 //System.out.println("Goudar equation f1="+f1);
 return f1;
 }
//boru içi 
public double fx(double X,double Re)
{
// colebrook equation to solve
// friction factor for turbulent flow 2000 < Re
double xx=2.0*Math.log10(eod/3.7+2.51/Re*X)+X;
return xx;
}
//boru içi 
public double dfx(double X,double Re)
{
//derivative of colebrook equation
double xx;
xx = 1+2.0/(eod/3.7+2.51/Re*X)/Math.log(10.0)*2.51/Re;
return  xx;
}
//boru içi 
public  double fcol(double Re)
{
// solution of the colebrook equation
// by using newton method
double fi=f(Re);
double xx=1.0/ Math.pow(fi,0.5);
int nmax=50;
double tolerance=1.0e-10;
for(int i=0;i<nmax;i++)
{
double fx1=fx(xx,Re);
xx-=fx1/dfx(xx,Re);
if(Math.abs(fx1)<tolerance) 
{double ff=1.0/(xx*xx);
return ff;}
}
double ff=1.0/(xx*xx);
//System.out.println("fcol="+ff);
return ff;
}

//boru içi 
public double  velocity(double t)
{
// avarage velocity of the pipe m/x
double x=0.0;
double mboru=msicak/n_boru;
double a[];
if(xs>=0 && xs<=1) a=sicak_sivi.property("tx",t,xs);
else               a=sicak_sivi.property("tp",t,P);
double ro=a[7];
double A=Math.PI*di*di/4.0;
//System.out.println("mboru="+mboru+"ro="+ro+"A="+A+"di="+di);
return mboru/ro/A;
}
public double x(double xs)
{double x=0;
if(xs>1) x=1;
else if(xs<0) x=0;
else x=xs;
return x;
}

public double  velocityl(double t)
{
// avarage velocity of the pipe m/x

double x=0.0;
double mboru=msicak/n_boru;
double a[];
double rol=sicak_sivi.r.rol(t);
double A=Math.PI*di*di/4.0;
//System.out.println("mboru="+mboru+"rol="+rol+"A="+A+"di="+di);
return (1-x(xs))*mboru/rol/A;
}
public double  velocityv(double t)
{
// avarage velocity of the pipe m/x
double x=0.0;
double mboru=msicak/n_boru;
double a[];
double rov=sicak_sivi.r.rov(t);
double A=Math.PI*di*di/4.0;
//System.out.println("mboru="+mboru+"rov="+rov+"A="+A+"di="+di);
return x(xs)*mboru/rov/A;
}
//boru içi  Ref
public double  Re(double t)
{
//System.out.println("Re="+res+"di="+di+"vv="+vv+"ro="+ro+"vis="+vis);
return Rel(t)+Rev(t);
}
public double  Rel(double t)
{
// Reynold's number boru içi liquid
double rol=sicak_sivi.r.rol(t);
double visl=sicak_sivi.r.viscosity_l(t);
double vv=velocityl(t);
double res=(di*vv*rol/visl);
//System.out.println("di="+di+"velocityl="+vv+"rol="+rol+"visl="+visl);
return res;
}
public double  Rev(double t)
{
// Reynold's number boru içi vapor
double a[];
double rov=sicak_sivi.r.rov(t);
double visv=sicak_sivi.r.viscosity_v(t);
double vv=velocityv(t);
double res=(di*vv*rov/visv);
//System.out.println("di="+di+"velocityv="+vv+"rov="+rov+"visv="+visv);
return res;
}
//boru içi 
public double  hc(double t)
{
//convective heat transfer coefficient
double Rey=Rev(t);
//System.out.println("Rey="+Rey);
double Nu=0;
double Prt=0;
double kt=0;
double ss=0;
if(xs>=1) Prt=sicak_sivi.r.Pr_v(t);
else if(xs<=0) Prt=sicak_sivi.r.Pr_l(t);
else
{
Prt=sicak_sivi.r.Pr_v(t)*xs+sicak_sivi.r.Pr_l(t)*(1.0-xs);
}
if(xs>=1 || xs<=0)
{
if(Rey<=2300)
{  //Laminar region
	Nu=3.66; 
}
else if(Rey>2300 && Rey<=3100)
{  //Referans : Heat transfer in all pipe flow regimes:laminar,transitional/intermittent, and turbulent
   // J.P. Abraham, E.M. Sparrow, J.C.K. Tong, International Journal of Heat and Mass Transfer 52(2009) 557-563
	double Re1=(Rey/1000.0);
	Nu=2.2407*Re1*Re1*Re1*Re1-29.499*Re1*Re1*Re1+142.32*Re1*Re1-292.51*Re1+219.88;}
else
  {
  double fr  = f(Rey);
  //Prt = sicak_sivi.r.Pr(t);
  // Turbulent region Gnielinski equation
  // Referance: 
  // V. Gnielinski, New equations for heat and mass transfer in turbulent pipe and
  //channel flow, Int. Chem. Eng. 16 (1976) 359–367.
  // Valid for 2000 < Re <5e5, 0.5 < Pr < 2000
  Nu=fr/8.0*(Rey-1000.0)*Prt/
  (1+12.7* Math.sqrt(fr/8.0)*( Math.pow(Prt,(2.0/3.0))-1.0));
  }
  kt=sicak_sivi.r.k_l(t);
  ss=Nu*kt/di;
}
else
{//Travis ve arkadaşları formülü
double a[]=sicak_sivi.property("tx",t,xs);
double ro=a[7];
double rov=sicak_sivi.r.rov(t);
double rol=sicak_sivi.r.rol(t);
double visv=sicak_sivi.r.viscosity_v(t);
double visl=sicak_sivi.r.viscosity_l(t);
double vis=(1.0-xs)*visl+xs*visv;
double Rel=Rel(t);
double Xtt=Math.pow(((1-xs)/xs),0.9)*Math.sqrt(rov/ro)*Math.pow((vis/visv),0.1);
double Ftt=0.15*(1.0/Xtt+2.85*Math.pow(Xtt,-0.467));
double F2=0;
if(Rel<50)
{F2=0.707*Prt*Rel;}
else if(Rel>50 && Rel<1125)
{F2=5.0*Prt+5*Math.log(1+Prt*(0.09636*Math.pow(Rel,0.585)-1.0));}
else
{F2=5*Prt+5*Math.log(1+5.0*Prt)+2.5*Math.log(0.00313*Math.pow(Rel,0.812)-1.0);}
Nu=Prt*Math.pow(Rel,0.9)/F2*Ftt;
kt  =  sicak_sivi.r.k_l(t);
ss=Nu*kt/di;
}
  //System.out.println("Re="+Rey+"Nu="+Nu+"h="+ss+"Prt="+Prt+"kt="+kt+"di="+di);
  return ss;
}

// boru dışı ısı transferi
public double Reout(double t)
{
//======= Reynold sayısı boru dışı ==========	
//x : % karışım miktarı
//t sıvı sıcaklığı	
//boru geçiş alanı

double V=Vsoguk/sigma; //düzeltilmiş hız
double ro=soguk_sivi.M/soguk_sivi.v((t+273.15),1.01325);
double vis=soguk_sivi.vis(t+273.15);
double res=V*ro*dout/vis;
//msicak=ro*V*A;
//System.out.println("As="+As+"L="+L+"W="+W+"n_boru="+n_boru+"nkanat"+nkanat+"delta="+delta+"dout="+dout+"A="+A+"V="+V+"Vsicak="+Vsicak+"Re="+res+"ro="+ro+"dout="+dout+"Re="+res);
return res;
}
public double hout(double t)
{
// t  sıvı sıcaklığı	
//===== Boru dışı taşınım ısı transferi katsayısı W/M^2 K ===========
//	    kanatlı boru dizini
double Re=Reout(t);
double ro=soguk_sivi.M/soguk_sivi.v((t+273.15),1.01325);
double vis=soguk_sivi.vis(t+273.15);
double k=soguk_sivi.k(t+273.15);
double Cp=soguk_sivi.Cp(t+273.15)/soguk_sivi.M*1e3;
double Pr=soguk_sivi.Prandtl(t+273.15);
double P1=-0.22*Math.log(Re)+1.88;
double P2=0.106*Math.log(Re);
//System.out.println("Re="+Re+"vis="+vis+"k="+k+"Cp="+Cp+"Pr="+Pr+"P1="+P1+"P2="+P2);
double y0,y1,y2,y3,y4;
double x1=(Pt/Pl);
double x2=(Dc/Fp);
double x3=(Dh/Fp);
double x4=(Fp/Pt);
y0=Math.pow(Re,0.346);
y1=Math.pow(x1,P1);
y2=Math.pow(x2,1.161);
y3=Math.pow(x3,1.035);
y4=Math.pow(x4,P2);
double j=0.173/y0*y1*y2*y3*y4;
//System.out.println("y0="+y0+"y1"+y1+"y2="+y2+"y3="+y3+"y4="+y4+"x1="+x1+"x2="+x2+"x3="+x3+"x4="+x4+"j="+j);
G=msoguk/As;
double h0=j*G*Cp/Math.pow(Pr,(2.0/3.0));
//System.out.println("As="+As+"j="+j+"G="+G+"Re="+Re+"vis="+vis+"k="+k+"Pr="+Pr+"ho="+h0);
return h0;   
}


public double eta(double t)
{ //kanat verimi
   double hm=hout(t);
   double m=Math.sqrt(2.0*hm/kboru/delta);
  double X=m*r*fi;
  return Math.tanh(X)/X;
}

public double houtv(double t)
{ double eta=eta(t);
    double Af=H*W*2*nkanat-Math.PI*Dc*Dc/4*n_sira*n_boru;
    double A0=Math.PI*Dc*L*n_sira+Af;
    A=A0/(n_sira*n_boru);
    Aboru=A0;
    double hout=hout(t);
    double fact=(1-(1-eta)*Af/A0);
    double houtv=hout*fact;
    System.out.println("Af="+Af+"A0="+A0+"A="+A+"hout="+hout+"fact="+fact+"houtv="+houtv);
    return Math.abs(houtv);
}

public double U0(double tic,double tdis)
{
double hi=hc(tic);    // boru içi ısı transferi
double h0=hout(tdis);
//System.out.println("hi="+hi+"h0="+h0);
double Ai=Math.PI*di*L*n_sira;
double Aw=Math.PI*Dc*L*n_sira;
    double Af=H*W*2*nkanat-Math.PI*Dc*Dc/4*n_sira*n_boru;
    double A0=Math.PI*Dc*L*n_sira+Af;
    A=A0/(n_sira*n_boru);
    Aboru=A0;
double eta0=eta(tdis);

double Uboru=1.0/(1.0/(eta0*h0*A)+(dout-di)/(kboru*Aw)+1.0/(hi*Ai)+Ric/Ai+Rdis/Aw);
//System.out.println("Uboru="+Uboru+"hi="+hi+"h0="+h0+"A0="+A0+"Aw="+Aw+"Ai="+Ai);
return Uboru;
}
public void hesapla1(double tic, double tdis)
{   Q=0;
    double a[],a1[],a2[];
	double dq=0;
	double roavg=0;
	double Vavg=0;
	double ms=msicak/n_boru; //bir borudaki kütlesel debi
	double rosoguk=soguk_sivi.M/soguk_sivi.v((tic+273.15),1.01325);
	msoguk=rosoguk*Vsoguk*H*W;  //sabit 
	System.out.println("msoguk="+msoguk+"rosoguk="+rosoguk+"L*W="+L*W);
	double msic=msicak;
    double Af=H*W*2*nkanat-Math.PI*Dc*Dc/4*n_sira*n_boru;
    double A0=Math.PI*Dc*L*n_sira+Af;
    A=A0/(n_sira*n_boru);
    Aboru=A0;
    //System.out.println("ms="+ms+"kg/s"+"rosicak="+rosicak+"msicak="+msicak+"Af="+Af+"A0="+A0+"Aboru="+Aboru+"nkanat="+nkanat+"n_boru="+n_boru+"n_sira="+n_sira);
	dP=0;
    double xx=0;
    double dtic=0;
    double dhic=0;
    double hv=0,hf=0; 
    a=sicak_sivi.property("tp",tic,P);     
    double hic=a[3]*1e3;
    xs=a[7];
    //System.out.println("hic="+hic+"xs="+xs+"baslangic");
    double dxs=0;
    double dtdis=0;
    double Cp=0;
    Uortalama=0;
    Vavg=0;
    double uu=0;
    double dA=A0/n_finite;
    //System.out.println("A="+A+"A0="+A0+"dA="+dA+"Af="+Af+"Aboru="+Aboru);
    double dq1=0; 
    a1=sicak_sivi.property("px",P,1.0);
    a2=sicak_sivi.property("px",P,0.0);
    hv=a1[3]*1e3;  
    hf=a2[3]*1e3;
    a=sicak_sivi.property("tp",tic,P);
    hic=a[3]*1e3;
    xs=(hic-hf)/(hv-hf);
	for(int k=0;k<n_sira;k++)
	{ 
	 Cp=soguk_sivi.Cp(tdis+273.15)/soguk_sivi.M;
	 Cportalama+=Cp; 
	 dq1=0;
	for(int i=0;i<=n_finite;i++)
	{   double Rey=Re(tic);
	    double f=fcol(Rey);
	    Vavg+=velocity(tic);
		uu=U0(tic,tdis);
		Uortalama+=uu;
		dq=uu*dA*(tic-tdis);		
		dq1+=dq;
		dhic=dq/ms;
		hic=hic-dhic;
		xs=(hic-hf)/(hv-hf);
  
		if(hic>hv)
		  {       a=sicak_sivi.property("ph",P,hic);
		          tic=a[1]; 
		          xs=a[6];
		   System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+" superheated");      
	      }
	      else if(hic<=hv && hic>hf)
	      {   //xs=(hic-hf)/(hv-hf);
		      System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+" mixture");
		  }
		else //(hic<hf)
		  {
			 dtic=dhic/(sicak_sivi.r.Cpl(tic)*1.0e3);
		     tic-=dtic;
		      System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+"liquid");
	      }
		//System.out.println("dq="+dq+"tdis="+tdis+"tic="+tic+"xs="+xs+"hic="+hic+"hv="+hv+"hf="+hf+"dhic="+dhic);
	    Tsoguk[k*n_finite+i]=tic;
	    Tsicak[k*n_finite+i]=tdis;
	    x[k*n_finite+i]=xx;
        xx+=dL;    
	}
	dtdis=dq1/(msoguk*Cp*1.0e3);  
	Q+=dq1;    
	tdis-=dtdis;
	}	
    Q*=n_boru;
    roavg/=n_finite;
    Vavg/=n_finite;
    Uortalama/=(n_finite*n_boru); 
    Cportalama/=n_boru;   
    double dT1=Tsoguk[0]-Tsicak[0];
    double dT2=Tsoguk[n_finite*n_boru-1]-Tsicak[n_finite*n_boru-1];
    LMTD=(dT1-dT2)/Math.log(dT1/dT2);
    Qlmtd=Uortalama*Aboru*LMTD;
    dP+=KL*roavg*Vavg*Vavg/2.0;
}
public void hesapla(double tic, double tdis)
{   Q=0;
    double a[],a1[],a2[];
	double dq=0;
	double roavg=0;
	double Vavg=0;
	double ms=msicak/n_boru; //bir borudaki kütlesel debi
	double rosoguk=soguk_sivi.M/soguk_sivi.v((tic+273.15),1.01325);
	msoguk=rosoguk*Vsoguk*H*W;  //sabit 
	System.out.println("msoguk="+msoguk+"rosoguk="+rosoguk+"L*W="+L*W);
	double msic=msicak;
    double Af=H*W*2*nkanat-Math.PI*Dc*Dc/4*n_sira*n_boru;
    double A0=Math.PI*Dc*L*n_sira+Af;
    A=A0/(n_sira*n_boru);
    Aboru=A0;
    //System.out.println("ms="+ms+"kg/s"+"rosicak="+rosicak+"msicak="+msicak+"Af="+Af+"A0="+A0+"Aboru="+Aboru+"nkanat="+nkanat+"n_boru="+n_boru+"n_sira="+n_sira);
	dP=0;
    double xx=0;
    double dtic=0;
    double dhic=0;
    double hv=0,hf=0; 
    a=sicak_sivi.property("tp",tic,P);     
    double hic=a[3]*1e3;
    xs=a[7];
    //System.out.println("hic="+hic+"xs="+xs+"baslangic");
    double dxs=0;
    double dtdis=0;
    double Cp=0;
    Uortalama=0;
    Vavg=0;
    double uu=0;
    double dA=A0/n_finite;
    //System.out.println("A="+A+"A0="+A0+"dA="+dA+"Af="+Af+"Aboru="+Aboru);
    double dq1=0; 
    a1=sicak_sivi.property("px",P,1.0);
    a2=sicak_sivi.property("px",P,0.0);
    hv=a1[3]*1e3;  
    hf=a2[3]*1e3;
    a=sicak_sivi.property("tx",tic,0.0);
    hic=a[3]*1e3;
    xs=(hic-hf)/(hv-hf);
	for(int k=0;k<n_sira;k++)
	{ 
	 Cp=soguk_sivi.Cp(tdis+273.15)/soguk_sivi.M;
	 Cportalama+=Cp;
	 dq1=0; 
	for(int i=0;i<=n_finite;i++)
	{   double Rey=Re(tic);
	    double f=fcol(Rey);
	    Vavg+=velocity(tic);
		uu=U0(tic,tdis);
		Uortalama+=uu;
		dq=uu*dA*(tic-tdis);		
		dq1+=dq;
		dhic=dq/ms;
		hic=hic-dhic;
		xs=(hic-hf)/(hv-hf);
   
		if(hic>hv)
		  {       a=sicak_sivi.property("ph",P,hic);
		          tic=a[1];
		          xs=a[6];
		   System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+" superheated");      
	      }
	      else if(hic<=hv && hic>hf)
	      {   //xs=(hic-hf)/(hv-hf);
		      System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+" mixture");
		  }
		else //(hic<hf)
		  {  dtic=dhic/(sicak_sivi.r.Cpl(tic)*1.0e3);
		     tic+=dtic;
			 //a=sicak_sivi.property("ph",P,hic);
		     //tic=a[1];
		     //xs=a[6];
		     System.out.println("xs="+xs+"dq="+dq+"ms="+ms+"hic="+hic+"dhic="+dhic+"hv="+hv+"hf="+hf+"xs = "+xs+"liquid");
	      }
         tdis+=dtdis;
		//System.out.println("dq="+dq+"tdis="+tdis+"tic="+tic+"xs="+xs+"hic="+hic+"hv="+hv+"hf="+hf+"dhic="+dhic);
	    Tsoguk[k*n_finite+i]=tic;
	    Tsicak[k*n_finite+i]=tdis;
	    x[k*n_finite+i]=xx;
        xx+=dL;    
	}
	dtdis=dq1/(msoguk*Cp*1.0e3); 
	Q+=dq1;    
	tdis-=dtdis;
	}	
    Q*=n_boru;
    roavg/=n_finite;
    Vavg/=n_finite;
    Uortalama/=(n_finite*n_boru); 
    Cportalama/=n_boru;   
    double dT1=Tsoguk[0]-Tsicak[0];
    double dT2=Tsoguk[n_finite*n_boru-1]-Tsicak[n_finite*n_boru-1];
    LMTD=(dT1-dT2)/Math.log(dT1/dT2);
    Qlmtd=Uortalama*Aboru*LMTD;
    dP+=KL*roavg*Vavg*Vavg/2.0;
}
public void plot()
{
 Plot pp=new Plot(x,Tsoguk);
 pp.addData(x,Tsicak);
 Locale us=new Locale("US");          
 String s1="Q = %4.1f kW  U = %4.0f W/m^2K";
 String s4=String.format(us,s1,Q*1e-3,Uortalama);
 pp.setPlabel(s4);
 pp.setXlabel("x, m");
 pp.setYlabel("T sıcaklık , derece C");
 pp.plot();
}

public String toString()
{   double Af=H*W*2*nkanat-Math.PI*Dc*Dc/4*n_sira*n_boru;
  double A0=Math.PI*Dc*n_sira*n_boru+Af;
  String s="Isı değiştirici \n";
s+="boru içi akışkan = "+sicak_sivi.r.refrigerantName+"\n";
s+="boru dışı akışkan = "+soguk_sivi.gasName+"\n";
s+=soguk_sivi.toString(soguk_sivi.gasName)+"\n";
s+="m_boru içi = "+msoguk+"\n kg/s";
s+="m_boru dışı = "+msicak+"\n kg/s";
s+="boru içi yüzey pürüzlülüğü : "+eps+"\n";
s+="boru içi çapı : "+di+"\n";
s+="boru dışı çapı : "+dout+"\n";
s+="basınç düşümü : "+dP+"\n";
s+="ortalama ısı transfer katsayısı : "+Uortalama+"\n";
s+="ortalama eksoz gazı özgül ısı kapasitesi = "+Cportalama+"kJ/kg K";
s+="Isı transferi : "+Q+"\n";
s+="Isı değiştirici yüzey (kanat+boru) alanı : "+A0+"\n";
s+="Soğuk akışkan giriş-çıkış sıcaklıkları : "+"\n";
s+=Tsoguk[0]+"   "+Tsoguk[n_boru*n_finite-1]+"\n";
s+="Sıcak akışkan giriş-çıkış sıcaklıkları : "+"\n";
s+=Tsicak[0]+"   "+Tsicak[n_boru*n_finite-1]+"\n";
s+="LMTD ="+LMTD+"derece K\n";
s+="Q_LMTD ="+Qlmtd+"W\n";
return s;
}

//en kucuk kareler metodu	
  public static double[] pivotlugauss(double a[][],double b[])
  { //kısmi pivotlu gauss eleme yöntemi
  int n=b.length;	  
  double x[]=new double[n];
  double carpan=0;
  double toplam=0;
  double buyuk;
  double dummy=0;
  //gauss eleme
  int i,j,k,p,ii,jj;
  for(k=0;k<(n-1);k++)
  { //pivotlama
	p=k;
	buyuk=Math.abs(a[k][k]);
	for(ii=k+1;ii<n;ii++)
	{  dummy=Math.abs(a[ii][k]);
	   if(dummy > buyuk) {buyuk=dummy;p=ii;}
	}
	if(p!=k)
	{ for(jj=k;jj<n;jj++)
	  { dummy=a[p][jj];
	    a[p][jj]=a[k][jj];
	    a[k][jj]=dummy;
	  }
	  dummy=b[p];
	  b[p]=b[k];
	  b[k]=dummy;
	}
	//gauss elemeyi çözme  
    for(i=k+1;i<n;i++)
    {  carpan=a[i][k]/a[k][k];
       a[i][k]=0;
       for(j=k+1;j<n;j++)
       {   a[i][j]-=carpan*a[k][j]; }
           b[i]   =b[i]   -carpan*b[k];
	}
  }
  //geriye doğru yerine koyma
  x[n-1]=b[n-1]/a[n-1][n-1];
  for(i=n-2;i>=0;i--)
  {
    toplam=0;
    for(j=i+1;j<n;j++)
    {  toplam+=a[i][j]*x[j];}
    x[i]=(b[i]-toplam)/a[i][i];
  }
  return x;
}


  
public static double[] EKK(double xi[],double yi[],int n)
{
int l=xi.length;
int i,j,k;
int np1=n+1;
double A[][];
A=new double[np1][np1];
double B[];
B=new double[np1];
double X[];
X=new double[np1];
for(i=0;i<n+1;i++)
  {  for(j=0;j<n+1;j++)
     {if(i==0 && j==0) A[i][j]=l;
     else  for(k=0;k<l;k++) A[i][j] += Math.pow(xi[k],(i+j));
     }
     for(k=0;k<l;k++) { if(i==0)  B[i]+= yi[k];
                       else      B[i] += Math.pow(xi[k],i)*yi[k];}
  }
//System.out.println(Matrix.toString(A));
//System.out.println(Matrix.toStringT(B));  
X=pivotlugauss(A,B);
//X=B/A;
double max=0;
for(i=0;i<n+1;i++)
 if(Math.abs(X[i]) > max) max = Math.abs(X[i]);
for(i=0;i<n+1;i++)
 if((Math.abs(X[i]/max) > 0) && (Math.abs(X[i]/max) < 1.0e-100)) X[i]=0;
return X;
}

public static double funcEKK(double e[],double x)
{
// this function calculates the value of
// least square curve fitting function
int n=e.length;
double ff;
if(n!=0.0)
  { ff=e[n-1];
  for(int i=n-2;i>=0;i--)
   { ff=ff*x+e[i]; }
  }
else
  ff=0;
return ff;
}

public static double hata(double x[],double y[],double e[])
{
//calculates absolute square root error of a least square approach
double n=x.length;
 int k;
 double total=0;
 for(k=0;k<n;k++)
 {
 total+=(y[k]-funcEKK(e,x[k]))*(y[k]-funcEKK(e,x[k]));
 }
total=Math.sqrt(total);
return total;
}

public static double[][]  funcEKK(double xi[],double yi[],int polinomkatsayisi,int aradegersayisi)
{
//aradegersayisi:  x--o--o--x--o--o--x zincirinde x deneysel noktalar ise
// ara değer sayısı 2 dir
   int n=xi.length;
   int nn=(n-1)*(aradegersayisi+1)+1;
   double z[][]=new double[2][nn];
   double E[]=EKK(xi,yi,polinomkatsayisi);	
   //System.out.println("katsayılar :\n"+Matrix.toStringT(E));
   double dx=0;
   int k=0;
   int i;
   for(i=0;i<(n-1);i++)
       {z[0][k]=xi[i];z[1][k]=funcEKK(E,z[0][k]);k++;
       for(int j=0;j<aradegersayisi;j++) 
       {dx=(xi[i+1]-xi[i])/((double)aradegersayisi+1.0);
       z[0][k]=z[0][k-1]+dx;z[1][k]=funcEKK(E,z[0][k]);k++;}
       }
       z[0][k]=xi[i];z[1][k]=funcEKK(E,z[0][k]);
   return z;
 } 

}