// The class which does the computations for the Sphlow applet

import java.lang.Math;

public class DiamCalculator {
  double mu_fluid, rho_fluid, g, res[], ffs[];

public DiamCalculator(double init_mu, double init_rho, double gee) {
  this.mu_fluid=init_mu; this.rho_fluid=init_rho; g=gee;
  res=new double[18]; ffs=new double[18];           // Construct f vs. Re table
  res[0]=.2; ffs[0]=120; res[6]=20;   ffs[6]=2.5; res[12]=2000;  ffs[12]=.42;
  res[1]=.5; ffs[1]=50;  res[7]=50;   ffs[7]=1.5; res[13]=5000;  ffs[13]=.4;
  res[2]=1;  ffs[2]=26;  res[8]=100;  ffs[8]=1.05;res[14]=10000; ffs[14]=.42;
  res[3]=2;  ffs[3]=14;  res[9]=200;  ffs[9]=.8;  res[15]=20000; ffs[15]=.46;
  res[4]=5;  ffs[4]=7.1; res[10]=500; ffs[10]=.56;res[16]=50000; ffs[16]=.49;
  res[5]=10; ffs[5]=4.3; res[11]=1000;ffs[11]=.45;res[17]=100000;ffs[17]=.5; }

public void newfluid(double new_mu, double new_rho, double new_g) {
  this.mu_fluid=new_mu; this.rho_fluid=new_rho; g=new_g; }

public double f(double Re) {
  int i=0; if(Re<res[0]) return 24/Re;                  // Stokes flow: f=24/Re
  while(i<18&&Re>res[i]) i++;                                // Which interval?
  if(i==18) return(-1);                                          // Re too high
  return Math.exp(Math.log(ffs[i])+(Math.log(ffs[i])-Math.log(ffs[i-1]))/             // The answer
  (Math.log(res[i])-Math.log(res[i-1]))*(Math.log(Re)-Math.log(res[i]))); }

public double rerat(double f_Re) {
  int i=0;
  if(f_Re>ffs[0]/res[0]) return(Math.sqrt(24./f_Re));   // Stokes flow: f=24/Re
  while(i<18&&f_Re<ffs[i]/res[i]) i++;                       // Which interval?
  if(i==18) return 0;                                             //Re too high
  double m=(Math.log(res[i])-Math.log(res[i-1]))/(Math.log(ffs[i])-Math.log(ffs[i-1])); // Slope^-1
  return Math.exp((Math.log(res[i])+m*(Math.log(f_Re)-Math.log(ffs[i])))/(1-m)); }   // The answer

public double free(double rho_p, double u) {
  return 4/3*Math.abs(rho_p-rho_fluid)*mu_fluid*g/(rho_fluid*rho_fluid*u*u*u); }}
