//======================================================
// Termodinamik-nümerik analiz paketleri
// kazan verim analizi
// Dr. Turhan Coban
// EGE Üniversitesi Mühendislik Fakultesi, Makina Bölümü
// turhan.coban@ege.edu.tr
// =====================================================


import java.lang.Integer;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Locale;
import java.text.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.table.*;
//import java.io.*;
//import Plot2D2;
//import PlotShapesSW;
//import BasicWindowMonitor;

public class boilerTable2 extends JApplet implements ActionListener,ItemListener
{
     String g[];
     double gn[];
     double Tfuel;
     double Tair;
     double Texhaust;
     double excess_air;
     double QKW; //istenilen ısı çıkışı
     double nair,nair_tamyanma;
     boolean Higher_heating_value;	
    JPanel panel[];
    String gi[];
    double gni[];
  JTextArea output;
  JTextField hhv_lhv;
  boiler k1;
  JButton b1;
  JButton b2; //kanatlı ısı değiştirici
  kanatliisidegistirici2 kid;
  JCheckBox hhv;     // higher heating value chech
  JTextArea hhv_out; // higher heating value check result
  girdiP1 gp1;
  girdiP gp;
  String state[]={"   Üst ısıl değer            ","   Alt ısıl değer             "}; 
//  ısı değiştirici parametreleri
  liquid_CS soguk_sivi; // soğuk sıvı (boru içi)
  Gmix sicak_sivi;      // sıcak sıvı (boru dışı)
  steam st1;            // su buharı
  double s;     //kanatlar arası mesafe
  int nkanat;
  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 D;     //kanat çapı
  double fi;    
  double st;    // borular arası dikey mesafe
  double sl;    // borular arası yatay mesafe
  double dP;    // basınç düşümü
  double Uortalama;
  double Cportalama;
  double L; //kanal boyu
  double W; //kanal genişliği
  double H; //kanal yüksekliği
  double eod;      // eps/di
  double Tsoguk[];
  double Tsicak[];
  double x[];      // ısı değiştirici boy koordinatı
  double Q;        // ısı transferi
  double Qlmtd;    // ısı transferi LMTD metodu
  double LMTD;
  double KL;       // yerel basınç düşüş katsayısı
  double Aboru;    // boru yüzey alanı
  double msoguk;   // soğuk akışkan debisi
  double Vsicak;   //sıcak 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 blünüm sayısı
  int n_finite;     // sonlu farklar step sayısı
  double rosicak;   // baca giriş sıcaklığı
  double ts=0;      // su yoğuşma sıcaklığı
  String isoguk_sivi="su";
  String isicak_sivi="eksoz gazı";  
    public void yakit_sec()
    {
    Object[] o=new Object[]{"Doğal gaz","Dizel","LPG","biogaz"};
    String name=(String)JOptionPane.showInputDialog(null,"Yakıt karışımı seçiniz : ",
    "Yakıt seçimi",JOptionPane.QUESTION_MESSAGE,null,o,"Dizel");

if(name.equals("Doğal gaz"))
{
String g1[]={"ch4","c2h6","c3h8","co2","h2","co","h2o"};
double gn1[]={0.908,0.059,0.006,0.018,0.0,0.0,0.0}; 
g=g1;
gn=gn1;
}
else if(name.equals("Dizel"))
{
	String g1[]={"c9h20",
"c10h22",
"c11h24",
"c12h26",
"c13h28",
"c14h30",
"c15h32",
"c16h34",
"c17h36",
"c18h38",
"c19h40",
"c20h42",
"c11h16",
"c12h18",
"c13h20",
"c14h22",
"c15h24",
"c16h26",
"c17h28",
"c18h30",
"c10h8",
"c11h10",
"c12h12",
"c13h14",
"c14h16"};
double gn1[]={0.01715,
0.03079,
0.05964,
0.09655,
0.1960,
0.1780,
0.08319,
0.03902,
0.01837,
0.00865,
0.00409,
0.001978,
0.00328,
0.004556,
0.005626,
0.005495,
0.005206,
0.005367,
0.002328,
0.001463,
0.04248,
0.08293,
0.05228,
0.03410,
0.02103};
g=g1;
gn=gn1;
	}
else if(name.equals("LPG"))
{
// c3h8 0.3
// c4h10 0.7
String g1[]={"c3h8","c4h10","co2","h2","co","h2o"};
double gn1[]={0.3,0.7,0,0,0,0}; 
g=g1;
gn=gn1;
}
else if(name.equals("biogaz"))
{
// h2 0.116
// co 0.174
// ch4 0.082
// co2 0.131
// n2 0.382
String g1[]={"h2","co","ch4","co2","n2","h2","co","h2o"};
double gn1[]={0.116,0.174,0.082,0.131,0.382,0,0,0}; 
g=g1;
gn=gn1;
}
else
{
String g1[]={"ch4","c2h6","c3h8","co2","h2","co","h2o"};
double gn1[]={0.908,0.059,0.006,0.018,0.0,0.0,0.0}; 
g=g1;
gn=gn1;
}
}
   public String setArea()
   {
	double nyakit=k1.V_NM3_h(QKW); 
	double myakit=k1.m_kg_h(QKW,Tfuel,1.01325);     
    String s="";  
    s+="    Program : Dr. Turhan Çoban, \n";
    s+="    Ege Üniversitesi, Mühendislik Bilimleri Fak., Makina Bölümü\n";
    s+="    e-posta : turhan.coban@turhan.coban.com\n";
    s+="    =======================================================\n";
    s+="    1 kmol yakıt için ısı enerjisi çıktısı Q="+k1.Qi()+" KJ/kmol yakıt\n";
    s+="    Yakıtın ısıl değeri Q_maksimum ="+k1.Qmax()+" KJ/kmol yakıt\n";
    s+="    kazan verimi Q/Qmaksimum= "+k1.efficiency()+"\n";  
    double m1=k1.m_kg_h(QKW,Tfuel,1.01325);
    s+="    Yakıt giriş sıcaklığı   = "+Tfuel+" derece K\n";
    s+="    Hava giriş sıcaklığı    = "+Tair+" derece K\n";
    s+="    Baca çıkış sıcaklığı    = "+Texhaust+" derece K\n";
    s+="    hava fazlalık katsayısı = "+excess_air+"\n";
    s+="    istenilen ısıl çıktı    = "+QKW+" kW = "+QKW*859.8041557+"kCal/saat\n"; 
    s+="    hacimsel yakıt debisi   = "+nyakit+" Nm^3/h\n";
    s+="    kütlesel yakıt debisi   = "+myakit+" kg/h\n";
    s+="    yakıtın molekül ağırlığı= "+k1.M_fuel()+"kg/kmol\n"; 
    s+="    hacimsel tam hava yanma hava debisi     = "+nyakit*k1.nair_stoichiometric+"Nm^3/h\n";
    s+="    oransal tam yanma oksijen katsayısı     = "+k1.nair_stoichiometric/(1.0+79.0/21.0)+"kmol/kmol yakıt\n";
    s+="    hacimsel gerçek yanma hava debisi       = "+nyakit*k1.nair+" Nm^3/h\n";
    s+="    oransal gerçek yanma oksijen katsayısı  = "+k1.nair/(1.0+79.0/21.0)+"kmol/kmol yakıt\n";
    s+="    hava /yakıt oranı       = "+k1.kg_air_to_kg_fuel()+"  kg hava/kg yakıt \n";
    s+="    hava /yakıt oranı       = "+k1.kmol_air_to_kmol_fuel()+"kmol air/kmol fuel \n";
    s+="    Adyabatik alev sıcaklığı= "+k1.Ti(g,gn,Tfuel,Tair,excess_air,false,0.0)+" derece K";
    s+="    \n";
    s+="    "+k1.fuel(); 
    s+="    "+k1.air(); 
    s+="    "+k1.exhaust();
    s+="    "+k1.dry_exhaust();
    s+="    "+k1.denklem();     
    return s;
   }
   
