Package flanagan.circuits

Source Code of flanagan.circuits.Impedance

/*      Class Impedance
*
*       Basic impedance methods
*
*       WRITTEN BY: Dr Michael Thomas Flanagan
*
*       DATE:    May 2007
*       UPDATE:  11, 12, 15, 22, 26 June and 15 July 2007
*
*       DOCUMENTATION:
*       See Michael T Flanagan's Java library on-line web pages:
*       http://www.ee.ucl.ac.uk/~mflanaga/java/Impedance.html
*       http://www.ee.ucl.ac.uk/~mflanaga/java/ImpedSpecSimulation.html
*       http://www.ee.ucl.ac.uk/~mflanaga/java/ImpedSpecRegression.html

*       http://www.ee.ucl.ac.uk/~mflanaga/java/
*
*       Copyright (c) May 2007, July 2007    Michael Thomas Flanagan
*
*       PERMISSION TO COPY:
*       Permission to use, copy and modify this software and its documentation for
*       NON-COMMERCIAL purposes is granted, without fee, provided that an acknowledgement
*       to the author, Michael Thomas Flanagan at www.ee.ucl.ac.uk/~mflanaga, appears in all copies.
*
*       Dr Michael Thomas Flanagan makes no representations about the suitability
*       or fitness of the software for any or for a particular purpose.
*       Michael Thomas Flanagan shall not be liable for any damages suffered
*       as a result of using, modifying or distributing this software or its derivatives.
*
***************************************************************************************/

package flanagan.circuits;

import flanagan.complex.Complex;
import flanagan.math.Fmath;

public class Impedance{

    // class variables
    protected static int numberOfModels = 44;   // number of circuit models included in this class

    // Constructor
    public Impedance(){
    }

    // Get the resistance complex impedance
    public static Complex resistanceImpedance(double resistance){
        return new Complex(resistance, 0.0D);
    }

    // Get the capacitance complex impedance for a given radial frequency
    public static Complex capacitanceImpedance(double capacitance, double omega){
        return new Complex(0.0D, -1.0D/(capacitance*omega));
    }

    // Get the inductance complex impedance for a given radial frequency
    public static Complex inductanceImpedance(double inductance, double omega){
        return new Complex(0.0D, inductance*omega);
    }

    // Get the 'infinite' Warburg impedance
    public static Complex infiniteWarburgImpedance(double sigma, double omega){
        double term = sigma/Math.sqrt(omega);
        return new Complex(term, -term);
    }

    // Get the 'finite' Warburg impedance
    public static Complex finiteWarburgImpedance(double sigma, double tanhConst, double omega){
        Complex zVal1 = new Complex(sigma*Math.sqrt(omega), 0.0D);
        Complex zVal2 = new Complex(tanhConst, 0.0D);
        Complex zVal3 = new Complex(0.0D, omega);
        Complex zVal4 = Complex.sqrt(zVal3);
        Complex zVal5 = zVal2.times(zVal4);
        Complex zVal6 = Complex.tanh(zVal5);
        Complex zVal7 = zVal1.times(zVal6);
        Complex zVal8 = Complex.plusOne().minus(Complex.plusJay());
        return zVal8.times(zVal7);
    }

    // Get the constant phase element impedance
    public static Complex constantPhaseElementImpedance(double cpeCoeff, double alpha, double omega){
        Complex jOmega = new Complex(0.0D, omega);
        Complex jOmegaAlpha = Complex.pow(jOmega,-alpha);
        Complex coeff = new Complex(cpeCoeff, 0.0D);
        return coeff.times(jOmegaAlpha);
    }

    // Calculate the impedance of two impedances in series
    public static Complex impedanceInSeries(Complex z1, Complex z2){
        return z1.plus(z2);
    }

    // Calculate the impedance of two impedances in series
    public static Complex impedanceInSeries(double z1, Complex z2){
        return z2.plus(z1);
    }

