//Oblique_State.java
//import maestro.lib.math.*;
import java.util.*;

public class Oblique_State {
    public double pwave, qwave, test;
    
    public Complex gamma1, gamma2, cosgeom2, singeom2;
    public double Power_Trans;
    public int ShowWhich;
    //public static final double epsilon0 = 8.8541878176E-12; //Units: F/m
    private static final double epsilon0 = 8.841941286E-12; // approximate value 
    public static final double mu0 = 1.25663706144E-6; //Units H/m
    //public static final double c = 1.0/Math.sqrt(epsilon0*mu0); //Units m/s
    private static final double c = 3.0E8; //Units m/s

    public double epsilon_r1, mu_r1, conductivity1, max; //Units S/m
    public double epsilon_r2, mu_r2, conductivity2; //Units S/m
    public Complex epsilon_complex;
    public boolean isPolarizationParallel, Incident, Reflected, Total, Plot2D;
    double wavelength1, wavelength2;
    double wavelength1x, wavelength2x;
    double wavelength1z, wavelength2z;
    double phase_velocity1, phase_velocity2, phase_velocity2_eff;
    double phase_velocity1x, phase_velocity2x, phase_velocity2x_eff;
    double phase_velocity1z, phase_velocity2z;
    
    double new_conductivity2;
    
    public double alpha1, alpha2, beta1, beta2, beta2bulk, beta1_z, beta1_x, beta2_z, beta2_x, beta_ratio; //attentuation coefficient and wave vector
    double E0; //Amplitudes of E-Field
    double loss_tangent1, loss_tangent2;
    double skin_depth1, skin_depth2;
    public Complex wave_impedance1, wave_impedance2;
    public Complex ratioZ;
    public double Deltax = 0.05;
    public double wt, dwt;
    public int NSteps;
    
    public int width=603;
    public int height=603;
    //public int height=574;
    
    public double myarray[][];
    //public double myarray2[][];
    public double xarrayInc_M[];
    public double xarrayRef_M[];
    public double xarrayTot_M[];
        
    public Complex Reflection_Coef, Reflection_CoefH, Transmission_Coef, Transmission_CoefH;
    double wave_impedance_mag1, wave_impedance_phase1, wave_impedance_mag2, wave_impedance_phase2;
    public double theta1, theta2, theta1_deg;
    public double frequency, angular_frequency, total_angle, totalR_angle;
    public double x[], ref_array[], trans_array[], refCM_array[], transCM_array[],
                  refCR_array[], transCR_array[], refCI_array[], transCI_array[];
    public Complex refC_array[], transC_array[];
    public double x_deg[], x_swp[];
    
    public int which = 1;
    public boolean plotE;
    public boolean IsVectorIn = true;
    
    public boolean show_normal = true;
    public boolean show_tang = true;
    
    public int Nt = 6000;
    private double PI = Math.PI;
    public int palettereference = 382;
    public int palettereferenceB = 127;
    public int palettereferenceC = 127;
    public boolean IsThreshold = false;
    public boolean IsCoarser = true;
    public boolean PlotSW = false;
    
    public boolean LicenseExpired;
    public int this_month, today_week, this_year, this_hour, this_minute, today_month, 
	       today_year,this_zone, saving_time;       
    GregorianCalendar Greg = new GregorianCalendar();
    
