using Plots, Plots.PlotMeasures, DifferentialMobilityAnalyzers, LinearAlgebra plotlyjs(); t,p = 295.15, 1e5 # Temperature [K], Pressure [Pa] qsa,β = 1.66e-5, 1/10 # Qsample [m3 s-1], Sample-to-sheath ratio, r₁,r₂,l = 9.37e-3,1.961e-2,0.44369 # DMA geometry [m] leff = 13.0 # DMA effective diffusion length [m] m = 3 # Upper number of charges Λ₁ = DMAconfig(t,p,qsa,qsa/β,r₁,r₂,l,leff,:-,m,:cylindrical) # Specify DMA with negative polarity Λ₂ = DMAconfig(t,p,qsa,qsa/β,r₁,r₂,l,leff,:+,m,:cylindrical) # Specify DMA with negative polarity bins,z₁,z₂ = 512, dtoz(Λ₁,250e-9),dtoz(Λ₁,20e-9) # bins, upper, lower mobility limit δ₁ = setupDMA(Λ₁, z₁, z₂, bins); # Compute matrices δ₂ = setupDMA(Λ₂, z₁, z₂, bins); # Compute matrices Dm = 100.0 # Size select 100 nm mobility diameter zˢ = dtoz(Λ₁, Dm*1e-9); # Compute corresponding electrical mobility T = (zˢ,k,Λ,δ) -> δ.Ω(Λ,δ.Z,zˢ/k).*δ.Tc(k,δ.Dp).*δ.Tl(Λ,δ.Dp); # Transfer model through DMA Ax = [[400., 60., 1.5], [3000., 200., 1.6]] # Assumed lognormal size distribution 𝕟ᶜⁿ = DMALognormalDistribution(Ax, δ₁) # Evaporation function t = 10.0 # Time for particles to evaporate [s] dt = 1e-4 # Timestep for evaporation - needs to be small for small sizes g = -3.0e2 D = deepcopy(𝕟ᶜⁿ.Dp) for i in 1:length(D) clock = 0 # Start the clock while clock < t D[i] = (D[i] < 10) ? D[i]-1e-11 : D[i] + g/D[i]*dt # evaporate clock = clock + dt end end l = length(D[D .< 10]) # Check for complete evaporation and fill the arry with dummy values D[end-l+1:end] = reverse(exp10.(range(log10(9.8), stop=log10(10), length=l))) EF = D./𝕟ᶜⁿ.Dp; # Compute the size depenent evaporation factor T = (zˢ,k,Λ,δ) -> δ.Ω(Λ,δ.Z,zˢ/k).*δ.Tc(k,δ.Dp).*δ.Tl(Λ,δ.Dp) # Transfer model through DMA Nkz = (zˢ,k,Λ,δ) -> EF⋅(𝕥=T(zˢ,k,Λ,δ)*𝕟ᶜⁿ) # Size distribution for particles with charge k Nz = (zˢ,Λ,δ) -> Σ(k->EF⋅(𝕥=T(zˢ,k,Λ,δ)*𝕟ᶜⁿ),Λ₁.m) # Total size distribution for all charges 1..n Nkm = (zˢ,k,Λ,δ) -> ((ztod(Λ,1,zˢ)/ztod(Λ,k,zˢ))⋅(EF⋅(𝕥=T(zˢ,k,Λ,δ)*𝕟ᶜⁿ))) # App. Mobility dist k charges Nm =(zˢ,Λ,δ) -> Σ(k->((ztod(Λ,1,zˢ)/ztod(Λ,k,zˢ))⋅(EF⋅(𝕥=T(zˢ,k,Λ,δ)*𝕟ᶜⁿ))),Λ₁.m); # Total all charges # Setup the special case Dm = 100 # Dry size 100 nm zˢ = dtoz(Λ₁, Dm*1e-9); # Compute corresponding electrical mobility n = 3 # Charges 1..3 figure("Nimbus Sans L", 2, 5.5, 3.5, 8) p = Plots.get_color_palette(:auto, default(:bgcolor), 100) # Get a list of colors from the theme palette # Panel 1: m\Mobility diameter 𝕩 = map(k -> Nkz(zˢ,k,Λ₁,δ₁), 1:3) 𝕪 = Nz(zˢ,Λ₁,δ₁) p1 = plot([ztod(Λ₁,1,zˢ), ztod(Λ₁,1,zˢ)], [0,200], color = p[1], ls = :dot, label = "D₁(zˢ)", lw = 2) p1 = plot!([ztod(Λ₁,2,zˢ), ztod(Λ₁,2,zˢ)], [0,200], color = p[2], ls = :dot, label = "D₂(zˢ)", lw = 2) p1 = plot!([ztod(Λ₁,3,zˢ), ztod(Λ₁,3,zˢ)], [0,200], color = p[3], ls = :dot, label = "D₃(zˢ)", lw = 2) p1 = plot!(𝕩[1].Dp, 𝕩[1].S, label = "ℕ₁δ₁", xaxis = :log10, xlim = (50,500), color = p[1]) p1 = plot!(𝕩[2].Dp, 𝕩[2].S, label = "ℕ₂δ₁", color = p[2]) p1 = plot!(𝕩[3].Dp, 𝕩[3].S, label = "ℕ₃δ₁", color = p[3]) p1 = plot!(𝕪.Dp, 𝕪.S, color = :black, label = "𝕟ₜδ₁", ls = :dashdot, lw = 1.25, ylabel = "dN/dlnD (cm⁻³)", left_margin = 20px, xlabel = "Mobility Diameter (nm)") # Panel 2: Apparent +1 Mobility diameter 𝕩 = map(k -> Nkm(zˢ,k,Λ₁,δ₁), 1:3) 𝕪 = Nm(zˢ,Λ₁,δ₁) p2 = plot([ztod(Λ₁,1,zˢ), ztod(Λ₁,1,zˢ)], [0,200], color = :black, ls = :dot, label = "D₁(zˢ)", lw = 2) p2 = plot!(𝕩[1].Dp, 𝕩[1].S, xlim = (120, 220), label = "𝕄₁δ₁", color = p[1]) p2 = plot!(𝕩[2].Dp, 𝕩[2].S, label = "𝕄₂δ₁", color = p[2]) p2 = plot!(𝕩[3].Dp, 𝕩[3].S, label = "𝕄₃δ₁", color = p[3]) p2 = plot!(𝕪.Dp, 𝕪.S, color = :black, lw = 1.25, ls = :dashdot, label = "𝕞ₜδ₁", xlabel = "Apparent +1 Mobility Diameter (nm)") # Panel 3: Passage through DMA 𝕩 = map(k -> δ₂.𝐀*Nkz(zˢ,k,Λ₁,δ₁), 1:3) 𝕪 = δ₂.𝐀*Nz(zˢ,Λ₁,δ₁) p3 = plot(𝕩[1].Dp, 𝕩[1].N, label = "ℕ₁δ₂") p3 = plot!(𝕩[2].Dp, 𝕩[2].N, label = "ℕ₂δ₂") p3 = plot!(𝕩[3].Dp, 𝕩[3].N, label = "ℕ₃δ₂") p3 = plot!(𝕪.Dp, 𝕪.N, xaxis = :log10, ylim = (-0.1,2.5), xlim = (50,500), color = :black, ls = :dashdot, left_margin = 34px, lw = 1.25, label = "𝕟ₜδ₂", ylabel = "Concentration (cm⁻³)", xlabel = "Apparent +1 Mobility Diameter (nm)") # Panel 4: Passage through DMA 𝕩 = map(k -> δ₂.𝐎*Nkm(zˢ,k,Λ₁,δ₁), 1:3) 𝕪 = δ₂.𝐎*Nm(zˢ,Λ₁,δ₁) p4 = plot(𝕩[1].Dp, 𝕩[1].N, label = "𝕄₁δ₂") p4 = plot!(𝕩[2].Dp, 𝕩[2].N, label = "𝕄₂δ₂") p4 = plot!(𝕩[3].Dp, 𝕩[3].N, label = "𝕄₃δ₂") p4 = plot!(𝕪.Dp, 𝕪.N, xlim = (120,220), xlabel = "Apparent +1 Mobility Diameter (nm)", lw = 1.25, ls = :dashdot, color = :black, left_margin = 30px, ylim = (0,9.5), label = "𝕞ₜδ₂") plot(p1,p2,p3,p4, layout = grid(2,2), legend=:right, xlim = (23,230), xaxis = :log10, top_margin = 35px, right_margin = 20px, lw = 2, bottom_margin = 20px, fmt = :svg)