Forward Models

Single DMA

Constant Voltage

The DMA is operated in classifier mode and set to a single voltage. The mobility classified particles are then passed to one or more detectors. Transmission can be modeled by the convolution of the particle Charging Probability, DMA Transfer Function, and Transmission Loss through the DMA. These are built into the DMA Grid. Therefore a net transmission function can be written:

Info

The net transmission function T describes transmission through the DMA, including the charge filter, the DMA transfer function, and the DMA transmission efficiency.

T(zˢ,k,Λ,δ) = δ.Ω(Λ,δ.Z,zˢ/k).*δ.Tc(k,δ.Dp).*δ.Tl(Λ,δ.Dp)

where Λ is the DMA configuration, δ the DMA grid, zˢ is the z-star selected by the DMA, and k is the number of charges.

The following example shows ho to use T(zˢ,k,Λ,δ) to predict the mobility distribution exiting the DMA. In the code fragment

  • zˢ is the z-star selected by the DMA
  • 𝕟ᶜⁿ is an assumed known bimodal lognormal distribution computed on the DMA size grid
  • ℕ is an array of transmitted mobility distributions carrying k charges
  • 𝕄 is an array of transmitted apparent mobility distributions carrying k charges
  • 𝕟ₜ, 𝕞ₜ are the superposition of these distributions
using DifferentialMobilityAnalyzers

# Create a DMA config
qsa,qsh = 1.66e-5, 8.33e-5                       # Qsample [m3 s-1], Qsheath [m3 s-1]
t,p = 295.15, 1e5                                # Temperature [K], Pressure [Pa]
r₁,r₂,l = 9.37e-3,1.961e-2,0.44369               # DMA geometry [m]
Λ = DMAconfig(t,p,qsa,qsh,r₁,r₂,l,0.0,:-,6,:cylindrical)

# Create a DMA grid
z₁,z₂ = vtoz(Λ,10000), vtoz(Λ,10)    # bins, upper, lower mobility limit
δ = setupDMA(Λ, z₁, z₂, 512);

# Compute the transmission through the DMA
T(zˢ,k,Λ,δ) = δ.Ω(Λ,δ.Z,zˢ/k).*δ.Tc(k,δ.Dp).*δ.Tl(Λ,δ.Dp)
zˢ = dtoz(Λ, 100*1e-9)
𝕟ᶜⁿ = DMALognormalDistribution([[900., 40., 1.5], [500., 180., 1.4]], δ)
ℕ = map(k -> T(zˢ,k,Λ,δ)*𝕟ᶜⁿ,1:3)
𝕄 = map(k -> (ztod(Λ,1,zˢ)/ztod(Λ,k,zˢ))⋅(T(zˢ,k,Λ,δ)*𝕟ᶜⁿ),1:3)
𝕟ₜ, 𝕞ₜ = sum(ℕ), sum(𝕄)
Mobility Diameter (nm) 100 150 200 250 𝕟ₜ ℕ[1] ℕ[2] ℕ[3] h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 110 -50 -45 -40 -35 -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 -50 0 50 100 -50 -48 -46 -44 -42 -40 -38 -36 -34 -32 -30 -28 -26 -24 -22 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 Apparent +1 Mobility Diameter (nm) 80 100 120 140 𝕞ₜ 𝕄[1] 𝕄[2] 𝕄[3] h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -100 -80 -60 -40 -20 0 20 40 60 80 100 120 140 160 180 -80 -75 -70 -65 -60 -55 -50 -45 -40 -35 -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155 160 -100 0 100 200 -80 -75 -70 -65 -60 -55 -50 -45 -40 -35 -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155 160 Particle diameter (nm) 10 50 100 500 𝕟ᶜⁿ h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -1500 -1000 -500 0 500 1000 1500 2000 2500 -1000 -900 -800 -700 -600 -500 -400 -300 -200 -100 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 -1000 0 1000 2000 -1000 -950 -900 -850 -800 -750 -700 -650 -600 -550 -500 -450 -400 -350 -300 -250 -200 -150 -100 -50 0 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100 1150 1200 1250 1300 1350 1400 1450 1500 1550 1600 1650 1700 1750 1800 1850 1900 1950 2000 dN/dlnD (cm-3)