    public void init()
    {      
      JTabbedPane jtp=new JTabbedPane();
	  b1=new JButton("Kazan verimini hesaplamak için basınız");
	  b1.addActionListener(this);
      hhv=new JCheckBox("Üst ısıl değer ? ",true); 
      hhv.addItemListener(this);     
      JPanel panel[]=new JPanel[4];
      panel[0]= new JPanel(new BorderLayout());
      panel[1]= new JPanel(new FlowLayout());
      panel[2]= new JPanel(new BorderLayout());
      panel[3]= new JPanel(new FlowLayout());
      yakit_sec();
      Tfuel=298.0;//K
      Tair=298.0;//K
      Texhaust=162.5+298.0;//K
      excess_air=1.08;
      QKW=2816.0085875737277;
      Higher_heating_value=true;//üst ısıl değer üzerinden analiz
      
      String s1[]={"yakıt sıcaklığı, Tyakıt",
                   "hava sıcaklığı, Thava",
                   "Eksoz gazları sıcaklığı , Teksoz",
                   "hava fazlalık katsayısı",
                   "istenilen kazan ısı çıktısı"};
     String s2[]={"derece K",
                   "derece K",
                   "derece K",
                   " 0..1..",
                   "KW"};
     double t[]={Tfuel,Tair,Texhaust,excess_air,QKW};
     gp1=new girdiP1(g,gn,s1,s2,t,"Kazan verim analizi girdi sayfası");              
 
     
     k1=new boiler(gp1.gas,gp1.ngas_percent,Tfuel,Tair,Texhaust,excess_air,Higher_heating_value); 
     gi=k1.exhaust_name;
     gni=k1.exhaust_N;
     
     
     String s3[]={ "0 s  kanatlar arası mesafe",
  "1 delta kanat kalınlığı",
  "2 n_sira sıra sayısı (dikey)",
  "3 n_boru bir sıradaki boru sayısı (yatay)",
  "4 eps yüzey pürüzlülüğü",
  "5 di boru iç çapı",
  "6 dout boru dış çapı",
  "7 D kanat çapı",   
  "8 L kanal boyu",
  "9 W kanal genişliği",
  "10 H kanal yüksekliği",
  "11 V_sicak eksoz gazı ısı değiştirici içi hızı",
  "12 m_soguk su debisi",
  "13 Kboru boru ısı iletim katsayısı",
  "14 Ric boru içi kirlilik direnci",
  "15 Rdis boru dışı kirlilik direnci",
  "16 Kl yerel basınç düşüm katsayısı",
  "17 dL sonlu eleman hesabı boru sonlu eleman boyu"
  };
          double t4[]={3e-3,0.4e-3,14,14,1e-4,12e-3,12.7e-3,40e-3,0.6,0.6,0.5,2.41,1.0,320.0,0.0083,0.00083,2.0,0.001};
  String s4[]={" m"," m"," sıra"," sıra"," m"," m"," m"," m"," m"," m"," m"," m/s"," kg/s","W/mK","m^2K/W","m^2K/W"," "," m"};
  gp=new girdiP(s3,s4,t4,"Isı değiştirici girdi paneli");
  s=gp1.t[0];
  delta=gp1.t[1];
  D=gp1.t[2];
  n_sira=(int)(gp1.t[3]+0.001);
  n_boru=(int)gp1.t[4];
  eps=gp1.t[5];
  di=gp1.t[6];
  dout=gp1.t[7];
  L=gp1.t[8];
  W=gp1.t[9];
  H=gp1.t[10];
  Vsicak=gp1.t[11];
  msoguk=gp1.t[12];
  kid=new kanatliisidegistirici2(isoguk_sivi,isicak_sivi,gi,gni,s,delta,D,n_sira,n_boru,eps,
      di, dout, L, W, H,Vsicak,msoguk,Kboru, Ric, Rdis,KL,dL);
  
  panel[2].add(gp);
  
     output=new JTextArea(setArea()); 
     output.setFont(new Font("TimesRoman",Font.BOLD,14));
     setLayout(new BorderLayout(5,5));
     panel[0].add(gp1,BorderLayout.NORTH); 
     hhv_lhv=new JTextField(state[0]);
     hhv_lhv.setFont(new Font("TimesRoman",Font.BOLD,14));                      
     panel[1].add(hhv); 
     panel[1].add(hhv_lhv);     
     panel[0].add(panel[1],BorderLayout.CENTER); 
     panel[0].add(b1,BorderLayout.SOUTH);
     JScrollPane skrolPane=new JScrollPane(panel[0]);
     jtp.addTab("kazan giriş paneli",skrolPane);     
     jtp.addTab("kazan çıktı paneli",new JScrollPane(output));
     jtp.addTab("kanatlı bacagazı-su ısı değiştirici giriş paneli",panel[2]);     
     jtp.addTab("kanatlı bacagazı-su ısı değiştirici çıktı paneli",new JScrollPane(panel[3]));
     add(jtp);            
    }

