Emulsion Yield Stress
Quick Start
Many cosmetic and food emulsions stay stable against creaming because the emulsion has a significant yield stress. Here we see the core science of what controls this desirable characteristic. You might get a bit more stability at lower concentrations, but we have no theory for this.
Credits
I am grateful to Dr Duncan Gilbert for pointing out this phenomenon and providing the link to the key paper by Pal1
Emulsion Yield
//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 = {
R: sliders.SlideR.value / 1e6, //From μm
sigma: sliders.Slidesigma.value / 1000, //From mN/m
h: sliders.Slideh.value / 1e6, //From μm
phimin: sliders.Slidephimin.value,
Droplet: sliders.SlideDroplet.value / 1e6, //From μm
Deltarho: sliders.SlideDeltarho.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('tBlock').value = result.tBlock;
//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
//The inputs are just the names provided - their order in the curly brackets is unimportant!
//By convention the input values are provided with the correct units within Main
function CalcIt({ R, sigma, h, phimin, Droplet, Deltarho }) {
let Plot=[], phi, phieff, tau, sigR=sigma/R
for (phi=phimin; phi<0.9; phi+=0.01){
phieff=Math.min(0.999,Math.pow(1/(Math.pow(phi,-0.33333)-1.105/2*h/R),3))
tau=Math.max(0,sigR*Math.pow(phieff,0.33333)*(-0.08-0.114*Math.log10(1-phieff)))
Plot.push({x:phi,y:tau})
}
const tBlock=10*Droplet*Deltarho
//Now set up all the graphing data detail by detail.
let plotData = [Plot]
let lineLabels = ["Yield Stress"]//,"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: "τ0& Pa", //Label for the y axis, with an & to separate the units
y2Label: undefined, //Label for the y2 axis, null if not needed
yAxisL1R2: [1, 2], //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: [,], //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: [0,], //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: 'F1', //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'],
tBlock: tBlock.toFixed(3)
};
}
The theory is straightforward. You have an interfacial energy, σ, and an emulsion radius, R. The Yield Stress, τ0 at an emulsion volume fraction, φ, is given by:
`τ_0=σ/Rφ^0.333(-0.08-0.114log_10(1-φ))`
It's obviously an empirical equation, attributed to Princen & Kiss - the real parameters behind it are found in the paper.
However, in the real world there's an extra effect. If there is a "film thickness", h, around each emulsion drop (some sort of unspecified environment different from the bulk liquid) then the volume fraction to be used in the equation is the effective fraction given by:
`φ_(eff)^-0.333=φ^-0.333-0.5525h/R`
The default parameters for the app (R=1.4, h=0.09) are those from the Pal paper, giving a yield stress starting just above φ=0.7.
As you increase h with the slider, you find that you obtain a useful yield stress for smaller real φ values, giving you useful extra stability.
The effects for large radii are small, so the R slider maxes out at 10μm. As you go smaller, the h/R effect becomes strong so you may need to change φmin to lower values. But, of course, your h value might be unrealistically large for such a small droplet.
In Dr Gilbert's experience, you can get useful yield stresses down below φ=0.6. However, this doesn't emerge from the theory here because the sorts of yield stress values that will stop creaming are in the 0.1Pa region while the theory has been created/validated in the > 1 Pa range and creates negative values (changed to 0 in the app) at low φ values. Here is his explanation. "Let talk about oil (ρ = 900 kg/m³) in water (ρ = 1000) and a Droplet of size 100µm, with g rounded to 10 m/s². We have Δρ = (1000 – 900) and Stress = Δρ * 10 * 100µm = 100 * 10 * 100 *10-6 = 10-1 Pa. Basically if you want to vertically stabilize that kind of emulsion, you need a yield stress of 0.1 Pa."
Use Droplet size and Δρ as inputs to do this calculation yourself. Even if the app can't help you directly, finding ways to create and measure yield stresses in the sub 1 Pa range might be a useful formulation approach.
1Rajinder Pal, Yield stress and viscoelastic properties of high internal phase ratio emulsions, Colloid Polym Sci 277:583±588 (1999)