    public Oblique_State(){
        
        max=0.0;
	ShowWhich = 1;
	alpha1 = 0.0;  
	frequency = 1.0E9;
	test = 0.0;
	
        NSteps = 180;
	wt = 0.0;
	dwt = Math.PI*2/(NSteps);
	
        new_conductivity2 = 1.0; 
	theta1 = Math.PI*0.25;
        theta1_deg = 45.0;
	theta2 = Math.PI/4.0;
	epsilon_r1 = 1.0;
	mu_r1 = 1.0;
	conductivity1 = 0.0;
	epsilon_r2 = 2.55;
	mu_r2 = 1.0;
	conductivity2 = 1.0;  // Siemens per meter
	isPolarizationParallel = true;
	frequency = 1.0E9;
	angular_frequency = 2.0 * Math.PI * frequency; // rad/s
        
        epsilon_complex = new Complex(epsilon_r2,-conductivity2/(epsilon0*angular_frequency));
        
        Incident = true;
        Reflected = false;
        Total = false;
        Plot2D = false;
        
        plotE = true;
        
        myarray = new double[width+1][height+1];
        //myarray2 = new double[width+1][height+1];
        xarrayInc_M = new double[height+1];
        xarrayRef_M = new double[height+1];
        xarrayTot_M = new double[height+1];
        x_swp = new double[height+1];
       
	this_month = Greg.get(Calendar.MONTH);
	//System.out.println("  This is the month = "+this_month);
	today_week = Greg.get(Calendar.DAY_OF_WEEK);
	//System.out.println("  This is the day_week = "+today_week);
	this_year = Greg.get(Calendar.YEAR);
	this_hour = Greg.get(Calendar.HOUR_OF_DAY);
	//System.out.println("  This is the year = "+this_year);
	this_minute = Greg.get(Calendar.MINUTE);
	//System.out.println("  This is the minute = "+this_minute);
	today_month = Greg.get(Calendar.DAY_OF_MONTH);
	//System.out.println("  This is the day_month = "+today_month);
	today_year = Greg.get(Calendar.DAY_OF_YEAR);
	//System.out.println("  This is the day_year = "+today_year);
	this_zone = Greg.get(Calendar.ZONE_OFFSET);
	//System.out.println("  This is the zone_offset = "+this_zone/3600000);
	saving_time = Greg.get(Calendar.DST_OFFSET);
	//System.out.println("  This is the dst_offset = "+saving_time/3600000);

	ignition();
	scan_coefficients();
        get_maxangle();	
        
    }
    
    public synchronized void increment(){
	wt+=dwt;
	if(wt > Math.PI * 2){
		wt -= 2 * Math.PI;
	}
    }
    
