### Specular simulation 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 68 69 70 71 72 73 74 75 76  #!/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): """ Defines sample and returns it """ # create materials m_ambient = ba.MaterialBySLD("Ambient", 0, 0) m_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0) m_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0) m_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0) # create layers ambient_layer = ba.Layer(m_ambient) ti_layer = ba.Layer(m_ti, 30*angstrom) ni_layer = ba.Layer(m_ni, 70*angstrom) substrate_layer = ba.Layer(m_substrate) # define 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): """ Defines and returns a specular simulation. """ n = bp.simargs['n'] 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__': bp.parse_args(sim_n=500) results = [ simulate(ba.RoughnessModel.NEVOT_CROCE, "Névot-Croce"), simulate(ba.RoughnessModel.TANH, "Tanh"), ] bp.plot_multicurve_specular(results) 
Examples/specular/RoughnessModel.py