Draft:Super droplet method

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
  • Comment: Currently too much of this is a how-to/textbook, and we do not have those, see WP:NOTTEXTBOOK. Look at some other pages such as Broyden's method, QM/MM, Anderson acceleration and others. I thnk the whole #SDM Monte-Carlo Algorithm section should be heavily trimmed, perhaps removed. Ldm1954 (talk) 13:19, 26 September 2025 (UTC)


In mathematical modeling of aerosols, clouds and precipitation, Super Droplet Method (SDM) is a Monte-Carlo approach for representing collisions and coalescence of particles in atmospheric fluid dynamics simulations. The method and its name was introduced in a 2007 arXiv e-print by Shin-ichiro Shima et al..[1] (preceded by a 2006 patent application[2] and followed by 2008 RIMS Kôkyûroku[3] and 2009 QJRMS[4] papers).

File:Super droplet method teaser.gif
Evolution of mass density distribution and the underlying population of 211 super-particles in a Monte-Carlo SDM simulation employing additive coagulation kernel and exponential initial particle mass spectrum, for which the Safronov[5]-Golovin[6] analytical solution to the Smoluchowski coagulation equations can be used as a reference (animation based on Fig. 2 from Shima et al. 2007[1], generated using the basic Python implementation of SDM provided in this article).

SDM algorithm is a probabilistic alternative to the deterministic model of the process embodied in the Smoluchowski coagulation equations. Among the key characteristics of SDM is that it is not subject to the "curse of dimensionality" that hampers application of other methods when multiple particle attributes need to be resolved in a simulation[7]. The algorithm is embarrassingly parallel, has linear time complexity, constant state vector size (number conservation of simulated particles during collisions) and zero numerical diffusion.

SDM in the cloud microphysics model taxonomy

[edit | edit source]

Particle-based approaches, including SDM, for simulating the dynamics of sizes of particles in clouds are considered as one of three distinct cloud microphysics modelling paradigms[8], which can be classified as either Eulerian or Lagriangian in terms of formulation of dynamics in particle attribute space:

Lagrangian microphysics approaches:

Eulerian microphysics approaches:

  • bulk (in which moment based description of particle attribute distribution is used, with assumed size/mass distributions),
  • bin (in which nonparametric histogram-based description of particle attribute space is used, possibly involving moment-based description within each histogram bin)

The term "super-droplet" approach/method has been used either in reference to the particular Monte-Carlo algorithm (even if not used to model clouds[9]), or more broadly in reference to the particle-based approach for modeling of atmospheric clouds (even if neglecting coalescence processes[10]). Applications of particle-based methods in atmospheric modelling[11][12], including for cloud microphysics modelling[13], and including Monte-Carlo techniques and super-particle nomenclature[14], predate SDM. Analogous Monte-Carlo particle-based methods (or particle swarm methods) have also been used for modelling accretion in astrophysical context[15].

The canonical version of SDM follows the "all or nothing"[16] algorithm presented by Shima et al.[1]. The SDM collision algorithm is a Gillespie algorithm (see also Kinetic Monte Carlo and Dynamic Monte Carlo methods) in the sense that the expected number of droplet collisions which is represented by superdroplets over a given time in a certain volume matches the expected number of real droplet collisions, although the variance can be substantially higher.

SDM Monte-Carlo Algorithm for Coagulation of Particles

[edit | edit source]

The algorithm formulation presented herein follows the notation of Shima et al.[1], but uses pseudocode rather than mathematical notation. The code snippets are valid Python (used to generate the animation above) and refer to NumPy and SciPy components.

Super-particle state

[edit | edit source]

SDM models evolution of a particulate system composed of ns super droplets, with i-th super droplet representing a multiplicity ξi of particles. Each super particle carries a set of attributes, among which there are extensive attributes, such as mass mi, as well as auxiliary attributes which do not change upon aggregation, such as position in space.

Well-mixed control volume

[edit | edit source]

The considered particle-laden volume is split into cells. Cell volumes should be small enough to consider them well mixed, and hence to assume that any particle in the cell can collide with any other with a probability dependent only on particle extensive attributes. In subsequent formulation of the algorithm, a single cell of volume Δv is considered.

Attribute sampling

[edit | edit source]

SDM allows for arbitrary initial sampling of the particle attribute distribution. Among the commonly used methods, there is inverse transform sampling which yields uniform initial multiplicities across the population. Such constant-multiplicity sampling implies evaluation of the quantile function at random locations chosen uniformly from the 0...1 range as in the listing below:

import numpy as np
from scipy import stats

def sample(*,
    rng: np.random.Generator,
    dist: stats.rv_continuous,
    norm: float,
    n_s: int,
):
    state = np.empty(
        shape=n_s,
        dtype=[('ξ', np.int64), ('m', np.float64)]
    )
    state['ξ'] =  round(norm / n_s)
    state['m'] =  dist.ppf(rng.uniform(0, 1, n_s))
    return state

