Source code for refl1d.util
__all__ = ["merge_ends"]
import sys
import numpy as np
# CRUFT: 2.7 support
if sys.version_info[0] > 2:
def asbytes(s):
return s.encode('utf-8')
else:
def asbytes(s):
return s
[docs]
def merge_ends(w, p, tol=1e-3):
"""
join the leading and trailing ends of the profile together so fewer
slabs are required and so that gaussian roughness can be used.
"""
# TODO: accept rho, rhoi pairs as well
# TODO: make sure we apply an interface to the right as well as the left
try:
# Assuming there p[0] != p[-1] within tolerance, we are guaranteed
# that we will have a first value not equivalent to p[0] on the
# left, with index > 0 and a last value not equivalent to p[-1] on
# the right, with index < -1. We are going to put the first value
# at left index - 1 and the last value at right index + 1, accumulating
# the widths of the identical layers.
lidx = np.where(abs(p-p[0]) > tol)[0][0]-1
ridx = len(p) - np.where(abs(p[::-1]-p[-1]) > tol)[0][0]
w[lidx], p[lidx] = np.sum(w[:lidx+1]), p[0]
w[ridx], p[ridx] = np.sum(w[ridx:]), p[-1]
return w[lidx:ridx+1], p[lidx:ridx+1]
except Exception:
if len(w):
# All one big layer
w[0] = np.sum(w)
return w[0:1], p[0:1]
else:
return w, p