//======================================================
// Thermodynamic Package in java
// Class kazan
// Dr. Turhan Coban
// Ege University, School of Engineering, 
// Department of Mechanical Engineering
// Bornova İZMİR - TURKEY
// boiler combustion efficiency

import java.io.*;
import java.net.*;
import java.util.*;

class kazan
{
Gas1 yakit[];
Gas1 hava[];
Gas1 eksoz[];
Gas1 eksozanaliz[];

double Tyakit;
double Thava;
double Teksoz;
double havafazlalikkatsayisi;
double NT;
double Q,Qmax,eff;

public kazan(String yakitismi[],double yakitmol[],double Ty,double Th,double Te,double hk,boolean ustisildeger)
{ // Yakıt ve hava karbon oranı verildiğinde verim analizi yapar
  //Ty : yakıt sıcaklığı derece K
  //Th : hava sıcaklığı derece K
  //Te : eksoz gazı sıcaklığı K
  //ustisildeger : true  : üst ısıl değer cinsinden yakıt verimi
  //ustisildeger : false : alt ısıl değer cinsinden yakıt verimi  
int n=yakitismi.length;
havafazlalikkatsayisi=hk;
yakit=new Gas1[n];
NT=0;
for(int i=0;i<n;i++)
  {NT+=yakitmol[i];}
for(int i=0;i<n;i++)
  {yakitmol[i]=yakitmol[i]/NT;yakit[i]=new Gas1(yakitismi[i],yakitmol[i]);}      
double Csay=0;
double Nsay=0;
double Osay=0;
double Hsay=0;
double Ssay=0;
double xO2=0;
double xN2=0;
for(int i=0;i<n;i++)
  {int m=yakit[i].atomList.length;
  for(int j=0;j<m;j++) 
    {if(yakit[i].atomList[j].symbol.equals("C")) Csay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("H")) Hsay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("O")) Osay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("S")) Ssay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("N")) Nsay+=yakit[i].N*yakit[i].atomList[j].N;
     else {System.out.println("listede olmıyan bir gaz mevcut : "+yakit[i].atomList[j].symbol);}
    }
  }
  xO2=Csay+Ssay+Hsay/4.0-Osay/2.0;//ideal yanma için gerekli O miktarı
  //ideal gaz çıkış atomları
  double hyakit=0;
  double hhava=0;
  double heksoz=0;
  for(int i=0;i<n;i++)
  {hyakit+=yakit[i].HT(298.0);}
  hava=new Gas1[2];
  hava[0]=new Gas1("o2",xO2);
  hava[1]=new Gas1("n2",(xO2*79.0/21.0));
  hhava=hava[0].HT(298.0)+hava[1].HT(298.0);
  eksoz=new Gas1[5];
  eksoz[0]=new Gas1("co2",Csay);
  if(ustisildeger) eksoz[1]=new Gas1("h2ol",(Hsay/2.0));
  else eksoz[1]=new Gas1("h2o",(Hsay/2.0));
  eksoz[2]=new Gas1("so2",Ssay);
  eksoz[3]=new Gas1("n2",(xO2*79.0/21.0+Nsay/2.0));
  //System.out.println("hh2o="+eksoz[1].HT(298.0));
  heksoz=eksoz[0].HT(298.0)+eksoz[1].HT(298.0)+eksoz[2].HT(298.0)+eksoz[3].HT(298);
  //System.out.println("co2="+Csay+"H2o="+(Hsay/2.0)+"So2"+Ssay+"n2="+(xO2*79.0/21.0+Nsay/2.0)+"heksoz="+heksoz);
  Qmax=heksoz-hhava-hyakit;
  double xO2gercek=xO2*havafazlalikkatsayisi;
  hyakit=0;
  for(int i=0;i<n;i++)
  {hyakit+=yakit[i].HT(Ty);}
  hava[0]=new Gas1("o2",xO2gercek);
  hava[1]=new Gas1("n2",(xO2gercek*79.0/21.0));
  hhava=hava[0].HT(Th)+hava[1].HT(Th);
  eksoz[1]=new Gas1("h2o",(Hsay/2.0));
  eksoz[3]=new Gas1("n2",(xO2gercek*79.0/21.0+Nsay/2.0));
  eksoz[4]=new Gas1("o2",(xO2gercek-xO2));
  heksoz=eksoz[0].HT(Te)+eksoz[1].HT(Te)+eksoz[2].HT(Te)+eksoz[3].HT(Te)+eksoz[4].HT(Te);
  Q=heksoz-hhava-hyakit;
  eff=Q/Qmax;
  }

public kazan(String yakitismi[],double yakitmol[],String eksozismi[],double eksozmol[],double Ty,double Th,double Te,double hfk,boolean ustisildeger)
{ //Ty : yakıt sıcaklığı derece K
  //Th : hava sıcaklığı derece K
  //Te : eksoz gazı sıcaklığı K
  //ustisildeger : true  : üst ısıl değer cinsinden yakıt verimi
  //ustisildeger : false : alt ısıl değer cinsinden yakıt verimi  
int n=yakitismi.length;
yakit=new Gas1[n];
havafazlalikkatsayisi=hfk;
NT=0;
for(int i=0;i<n;i++)
  {NT+=yakitmol[i];}
for(int i=0;i<n;i++)
  {yakitmol[i]=yakitmol[i]/NT;yakit[i]=new Gas1(yakitismi[i],yakitmol[i]);}      
double Csay=0;
double Nsay=0;
double Osay=0;
double Hsay=0;
double Ssay=0;
double xO2=0;
double xN2=0;
for(int i=0;i<n;i++)
  {int m=yakit[i].atomList.length;
  for(int j=0;j<m;j++) 
    {if(yakit[i].atomList[j].symbol.equals("C")) Csay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("H")) Hsay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("O")) Osay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("S")) Ssay+=yakit[i].N*yakit[i].atomList[j].N;
     else if(yakit[i].atomList[j].symbol.equals("N")) Nsay+=yakit[i].N*yakit[i].atomList[j].N;
     else {System.out.println("listede olmıyan bir gaz mevcut : "+yakit[i].atomList[j].symbol);}
    }
  }
