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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = ["bornagain>=25,<26"]
# ///
"""
Reference for HolesLattice: same computation using deposit2D with translation.
This example produces the same result as HolesLattice.py but uses deposit2D
in the vacuum layer with the particle translated downward by R, instead of
suspend2D in the substrate layer.
"""
import bornagain as ba
ba.require_versions("bornagain>=25,<26")
from bornagain import deg, nm, R3
def get_sample():
"""
Substrate with hemispherical holes arranged in a hexagonal lattice.
The holes are vacuum half-spheres deposited in the vacuum layer and
translated downward by R to position them at the interface.
"""
# Materials
substrate_color = (0.28, 0.57, 0.82)
substrate_mat = ba.RefractiveMaterial("Substrate", substrate_color, 6e-6, 2e-8)
vacuum = ba.Vacuum()
# Hemispherical hole (vacuum half-sphere, spanning from -R to 0)
R = 5*nm
ff = ba.SphericalSegment(R, R, 0) # radius, top_cut=R, bottom_cut=0
hole = ba.Particle(vacuum, ff)
hole.translate(R3(0, 0, -R)) # Translate down by R
# Hexagonal lattice
lattice = ba.HexagonalLattice2D(20*nm, 0)
layout = ba.Crystal2D(hole, lattice)
profile = ba.Profile2DCauchy(100*nm, 100*nm, 0)
layout.setDecayFunction(profile)
# Layers
vacuum_layer = ba.Layer(vacuum)
vacuum_layer.deposit2D(layout)
substrate_layer = ba.Layer(substrate_mat)
substrate_layer.setNumberOfSlices(6)
# Sample
sample = ba.Sample()
sample.addLayer(vacuum_layer)
sample.addLayer(substrate_layer)
return sample
def get_simulation(sample):
beam = ba.Beam(1e9, 0.1*nm, 0.2*deg)
n = 200
detector = ba.SphericalDetector(n, -2*deg, 2*deg, n, 0, 2*deg)
simulation = ba.ScatteringSimulation(beam, sample, detector)
return simulation
if __name__ == '__main__':
sample = get_sample()
ba.showSample3D(sample, sample_size=250*nm, seed=0)
simulation = get_simulation(sample)
result = simulation.simulate()
ba.plot_datafield(result, unit_aspect=1)
ba.plt.show()
|