Several other sampling methods were discussed and applied in studies employing SDM[17][18][19]

Time stepping, candidate pairs and attribute update

[edit | edit source]

Simulation using SDM involves time-stepping loop that advances the system state by Δt in each step. SDM is a Monte Carlo algorithm and each step employs random number generation. As exemplified in the basic serial implementation of an SDM step given in the listing below, each involves:

  • permuting the super particles to select a random set of n_pair non-overlapping pairs among all n_s super particles in the considered volume Δv;
  • shuffling n_pair random numbers from a uniform distribution (stored into array φ)
  • computing the p_ratio of all possible particle unordered pairs to the number of considered candidate pairs n_pair;
  • enumerating across all candidate pairs with α numbering the pair, and j,k numbering the super droplets within a pair;
  • evaluating the probability p_α of collision within the super-droplet pair α as a product of the coagulation kernel, the timestep-to-cell-volume ratio Δt/Δv, the p_ratio and ξ_j where j is chosen to point to the super droplet of higher multiplicity in the pair;
  • evaluating the γ factor, which for p_α<1 is a Boolean flag resulting from comparison of the probability of coagulation with the random number from the 0...1 range; while in the case of p_α≥1, γ is augmented by the number of "certain" coagulations to represent repeated collision events within a single step (note that depending on the value of the ξ_j/ξ_k ratio, the number of repeated events may need be truncated incurring a collision-event deficit);
  • updating particle attributes ξ_j, ξ_k, m_j and m_k.
Scenario A: single-collision event (γ=1)
Scenario B: multiple-collision event (γ>1 and ξ[j]≠γξ[k])
Scenario C: equal-ratio collision event (γ≥1 and ξ[j]=γξ[k])
from collections import abc

def sdm(*,
    rng: np.random.Generator,
    ξ: abc.MutableSequence[int],
    m: abc.MutableSequence[float],
    kern: abc.Callable[[float, float], float],
    Δt: float,
    Δv: float,
):
    """ SDM step assuming non-zero multiplicities """
    n_s = len(ξ)
    n_pair = n_s // 2
    
    pairs = rng.permutation(n_s)[: 2 * n_pair]
    φ = rng.uniform(0, 1, n_pair)

    p_ratio = n_s * (n_s - 1) / 2 / n_pair
    for α, (j, k) in enumerate(pairs.reshape(-1, 2)):
        p_jk = kern(m[j], m[k]) * Δt / Δv
        if ξ[j] < ξ[k]:
            j, k = k, j
        p_α = ξ[j] * p_ratio * p_jk
        γ = p_α // 1 + (p_α - p_α // 1) > φ[α]
        if γ != 0:
            γ = min(γ, (ξ[j] / ξ[k]) // 1)
            if ξ[j] - γ * ξ[k] > 0:
                ξ[j] -= γ * ξ[k]
                m[k] += γ * m[j]
            else:
                ξ[j] = ξ[k] // 2
                ξ[k] -= ξ[j]
                m[k] += γ * m[j]
                m[j] = m[k]

Collision Scenarios

[edit | edit source]

The above algorithm can yield the following collision scenarios (see animations above, symbol m denotes an arbitrary mass unit, symbol M denotes the mass attribute of the super-droplet of respective color):

- A: single-collision event (γ=1 )

- B: multiple-collision event (γ > 1 and ξ[j] ≠ γξ[k])

- C: equal-ratio collision event (γ ≥ 1 and ξ[j] = γξ[k]), note: an equal-ratio collision event may also occur within scenario A

Concurrency

[edit | edit source]

The SDM coagulation algorithm does not feature data dependencies across candidate pairs, hence is particularly well suited for SIMT concurrent operation. Implementations of SDM leverage both CPU and GPU multi-threading.[20]

Algorithm development and applications

[edit | edit source]

The SDM algorithm has been applied in diverse modelling studies, covering topics such as:

  • mixed-phase clouds[19]
  • representation of collisional breakup[21]
  • aqueous chemical reactions involving soluble aerosol material[22]
  • in-cloud electro-coalescence[23]
  • role of clouds in nuclear fallout dynamics[24]
  • geo-engineering (cloud brightening)[25] (the reference uses particle-based microphysics representation, but collisions are represented in a different way than SDM)
  • simulations of processes occurring in cloud-chamber laboratories[26][27]
  • interaction of cosmic rays with clouds[28]
  • dynamics of fogs[29]

Open-source implementations

[edit | edit source]

(links point to Git repositories)

References

[edit | edit source]
  1. ^ a b c d Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  2. ^ JP 2007292465A, "Simulation method, simulation program, and simulation apparatus" 
  3. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  4. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  5. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  6. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  7. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  8. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  9. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  10. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  11. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  12. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  13. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  14. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  15. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  16. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  17. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  18. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  19. ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  20. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  21. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  22. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  23. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  24. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  25. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  26. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  27. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  28. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  29. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).