Disordered particle assembly

Completely uncorrelated particles (dilute approximation)

To add a dilute random assembly of uncorrelated particles to a layer:

layer.deposit2D(ba.Dilute2D(density, particle, ba.ParticleAlignment_BottomAligned))
layer.suspend2D(ba.Dilute2D(density, particle, ba.ParticleAlignment_TopAligned))

Argument density is the number density in nm$^{-2}$.

For argument particle, see Particle.

With deposit2D and ParticleAlignment_BottomAligned, the bottom of the particle is placed at the layer’s bottom interface. This is appropriate for particles sitting on a substrate. This mode must only be used for finite-thickness layers, not for the semi-infinite bottom (substrate) or top (ambient) layer.

With suspend2D and ParticleAlignment_TopAligned, the top of the particle is placed at the layer’s top interface. This is appropriate for particles hanging from below an interface, such as particles embedded in a substrate just below its top surface. This mode can be used for finite-thickness layers or the semi-infinite bottom (substrate) layer.

For soft particles with diffuse boundaries (like FuzzySphere), use ParticleAlignment_Centered to place the particle center at the interface.

For an incoherent mixture of different particles, just call deposit2D multiple times with different particle structures.

Dense random assembly (hard disk approximation)

To add a dense random assembly of non-overlapping but otherwise non-interacting particles to a layer:

layer.deposit2D(ba.Dense2D(density, particle, ba.ParticleAlignment_BottomAligned))
layer.suspend2D(ba.Dense2D(density, particle, ba.ParticleAlignment_TopAligned))

The scattering is computed in Percus-Yevick approximation, using the approximative structure factor of M.S. Ripoll & C.F. Tejero (1995).

Use the appropriate layer function (deposit2D or suspend2D) according to the positioning rules described above.

Mixtures of particles

Example

In the following example, the sample is a dense random assembly of disks on a substrate. GISAS has been simulated (a) assuming that the disks are completely uncorrelated, as in an ideal gas, and (b) taking into account that the disks cannot overlap, using the hard-disk liquid model. The figure shows horizontal cuts through these GISAS patterns.

GISAS intensity at $\alpha_f=0.8^\circ$

 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
51
#!/usr/bin/env python3
"""
Dense cylinders, approximated as ideal gas or as hard disks.
Horizontal cut through GISAS image.
"""
import bornagain as ba
from bornagain import ba_plot as bp, deg, nm, nm2


def get_sample(approx):
    # materials
    vacuum = ba.Vacuum()
    material_substrate = ba.RefractiveMaterial("Substrate", 6e-6, 2e-8)
    material_particle = ba.RefractiveMaterial("Particle", 3e-5, 2e-8)

    # particle
    ff = ba.Cylinder(5*nm, 1*nm)
    particle = ba.Particle(material_particle, ff, ba.AlignAt_Bottom)

    # layers
    toplayer = ba.Layer(vacuum)
    density = 0.008/nm2
    if approx == "Dilute":
        toplayer.deposit2D(ba.Dilute2D(density, particle))
    else:
        toplayer.deposit2D(ba.Dense2D(density, particle))
    substrate = ba.Layer(material_substrate)

    sample = ba.Sample()
    sample.addLayer(toplayer)
    sample.addLayer(substrate)
    return sample


def simulate(sample, title):
    beam = ba.Beam(1e9, 0.03*nm, 0.2*deg)
    n = 555
    detector = ba.SphericalDetector(n, -1*deg, 1*deg, 1, 0.78*deg, 0.82*deg)
    simulation = ba.ScatteringSimulation(beam, sample, detector)
    field = simulation.simulate()
    field.setTitle(title)
    return field.flat()


if __name__ == '__main__':
    results = [
        simulate(get_sample("Dilute"), "ideal gas"),
        simulate(get_sample("Dense"), "hard disks"),
    ]
    bp.plot_multicurve(results)
    bp.plt.show()
auto/Examples/scatter2d/Disordered.py