Dispersion Conductivity

Quick Start

The conductivity of a particle dispersion depends on the relative conductivities of the particle and the dispersion medium. Three formulae are available depending on circumstances.

Credits

I am grateful to Dr Mansur S. Mohammadi who first told me about these theories.

Dispersion Conductivity

kp
Aspect Ratio
Model
//One universal basic required here to get things going once loaded
window.onload = function () {
    //restoreDefaultValues(); //Un-comment this if you want to start with defaults
    Main();
};
//Any global variables go here


//Main is hard wired as THE place to start calculating when input changes
//It does no calculations itself, it merely sets them up, sends off variables, gets results and, if necessary, plots them.
function Main() {
    saveSettings();

    //Send all the inputs as a structured object
    //If you need to convert to, say, SI units, do it here!
    const inputs = {
        kp: sliders.Slidekp.value,
        AR: sliders.SlideAR.value,
        Model: document.getElementById('Model').value,
    }

    //Send inputs off to CalcIt where the names are instantly available
    //Get all the resonses as an object, result
    const result = CalcIt(inputs)

    //Set all the text box outputs
    // document.getElementById('Data').value = result.Data

    //Do all relevant plots by calling plotIt - if there's no plot, nothing happens
    //plotIt is part of the app infrastructure in app.new.js
    if (result.plots) {
        for (let i = 0; i < result.plots.length; i++) {
            plotIt(result.plots[i], result.canvas[i]);
        }
    }

    //You might have some other stuff to do here, but for most apps that's it for CalcIt!
}

//Here's the app calculation
function CalcIt({ kp, AR, Model }) {
    let phi = 0, kd = 1, it = 0, bf = 1, Plot = []
    const theSign = kp < 1 ? -1 : 1
    const theta = Math.acos(1 / AR)
    const W = (theta - 0.5 * Math.sin(2 * theta)) * Math.cos(theta) / Math.pow(Math.sin(theta), 3)
    const beta = 0.333 * (2 / (1 + (kp - 1) * W / 2) + 1 / (1 + (kp - 1) * (1 - W))) * (kp - 1)
    Plot.push({ x: 0, y: 1 })
    for (phi = 0.01; phi <= 0.501; phi += 0.01) {
        if (Model == "Fricke" && AR == 1) Model = "Maxwell"
        if (Model == "Maxwell") {
            kd = (kp + 2 - 2 * phi * (1 - kp)) / (kp + 2 + phi * (1 - kp))
        }
        if (Model == "Bruggeman") {
            //Solve iteratively, starting from previous value
            if (theSign < 1) {
                for (it = 0; it < 1000; it++) {
                    kd -= 0.001
                    if ((kd - kp) / (1 - kp) * Math.pow(1 / kd, 0.333) < 1 - phi) break
                }
            } else {
                if (kp == 1) break //No need to calculate
                for (it = 0; it < 1000; it++) {
                    kd += 0.001
                    if ((kd - kp) / (1 - kp) * Math.pow(1 / kd, 0.333) < 1 - phi) break
                }
            }
        }
        if (Model == "Fricke") {
            bf = beta * phi / (1 - phi)
            kd = (bf * kp + kp - 1) / (kp - 1 + bf)
        }
        Plot.push({ x: phi, y: kd })
    }
    //Now set up all the graphing data detail by detail.
    let plotData = [Plot]
    let lineLabels = ["Relative Conductivity"]//,"Plot1","Plot2","Plot3"] //An array of labels for each dataset
    const prmap = {
        plotData: plotData,
        lineLabels: lineLabels,
        xLabel: "φ&", //Label for the x axis, with an & to separate the units
        yLabel: "kd/km&", //Label for the y axis, with an & to separate the units
        y2Label: undefined, //Label for the y2 axis, null if not needed
        yAxisL1R2: [], //Array to say which axis each dataset goes on. Blank=Left=1
        logX: false, //Is the x-axis in log form?
        xTicks: undefined, //We can define a tick function if we're being fancy
        logY: false, //Is the y-axis in log form?
        yTicks: undefined, //We can define a tick function if we're being fancy
        legendPosition: 'top', //Where we want the legend - top, bottom, left, right
        xMinMax: [, 0.5], //Set min and max, e.g. [-10,100], leave one or both blank for auto
        yMinMax: [0,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
        y2MinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
        xSigFigs: 'F2', //These are the sig figs for the Tooltip readout. A wide choice!
        ySigFigs: 'F2', //F for Fixed, P for Precision, E for exponential
    };

    //Now we return everything - text boxes, plot and the name of the canvas, which is 'canvas' for a single plot

    return {
        plots: [prmap],
        canvas: ['canvas'],
    };

}

        

We have a dispersion medium with a relative conductivity km which by definition = 1. A particle with relative conductivity kp (which might be zero) is added at volume fraction φ and the resulting relative conductivity of the dispersion is kd.

The simplest formula is from Maxwell:

`k_d=(k_p+2-2φ(1-k_p))/(k_p+2φ(1-k_p))`

Bruggeman gives us a somewhat unwieldy formula

`1-φ=(k_d-k_p)/(k_m-k_p)root(3)(k_m/k_d)`

The app solves for kd via an iterative process.

Bruggeman is especially suited for dispersions with broad size distributions rather than the narrow size distributions assume by the other two.

Finally there's the Fricke formula which depends on the aspect ratio (length over width) of the particle. The formula is too complex to show here but you can work it out from the code. When AR = 1 it reverts to the Maxwell equation.

The theories get unreliable at "high" volume fractions so the app stops at φ = 0.5.

Layman's Guide

Dr Mohammadi has kindly provided a version of a guide from 1993 on the details of measuring conductivity (as well as other techniques). Click the link to download his Measurement Techniques.pdf