Gas1 eksozanaliz[]=new Gas1[eksozmol.length];
double NTeksoz=0;
double n_N2=0;  
for(int i=0;i<n;i++)
  {NTeksoz+=eksozmol[i];}

for(int i=0;i<n;i++)
  {eksozanaliz[i]=new Gas1(eksozismi[i],eksozmol[i]);}  
double CX=0;
double NX=0;
double OX=0;
double HX=0;
double SX=0;
int nn=eksozanaliz.length;

for(int i=0;i<n;i++)
  {int m=eksozanaliz[i].atomList.length;
  for(int j=0;j<m;j++) 
    {if(eksozanaliz[i].atomList[j].symbol.equals("C")) CX+=eksozanaliz[i].N*eksozanaliz[i].atomList[j].N;
     else if(eksozanaliz[i].atomList[j].symbol.equals("H")) HX+=eksozanaliz[i].N*eksozanaliz[i].atomList[j].N;
     else if(eksozanaliz[i].atomList[j].symbol.equals("O")) OX+=eksozanaliz[i].N*eksozanaliz[i].atomList[j].N;
     else if(eksozanaliz[i].atomList[j].symbol.equals("S")) SX+=eksozanaliz[i].N*eksozanaliz[i].atomList[j].N;
     else if(eksozanaliz[i].atomList[j].symbol.equals("N")) NX+=eksozanaliz[i].N*eksozanaliz[i].atomList[j].N;
     else {System.out.println("listede olmıyan bir gaz mevcut : "+eksozanaliz[i].atomList[j].symbol);}
    }
  }
double AC=CX/Csay; //eksoz karışımı katsayısı
n_N2=AC*(1.0-NTExsoz);
      
  xO2=Csay+Ssay+Hsay/4.0-Osay/2.0;//ideal yanma için gerekli O miktarı
  //ideal gaz çıkış atomları
  double hyakit=0;
  double hhava=0;
  double heksoz=0;
  for(int i=0;i<n;i++)
  {hyakit+=yakit[i].HT(298.0);}
  hava=new Gas1[2];
  hava[0]=new Gas1("o2",xO2);
  hava[1]=new Gas1("n2",(xO2*79.0/21.0));
  hhava=hava[0].HT(298.0)+hava[1].HT(298.0);
  eksoz=new Gas1[5];
  eksoz[0]=new Gas1("co2",Csay);
  if(ustisildeger) eksoz[1]=new Gas1("h2ol",(Hsay/2.0));
  else eksoz[1]=new Gas1("h2o",(Hsay/2.0));
  eksoz[2]=new Gas1("so2",Ssay);
  eksoz[3]=new Gas1("n2",(xO2*79.0/21.0+Nsay/2.0));
  //System.out.println("hh2o="+eksoz[1].HT(298.0));
  heksoz=eksoz[0].HT(298.0)+eksoz[1].HT(298.0)+eksoz[2].HT(298.0)+eksoz[3].HT(298);
  //System.out.println("co2="+Csay+"H2o="+(Hsay/2.0)+"So2"+Ssay+"n2="+(xO2*79.0/21.0+Nsay/2.0)+"heksoz="+heksoz);
  Qmax=heksoz-hhava-hyakit;
  double xO2gercek=xO2*havafazlalikkatsayisi;
  hyakit=0;
  for(int i=0;i<n;i++)
  {hyakit+=yakit[i].HT(Ty);}
  hava[0]=new Gas1("o2",xO2gercek);
  hava[1]=new Gas1("n2",(xO2gercek*79.0/21.0));
  hhava=hava[0].HT(Th)+hava[1].HT(Th);
  eksoz[1]=new Gas1("h2o",(Hsay/2.0));
  eksoz[3]=new Gas1("n2",(xO2gercek*79.0/21.0+Nsay/2.0));
  eksoz[4]=new Gas1("o2",(xO2gercek-xO2));
  heksoz=eksoz[0].HT(Te)+eksoz[1].HT(Te)+eksoz[2].HT(Te)+eksoz[3].HT(Te)+eksoz[4].HT(Te);
  Q=heksoz-hhava-hyakit;
  eff=Q/Qmax;
  }
  
public double Qi() {return Q;}
public double Qmax() {return Qmax;}

public double V_NM3_h(double QKW)
{
double Ni=QKW/(-Qi()); //kmol/s
return Ni*8314.5*273.15/1.01325e5*3600.0; //NM^3/saat
}

public double V_M3_h(double QKW,double T,double P)
{//T derece K
 //P basınç bar
 //verilen çevre sıcaklığı ve basınçtaki gaz debisi
double Ni=QKW/(-Qi()); //kmol/s
return Ni*8314.5*T/(P*1e5)*3600.0; //NM^3/saat
}

public double Ni(double QKW)
{
double Ni=QKW/(-Qi()); //kmol/s
return Ni*3600.0; //NM^3/saat
}

public double efficiency() {return eff;}

}
