Darcy Flow

Quick Start

We all know about Darcy's law of flow. The basic equation is simple and not worth an app. For the more interesting issue of capillary flow into a porous medium the Darcy calculation is a bit tricky. The app handles those issues for you.

Darcy Flow

Diameter D μm
Porosity ε
Viscosity η cP
SurfTen σ mN/m
Contact θ°
Time tmax s
//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();
};

//Main() is hard wired as THE place to start calculating when inputs change
//It does no calculations itself, it merely sets them up, sends off variables, gets results and, if necessary, plots them.
function Main() {
    //Save settings every time you calculate, so they're always ready on a reload
    saveSettings();

    //Send all the inputs as a structured object
    //If you need to convert to, say, SI units, do it here!
    const inputs = {
        D: sliders.SlideD.value * 1e-6, //μm to m
        V: sliders.SlideV.value * 1e-3, //cP to Pa.s
        sigma: sliders.Slidesigma.value * 1e-3, //mN/m to N/m
        theta: sliders.Slidetheta.value * Math.PI / 180, //deg to rad
        tmax: sliders.Slidetmax.value,
        eta: sliders.Slideeta.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('ty').value = result.ty; 
    //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 Main!
}

//Here's the app calculation
function CalcIt({ D, V, sigma, theta, eta, tmax }) {
    let DPts = [], dz = 0, z = 0.00001, tstep = 0.0001, t = 0
    const S = -4 * (1 - eta) - Math.pow(1 - eta, 2) - 3 - 2 * Math.log(1 - eta)
    const T = Math.log(1 - eta) + (1 - Math.pow(1 - eta, 2)) / (1 + Math.pow(1 - eta, 2))
    const Big = -D * sigma * Math.cos(theta) / (8 * V) * S * T / (S + T)
    DPts.push({ x: 0, y: 0 })
    while (t < tmax) {
        dz = tstep * Big / z
        z += dz
        DPts.push({ x: t, y: z * 1000 })
        t += tstep
        if (z * V/0.01 > 0.0005) tstep = 0.001
        if (z * V/0.01 > 0.005) tstep = 0.01
    }



    const plotData = [DPts]
    //Now set up all the graphing data detail by detail.
    const prmap = {
        plotData: plotData, //An array of 1 or more datasets
        lineLabels: ["Darcy"], //An array of labels for each dataset
        colors: ["blue"], //An array of colors for each dataset
        hideLegend: true,
        borderWidth: 2,
        xLabel: 't&s', //Label for the x axis, with an & to separate the units
        yLabel: 'z&mm', //Label for the y axis, with an & to separate the units
        y2Label: null, //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: null,
        logY: false, //Is the y-axis in log form?
        yTicks: null,
        legendPosition: 'top', //Where we want the legend - top, bottom, left, right
        xMinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
        yMinMax: [,], //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: 'P3', //These are the sig figs for the Tooltip readout. A wide choice!
        ySigFigs: 'P3', //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'],
    };
}

            

Basic Darcy's Law

The flow per unit area, q, of a fluid with viscosity η through a porous medium of length L under a pressure ΔP is described by Darcy's law

`q=k/(ηL)ΔP`

This is fine, but it needs the permeability k. Typically you apply various pressures, measure the flow and deduce k from the results. If the medium is complex, then measuring k is the best you can hope for.

Darcy Capillary Flow

Here we are interested in the case of capillary flow into a porous medium (a powder or fibre) where we only know some basic data:

  • D: powder or fibre diameter
  • ε: porosity (fraction of open space)
  • σ: surface tension of the liquid
  • θ: contact angle of liquid to solid
  • η: viscosity of the liquid

It is convenient to define two parameters, S & T:

`S=-4(1-ε)-(1-ε)^2-3-2ln(1-ε)`

`T=ln(1-ε)+(1-(1-ε)^2)/(1+(1-ε)^2)`

We can then calculate the permeability:

`k=-D^2/(16(1-ε))(ST)/(S+T)`

And finally we can calculate the rate, `(δz)/(δt)` at which the liquid progresses along the z direction into the porous medium. The k term disappears through use of S & T

`(δz)/(δt)=-(Dσcos(θ))/(8ηz)(ST)/(S+T)`

Obviously the rate of penetration decreases over time because of the z term on the bottom of the equation.