    // Calculate the impedance of two impedances in series
    public static Complex impedanceInSeries(Complex z1, double z2){
        return z1.plus(z2);
    }

    // Calculate the impedance of two impedances in series
    public static Complex impedanceInSeries(double z1, double z2){
        return new Complex(z1+z2, 0.0D);
    }

    // Calculate the impedance of a resistor and capacitor in series
    public static Complex rInSeriesWithC(double res, double cap, double omega){
        Complex ret = new Complex(res, -1.0D/(cap*omega));
        return ret;
    }

    // Calculate the impedance of a resistor and an inductor in series
    public static Complex rInSeriesWithL(double res, double ind, double omega){
        Complex ret = new Complex(res, ind*omega);
        return ret;
    }

    // Calculate the impedance of a capacitor and an inductor in series
    public static Complex cInSeriesWithL(double cap, double ind, double omega){
        Complex z1 = new Complex(0.0D, -1.0D/(cap*omega));
        Complex z2 = new Complex(0.0D, ind*omega);
        return z1.plus(z2);
    }

    // Calculate the impedance of two impedances in parallel
    public static Complex impedanceInParallel(Complex z1, Complex z2){
        Complex ret = z1.times(z2);
        return ret.over(z1.plus(z2));
    }

    // Calculate the impedance of two impedances in parallel
    public static Complex impedanceInParallel(Complex z1, double z2){
        Complex ret = z1.times(z2);
        return ret.over(z1.plus(z2));
    }

    // Calculate the impedance of two impedances in parallel
    public static Complex impedanceInParallel(double z1, Complex z2){
        Complex ret = z2.times(z1);
        return ret.over(z2.plus(z1));
    }

    // Calculate the impedance of two impedances in parallel
    public static Complex impedanceInParallel(double z1, double z2){
        return new Complex(z1*z2/(z1+z2), 0.0D);
    }

    // Calculate the impedance of a resistor and capacitor in parallel
    public static Complex rInParallelWithC(double res, double cap, double omega){
        Complex zC = new Complex(0.0D, -1.0D/(cap*omega));
        Complex zR = new Complex(res, 0.0D);
        Complex ret = zC.times(zR);
        return ret.over(zC.plus(zR));
    }

    // Calculate the impedance of a resistor and an inductor in parallel
    public static Complex rInParallelWithL(double res, double ind, double omega){
        Complex zL = new Complex(0.0D, ind*omega);
        Complex zR = new Complex(res, 0.0D);
        Complex ret = zL.times(zR);
        return ret.over(zL.plus(zR));
    }

    // Calculate the impedance of a capacitor and an inductor in parallel
    public static Complex cInParallelWithL(double cap, double ind, double omega){
        Complex z1 = new Complex(0.0D, -1.0D/(cap*omega));
        Complex z2 = new Complex(0.0D, ind*omega);
        Complex z3 = z1.plus(z2);
        Complex z4 = z1.times(z2);
        return z4.over(z3);
    }

