Specular reflectivity with different roughness models

This example demonstrates how to apply different roughness models in a specular reflectivity calculation. The considered sample is exactly the same as the one described in the reflectometry tutorial, and the basic roughness tutorial. Hewever, now the computation is performed twice with the standard $tanh$ interface profile and the Névot-Croce roughness model that arises from a Gaussian distribution of the deviation from the mean-surface position.

In both cases, the root-mean-square deviation from the mean surface position is chosen to be $\sigma = 1$ nm.

 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
#!/usr/bin/env python3
"""
Example of simulating a rough sample with a
tanh and Nevot-Croce roughness model using BornAgain.

"""
from matplotlib import pyplot as plt
import bornagain as ba
from bornagain import angstrom, ba_plot as bp, deg


def get_sample(roughness_model):
    # create materials
    vacuum = ba.MaterialBySLD("Vacuum", 0, 0)
    material_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0)
    material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
    material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)

    # create layers
    ambient_layer = ba.Layer(vacuum)
    ti_layer = ba.Layer(material_ti, 30*angstrom)
    ni_layer = ba.Layer(material_ni, 70*angstrom)
    substrate_layer = ba.Layer(material_substrate)

    # Roughness
    roughness = ba.LayerRoughness(10*angstrom)

    # create sample
    sample = ba.MultiLayer()
    sample.addLayer(ambient_layer)
    for _ in range(10):
        sample.addLayerWithTopRoughness(ti_layer, roughness)
        sample.addLayerWithTopRoughness(ni_layer, roughness)
    sample.addLayerWithTopRoughness(substrate_layer, roughness)

    sample.setRoughnessModel(roughness_model)

    return sample


def get_simulation(sample):
    n = 500
    scan = ba.AlphaScan(n, 2*deg/n, 2*deg)
    scan.setWavelength(1.54*angstrom)

    return ba.SpecularSimulation(scan, sample)


def simulate(roughness_model, title):
    """
    Runs simulation and returns its result.
    """
    sample = get_sample(roughness_model)
    simulation = get_simulation(sample)
    result = simulation.simulate()
    result.setTitle(title)
    return result


if __name__ == '__main__':
    results = [
        simulate(ba.RoughnessModel.NEVOT_CROCE, "Névot-Croce"),
        simulate(ba.RoughnessModel.TANH, "Tanh"),
    ]

    bp.plot_multicurve(results)
    bp.show_or_export()
auto/Examples/specular/RoughnessModel.py