Spray Drying

Quick Start

Although spray drying is highly complex and can only be fully modelled with high-powered tools such as CFD, some core ideas can be captured via a set of relatively simple formulae and input data.


The app is based on Reinhard Vehring's Pharmaceutical Particle Engineering via Spray Drying, Pharmaceutical Research, 25, 999-1022, 2008.

Spray Drying

cFeed g/cc
cSat g/cc
rSolute nm
dDrop μm
Tgas °C
η cP
ρParticle g/cc
ρTrue g/cc
D cm²/s
dgeometric μm
daerodynamic μm
Twet bulb °C
tDry s
tSat s
tPrecipitation s
tTrue density s
k cm²/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
//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() {

    //Send all the inputs as a structured object
    //If you need to convert to, say, SI units, do it here!
    const inputs = {
        cF: sliders.SlidecF.value * 1000, //from g/cc to kg/m3
        csol: sliders.Slidecsol.value * 1000, //from g/cc to kg/m3
        r: sliders.Slider.value / 1e9, //From nm to m
        dD: sliders.SlidedD.value * 1e-6, //μm to m
        Tg: sliders.SlideTg.value + 273.15, //from C to K
        visc: sliders.Slidevisc.value / 1000, //from cP to Pa.s
        rhoP: sliders.SliderhoP.value * 1000, //from g/cc to kg/m3
        rhot: sliders.Sliderhot.value * 1000, //from g/cc to kg/m3
        solvInfo: document.getElementById('Solvent').value

    //Get all the resonses as a structure
    const result = CalcIt(inputs)

    //Set all the text box outputs
    document.getElementById('D').value = result.D
    document.getElementById('dg').value = result.dg
    document.getElementById('da').value = result.da
    document.getElementById('Twb').value = result.Twb
    document.getElementById('Pe').value = result.Pe
    document.getElementById('tD').value = result.tD
    document.getElementById('tSat').value = result.tsat
    document.getElementById('tp').value = result.tp
    document.getElementById('tt').value = result.tt
    document.getElementById('k').value = result.k

//Here's the real app calculation
function CalcIt({ cF, csol, r, dD, Tg, visc, rhoP,rhot, solvInfo }) {
    //The structure automatically has the names provided from input
    //By convention the values are provided with the correct units within CalcIt
    let SS = solvInfo.split("[")
    SS = SS[1].split(",")
    const MWt = parseFloat(SS[0])
    const MVol = parseFloat(SS[1]) //Not used, but who knows if we'll need it sometime
    const AA = parseFloat(SS[2])
    const AB = parseFloat(SS[3])
    const AC = parseFloat(SS[4].replace("]", ""))
    //Get the BPt from the Antoine constants 
    const AAlogP=AA-Math.log10(760)
    const Tb=(AB-AC*AAlogP)/AAlogP+273.15
    //Now the approximation to wet bulb
    const Twb = 137 * Math.pow(Tb / 373.15, 0.68) * Math.log10(Tg) - 45
    const kB = 1.38e-23
    //Difusion coef via Stokes-Einstein
    const D = kB * Twb / (6 * Math.PI * visc * r)
    const dg = Math.pow(cF / rhoP, 0.333) * dD
    const da = Math.pow(rhoP / 1000, 0.166) * dg
   const rhoRatio=1.1/1000 //Typical warm air divided by typical liquid kg/m3
    const Dg=18/MWt*(22.5e-6*Math.pow(Tg/273,1.8)) //A rough correction for T and MWt
    //Now the saturated mass fraction
    const YsTwb=Math.pow(10,AA-AB/(AC+Twb-273))/760
    const Yinf=0 //We can add this as an input if required
    //Now the evaporation rate
    const k=8*Dg*rhoRatio*(YsTwb-Yinf)
    const Pe=k/(8*D)
    //Theoretical drying time for unimpeded drop
    const tD=Math.pow(dD,2)/k
    const E=1+Pe/5+Math.pow(Pe,2)/100-Math.pow(Pe,3)/4000
    //Saturation time
    const Sat=cF/csol
    const tsat=tD*(1-Math.pow(Sat*E,0.667))
    //Precipitation window
    const tp=tD-tsat
    //Time to true density - goes negative with high E from high Peclet
    const tt=Math.max(0,tD*(1-Math.pow(cF/rhot*E,0.667)))

    return {
        D: (D * 1e4).toExponential(3),
        dg: (dg * 1e6).toPrecision(3),
        da: (da * 1e6).toPrecision(3),
        k:(k*1e4).toExponential(3),//export as cm2/s

The paper by Vehring provides a detailed and welcomely clear tour through the various competing processes during the drying of a drop. The nomenclature of nearly 40 relevant parameters provided in the paper is clear but for the app user the input and output values are expanded versions, with (hopefully) easy mapping between the two versions. A number of intermediate values are used in the calculations (just click the Show Code button to see) and again their terminology matches the paper's. Let's see what's going on. For an expert critique of the limitations of the app, see below.

We start off with a drop of diameter dDrop containing a solute at concentration cFeed which is below its saturated solubility of cSat. From these and the density of the particle ρParticle and an assumed liquid density ρ* = 1 we can calculate the dried diameter dgeometric and the aerodynamic diameter (used, e.g. for pulmonary delivery) daerodyamic:

`d_"geometric"=d_"Drop"(c_"Feed"/ρ_"Particle")^(0.333)` and `d_"aerodynamic"=d_"geometric"(ρ_"Particle"/(rho"*"))^(0.167)`

The viscosity is η and the solute has a radius rSolute from which a diffusion coefficient D can be calculated for temperature T (the drop temperature, assumed to be the wet bulb described shortly) and Bolztmann constant kB via Stokes-Einstein


If we know (see below) the evaporation rate, κ, we can find the characteristic time to dry the drop, tDry via:


From κ and the diffusion coefficient we can calculate the Peclet number, Pe which describes the relative rates of drying and diffusion. If Pe is large then there is no time for the solute to equilibrate by diffusion so a shell starts to form. Pe is given by:


The ratio surface/bulk concentration is the enrichment, E , which can be approximated, if Pe < 20, via:


From E and a knowledge of the original Saturation, S, of the solution (cFeed/cSat) we can find the time to saturation:


There's a similar equation, using P = cFeedTrue to find the time for the shell to reach its "true" dry density (as opposed to the density of the final particle which might be lower if full of holes):


If you happen to know how rapidly your solute crystallises then you can check the precipitation window time to see whether you'll end up with crystalline or amorphouse material:


The Evaporation Rate, κ

We know that in any well-run spray drier, the temperature in the droplet is much lower than that of the hot air, Tgas, because of evaporative cooling. This allows us to spray dry delicate materials at high speeds in very hot air. The temperature of the drop is the "wet bulb" temperature, Twet bulb, and its value depends on enthalpy of vaporization, heat capacity, Lewis number and the vapour pressure (or, rather, the mass fraction, Y, compared to full saturation) of the solvent at a given temperature. Fortunately, there is an approximation that is good enough for this app which just needs Tb, the boiling point of the solvent, and Tgas:

`T_"wet bulb"=137(T_b/373)^0.68log10(T_"gas")-45`

Note that we input T values in °C but calculations are in °K. When you choose a solvent you get the MWt, the MVol (currently not used) and the three Antoine Constants, AA, AB, AC. From the Antoines we can calculate both Tb (by finding T when the pressure = 760 mm/Hg) and Y (vapour pressure at Twet bulb/760). We need a few more parameters (hard coded) which are Dg the diffusion coefficient of the solute in the gas and the ratio of densities of gas and liquid, ρratio. Assuming that the concentration of solvent away from the drop, Y is zero we calculate κ via:


The value of κ is quoted in cm²/s to match the units of the diffusion coefficient D.

So what?

There are two criticisms that can equally be applied to this app (and to the original paper): It's too complicated and It's too simplistic. But let's think through what it's trying to let us do. If you happen to have a full spray drying model and the experience/knowlege to operate such a complex bit of software, you won't be reading this page. If you want spray drying to be magic, or just want to use "standard settings" you will, equally, not be reading this page.

This intermediate scale view gives a feel for the levers you can pull to alter your spray drying process. Do you need uniform, spherical particles? Then you need a low Peclet number so that the solute has time to equilibrate as the particle shrinks? So how do you reduce Pe? Decrease κ by changing the solvent or temperature, or increase D by reducing viscosity and size of the solute.

Various shapes from spray dryingIf, instead, you want funny shapes from rapidly-formed shells that then deform as they hollow out or maybe explode from pent-up solvent, you need a large Pe.

And, of course, you have the trade-offs of original drop size with available time to dry at a temperature that gives you the right sort of κ. The "obvious" solution of using smaller drops meets the challenge of finding an atomizer that reliably gives you a tight size distribution at that smaller diameter. And if you know that you are going to have some larger drops, you can easily see whether they are going to have a problem in terms of the various timescales, compared to your notional drop size.

That's not a bad set of capabilities from a relatively simple app.

But spray drying is far more than this!

Prof David York at U Leeds is not only a leading academic in the world of spray drying, but also has had many years of real-world experience during his time at Proctor & Gamble. Prof York kindly provided this critique (lightly edited by myself) of aspects of the app:

  1. The diffusion equation is fine with respect to dilute systems and relatively spherical molecules but the deviations get large once you move away from these simpler systems. Its still a good rule of thumb though to guide the practitioner in thinking about what factors do what, and importantly to what magnitude.
  2. The theory here is focussed on crystalline solutes but there is a large range of systems where the simple theory of reaching saturated solution can't apply. Still, everything has a solubility limit so users can interpret the saturated concentration with some flexibility.
  3. Diffusion depends on all species in the drying regime. Water is usually fast but certain additives can really slow down the diffusion rate where the additives chemically interact with the water, such as water soluble polymers, sugars and surfactants.
  4. These equations work best for small droplets. Once you get above 50 microns it is difficult to see how one can measure the relevant parameters. Also the shape of the particle starts to influence the moisture movement.
  5. Particles are almost never fully dry as the drying time would be infinite. What is critical is how much residula water can you accept - the higher the better. Otherwise you need a second drying unit operation such as a fluid bed to provide the longer times for the remaining water to get out.
  6. There's a caveat needed for formulated liquids; the system here really works best for solutions.
  7. There's much more to add such as atomisation, drying temperatures, impact of wide droplet distribution etc. There are plenty more possibilities for spray drying apps!