    // return model circuit component list
    public static String[] modelComponents(int modelNumber){
        // Components within models
        String[][] compName  = {{" "},{"R1"},{"C1"},{"L1"},{"W1"},{"Fsigma1", "Fdelta1"},{"Qsigma1", "Qalpha1"},{"R1", "C1"},{"R1", "L1"},{"L1", "C1"},{"R1", "C1"},{"R1", "L1"},{"L1", "C1"},{"R1", "C1", "R2"},{"R1", "C1", "R2", "L1"},{"R1", "C1", "R2", "L1"},{"R1", "C1", "C2"},{"R1", "C1", "C2"},{"R1", "C1", "R2", "C2"},{"R1", "C1", "R2", "C2"},{"R1", "C1", "R2", "C2", "R3"},{"R1", "C1", "R2", "C2", "R3"},{"R1", "C1", "R2", "C2", "R3", "C3"},{"R1", "C1", "R2", "C2", "R3", "C3", "R4"},{"R1", "C1", "W1", "R2"},{"R1", "C1", "Fsigma1", "Fdelta1", "R2"},{"R1", "C1", "Qsigma1", "Qalpha1", "R2"},{"R1", "C1", "R2", "C2", "W1"},{"R1", "C1", "R2", "C2", "W3", "C3", "R4"}, {"R1", "C1", "R2", "Qsigma1", "Qalpha1"},{"R1", "C1", "R2", "Qsigma1", "Qalpha1", "R3"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "Qsigma3", "Qalpha3"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "Qsigma3", "Qalpha3", "R4"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "Qsigma3", "Qalpha3", "R4", "C1"},{"C1", "Qsigma1", "Qalpha1", "C2", "Qsigma2", "Qalpha2", "C3", "Qsigma3", "Qalpha3"},{"C1", "Qsigma1", "Qalpha1", "C2", "Qsigma2", "Qalpha2", "C3", "Qsigma3", "Qalpha3", "R1"},{"R1", "Qsigma1", "Qalpha1", "C1", "R2","Qsigma2", "Qalpha2", "C2", "R3", "Qsigma3", "Qalpha3", "C3"},{"R1", "Qsigma1", "Qalpha1", "C1", "R2","Qsigma2", "Qalpha2", "C2", "R3", "Qsigma3", "Qalpha3", "C3", "R4"},{"R1", "Qsigma1", "Qalpha1", "C1", "R2","Qsigma2", "Qalpha2", "C2"},{"R1", "Qsigma1", "Qalpha1", "C1", "R2","Qsigma2", "Qalpha2", "C2", "R3"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "Qsigma3", "Qalpha3", "R4", "C1"},{"R1", "Qsigma1", "Qalpha1", "R2", "C2", "R3", "Qsigma3", "Qalpha3", "R4", "C1"},{"R1", "Qsigma1", "Qalpha1", "R2", "C2", "R3", "Qsigma3", "Qalpha3", "R4"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "Qsigma3", "Qalpha3", "R4", "C1"},{"R1", "Qsigma1", "Qalpha1", "R2", "Qsigma2", "Qalpha2", "R3", "C1"}};
        return compName[modelNumber];
    }