    public void actionPerformed(ActionEvent e)
    {
	
	for(int i=0;i<gp.n;i++)
	{
	if(e.getSource()==gp.t1[i]) {}
	}

    if (e.getSource()==b1)
    {
      double a[]=gp1.readText();
      double np[]=gp1.readNgas();
      String sg[]=gp1.readgas();
      gn=np;
      g=sg;
      Tfuel=a[0];//K
      Tair=a[1];//K
      Texhaust=a[2];//K
      excess_air=a[3];
      QKW=a[4];
      k1.set_boiler(gp1.gas,gn,Tfuel,Tair,Texhaust,excess_air,Higher_heating_value);
      output.setText(setArea());
    }
    repaint();
  }
              
public void itemStateChanged(ItemEvent e)
{   if(e.getSource()==hhv)
    { if(e.getStateChange()==ItemEvent.SELECTED)
        {Higher_heating_value=true;
        hhv_lhv.setText(state[0]);
        }
      else
        {Higher_heating_value=false;
        hhv_lhv.setText(state[1]);
        }
    }
    double a[]=gp1.readText();
     Tfuel=a[0];//K
     Tair=a[1];//K
     Texhaust=a[2];//K
     excess_air=a[3];
     QKW=a[4];
     k1.set_boiler(gp1.gas,gp1.ngas_percent,Tfuel,Tair,Texhaust,excess_air,Higher_heating_value);
    output.setText(setArea());
    repaint();
}  
    public static void main(String s[])
    {
        //main program
	    JFrame f = new JFrame("Kazan verimi ve eksoz su-eksoz gazı ısı değiştirici");
       f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	    JApplet applet = new boilerTable2();
        f.getContentPane().add("Center", applet);
        applet.init();
        f.pack();
        f.setSize(new Dimension(1000,600));
        f.setVisible(true);
    }    
 }

