/*	Arrhenius Calculation   
	
	Jeffrey Clymer, 4/13/97
	jwclymer@one.net
	http://w3.one.net/~jwclymer/welcome.html

*/

import java.awt.*;
import java.applet.*;
import java.util.*;

public class arr extends Applet {

	int			num=10, num_data; 		// reset num for number of data points
	double[]	k = new double[num];	// the rate constants
	double[]	T = new double[num];	// the temperatures, in Kelvin
	double		X, Y, time_con;			// X=1/T, Y=ln(k)
	double 		slope, intercept, correl, preExp, deltaE, deltaS;
	
	TextField[]	k_text = new TextField[num];
	TextField[] T_text = new TextField[num];
	TextField	con_text, slope_text, preExp_text, deltaE_text, deltaS_text;
	TextField	temp_text, time_text, rate_text, loss_text;
	
	double		temp, time, rate, conc, loss;
	Button		calc_button, calc1_button;
	Label		label;

	public void init() {
	
		setLayout(new GridLayout(num+18, 3));
		
		this.setBackground(Color.white);
		
		add(new Label()); add(new Label("T (K)", Label.CENTER)); add(new Label("k", Label.CENTER));
		
		for(int i=0; i<num; i++)
		{
			label = new Label(Integer.toString(i+1), Label.CENTER);
			add(label);
			
			T_text[i] = new TextField(10);
			add(T_text[i]);
			
			k_text[i] = new TextField(10);
			add(k_text[i]);
			
		}	
		
		add(new Label()); add(new Label()); add(new Label());
		
		con_text = new TextField("1.0",10);
		add(new Label("Time Conversion")); add(con_text); add(new Label("sec/unit", Label.CENTER));
		
		add(new Label()); add(new Label()); add(new Label());
		
		add(new Label());
		calc_button = new Button("Calculate");
		add(calc_button);
		calc_button.setBackground(Color.yellow);
		add(new Label());
		
		add(new Label()); add(new Label()); add(new Label());
		
		add(new Label("Slope"));
		slope_text = new TextField(10);
		add(slope_text); add(new Label());
		
		add(new Label("Pre-Exponential Factor"));
		preExp_text = new TextField(10);
		add(preExp_text); add(new Label());
		
		add(new Label("Activation Energy"));
		deltaE_text = new TextField(10);
		add(deltaE_text); add(new Label("J/mol", Label.CENTER));		

		add(new Label("Activation Entropy"));
		deltaS_text = new TextField(10);
		add(deltaS_text); add(new Label("J/K mol", Label.CENTER));		
		
		add(new Label()); add(new Label()); add(new Label());
		
		add(new Label("New Temperature"));
		temp_text = new TextField(10);
		add(temp_text); add(new Label("K", Label.CENTER));		

		add(new Label("New Time"));
		time_text = new TextField(10);
		add(time_text); add(new Label("Same units as above", Label.CENTER));		
		
		add(new Label()); add(new Label()); add(new Label());
		
		add(new Label());
		calc1_button = new Button("Calculate");
		add(calc1_button);
		calc1_button.setBackground(Color.yellow);
		add(new Label());
		
		add(new Label()); add(new Label()); add(new Label());

		add(new Label("Calculated Rate"));
		rate_text = new TextField(10);
		add(rate_text); add(new Label("Same units as above", Label.CENTER));		
		
		add(new Label("Calculated Loss"));
		loss_text = new TextField(10);
		add(loss_text); add(new Label("%", Label.CENTER));		
		
	}
	
	public boolean action(Event event, Object arg) {
		
		if (event.target == calc_button) {
			
			for(int i=0; i<num; i++)
			{
			try {
				T[i]	= new Double(T_text[i].getText()).doubleValue();	
				k[i]	= new Double(k_text[i].getText()).doubleValue();
				
				num_data = i+1;

				}

			catch (Exception e) { break; }
			
			}
			
			System.out.println("No. of points = " + num_data);
			
			time_con = new Double(con_text.getText()).doubleValue();
			
			double sum_T = 0;
			double sum_x = 0;
			double sum_xy = 0;
			double sum_y = 0;
			double sum_x2 = 0;
			double sum_y2 = 0;
			
			for (int i=0; i<num_data; i++)
			{
				sum_T += T[i];
				
				X = 1/T[i];
				Y = Math.log(k[i]/time_con);
				
				sum_x += X;
				sum_xy += X*Y;
				sum_y += Y;
				sum_x2 += X*X;
				sum_y2 += Y*Y;
			}	
			
			double	T;
			
			T = sum_T/num_data;
			
			System.out.println("mean T = " + T);
			
			slope = (sum_xy - sum_x * sum_y / num_data) / (sum_x2 - sum_x * sum_x / num_data);
			intercept = (sum_y - slope * sum_x) / num_data;
			correl = (num_data*sum_xy - sum_x*sum_y) / 
						(Math.sqrt(num_data*sum_x2 - sum_x*sum_x) *
						 Math.sqrt(num_data*sum_y2 - sum_y*sum_y));
			System.out.println("Correlation coefficient = " + correl);
			showStatus("Correlation coefficient = " + correl);
			
			double R = 8.314;
			double k = 1.38e-23;
			double h = 6.626e-34;
			double e = Math.exp(1);
						
			preExp = Math.exp(intercept);
			deltaE = -R * slope;
			deltaS = R * Math.log(preExp * h / (k * T * e));
			
			slope_text.setText(Double.toString(slope));
			preExp_text.setText(Double.toString(preExp));
			deltaE_text.setText(Double.toString(deltaE));
			deltaS_text.setText(Double.toString(deltaS));
			
		}
		
		if (event.target == calc1_button) {
		
		temp = new Double(temp_text.getText()).doubleValue();
		time = new Double(time_text.getText()).doubleValue();
		
		rate = time_con*Math.exp(intercept + slope/temp);
		conc = Math.exp(-rate*time);
		loss = (1 - conc) * 100;
		
		System.out.println("Concentration = " + conc);
		showStatus("Concentration = " + conc);
		
		rate_text.setText(Double.toString(rate));
		loss_text.setText(Double.toString(loss));
		
		}
		
		return super.action(event, arg);
	}		
	
}