    public void ignition(){
        
        angular_frequency = 2.0 * Math.PI * frequency; // rad/s
        epsilon_complex = new Complex(epsilon_r2,-conductivity2/(epsilon0*angular_frequency));
        //System.out.println("epscomp = "+epsilon_complex);
	theta1_deg = MaestroA.rounder(theta1*180.0/Math.PI,4);
        beta1  = EMF.getBeta(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	beta2  = EMF.getBeta(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	beta_ratio = beta2/beta1;
        beta1_z = beta1 * Math.sin(theta1);
        beta1_x = Math.sqrt(beta1*beta1 - beta1_z*beta1_z);
        alpha1 = 0.0;
	//alpha1 = EMF.getAlpha(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	alpha2 = EMF.getAlpha(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	wavelength1 = EMF.getWaveLength(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	wavelength2 = EMF.getWaveLength(epsilon_r2,mu_r2,conductivity2,angular_frequency);
        wavelength1z = wavelength1/Math.sin(theta1);
        wavelength2z = wavelength1z;//wavelength2/Math.sin(theta2);
	wavelength1x = wavelength1/Math.cos(theta1);
        wavelength2x = wavelength2/Math.cos(theta2);
        phase_velocity1 = EMF.getPhaseVelocity(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	phase_velocity2 = EMF.getPhaseVelocity(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	phase_velocity1z = phase_velocity1/Math.sin(theta1);
	phase_velocity2z = phase_velocity1z; //phase_velocity2/Math.sin(theta2);
	phase_velocity1x = phase_velocity1/Math.cos(theta1);
	phase_velocity2x = phase_velocity2/Math.cos(theta2);
        
        //----------------------------------------------------------------------
        test = conductivity2/(angular_frequency*epsilon0*epsilon_r2);
	wave_impedance1 = EMF.getWaveImpedance(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	    
	if(test > 1.0E20){ // Apply good conductor limit approximations
	    double new_conductivity2;
	    if(test > 1.0e150){
		new_conductivity2 = 1.0e150*(angular_frequency*epsilon0*epsilon_r2);
	    }
	    else{
		new_conductivity2 = test*(angular_frequency*epsilon0*epsilon_r2);
	    }
	    
	    beta2  = Math. sqrt(Math.PI*frequency*mu0*mu_r2*new_conductivity2);
	    alpha2 = beta2;//Math. sqrt(Math.PI*frequency*mu0*mu_r2*new_conductivity2);
	    wavelength2 = 2.0*Math.PI/beta2;
	    phase_velocity2 = angular_frequency/beta2;
	    double temp_imp = Math.sqrt(Math.PI*frequency*mu0*mu_r2/new_conductivity2);
	    wave_impedance2 = new Complex(temp_imp,temp_imp);
	}
	else{// general formulation - beta2 to phase_velocity2 already calulated above
	    beta2  = EMF.getBeta(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	    alpha2 = EMF.getAlpha(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	    wavelength2 = EMF.getWaveLength(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	    phase_velocity2 = EMF.getPhaseVelocity(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	    wave_impedance2 = EMF.getWaveImpedance(epsilon_r2,mu_r2,conductivity2,angular_frequency);
	}
	gamma1 = new Complex(0.0,beta1);
	gamma2 = new Complex(alpha2,beta2);
	
        beta2bulk = beta2;
        
	//Angle for phase front - See von Hippel "Dielectrics and Waves" page 64
	double temp1;
	Complex temp2, temp3, temp4, temp5;
	temp1 = Math.sin(theta1)*Math.sin(theta1);
	temp2 = Complex.Multiply(gamma2,gamma2);
	temp3 = Complex.Multiply(gamma1,gamma1);
	temp4 = Complex.Multiply(temp1,temp3);
	
	temp5 = Complex.Subtract(temp2,temp4);
	pwave=Complex.Real(Complex.Pow(temp5,0.5)); // effective attenuation factor
	qwave=Complex.Imaginary(Complex.Pow(temp5,0.5)); // effective propagation factor normal to interface
        
        if(conductivity2 > 0.0){
			
            // effective angle
            theta2 = Math.asin( beta1*Math.sin(theta1)/
			    Math.sqrt(qwave*qwave+beta1*beta1*Math.sin(theta1)*Math.sin(theta1))
			   );
	}
	else{
	
	    theta2 = Math.asin(beta1*Math.sin(theta1)/beta2);
	}
         
        cosgeom2 = Complex.Divide(new Complex(pwave,qwave),gamma2); // = cos (theta2) actual complex angle
        singeom2 = Complex.Divide(new Complex(0.0, beta1*Math.sin(theta1)),gamma2); // sin (theta2) actual complex angle
        
        Complex check1, check2;
        check1 = Complex.Multiply(cosgeom2,cosgeom2);
        check2 = Complex.Subtract(1.0,Complex.Multiply(singeom2,singeom2));
        //System.out.println("cosgeom2 = "+cosgeom2+" check1 = "+check1+"  check2 = "+check2);
	{ 
	    Reflection_Coef =  EMF.getOblique_Reflection_Coefficient(theta1, epsilon_r1, epsilon_r2,
		mu_r1, mu_r2, conductivity1, conductivity2, angular_frequency, isPolarizationParallel);
	
	    Transmission_Coef = EMF.getOblique_Transmission_Coefficient(theta1, epsilon_r1, epsilon_r2,
		mu_r1, mu_r2, conductivity1, conductivity2, angular_frequency, isPolarizationParallel);
	}
	
	Complex t1, t2;
	double t3;
	t1=Complex.Multiply(Complex.Multiply(Transmission_Coef,Transmission_Coef),
			    Math.cos(Complex.Arg1(wave_impedance2)));
	t2 = Complex.Multiply(wave_impedance1,cosgeom2);
	t3 = Complex.Magnitude(wave_impedance2)*Math.cos(theta1);
	
	Power_Trans = Complex.Magnitude(Complex.Multiply(t1,Complex.Divide(t2,t3)));
        
        //----------------------------------------------------------------------
        
	wave_impedance1 = EMF.getWaveImpedance(epsilon_r1,mu_r1,conductivity1,angular_frequency);
	wave_impedance2 = EMF.getWaveImpedance(epsilon_r2,mu_r2,conductivity2,angular_frequency);
				
        ratioZ = Complex.Divide(wave_impedance1,wave_impedance2);
        
        //theta2 = Math.asin(beta1*Math.sin(theta1)/beta2);//Snell's law
	
        beta2_z = beta1 * Math.sin(theta1);
        beta2_x = qwave;
        
        double beta2_x_alt = Math.sqrt(Math.abs(beta2*beta2 - beta2_z*beta2_z));
        
        beta2 = Math.sqrt(Math.pow(beta2_z,2)+Math.pow(beta2_x,2));
        phase_velocity2_eff = Math.PI*2.0*frequency/beta2;
        
        //System.out.println(" beta2x = "+beta2_x+"   beta2xB = "+beta2_x_alt+"  beta2 = "+beta2+"  beta2bulk = "+beta2bulk);
        //System.out.println("veff = "+phase_velocity2_eff+"    v = "+phase_velocity2);
	
        //Reflection_CoefH = Complex.Multiply(Reflection_Coef,new Complex(-1.0,0.0));
	//Transmission_CoefH = Complex.Multiply(ratioZ,Transmission_Coef);
        
        //System.out.println("GammaH = "+Complex.Multiply(Reflection_Coef,new Complex(-1.0,0.0)));
        //System.out.println("TauH = "+Complex.Multiply(ratioZ,Transmission_Coef));
        
        Reflection_CoefH = EMF.getOblique_Reflection_CoefficientH(theta1, epsilon_r1, epsilon_r2,
		mu_r1, mu_r2, conductivity1, conductivity2, angular_frequency, isPolarizationParallel);
	Transmission_CoefH = EMF.getOblique_Transmission_CoefficientH(theta1, epsilon_r1, epsilon_r2,
		mu_r1, mu_r2, conductivity1, conductivity2, angular_frequency, isPolarizationParallel);
        
        
        //System.out.println("H   r = "+Reflection_CoefH+"   t = "+Transmission_CoefH);
        //System.out.println("E   r = "+Reflection_Coef+"   t = "+Transmission_Coef);
        //System.out.println("Z1 = "+wave_impedance1+"Z2 = "+wave_impedance2);
        
        //System.out.println("r = "+Complex.Magnitude(Reflection_Coef)+"   rH = "+Complex.Magnitude(Reflection_CoefH));
        //System.out.println("t = "+Complex.Magnitude(Transmission_Coef)+"   tH = "+Complex.Magnitude(Transmission_CoefH));
        Complex trythis, trythis2, trythis3, trythis4, trythis5, trythis6;
        double trythat;
        trythis = Complex.Multiply(wave_impedance2,Transmission_CoefH);
        trythat = (Math.cos(theta1)/Math.cos(theta2));
        trythis2 = Complex.Multiply(trythis,cosgeom2);
        trythis3 = Complex.Multiply(trythis,singeom2);
        trythis4 = Complex.Multiply(Complex.Multiply(wave_impedance1,Complex.Subtract(1.0,Reflection_CoefH)),Math.cos(theta1));
        trythis5 = Complex.Multiply(Complex.Multiply(wave_impedance1,Complex.Subtract(1.0,Reflection_CoefH)),Math.sin(theta1));
        trythis6 = Complex.Multiply(trythis5,epsilon_complex);
        //System.out.println("  cosgeom2 = "+cosgeom2+"    singeom2 ="+singeom2);
        //System.out.println("  trythis = "+trythis+"    trythis4 ="+trythis4);
        //System.out.println("  trythis5 = "+trythis5+"    trythis6 ="+trythis6);
        //System.out.println(" t =  "+Transmission_Coef);
        
        
        total_angle = MaestroA.rounder(180.0/Math.PI*Math.atan(Math.sqrt((mu_r2*epsilon_r2)/(mu_r1*epsilon_r1))),4);
        if((mu_r1*epsilon_r1) <= (mu_r2*epsilon_r2) || conductivity2 > 0.0){
            totalR_angle = 91.0;
        }
        else{
            totalR_angle = MaestroA.rounder(180.0/Math.PI*Math.asin(Math.sqrt((mu_r2*epsilon_r2)/(mu_r1*epsilon_r1))),4);
        }
        
            int mid = height/2;
            int mid2 = width/2;
            Complex useT, useR;
            
            if(isPolarizationParallel){
                useR = Reflection_CoefH;
                useT = Transmission_CoefH;
                
            }
            else{
                useR = Reflection_Coef;
                useT = Transmission_Coef;
                
            }
            
            if(Plot2D){
                if(Incident){
                    if(useT.Imaginary() == 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                    300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){
                                myarray[width-j][i] = 300.0*useT.Real()*
                                        Math.cos(wt - beta2_x/beta1*(double)(i-mid)*Deltax - beta2_z/beta1*(double)(j-mid2)*Deltax);
                            }
                        }
                    }
                    else if(conductivity2 > 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                    300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                    myarray[width-j][i] = 300.0*useT.Magnitude()
                                                    * Math.exp(- pwave/beta1*(double)(i-mid)*Deltax)
                                                    * Math.cos(wt - qwave/beta1*(double)(i-mid)*Deltax 
                                                      - beta2_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }   
                        }
                    }
                    
                    else if(useT.Imaginary() != 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                    300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                    myarray[width-j][i] = 300.0*useT.Magnitude()
                                                    * Math.exp(-Math.abs(beta2_x/beta1)*(double)(i-mid)*Deltax)
                                                    * Math.cos(wt - beta1_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }   
                        }
                     
                    }
                    
                }// end of if(Incident)
                //--------------------------------------------------------------
                if(Reflected){
                    if(useT.Imaginary() == 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 300.0*useR.Real()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){
                                 myarray[width-j][i] = 300.0*useT.Real()*
                                    Math.cos(wt - beta2_x/beta1*(double)(i-mid)*Deltax - beta2_z/beta1*(double)(j-mid2)*Deltax);
                            }
                        }
                    }
                    else if(conductivity2 > 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                 
                                    myarray[width-j][i] = 300.0*useR.Magnitude()*
                                    Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax 
                                             - beta1_z/beta1*(double)(j-mid2)*Deltax+useR.Arg2());
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                    myarray[width-j][i] = 300.0*useT.Magnitude()
                                                    * Math.exp(- pwave/beta1*(double)(i-mid)*Deltax)
                                                    * Math.cos(wt - qwave/beta1*(double)(i-mid)*Deltax 
                                                      - beta1_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }   
                        }
                    }
                    else if(useT.Imaginary() != 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 300.0*useR.Magnitude()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax+useR.Arg2());
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                myarray[width-j][i] = 300.0*useT.Magnitude() 
                                                * Math.exp(-Math.abs(beta2_x/beta1)*(double)(i-mid)*Deltax)
                                                * Math.cos(wt - beta1_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }
                        }
                    }
                }// end of if(Reflected)
                //--------------------------------------------------------------
                if(Total){
                     if(useT.Imaginary() == 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax)+
                                300.0*useR.Magnitude()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax+useR.Arg2());
                            }
                            for(int i = mid+1; i < height+1; i++){
                                myarray[width-j][i] = 300.0*useT.Real()*
                                                  Math.cos(wt - beta2_x/beta1*(double)(i-mid)*Deltax - beta2_z/beta1*(double)(j-mid2)*Deltax);
                            }
                        }
                    }
                    else if(conductivity2 > 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax)+
                                300.0*useR.Magnitude()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax+useR.Arg2());
                                //300.0*useR.Real()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                    myarray[width-j][i] = 300.0*useT.Magnitude()
                                                    * Math.exp(- pwave/beta1*(double)(i-mid)*Deltax)
                                                    * Math.cos(wt - qwave/beta1*(double)(i-mid)*Deltax 
                                                      - beta1_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }   
                        }
                    }
                    
                    else if(useT.Imaginary() != 0.0 && conductivity2 == 0.0){
                        for(int j = 0; j < width+1; j++){
                            for(int i = 0; i < mid+1; i++){
                                myarray[width-j][i] = 
                                300.0*Math.cos(wt - beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax)+
                                300.0*useR.Magnitude()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j-mid2)*Deltax+useR.Arg2());
                                //300.0*useR.Real()*Math.cos(wt + beta1_x/beta1*(double)(i-mid)*Deltax - beta1_z/beta1*(double)(j)*Deltax);
                            }
                            for(int i = mid+1; i < height+1; i++){    
                                myarray[width-j][i] = 300.0*useT.Magnitude() 
                                           * Math.exp(-Math.abs(beta2_x/beta1)*(double)(i-mid)*Deltax)
                                           * Math.cos(wt - beta1_z/beta1*(double)(j-mid2)*Deltax + useT.Arg2());
                            }
                        }
                    }
                }//end of if(Total)
                //--------------------------------------------------------------
                
                
                //for(int j = 0; j < width+1; j++){
                  //          for(int i = 0; i < height+1; i++){
                    //            myarray[j][i] = myarray2[width-j][i]; 
                      //      }
                //}
                
                
            }// end of if(Plot2D)
            
                //if(useT.Imaginary() == 0.0 || conductivity2 != 0.0){
                
            // Get Standing Wave Pattern
                if(useT.Imaginary() == 0.0 && conductivity2 == 0.0){
                    for(int i = 0; i < mid+1; i++){
                        xarrayTot_M[i] = Complex.Magnitude(
                        Complex.Add(
                        new Complex(Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax), Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax)),
                        new Complex(useR.Magnitude()*Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2()), 
                                   -useR.Magnitude()*Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2())))
                        );
                    }
                    for(int i = mid+1; i < height+1; i++){
                        xarrayTot_M[i] = useT.Magnitude(); 
                        
                    }
                }
                else if(conductivity2 > 0.0){
                    for(int i = 0; i < mid+1; i++){
                        xarrayTot_M[i] = Complex.Magnitude(
                            Complex.Add(
                            new Complex(Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax), Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax)),
                            new Complex(useR.Magnitude()*Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2()), 
                            -useR.Magnitude()*Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2())))
                            );
                    }
                    for(int i = mid+1; i < height+1; i++){
                                xarrayTot_M[i] = useT.Magnitude()*
                                                 Math.exp(-pwave/beta1*(double)(i-mid)*Deltax);
                    }
                    
                }
                else if(useT.Imaginary() != 0.0 && conductivity2 == 0.0){
                    for(int i = 0; i < mid+1; i++){
                        xarrayTot_M[i] = Complex.Magnitude(
                            Complex.Add(
                            new Complex(Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax), Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax)),
                            new Complex(useR.Magnitude()*Math.cos(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2()), 
                            -useR.Magnitude()*Math.sin(beta1_x/beta1*(double)(i-mid)*Deltax+useR.Arg2())))
                            );
                    }
                    for(int i = mid+1; i < height+1; i++){
                                xarrayTot_M[i] = useT.Magnitude()*
                                                 Math.exp(-Math.abs(beta2_x/beta1)*(double)(i-mid)*Deltax);
                    }
                    
                }
                for(int i = 0; i < height+1; i++){
                         x_swp[i] = i;
                }
            
            get_maxangle();	
            
    }
    
    public void scan_coefficients(){
	x = new double[9001];
	x_deg = new double[9001];
	ref_array = new double[9001];
	trans_array = new double[9001];
	refC_array = new Complex[9001];
	transC_array = new Complex[9001];
        refCM_array = new double[9001];
	transCM_array = new double[9001];
	refCR_array = new double[9001];
	transCR_array = new double[90001];
        refCI_array = new double[9001];
	transCI_array = new double[9001];
	
        for(int i=0;i<9001;i++){
	    x_deg[i] = (double)i;
	}
	
        if(plotE){
            EMF.getOblique_Reflection_Coefficient(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, ref_array,x);
            EMF.getOblique_Transmission_Coefficient(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, trans_array,x);
                                      
            EMF.getOblique_Reflection_CoefficientC(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, refC_array,x);
	
            EMF.getOblique_Transmission_CoefficientC(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, transC_array,x);
        
        }
        else{
            EMF.getOblique_Reflection_Coefficient(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, ref_array,x);
            EMF.getOblique_Transmission_Coefficient(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, trans_array,x);
                                      
            EMF.getOblique_Reflection_CoefficientCH(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, refC_array,x);
	
            EMF.getOblique_Transmission_CoefficientCH(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency, isPolarizationParallel, transC_array,x);
            
        }
        
        for(int i=0;i<9001;i++){
            refCR_array[i] = Complex.Real(refC_array[i]);
            transCR_array[i] = Complex.Real(transC_array[i]);
            refCI_array[i] = Complex.Imaginary(refC_array[i]);
            transCI_array[i] = Complex.Imaginary(transC_array[i]);
	    refCM_array[i] = Complex.Magnitude(refC_array[i]);
            transCM_array[i] = Complex.Magnitude(transC_array[i]);
        }
        
    }
    
   public void get_maxangle(){
	   
	    max = EMF.get_Trans_max(epsilon_r1, epsilon_r2, mu_r1, mu_r2, conductivity1, conductivity2,
				      angular_frequency,true);
	
    }
}