From d51d93145b2b2ee055ee12d93fea8fc6b6687466 Mon Sep 17 00:00:00 2001
From: Randolf Beerwerth <r.beerwerth@fz-juelich.de>
Date: Tue, 16 Jun 2020 17:21:14 +0200
Subject: [PATCH] Add Python example RoughnessModel

---
 .../ex06_Reflectometry/RoughnessModel.py      | 86 +++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 Examples/python/simulation/ex06_Reflectometry/RoughnessModel.py

diff --git a/Examples/python/simulation/ex06_Reflectometry/RoughnessModel.py b/Examples/python/simulation/ex06_Reflectometry/RoughnessModel.py
new file mode 100644
index 00000000000..e75ee983d2e
--- /dev/null
+++ b/Examples/python/simulation/ex06_Reflectometry/RoughnessModel.py
@@ -0,0 +1,86 @@
+"""
+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 deg, angstrom, nm
+
+def get_sample(roughness_model):
+    """
+    Defines sample and returns it
+    """
+
+    # creating materials
+    m_ambient = ba.MaterialBySLD("Ambient", 0.0, 0.0)
+    m_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0.0)
+    m_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0.0)
+    m_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0.0)
+
+    # creating 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)
+
+    # defining roughness
+    roughness = ba.LayerRoughness()
+    roughness.setSigma(1.0 * nm)
+
+    # creating multilayer
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(ambient_layer)
+    for i in range(10):
+        multi_layer.addLayerWithTopRoughness(ti_layer, roughness)
+        multi_layer.addLayerWithTopRoughness(ni_layer, roughness)
+    multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+    
+    multi_layer.setRoughnessModel(roughness_model)
+
+    return multi_layer
+
+
+def get_simulation(scan_size=500):
+    """
+    Defines and returns a specular simulation.
+    """
+    simulation = ba.SpecularSimulation()
+    scan = ba.AngularSpecScan(1.54 * angstrom, scan_size,
+                              0.0 * deg, 2.0 * deg)
+    simulation.setScan(scan)
+    return simulation
+
+
+def run_simulation(roughness_model=ba.RoughnessModel.TANH):
+    """
+    Runs simulation and returns its result.
+    """
+    sample = get_sample(roughness_model)
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.result()
+
+
+def plot(result_tanh, result_nevot_croce):
+    
+    plt.semilogy(result_nevot_croce.axis(), result_nevot_croce.array(), label="Névot-Croce")
+    plt.semilogy(result_tanh.axis(), result_tanh.array(), label="Tanh")
+    
+    plt.xlabel(r'$\alpha_i \; (deg)$', fontsize=12)
+    plt.ylabel(r'Intensity', fontsize=12)
+    
+    plt.legend()
+    plt.show()
+    
+    
+    
+if __name__ == '__main__':
+    result_tanh         = run_simulation(roughness_model=ba.RoughnessModel.TANH)
+    result_nevot_croce  = run_simulation(roughness_model=ba.RoughnessModel.NEVOT_CROCE)
+    
+    plot(result_tanh, result_nevot_croce)
+    
+    
-- 
GitLab