Figure. Left: assumed bimodal lognormal size distribution. Middle: monodisperse mobility size distribution plotted against the apparent +1 mobility diameter, defined as the apparent setpoint diameter of the DMA. Dashed line is total number concentration. Right: same as middle panel but plotted versus the mobility diameter.

The DMA selects approximately a triangular distribution around mobility centroid $z^s$. The distribution is symmetric when plotted against the log of mobility, but asymmetric when plotted against the log of the apparent +1 mobility diameter because the Cunningham slip flow correction factor applied in the conversion from mobility to diameter is a strong function of particle size. The majority of selected particles are singly charged, but the contribution of multiply charged particles to the total number is not negligible. The mobility distribution has contributions from particles that are at least twice the diameter of the selected centroid diameter. The relative fractions are determined by the equilibrium charge fraction and the number of particles available at each diameter.

Info

The map(k->f, 1:3) construct sequentially applies values from the array [1,2,3] to k and calls the function f. The output is an array of length 3. Since T(zˢ,k,Λ,δ) produces a vector, 𝕟ᶜⁿ is a size distribution, and vector * size distribution is a size distribution, the output of

ℕ = map(k -> T(zˢ,k,Λ,δ)*𝕟ᶜⁿ,1:3) 

is an array of size distributions.

For more information see Figure 2 in the Manuscript, check out Session 2 of the Tutorial and/or Notebook S4 in the Notebooks section.

Complete Distribution

If the DMA is stepped or scanned, the response function can be computed from the convolution Matrix 𝐀 and the known true size distribution. The operation matrix * size distribution is defined in the Operators section. Thus we can conveniently write 𝕣 = 𝐀 * 𝕟 to compute the response function.

δ = setupDMA(Λ, z₁, z₂, 60);
𝕟 = DMALognormalDistribution([[400, 30, 1.2],[500, 110, 1.7]], δ)
𝕣 = δ.𝐀 * 𝕟
Particle diameter (nm) 10 20 50 100 200 500 𝕟 𝕣 Distribution h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -1500 -1000 -500 0 500 1000 1500 2000 2500 -1000 -900 -800 -700 -600 -500 -400 -300 -200 -100 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 -1000 0 1000 2000 -1000 -950 -900 -850 -800 -750 -700 -650 -600 -550 -500 -450 -400 -350 -300 -250 -200 -150 -100 -50 0 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100 1150 1200 1250 1300 1350 1400 1450 1500 1550 1600 1650 1700 1750 1800 1850 1900 1950 2000 dN/dlnD (cm-3)

Tandem DMAs

Humidified Tandem DMA

Single Composition

Dried, charge equilibrated particles are classified in DMA1. The flow is split to measure particle concentration with a condensation particle counter (CPC). The remaining flow is passed through a humidifier. Hygroscopic particles take up water and increase in diameter. The humidified size distribution is measured using the second DMA that is operated in scanning or stepping mode. Passage through a second bipolar charger (charge neutralizer) is optional and rarely used in TDMA experiments.

To model transmission through the tandem DMA we need to

  • setup two DMAs, δ₁ and δ₂
  • know the input size distribution
  • formulate a transmission model

Setting up DMAs is described in DMA Configuration. The input size distribution is assumed based on a lognormal distribution. The constructor function DMALognormalDistribution initializes a lognormal distribution along a DMA grid.

Ax = [[1300.0, 60.0, 1.4], [2000.0, 200.0, 1.6]]
𝕟ᶜⁿ = DMALognormalDistribution(Ax, δ₁)

The transmission model is a combination of operating DMA₁ at Constant Voltage and transmission of a Complete Distribution through DMA₂.

