"""
Interfacial models
Definitions taken from:
Svechnikov, M.; Pariev, D.; Nechay, A.; Salashchenko, N.; Chkhalo, N.;
Vainer, Y. & Gaman, D., "Extended model for the reconstruction of periodic
multilayers from extreme ultraviolet and X-ray reflectivity data",
Journal of Applied Crystallography, 2017, 50, 1428-1440
The Sinusoidal and Exponential definitions are incorrect in that paper
though. The correct equations are in:
Stearns, D. G. J. Appl. Phys., 1989, 65, 491–506.
The tanh definition has various definitions. This is taken from:
D. Bahr; W. Press; R. Jebasinski; S. Mantl, Phys. Rev. B, 1993, 47 (8), 4385
"""
import numpy as np
from scipy.stats import norm
_SQRT3 = np.sqrt(3.0)
_SQRT2 = np.sqrt(2.0)
_GAMMA = np.pi / np.sqrt(np.pi * np.pi - 8.0)
[docs]class Interface:
"""
Defines an Interfacial profile
"""
def __init__(self):
pass
[docs] def __call__(self, z, scale=1, loc=0):
raise NotImplementedError(
"You can't use the Interface superclass to calculate profiles"
)
[docs]class Erf(Interface):
"""
An Error function interfacial profile
Notes
-----
Svechnikov, M.; Pariev, D.; Nechay, A.; Salashchenko, N.; Chkhalo, N.;
Vainer, Y. & Gaman, D., "Extended model for the reconstruction of periodic
multilayers from extreme ultraviolet and X-ray reflectivity data",
Journal of Applied Crystallography, 2017, 50, 1428-1440
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
return norm.cdf(z, scale=scale, loc=loc)
def __repr__(self):
return "Erf()"
[docs]class Linear(Interface):
"""
A Linear function interfacial profile
Notes
-----
Stearns, D. G. J. Appl. Phys., 1989, 65, 491–506.
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
new_z = z - loc
f = 0.5 + new_z / (2 * _SQRT3 * scale)
f[new_z <= -_SQRT3 * scale] = 0
f[new_z >= _SQRT3 * scale] = 1
return f
def __repr__(self):
return "Linear()"
[docs]class Exponential(Interface):
"""
An Exponential interfacial profile
Notes
-----
Stearns, D. G. J. Appl. Phys., 1989, 65, 491–506.
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
new_z = z - loc
f = np.zeros_like(new_z)
f[new_z > 0] = 1 - 0.5 * np.exp(-_SQRT2 * new_z[new_z > 0] / scale)
f[new_z <= 0] = 0.5 * np.exp(_SQRT2 * new_z[new_z <= 0] / scale)
return f
def __repr__(self):
return "Exponential()"
[docs]class Tanh(Interface):
"""
A hyperbolic tangent (tanh) interfacial profile
Notes
-----
D. Bahr; W. Press; R. Jebasinski; S. Mantl,
Phys. Rev. B,1993, 47 (8), 4385
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
arg = np.sqrt(2 / np.pi) * (z - loc) / scale
return 0.5 * (1 + np.tanh(arg))
def __repr__(self):
return "Tanh()"
[docs]class Sinusoidal(Interface):
"""
A sinusoidal (sin) interfacial profile
Notes
-----
Stearns, D. G. J. Appl. Phys., 1989, 65, 491–506.
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
new_z = z - loc
f = 0.5 + 0.5 * np.sin(np.pi * new_z / _GAMMA / 2.0 / scale)
f[new_z <= -_GAMMA * scale] = 0
f[new_z >= _GAMMA * scale] = 1
return f
def __repr__(self):
return "Sinusoidal()"
[docs]class Step(Interface):
"""
A step function interfacial profile
Notes
-----
Svechnikov, M.; Pariev, D.; Nechay, A.; Salashchenko, N.; Chkhalo, N.;
Vainer, Y. & Gaman, D., "Extended model for the reconstruction of periodic
multilayers from extreme ultraviolet and X-ray reflectivity data",
Journal of Applied Crystallography, 2017, 50, 1428-1440
"""
def __init__(self):
super().__init__()
[docs] def __call__(self, z, scale=1, loc=0):
new_z = z - loc
f = np.ones_like(new_z) * 0.5
f[new_z <= -scale] = 0
f[new_z >= scale] = 1
return f
def __repr__(self):
return "Step()"