    // Calculate the impedance of the listed model circuits
    public static Complex modelImpedance(double[] parameter, double omega, int modelNumber){

        Complex zVal = null;
        Complex z1 = null;
        Complex z2 = null;
        Complex z3 = null;
        Complex z4 = null;
        switch(modelNumber){
            case 1: zVal = resistanceImpedance(parameter[0]);
                    break;
            case 2: zVal = capacitanceImpedance(parameter[0], omega);
                    break;
            case 3: zVal = inductanceImpedance(parameter[0], omega);
                    break;
            case 4: zVal = infiniteWarburgImpedance(parameter[0], omega);
                    break;
            case 5: zVal = finiteWarburgImpedance(parameter[0], parameter[1], omega);
                    break;
            case 6: zVal = constantPhaseElementImpedance(parameter[0], parameter[1], omega);
                    break;
            case 7: zVal = rInSeriesWithC(parameter[0], parameter[1], omega);
                    break;
            case 8: zVal = new Complex(parameter[0], parameter[1]*omega);
                    break;
            case 9: z1 = new Complex(0.0D, -1.0D/(parameter[0]*omega));
                    z2 = new Complex(0.0D, parameter[1]*omega);
                    zVal = impedanceInSeries(z1, z2);
                    break;
            case 10:zVal = rInParallelWithC(parameter[0], parameter[1], omega);
                    break;
            case 11:z1 = new Complex(parameter[0], 0.0D);
                    z2 = new Complex(0.0D, parameter[1]*omega);
                    zVal = impedanceInParallel(z1, z2);
                    break;
            case 12:z1 = new Complex(0.0D, -1.0D/(parameter[0]*omega));
                    z2 = new Complex(0.0D, parameter[1]*omega);
                    zVal = impedanceInParallel(z1, z2);
                    break;
            case 13:zVal = rInParallelWithC(parameter[0], parameter[1], omega);
                    zVal = zVal.plus(parameter[2]);
                    break;
            case 14:zVal = rInParallelWithC(parameter[0], parameter[1], omega);
                    zVal = zVal.plus(parameter[2]);
                    z1 = new Complex(0.0D, parameter[3]*omega);
                    zVal = zVal.plus(z1);
                    break;
            case 15:zVal = rInParallelWithC(parameter[0], parameter[1], omega);
                    zVal = zVal.plus(parameter[2]);
                    z1 = new Complex(0.0D, parameter[3]*omega);
                    zVal = impedanceInParallel(zVal, z1);
                    break;
            case 16:zVal = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = new Complex(0.0D, -1.0D/(parameter[2]*omega));
                    zVal = zVal.plus(z2);
                    break;
            case 17:z1 = new Complex(parameter[0], -1.0D/(parameter[1]*omega));
                    z2 = new Complex(0.0D, -1.0D/(parameter[2]*omega));
                    zVal = (z1.times(z2)).over(z2.plus(z1));
                    break;
            case 18:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = new Complex(parameter[2], -1.0D/(parameter[3]*omega));
                    zVal = z1.plus(z2);
                    break;
            case 19:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    break;
            case 20:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    zVal = zVal.plus(parameter[4]);
                    break;
            case 21:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = z1.plus(parameter[2]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = z4.plus(parameter[4]);
                    break;
            case 22:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    z3 = rInParallelWithC(parameter[4], parameter[5], omega);
                    zVal = zVal.plus(z3);
                    break;
            case 23:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    z3 = rInParallelWithC(parameter[4], parameter[5], omega);
                    zVal = zVal.plus(z3);
                    zVal = zVal.plus(parameter[6]);
                    break;
            case 24:z1 = infiniteWarburgImpedance(parameter[2], omega);
                    z2 = impedanceInSeries(parameter[0], z1);
                    z3 = capacitanceImpedance(parameter[1], omega);
                    z4 = impedanceInParallel(z2, z3);
                    zVal = impedanceInSeries(z4, parameter[3]);
                    break;
            case 25:z1 = finiteWarburgImpedance(parameter[2], parameter[3], omega);
                    z2 = impedanceInSeries(parameter[0], z1);
                    z3 = capacitanceImpedance(parameter[1], omega);
                    z4 = impedanceInParallel(z2, z3);
                    zVal = impedanceInSeries(z4, parameter[4]);
                    break;
            case 26:z1 = constantPhaseElementImpedance(parameter[2], parameter[3], omega);
                    z2 = impedanceInSeries(parameter[0], z1);
                    z3 = capacitanceImpedance(parameter[1], omega);
                    z4 = impedanceInParallel(z2, z3);
                    zVal = impedanceInSeries(z4, parameter[4]);
                    break;
            case 27:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    z3 = infiniteWarburgImpedance(parameter[4], omega);
                    zVal = zVal.plus(z3);
                    break;
            case 28:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = rInParallelWithC(parameter[2], parameter[3], omega);
                    zVal = z1.plus(z2);
                    z3 = infiniteWarburgImpedance(parameter[4], omega);
                    z4 = new Complex(0.0D, -1.0D/(parameter[5]*omega));
                    z4 = impedanceInParallel(z3, z4);
                    zVal = zVal.plus(z4);
                    zVal = zVal.plus(parameter[6]);
                    break;
            case 29:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = constantPhaseElementImpedance(parameter[3], parameter[4], omega);
                    z3 = impedanceInParallel(z2, parameter[2]);
                    zVal = z1.plus(z3);
                    break;
            case 30:z1 = rInParallelWithC(parameter[0], parameter[1], omega);
                    z2 = constantPhaseElementImpedance(parameter[3], parameter[4], omega);
                    z3 = impedanceInParallel(z2, parameter[2]);
                    zVal = z1.plus(z3);
                    zVal = zVal.plus(parameter[5]);
                    break;
            case 31:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z2 = impedanceInParallel(z1, parameter[6]);
                    zVal = zVal.plus(z2);
                    break;
            case 32:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z2 = impedanceInParallel(z1, parameter[6]);
                    zVal = zVal.plus(z2);
                    zVal = zVal.plus(parameter[9]);
                    break;
            case 33:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z2 = impedanceInParallel(z1, parameter[6]);
                    zVal = zVal.plus(z2);
                    zVal = zVal.plus(parameter[9]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[10]*omega));
                    zVal = impedanceInParallel(zVal, z3);
                    break;
            case 34:z1 = new Complex(0.0D, -1.0D/(parameter[0]*omega));
                    z2 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, z2);
                    z1 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    z2 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z3 = impedanceInParallel(z1, z2);
                    zVal = zVal.plus(z3);
                    z1 = new Complex(0.0D, -1.0D/(parameter[6]*omega));
                    z2 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z3 = impedanceInParallel(z1, z2);
                    zVal = zVal.plus(z3);
                    break;
            case 35:z1 = new Complex(0.0D, -1.0D/(parameter[0]*omega));
                    z2 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, z2);
                    z1 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    z2 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z3 = impedanceInParallel(z1, z2);
                    zVal = zVal.plus(z3);
                    z1 = new Complex(0.0D, -1.0D/(parameter[6]*omega));
                    z2 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z3 = impedanceInParallel(z1, z2);
                    zVal = zVal.plus(z3);
                    zVal = zVal.plus(parameter[9]);
                    break;
            case 36:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    z2 = z1.plus(parameter[0]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    zVal = impedanceInParallel(z2, z3);
                    z1 = constantPhaseElementImpedance(parameter[5], parameter[6], omega);
                    z2 = z1.plus(parameter[4]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[7]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    z1 = constantPhaseElementImpedance(parameter[9], parameter[10], omega);
                    z2 = z1.plus(parameter[8]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[11]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    break;
            case 37:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    z2 = z1.plus(parameter[0]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    zVal = impedanceInParallel(z2, z3);
                    z1 = constantPhaseElementImpedance(parameter[5], parameter[6], omega);
                    z2 = z1.plus(parameter[4]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[7]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    z1 = constantPhaseElementImpedance(parameter[9], parameter[10], omega);
                    z2 = z1.plus(parameter[8]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[11]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    zVal = zVal.plus(parameter[12]);
                    break;
            case 38:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    z2 = z1.plus(parameter[0]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    zVal = impedanceInParallel(z2, z3);
                    z1 = constantPhaseElementImpedance(parameter[5], parameter[6], omega);
                    z2 = z1.plus(parameter[4]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[7]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    break;
            case 39:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    z2 = z1.plus(parameter[0]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[3]*omega));
                    zVal = impedanceInParallel(z2, z3);
                    z1 = constantPhaseElementImpedance(parameter[5], parameter[6], omega);
                    z2 = z1.plus(parameter[4]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[7]*omega));
                    z4 = impedanceInParallel(z2, z3);
                    zVal = zVal.plus(z4);
                    zVal = z4.plus(parameter[8]);
                    break;
            case 40:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z2 = impedanceInParallel(z1, parameter[6]);
                    zVal = zVal.plus(z2);
                    z3 = new Complex(0.0D, -1.0D/(parameter[10]*omega));
                    zVal = impedanceInParallel(zVal, z3);
                    zVal = zVal.plus(parameter[9]);
                    break;
            case 41:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = new Complex(0.0D, -1.0D/(parameter[4]*omega));
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[6], parameter[7], omega);
                    z2 = impedanceInParallel(z1, parameter[5]);
                    zVal = zVal.plus(z2);
                    z3 = new Complex(0.0D, -1.0D/(parameter[9]*omega));
                    zVal = impedanceInParallel(zVal, z3);
                    zVal = zVal.plus(parameter[8]);
                    break;
            case 42:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = new Complex(0.0D, -1.0D/(parameter[4]*omega));
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[6], parameter[7], omega);
                    z2 = impedanceInParallel(z1, parameter[5]);
                    zVal = zVal.plus(z2);
                    zVal = zVal.plus(parameter[8]);
                    break;
            case 43:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    z1 = constantPhaseElementImpedance(parameter[7], parameter[8], omega);
                    z2 = impedanceInParallel(z1, parameter[6]);
                    zVal = zVal.plus(z2);
                    zVal = zVal.plus(parameter[9]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[10]*omega));
                    zVal = impedanceInParallel(zVal, z3);
                    break;
            case 44:z1 = constantPhaseElementImpedance(parameter[1], parameter[2], omega);
                    zVal = impedanceInParallel(z1, parameter[0]);
                    z1 = constantPhaseElementImpedance(parameter[4], parameter[5], omega);
                    z2 = impedanceInParallel(z1, parameter[3]);
                    zVal = zVal.plus(z2);
                    zVal = zVal.plus(parameter[6]);
                    z3 = new Complex(0.0D, -1.0D/(parameter[7]*omega));
                    zVal = impedanceInParallel(zVal, z3);
                    break;
            default:throw new IllegalArgumentException("No model " + modelNumber + " exists");
        }

        return zVal;
    }

    // returns the Warburg coefficient, sigma, - infinite diffusion layer
    public static double warburgSigma(double electrodeArea, double oxidantDiffCoeff , double oxidantConcn, double reductantDiffCoeff, double reductantConcn, double tempCelsius, int electronsTransferred){
        double firstTerm = Fmath.R_GAS*(tempCelsius - Fmath.T_ABS)/(Fmath.square(electronsTransferred*Fmath.F_FARADAY)*electrodeArea*Math.sqrt(2));
        double secondTerm = 1.0D/(oxidantConcn*Math.sqrt(oxidantDiffCoeff));
        double thirdTerm = 1.0D/(reductantConcn*Math.sqrt(reductantDiffCoeff));
        return firstTerm*(secondTerm + thirdTerm);
    }


    // returns the capacitance of a parallel plate capacitor - plate width and length enterd
    public static double parallelPlateCapacitance(double plateArea, double plateSeparation, double relativePermittivity){
        return plateArea*relativePermittivity*Fmath.EPSILON_0/plateSeparation;
    }
    // returns the capacitance of a parallel plate capacitor - plate area entered
    public static double parallelPlateCapacitance(double plateLength, double plateWidth, double plateSeparation, double relativePermittivity){
        return plateLength*plateWidth*relativePermittivity*Fmath.EPSILON_0/plateSeparation;
    }

    // returns the capacitance of coaxial cylinders, e.g. model of a coaxial cable
    public static double coaxialCapacitance(double cylinderLength, double innerRadius, double outerRadius, double relativePermittivity){
        return 2.0D*Math.PI*relativePermittivity*Fmath.EPSILON_0*cylinderLength/Math.log(outerRadius/innerRadius);
    }

    // returns the capacitance of parallel wires
    public static double parallelWiresCapacitance(double wireLength, double wireRadius, double wireSeparation, double relativePermittivity){
        return Math.PI*relativePermittivity*Fmath.EPSILON_0*wireLength/Math.log((wireSeparation - wireRadius)/wireRadius);
    }

    // returns the inductance of parallel plates - plate width and length entered
    public static double parallelPlateInductance(double plateLength, double plateWidth, double plateSeparation, double relativePermeability){
        return relativePermeability*Fmath.MU_0*plateSeparation*plateLength/plateWidth;
    }

    // returns the inductance of coaxial cylinders, e.g. model of a coaxial cable
    public static double coaxialInductance(double cylinderLength, double innerRadius, double outerRadius, double relativePermeability){
        return relativePermeability*Fmath.MU_0*cylinderLength*Math.log(outerRadius/innerRadius)/(2.0D*Math.PI);
    }

    // returns the inductance of parallel wires
    public static double parallelWiresInductance(double wireLength, double wireRadius, double wireSeparation, double relativePermeability){
        return relativePermeability*Fmath.MU_0*wireLength*Math.log((wireSeparation - wireRadius)/wireRadius)/Math.PI;
    }

    // returns the magnitude of a rectangular complex variable
    public static double getMagnitude(Complex variable){
        return variable.abs();
    }

    // returns the argument (phase), in radians, of a rectangular complex variable
    public static double getPhaseRad(Complex variable){
        return variable.argRad();
    }

    // returns the argument (phase), in degrees, of a rectangular complex variable
    public static double getPhaseDeg(Complex variable){
        return variable.argDeg();
    }

    // converts magnitude and phase (radians) to a rectangular complex variable
    public static Complex polarRad(double magnitude, double phase){
        Complex aa = new Complex();
        aa.polarRad(magnitude, phase);
        return aa;
    }

    // converts magnitude and phase (degrees) to a rectangular complex variable
    public static Complex polarDeg(double magnitude, double phase){
        Complex aa = new Complex();
        aa.polarDeg(magnitude, phase);
        return aa;
    }

    // Converts frequency (Hz) to radial frequency
    public static double frequencyToRadialFrequency(double frequency){
        return  2.0D*Math.PI*frequency;
    }

    // Converts radial frequency to frequency (Hz)
    public static double radialFrequencyToFrequency(double omega){
        return  omega/(2.0D*Math.PI);
    }

    // METAL WIRE/CABLE/PLATE RESISTANCES
    // length = length in metres, area = cross-sectional
    // area = area in square metres
    // tempC = temptemperature in degrees Celsius
    // Data from  (1) Syed A Nasar, Electric Power Systems, Schaum's ouTlines, McGraw-Hill, 1990
    //            (2) Handbook of Chemistry and Physics, Chemical Rubber Publishing Company, Cleveland, Ohio, 37th Edition, 1955

    // Returns the resistance of aluminium
    public static double resistanceAluminium(double length, double area, double tempC){
        double rho = 2.824e-8;      // Al resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0039;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of aluminium
    public static double resistanceAluminum(double length, double area, double tempC){
        double rho = 2.824e-8;      // Al resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0039;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of hard drawn copper
    public static double resistanceHardDrawnCopper(double length, double area, double tempC){
        double rho = 1.771e-8;      // hard drawn Cu resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00382;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of annealed copper
    public static double resistanceAnnealedCopper(double length, double area, double tempC){
        double rho = 1.7241e-8;     // annealed Cu resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00393;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of 99.98% pure iron
    public static double resistanceIron(double length, double area, double tempC){
        double rho = 10.0e-8;      // Fe resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.005;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of manganese steel
    public static double resistanceManganeseSteel(double length, double area, double tempC){
        double rho = 70.0e-8;     // manganese steel resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.001;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of Siemens-Martin steel
    public static double resistanceSiemensMartinSteel(double length, double area, double tempC){
        double rho = 18.0e-8;     // Siemens-Martin steel resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.003;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of B. B. steel
    public static double resistanceBBSteel(double length, double area, double tempC){
        double rho = 11.9e-8;     // B. B. steel resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.004;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of E. B. B. steel
    public static double resistanceEBBSteel(double length, double area, double tempC){
        double rho = 10.4e-8;     // E. B. B. steel resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.005;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of brass
    // Average value of a range of resistivities from 6.4 to 8.4
    public static double resistanceBrass(double length, double area, double tempC){
        double rho = 7.4e-8;      // average brass resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.002;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of drawn tungsten
    public static double resistanceDrawnTunsten(double length, double area, double tempC){
        double rho = 5.6e-8;       // drawn tungsten resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0045;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of silver
    public static double resistanceSilver(double length, double area, double tempC){
        double rho = 1.59e-8;       // Ag resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0038;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of gold
    public static double resistanceGold(double length, double area, double tempC){
        double rho = 2.84e-8;       // Au resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0034;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of platinum
    public static double resistancePlatinum(double length, double area, double tempC){
        double rho = 10.0e-8;       // Pt resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.003;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of nickel
    public static double resistanceNickel(double length, double area, double tempC){
        double rho = 7.8e-8;        // Ni resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.006;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of drawn molybdenum
    public static double resistanceMolybdenum(double length, double area, double tempC){
        double rho = 5.7e-8;        // Mo resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.004;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of phosphor bronze
    public static double resistancePhosphorBronze(double length, double area, double tempC){
        double rho = 11.0e-8;       // phosphor bronze resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0033;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of tin
    public static double resistanceTin(double length, double area, double tempC){
        double rho = 11.5e-8;       // Sn resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0042;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of Nichrome
    public static double resistanceNichrome(double length, double area, double tempC){
        double rho = 100.0e-8;      // Nichrome resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0004;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of palladium
    public static double resistancePalladium(double length, double area, double tempC){
        double rho = 11.0e-8;       // Pd resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0033;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of tantalum
    public static double resistanceTantalum(double length, double area, double tempC){
        double rho = 15.5e-8;       // Ta resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0031;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of Therlo
    public static double resistanceTherlo(double length, double area, double tempC){
        double rho = 47.0e-8;       // Therlo resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00001;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of Monel metal
    public static double resistanceMonelMetal(double length, double area, double tempC){
        double rho = 42.0e-8;        // Monel metal resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.002;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of manganan
    public static double resistanceManganan(double length, double area, double tempC){
        double rho = 44.0e-8;        // Ni resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00001;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of constantan
    public static double resistanceConstantan(double length, double area, double tempC){
        double rho = 49.0e-8;       // Constantan resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00001;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }


    // Returns the resistance of antimony
    public static double resistanceAntimony(double length, double area, double tempC){
        double rho = 41.7e-8;       // Sb resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0036;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of cobalt
    public static double resistanceCobalt(double length, double area, double tempC){
        double rho = 9.8e-8;        // Co resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0033;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of magnesium
    public static double resistanceMagnesium(double length, double area, double tempC){
        double rho = 4.6e-8;        // Mg resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.004;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of zinc
    public static double resistanceZinc(double length, double area, double tempC){
        double rho = 5.8e-8;        // Zn resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0037;       // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of mercury
    public static double resistanceMercury(double length, double area, double tempC){
        double rho = 95.738e-8;     // Hg resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.00089;     // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of lead
    public static double resistanceLead(double length, double area, double tempC){
        double rho = 22.0e-8;       // Pb resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0039;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of German silver
    public static double resistanceGermanSilver(double length, double area, double tempC){
        double rho = 33.0e-8;       // German silver resistivity, ohms.metre, at 20 degrees Celsius
        double alpha = 0.0004;      // temperature coefficient, at 20 C, reciprocal degrees Celsius
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of material of restivity, rho, and temperature coefficient, alpha
    public static double resistivityToResistance(double rho, double alpha, double length, double area, double tempC){
        double resistance20 = rho*length/area;
        return resistance20*(1.0 + alpha*(tempC - 20.0));
    }

    // Returns the resistance of material of restivity, rho,
    public static double resistivityToResistance(double rho, double length, double area){
        return rho*length/area;
    }

    // Returns the resistivity of material of resistance, resistance
    public static double resistanceToResistivity(double resistance, double length, double area){
        return resistance*area/length;
    }
}
TOP

Related Classes of flanagan.circuits.Impedance

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.