From 302b6c55d11a524ad3b08a414cb9bb6ac106f9ff Mon Sep 17 00:00:00 2001 From: Walter Van Herck <w.van.herck@fz-juelich.de> Date: Wed, 10 Jul 2019 11:23:26 +0200 Subject: [PATCH] Add two Python examples for the generation of material profiles --- .../ex06_Reflectometry/MaterialProfile.py | 60 ++++++++++++++++ .../MaterialProfileWithParticles.py | 72 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py create mode 100644 Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py diff --git a/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py b/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py new file mode 100644 index 00000000000..0042cb0c8d6 --- /dev/null +++ b/Examples/python/simulation/ex06_Reflectometry/MaterialProfile.py @@ -0,0 +1,60 @@ +""" +Basic example for producing a profile of SLD of a multilayer. +""" + +import bornagain as ba +from bornagain import deg, angstrom, nm +import numpy as np +import matplotlib.pyplot as plt + + +def get_sample(): + """ + 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) + + # create roughness + roughness = ba.LayerRoughness(5 * angstrom, 0.5, 10 * angstrom) + + # creating multilayer + multi_layer = ba.MultiLayer() + multi_layer.addLayer(ambient_layer) + for i in range(4): + multi_layer.addLayerWithTopRoughness(ti_layer, roughness) + multi_layer.addLayerWithTopRoughness(ni_layer, roughness) + multi_layer.addLayer(substrate_layer) + + return multi_layer + + +def generate_profile(): + """ + Runs simulation and returns its result. + """ + sample = get_sample() + zmin, zmax = -420 * angstrom, 120 * angstrom + npoints = 400 + + zpoints = np.linspace(zmin, zmax, npoints) + slds = ba.MaterialProfile(sample, npoints, zmin, zmax) + + return zpoints, slds + + +if __name__ == '__main__': + zpoints, slds = generate_profile() + plt.figure() + plt.plot(zpoints, np.real(slds)) + plt.show() diff --git a/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py new file mode 100644 index 00000000000..9a7587db8c6 --- /dev/null +++ b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py @@ -0,0 +1,72 @@ +""" +Example for producing a profile of SLD of a multilayer with particles +and slicing. +""" + +import bornagain as ba +from bornagain import deg, angstrom, nm +import numpy as np +import matplotlib.pyplot as plt + + +def get_sample(): + """ + 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_particle = ba.MaterialBySLD("Particle", 5e-6, 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) + + # create roughness + roughness = ba.LayerRoughness(5 * angstrom, 0.5, 10 * angstrom) + + # create particle layout + ff = ba.FormFactorCone(5 * nm, 10 * nm, 75 * deg) + particle = ba.Particle(m_particle, ff) + layout = ba.ParticleLayout() + layout.addParticle(particle) + iff = ba.InterferenceFunction2DLattice.createSquare(10 * nm) + layout.setInterferenceFunction(iff) + ambient_layer.addLayout(layout) + ambient_layer.setNumberOfSlices(20) + + # creating multilayer + multi_layer = ba.MultiLayer() + multi_layer.addLayer(ambient_layer) + for i in range(2): + multi_layer.addLayerWithTopRoughness(ti_layer, roughness) + multi_layer.addLayerWithTopRoughness(ni_layer, roughness) + multi_layer.addLayer(substrate_layer) + + return multi_layer + + +def generate_profile(): + """ + Runs simulation and returns its result. + """ + sample = get_sample() + zmin, zmax = -220 * angstrom, 120 * angstrom + npoints = 400 + + zpoints = np.linspace(zmin, zmax, npoints) + slds = ba.MaterialProfile(sample, npoints, zmin, zmax) + + return zpoints, slds + + +if __name__ == '__main__': + zpoints, slds = generate_profile() + plt.figure() + plt.plot(zpoints, np.real(slds)) + plt.show() -- GitLab