# Tandem DMA equations
O(k) = mapfoldl(zs -> (δ₂.Ω(Λ₂, δ₂.Z, zs / k, k) .* δ₂.Tl(Λ₂, δ₂.Z, k))', vcat, δ₂.Z)
T₁(zˢ, k) = δ₁.Ω(Λ₁, δ₁.Z, zˢ / k, k) .* δ₁.Tc(k, δ₁.Dp) .* δ₁.Tl(Λ₁, δ₁.Dp)
DMA₁(𝕟, zˢ, gf) = @_ map((gf ⋅ (T₁(zˢ, _) * 𝕟)), 1:6)
itp(𝕟) = interpolateSizeDistributionOntoδ((𝕟, δ₂))
DMA₂(𝕟, k) = O(k) * 𝕟

The function T(zˢ, k, Λ, δ) is already known. The function DMA₁(𝕟, zˢ, gf) takes a distribution 𝕟 and mobility zˢ and passes it through DMA Λ₁, δ₁ and applied growth factor gf. The resulting distributions are interpolated into the same grid as DMA2 using interpolateSizeDistributionOntoδ. The function DMA₂(𝕟, δ) takes an input size distribution 𝕟 and passes it through DMA₂. No neutralizer is used. Therefore the convolution O(k) is applied. Note that O(k) corresponds to Eq. (15) in Petters (2021).

Note

The dot product of scalar ⋅ SizeDistribution shifts the size distribution in diameter space: Size Operators. Check out the Tutorial Session 1 and/or Notebook S3 in the Notebooks section for visualizations.

Here is an abriged example how to compute the grown output distributions from DMA2

Dd = 100e-9             # Dry diameter
zˢ = dtoz(Λ₁, Dd);      # Mobility of 100 nm particle
gf = 1.6                # Growth factor
ℕ = DMA₁(𝕟ᶜⁿ, zˢ, gf)   # Transmission through DMA1
𝕄 = map(k -> (@> itp(ℕ[k]) DMA₂(k)), 1:3) # Transmission through DMA2
𝕞ᵗ = sum(𝕄)                               # total response

𝕄[k] correspond to the +1, +2, +3 partial mobility response functions that would be measured after DMA2. The total is obtained by the sum of these distributions Below is the complete example, which produces the response function of the tandem DMA.

t, p = 295.15, 1e5                             # Temperature [K], Pressure [Pa]
qsa, β = 1.66e-5, 1 / 5                        # Qsample [m3 s-1], Sample-to-sheath ratio
r₁, r₂, l = 9.37e-3, 1.961e-2, 0.44369         # DMA geometry [m]
Λ₁ = DMAconfig(t, p, qsa, qsa / β, r₁, r₂, l, 0.0, :-, 3, :cylindrical)  # Specify DMA1
Λ₂ = DMAconfig(t, p, qsa, qsa / β, r₁, r₂, l, 0.0, :-, 3, :cylindrical)  # Specify DMA2
bins, z₁, z₂ = 512, dtoz(Λ₁, 500e-9), dtoz(Λ₁, 30e-9) # bins, upper, lower mobility limit
δ₁ = setupDMA(Λ₁, z₁, z₂, bins)                  # Compute matrices
δ₂ = setupDMA(Λ₂, z₁, z₂, bins)                  # Compute matrices

# Upstream Size Distribution
Ax = [[1300.0, 60.0, 1.4], [5000.0, 220.0, 1.6]]
𝕟ᶜⁿ = DMALognormalDistribution(Ax, δ₁)

# Tandem DMA equations
O(k) = mapfoldl(zs -> (δ₂.Ω(Λ₂, δ₂.Z, zs / k, k) .* δ₂.Tl(Λ₂, δ₂.Z, k))', vcat, δ₂.Z)
T₁(zˢ, k) = δ₁.Ω(Λ₁, δ₁.Z, zˢ / k, k) .* δ₁.Tc(k, δ₁.Dp) .* δ₁.Tl(Λ₁, δ₁.Dp)
DMA₁(𝕟, zˢ, gf) = @_ map((gf ⋅ (T₁(zˢ, _) * 𝕟)), 1:3)
itp(𝕟) = interpolateSizeDistributionOntoδ((𝕟, δ₂))
DMA₂(𝕟, k) = O(k) * 𝕟

Dd = 100e-9             # Dry diameter
zˢ = dtoz(Λ₁, Dd);      # Mobility of 100 nm particle
gf = 1.6                # Growth factor
ℕ = DMA₁(𝕟ᶜⁿ, zˢ, gf)   # Transmission through DMA1
𝕄 = map(k -> (@> itp(ℕ[k]) DMA₂(k)), 1:3) # Transmission through DMA2
𝕞ᵗ = sum(𝕄)                               # total response
Apparent Growth Factor 1.2 1.4 1.6 1.8 2.0 𝕞ᵗ 𝕄[1] 𝕄[2] 𝕄[3] h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -1.00×10⁴ -8.00×10³ -6.00×10³ -4.00×10³ -2.00×10³ 0 2.00×10³ 4.00×10³ 6.00×10³ 8.00×10³ 1.00×10⁴ 1.20×10⁴ 1.40×10⁴ 1.60×10⁴ 1.80×10⁴ -8.000×10³ -7.500×10³ -7.000×10³ -6.500×10³ -6.000×10³ -5.500×10³ -5.000×10³ -4.500×10³ -4.000×10³ -3.500×10³ -3.000×10³ -2.500×10³ -2.000×10³ -1.500×10³ -1.000×10³ -5.000×10² 0 5.000×10² 1.000×10³ 1.500×10³ 2.000×10³ 2.500×10³ 3.000×10³ 3.500×10³ 4.000×10³ 4.500×10³ 5.000×10³ 5.500×10³ 6.000×10³ 6.500×10³ 7.000×10³ 7.500×10³ 8.000×10³ 8.500×10³ 9.000×10³ 9.500×10³ 1.000×10⁴ 1.050×10⁴ 1.100×10⁴ 1.150×10⁴ 1.200×10⁴ 1.250×10⁴ 1.300×10⁴ 1.350×10⁴ 1.400×10⁴ 1.450×10⁴ 1.500×10⁴ 1.550×10⁴ 1.600×10⁴ -1.0×10⁴ 0 1.0×10⁴ 2.0×10⁴ -8.000×10³ -7.500×10³ -7.000×10³ -6.500×10³ -6.000×10³ -5.500×10³ -5.000×10³ -4.500×10³ -4.000×10³ -3.500×10³ -3.000×10³ -2.500×10³ -2.000×10³ -1.500×10³ -1.000×10³ -5.000×10² 0 5.000×10² 1.000×10³ 1.500×10³ 2.000×10³ 2.500×10³ 3.000×10³ 3.500×10³ 4.000×10³ 4.500×10³ 5.000×10³ 5.500×10³ 6.000×10³ 6.500×10³ 7.000×10³ 7.500×10³ 8.000×10³ 8.500×10³ 9.000×10³ 9.500×10³ 1.000×10⁴ 1.050×10⁴ 1.100×10⁴ 1.150×10⁴ 1.200×10⁴ 1.250×10⁴ 1.300×10⁴ 1.350×10⁴ 1.400×10⁴ 1.450×10⁴ 1.500×10⁴ 1.550×10⁴ 1.600×10⁴ dN/dlnD (cm⁻³)

The figure demonstrates the apparent shift toward smaller growth factors for multicharge particles. See Petters (2021) for more explanation. The complete example is reproduced as transmission3.jl in the examples/ folder of the main repository.

Multiple Compositions

The above example can be extended to write a TDMA model that integrates over a pdf. This function can be obtained from TDMA1Dpdf, which is part of the package.

function TDMA1Dpdf(𝕟ᵢₙ, Λ₁ᵢₙ, Λ₂ᵢₙ, dma2rangeᵢₙ)
    Λ₁, Λ₂, 𝕟1 = deepcopy(Λ₁ᵢₙ), deepcopy(Λ₂ᵢₙ), deepcopy(𝕟ᵢₙ)
    r = deepcopy(dma2rangeᵢₙ)
    Dd, gmin, gmax, n = r[1], r[2], r[3], r[4]
    nDMA, Dmin, Dmax = length(𝕟1.Dp), minimum(𝕟1.Dp), maximum(𝕟1.Dp)

    δ₁ = setupDMA(Λ₁, dtoz(Λ₁, Dmax * 1e-9), dtoz(Λ₁, Dmin * 1e-9), nDMA)
    δ₂ = setupDMA(Λ₂, dtoz(Λ₂, gmax * Dd), dtoz(Λ₂, gmin * Dd), n)
    𝕟 = interpolateSizeDistributionOntoδ((𝕟1, δ₁))

    @memoize O(k) = (hcat(map(i -> δ₂.Ω(Λ₂, δ₂.Z, i/k, k) .* δ₂.Tl(Λ₂, δ₂.Dp), δ₂.Z)...))'
    @memoize T₁(zˢ, k) = δ₁.Ω(Λ₁, δ₁.Z, zˢ / k, k) .* δ₁.Tc(k, δ₁.Dp) .* δ₁.Tl(Λ₁, δ₁.Dp)
	@memoize DMA₁(𝕟, zˢ, gf) = @_ map((gf ⋅ (T₁(zˢ, _) * 𝕟)), 1:6)
	@memoize DMA₂(𝕟, k) = O(k) * 𝕟
	@memoize itp(𝕟) = interpolateSizeDistributionOntoδ((𝕟, δ₂))
	@memoize function TDMA(𝕟, zˢ, gf)
		ℕ = DMA₁(𝕟, zˢ, gf)
		map(k -> (@> itp(ℕ[k]) DMA₂(k)), 1:length(ℕ)) |> sum
	end
	
	@memoize model(𝕟, P, Dd, gf) =
		sum(@_ map(P[_] * TDMA(𝕟, dtoz(Λ₁, Dd), gf[_]), 1:length(P)))
end

Note that the basic principle is the same as the single composition above. However, DMA₁(𝕟, zˢ, gf) sums directly over all charges, so the individual charge distributions are not considered. The function TDMA(𝕟, zˢ, gf) returns the output from the TDMA. The function model(𝕟, P, Dd, gf) extends this over a pdf, where gf is a list of growth fractors and P are corresponding probabilities. It one possible implementation of Eqs. (16) and (17) in Petters (2021)

Below is an example with 4 population each having a unique growth factor and fractional contribution to the total distribution. If the fractions are known, the net response function of the TDMA is readily computed. The example is reproduced as transmission4.jl in the examples folder of the main repository.

t, p = 295.15, 1e5
qsa, qsh = 1.66e-5, 8.33e-5
r₁, r₂, l = 9.37e-3, 1.961e-2, 0.44369
Λ₁ = DMAconfig(t, p, qsa, qsh, r₁, r₂, l, 0.0, :-, 6, :cylindrical)
Λ₂ = DMAconfig(t, p, qsa, qsh, r₁, r₂, l, 0.0, :-, 6, :cylindrical)
bins, z₁, z₂ = 120, dtoz(Λ₁, 500e-9), dtoz(Λ₁, 30e-9) # bins, upper, lower mobility limit
δ₁ = setupDMA(Λ₁, z₁, z₂, bins)

Ax = [[1300.0, 60.0, 1.4], [5000.0, 220.0, 1.6]]
𝕟 = DMALognormalDistribution(Ax, δ₁)

# scan 100 nm Dd from 0.8Dd to 3.0Dd with 100 bins
dma2range = (100e-9, 0.8, 3.0, 120)

# Get the model function
model = TDMA1Dpdf(𝕟, Λ₁, Λ₂, dma2range)

P = [0.5,0.15, 0.10, 0.25]   # Probability of growth factor (4 populations)
gf = [1.0, 1.2, 1.6, 2.1]    # Values of growth factor
𝕘 = model(𝕟, P, dma2range[1], gf)
Growth Factor (-) 1.0 1.5 2.0 2.5 3.0 h,j,k,l,arrows,drag to pan i,o,+,-,scroll,shift-drag to zoom r,dbl-click to reset c for coordinates ? for help ? -30 -25 -20 -15 -10 -5 0 5 10 15 20 25 30 35 40 45 50 55 -26 -24 -22 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 -25 0 25 50 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Number concentration (cm-3)

Volatilty Tandem DMA

See the Manuscript and notebook S9 in the Notebooks section for examples involving the volatility tandem DMA.

Dual Tandem DMA

See the Manuscript and notebook S10 and S11 in the Notebooks section for examples involving the volatility tandem DMA.